Cache the default cover for various sizes
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user