Cache the default cover for various sizes

This commit is contained in:
emeric
2018-09-17 20:05:03 +02:00
parent 8bd94d5493
commit 1d55e82e92
2 changed files with 39 additions and 14 deletions
+29 -10
View File
@@ -61,6 +61,25 @@ Grabber::instance()
return instance; return instance;
} }
Image::Image
Grabber::getDefaultCover(std::size_t size)
{
std::unique_lock<std::mutex> lock(_mutex);
auto it = _defaultCovers.find(size);
if (it == _defaultCovers.end())
{
Image::Image cover = _defaultCover;
cover.scale(size);
auto res = _defaultCovers.insert(std::make_pair(size, cover));
assert(res.second);
it = res.first;
}
return it->second;
}
static boost::optional<Image::Image> static boost::optional<Image::Image>
getFromAvMediaFile(const Av::MediaFile& input) getFromAvMediaFile(const Av::MediaFile& input)
{ {
@@ -147,7 +166,7 @@ Grabber::getFromTrack(const boost::filesystem::path& p) const
} }
Image::Image Image::Image
Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::size_t size) const Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::size_t size)
{ {
using namespace Database; using namespace Database;
@@ -173,16 +192,16 @@ Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::
} }
if (!cover) if (!cover)
cover = _defaultCover; cover = getDefaultCover(size);
else
cover->scale(size); cover->scale(size);
return *cover; return *cover;
} }
Image::Image Image::Image
Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, std::size_t size) const Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, std::size_t size)
{ {
using namespace Database; using namespace Database;
@@ -206,15 +225,15 @@ Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, s
} }
if (!cover) if (!cover)
cover = _defaultCover; cover = getDefaultCover(size);
else
cover->scale(size); cover->scale(size);
return *cover; return *cover;
} }
std::vector<uint8_t> std::vector<uint8_t>
Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size) const Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size)
{ {
Image::Image cover = getFromTrack(session, trackId, size); Image::Image cover = getFromTrack(session, trackId, size);
@@ -222,7 +241,7 @@ Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image
} }
std::vector<uint8_t> std::vector<uint8_t>
Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size) const Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size)
{ {
Image::Image cover = getFromRelease(session, releaseId, size); Image::Image cover = getFromRelease(session, releaseId, size);
+10 -4
View File
@@ -19,6 +19,8 @@
#pragma once #pragma once
#include <map>
#include <mutex>
#include <vector> #include <vector>
#include "database/Types.hpp" #include "database/Types.hpp"
@@ -35,23 +37,27 @@ class Grabber
static Grabber& instance(); static Grabber& instance();
std::vector<uint8_t> getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size) const; std::vector<uint8_t> getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size);
std::vector<uint8_t> getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size) const; std::vector<uint8_t> getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size);
private: private:
Grabber(); Grabber();
Image::Image getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::size_t size) const; Image::Image getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::size_t size);
Image::Image getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, std::size_t size) const; Image::Image getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, std::size_t size);
boost::optional<Image::Image> getFromTrack(const boost::filesystem::path& path) const; boost::optional<Image::Image> getFromTrack(const boost::filesystem::path& path) const;
std::vector<boost::filesystem::path> getCoverPaths(const boost::filesystem::path& directoryPath) const; std::vector<boost::filesystem::path> getCoverPaths(const boost::filesystem::path& directoryPath) const;
boost::optional<Image::Image> getFromDirectory(const boost::filesystem::path& path) const; boost::optional<Image::Image> getFromDirectory(const boost::filesystem::path& path) const;
Image::Image getDefaultCover(std::size_t size);
Image::Image _defaultCover; Image::Image _defaultCover;
std::mutex _mutex;
std::map<std::size_t /* size */, Image::Image> _defaultCovers;
std::vector<boost::filesystem::path> _fileExtensions std::vector<boost::filesystem::path> _fileExtensions
= {".jpg", ".jpeg", ".png", ".bmp"}; // TODO parametrize = {".jpg", ".jpeg", ".png", ".bmp"}; // TODO parametrize