diff --git a/pixivmodels.cpp b/pixivmodels.cpp index 65ffea8..518df67 100644 --- a/pixivmodels.cpp +++ b/pixivmodels.cpp @@ -21,7 +21,10 @@ const std::string& Images::original_or_thumbnail() const { throw std::runtime_error("Images does not contain any images"); } -const std::string& Images::thumbnail_or_original() const { +const std::string& Images::thumbnail_or_original(size_t back) const { + if (this->thumbnails.size() > back) { + return this->thumbnails[this->thumbnails.size() - back - 1]; + } if (!this->thumbnails.empty()) { return this->thumbnails.back(); } diff --git a/pixivmodels.h b/pixivmodels.h index 9538698..56bac32 100644 --- a/pixivmodels.h +++ b/pixivmodels.h @@ -12,7 +12,7 @@ struct Images { std::vector thumbnails; const std::string& original_or_thumbnail() const; - const std::string& thumbnail_or_original() const; + const std::string& thumbnail_or_original(size_t back = 0) const; }; struct User { diff --git a/routes/artworks.cpp b/routes/artworks.cpp index 1ec812a..83df449 100644 --- a/routes/artworks.cpp +++ b/routes/artworks.cpp @@ -6,10 +6,12 @@ static inline bool is_true(const std::string& str); static inline Element generate_user_link(const httplib::Request& req, const Config& config, const Illust& illust); static inline Element generate_images(const httplib::Request& req, const Config& config, const Illust& illust); +static inline Element generate_preview_images(const httplib::Request& req, const Config& config, const Illust& illust); static inline Element generate_illust_metadata(const Illust& illust); void artworks_route(const httplib::Request& req, httplib::Response& res, const Config& config, PixivClient& pixiv_client) { uint64_t illust_id = to_ull(req.matches.str(1)); + bool preview = is_true(req.get_param_value("preview")); Illust illust; try { @@ -32,7 +34,7 @@ void artworks_route(const httplib::Request& req, httplib::Response& res, const C Element body("body", { Element("h2", {illust.title}), generate_user_link(req, config, illust), - generate_images(req, config, illust), + !preview ? generate_images(req, config, illust) : generate_preview_images(req, config, illust), Element("br"), generate_illust_metadata(illust) }); @@ -73,6 +75,23 @@ static inline Element generate_images(const httplib::Request& req, const Config& return div; } +static inline Element generate_preview_images(const httplib::Request& req, const Config& config, const Illust& illust) { + Element div("div", {{"class", "grid"}}, {}); + + div.nodes.reserve(illust.images.size()); + for (size_t i = 0; i < illust.images.size(); i++) { + const Images& images = illust.images[i]; + std::string thumbnail = proxy_image_url(config, images.thumbnail_or_original(1)); + std::string link = get_origin(req, config) + "/artworks/" + std::to_string(illust.illust_id) + "#" + std::to_string(i + 1); + + div.nodes.push_back(Element("a", {{"href", std::move(link)}}, { + Element("img", {{"loading", "lazy"}, {"src", std::move(thumbnail)}}, {}) + })); + } + + return div; +} + static inline Element generate_illust_metadata(const Illust& illust) { Element div("div", {{"class", "illustmetadata"}}, {}); diff --git a/routes/css.cpp b/routes/css.cpp index 1cac9c2..b0c471f 100644 --- a/routes/css.cpp +++ b/routes/css.cpp @@ -59,21 +59,21 @@ void css_route(const httplib::Request& req, httplib::Response& res) { margin-left: .5em; } - /* USER ILLUSTRATIONS PAGE */ + /* USER ILLUSTRATIONS PAGE (and illustrations page) */ .center { text-align: center; } - .userillustrations { + .grid { display: flex; flex-wrap: wrap; gap: 1em; justify-content: center; } - .userillustrations img { + .grid img { width: 15em; height: 15em; } - .userillustrations p { + .grid p { width: 15em; } diff --git a/routes/users/illustrations.cpp b/routes/users/illustrations.cpp index 47233c1..9050e97 100644 --- a/routes/users/illustrations.cpp +++ b/routes/users/illustrations.cpp @@ -40,7 +40,7 @@ void user_illustrations_route(const httplib::Request& req, httplib::Response& re generate_content(req, config, illusts), generate_pager(illusts, page, false) }); - serve(req, res, config, user.display_name + " illustrations", std::move(body)); + serve(req, res, config, user.display_name + "'s illustrations", std::move(body)); } static Element generate_pager(const Illusts& illusts, size_t page, bool first_selector) { @@ -72,12 +72,12 @@ static Element generate_pager(const Illusts& illusts, size_t page, bool first_se } static inline Element generate_content(const httplib::Request& req, const Config& config, const Illusts& illusts) { - Element div("div", {{"class", "userillustrations"}}, {}); + Element div("div", {{"class", "grid"}}, {}); div.nodes.reserve(illusts.illusts.size()); for (const Illust& i : illusts.illusts) { std::string illust_url = get_origin(req, config) + "/artworks/" + std::to_string(i.illust_id); - std::string image_url = proxy_image_url(config, i.images[0].thumbnail_or_original()); + std::string image_url = proxy_image_url(config, i.images[0].thumbnail_or_original(1)); div.nodes.push_back(Element("a", {{"href", {std::move(illust_url)}}}, { Element("img", {{"loading", "lazy"}, {"src", std::move(image_url)}}, {}),