diff --git a/src/reader.cpp b/src/reader.cpp index 44cb312a6..071a16e22 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -191,7 +191,7 @@ Entry Reader::getMainPage() const bool Reader::getFavicon(string& content, string& mimeType) const { - return kiwix::getArchiveFavicon(*zimArchive, content, mimeType); + return kiwix::getArchiveFavicon(*zimArchive, 48, content, mimeType); } string Reader::getZimFilePath() const diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 689ba7732..86e3097a8 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -94,6 +94,16 @@ inline std::string normalizeRootUrl(std::string rootUrl) return rootUrl.empty() ? rootUrl : "/" + rootUrl; } +unsigned parseIllustration(const std::string& s) +{ + int nw(0), nh(0), nEnd(0); + long int w(-1), h(-1); + if ( sscanf(s.c_str(), "Illustration_%n%ldx%n%ld@1%n)", &nw, &w, &nh, &h, &nEnd) == 2 + && nEnd == (int)s.size() && !isspace(s[nw]) && !isspace(s[nh]) && w == h && w >= 0) { + return w; + } + return 0; +} } // unnamed namespace static IdNameMapper defaultNameMapper; @@ -408,7 +418,9 @@ std::unique_ptr InternalServer::handle_meta(const RequestContext& requ } else if (meta_name == "publisher") { content = getMetaPublisher(*archive); } else if (meta_name == "favicon") { - getArchiveFavicon(*archive, content, mimeType); + getArchiveFavicon(*archive, 48, content, mimeType); + } else if (const unsigned illustrationSize = parseIllustration(meta_name)) { + getArchiveFavicon(*archive, illustrationSize, content, mimeType); } else { return Response::build_404(*this, request, bookName, ""); } diff --git a/src/tools/archiveTools.cpp b/src/tools/archiveTools.cpp index 5d22b8ef2..8e5d1c7f3 100644 --- a/src/tools/archiveTools.cpp +++ b/src/tools/archiveTools.cpp @@ -69,10 +69,10 @@ std::string getMetaTags(const zim::Archive& archive, bool original) { return join(tags, ";"); } -bool getArchiveFavicon(const zim::Archive& archive, +bool getArchiveFavicon(const zim::Archive& archive, unsigned size, std::string& content, std::string& mimeType){ try { - auto item = archive.getIllustrationItem(); + auto item = archive.getIllustrationItem(size); content = item.getData(); mimeType = item.getMimetype(); return true; diff --git a/src/tools/archiveTools.h b/src/tools/archiveTools.h index 1429457ba..0b02d4fe4 100644 --- a/src/tools/archiveTools.h +++ b/src/tools/archiveTools.h @@ -33,7 +33,7 @@ namespace kiwix std::string getArchiveTitle(const zim::Archive& archive); std::string getMetaDescription(const zim::Archive& archive); std::string getMetaTags(const zim::Archive& archive, bool original = false); - bool getArchiveFavicon(const zim::Archive& archive, + bool getArchiveFavicon(const zim::Archive& archive, unsigned size, std::string& content, std::string& mimeType); std::string getMetaLanguage(const zim::Archive& archive); std::string getMetaName(const zim::Archive& archive); diff --git a/test/server.cpp b/test/server.cpp index d054eff33..93404b414 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -197,6 +197,7 @@ const ResourceCollection resources200Uncompressible{ { WITH_ETAG, "/meta?content=zimfile&name=creator" }, { WITH_ETAG, "/meta?content=zimfile&name=publisher" }, { WITH_ETAG, "/meta?content=zimfile&name=favicon" }, + { WITH_ETAG, "/meta?content=zimfile&name=Illustration_48x48@1" }, { WITH_ETAG, "/zimfile/I/m/Ray_Charles_classic_piano_pose.jpg" },