From 1d55e82e92a8d490ec35b842274f3250d72dac84 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 17 Sep 2018 20:05:03 +0200 Subject: [PATCH] Cache the default cover for various sizes --- src/cover/CoverArtGrabber.cpp | 39 ++++++++++++++++++++++++++--------- src/cover/CoverArtGrabber.hpp | 14 +++++++++---- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/cover/CoverArtGrabber.cpp b/src/cover/CoverArtGrabber.cpp index b9651b46..ce688492 100644 --- a/src/cover/CoverArtGrabber.cpp +++ b/src/cover/CoverArtGrabber.cpp @@ -61,6 +61,25 @@ Grabber::instance() return instance; } +Image::Image +Grabber::getDefaultCover(std::size_t size) +{ + std::unique_lock 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 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 -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 -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); diff --git a/src/cover/CoverArtGrabber.hpp b/src/cover/CoverArtGrabber.hpp index c2d572c2..e8d0b6a7 100644 --- a/src/cover/CoverArtGrabber.hpp +++ b/src/cover/CoverArtGrabber.hpp @@ -19,6 +19,8 @@ #pragma once +#include +#include #include #include "database/Types.hpp" @@ -35,23 +37,27 @@ class Grabber static Grabber& instance(); - std::vector getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size) const; - std::vector getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size) const; + std::vector getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size); + std::vector 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 getFromTrack(const boost::filesystem::path& path) const; std::vector getCoverPaths(const boost::filesystem::path& directoryPath) const; boost::optional getFromDirectory(const boost::filesystem::path& path) const; + Image::Image getDefaultCover(std::size_t size); Image::Image _defaultCover; + std::mutex _mutex; + std::map _defaultCovers; + std::vector _fileExtensions = {".jpg", ".jpeg", ".png", ".bmp"}; // TODO parametrize