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;
}
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>
getFromAvMediaFile(const Av::MediaFile& input)
{
@@ -147,7 +166,7 @@ Grabber::getFromTrack(const boost::filesystem::path& p) const
}
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;
@@ -173,16 +192,16 @@ Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::
}
if (!cover)
cover = _defaultCover;
cover->scale(size);
cover = getDefaultCover(size);
else
cover->scale(size);
return *cover;
}
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;
@@ -206,15 +225,15 @@ Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, s
}
if (!cover)
cover = _defaultCover;
cover->scale(size);
cover = getDefaultCover(size);
else
cover->scale(size);
return *cover;
}
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);
@@ -222,7 +241,7 @@ Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image
}
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);
+10 -4
View File
@@ -19,6 +19,8 @@
#pragma once
#include <map>
#include <mutex>
#include <vector>
#include "database/Types.hpp"
@@ -35,23 +37,27 @@ class Grabber
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> getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, 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);
private:
Grabber();
Image::Image getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::size_t size) const;
Image::Image getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, 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);
boost::optional<Image::Image> getFromTrack(const boost::filesystem::path& path) const;
std::vector<boost::filesystem::path> getCoverPaths(const boost::filesystem::path& directoryPath) const;
boost::optional<Image::Image> getFromDirectory(const boost::filesystem::path& path) const;
Image::Image getDefaultCover(std::size_t size);
Image::Image _defaultCover;
std::mutex _mutex;
std::map<std::size_t /* size */, Image::Image> _defaultCovers;
std::vector<boost::filesystem::path> _fileExtensions
= {".jpg", ".jpeg", ".png", ".bmp"}; // TODO parametrize