Removed session parameters from cover service

This commit is contained in:
emeric
2021-09-30 22:31:15 +02:00
parent 0cb1339901
commit 00c756f7e1
7 changed files with 56 additions and 53 deletions
+28 -18
View File
@@ -21,6 +21,7 @@
#include "av/IAudioFile.hpp"
#include "database/Db.hpp"
#include "database/Release.hpp"
#include "database/Session.hpp"
#include "database/Track.hpp"
@@ -33,6 +34,7 @@ using RawImage = CoverArt::STB::RawImage;
using RawImage = CoverArt::GraphicsMagick::RawImage;
#endif
#include "utils/IConfig.hpp"
#include "utils/Logger.hpp"
#include "utils/Random.hpp"
#include "utils/Utils.hpp"
@@ -85,27 +87,25 @@ isFileSupported(const std::filesystem::path& file, const std::vector<std::filesy
}
std::unique_ptr<IGrabber>
createGrabber(const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath,
std::size_t maxCacheSize, std::size_t maxFileSize, unsigned jpegQuality)
createGrabber(Database::Db& db, const std::filesystem::path& execPath, const std::filesystem::path& defaultCoverPath)
{
return std::make_unique<Grabber>(execPath, defaultCoverPath, maxCacheSize, maxFileSize, jpegQuality);
return std::make_unique<Grabber>(db, execPath, defaultCoverPath);
}
Grabber::Grabber(const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath,
std::size_t maxCacheSize,
std::size_t maxFileSize,
unsigned jpegQuality)
: _defaultCoverPath {defaultCoverPath}
, _maxCacheSize {maxCacheSize}
, _maxFileSize {maxFileSize}
, _jpegQuality {Utils::clamp<unsigned>(jpegQuality, 1, 100)}
Grabber::Grabber(Database::Db& db,
const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath)
: _db {db}
, _defaultCoverPath {defaultCoverPath}
, _maxCacheSize {Service<IConfig>::get()->getULong("cover-max-cache-size", 30) * 1000 * 1000}
, _maxFileSize {Service<IConfig>::get()->getULong("cover-max-file-size", 10) * 1000 * 1000}
{
setJpegQuality(Service<IConfig>::get()->getULong("cover-jpeg-quality", 75));
LMS_LOG(COVER, INFO) << "Default cover path = '" << _defaultCoverPath.string() << "'";
LMS_LOG(COVER, INFO) << "Max cache size = " << _maxCacheSize;
LMS_LOG(COVER, INFO) << "Max file size = " << _maxFileSize;
LMS_LOG(COVER, INFO) << "JPEG export quality = " << _jpegQuality;
#if LMS_SUPPORT_IMAGE_GM
GraphicsMagick::init(execPath);
@@ -313,9 +313,9 @@ Grabber::getFromTrack(const std::filesystem::path& p, ImageSize width) const
}
std::shared_ptr<IEncodedImage>
Grabber::getFromTrack(Database::Session& dbSession, Database::TrackId trackId, ImageSize width)
Grabber::getFromTrack(Database::TrackId trackId, ImageSize width)
{
return getFromTrack(dbSession, trackId, width, true /* allow release fallback*/);
return getFromTrack(_db.getTLSSession(), trackId, width, true /* allow release fallback*/);
}
std::shared_ptr<IEncodedImage>
@@ -338,7 +338,7 @@ Grabber::getFromTrack(Database::Session& dbSession, Database::TrackId trackId, I
cover = getFromSameNamedFile(trackInfo->trackPath, width);
if (!cover && trackInfo->releaseId && allowReleaseFallback)
cover = getFromRelease(dbSession, *trackInfo->releaseId, width);
cover = getFromRelease(*trackInfo->releaseId, width);
if (!cover && trackInfo->isMultiDisc)
{
@@ -357,7 +357,7 @@ Grabber::getFromTrack(Database::Session& dbSession, Database::TrackId trackId, I
}
std::shared_ptr<IEncodedImage>
Grabber::getFromRelease(Database::Session& session, Database::ReleaseId releaseId, ImageSize width)
Grabber::getFromRelease(Database::ReleaseId releaseId, ImageSize width)
{
const CacheEntryDesc cacheEntryDesc {releaseId, width};
@@ -371,6 +371,8 @@ Grabber::getFromRelease(Database::Session& session, Database::ReleaseId releaseI
std::filesystem::path releaseDirectory;
};
Database::Session& session {_db.getTLSSession()};
auto getReleaseInfo {[&]
{
std::optional<ReleaseInfo> res;
@@ -418,6 +420,14 @@ Grabber::flushCache()
_cache.clear();
}
void
Grabber::setJpegQuality(unsigned quality)
{
_jpegQuality = Utils::clamp<unsigned>(quality, 1, 100);
LMS_LOG(COVER, INFO) << "JPEG export quality = " << _jpegQuality;
}
void
Grabber::saveToCache(const CacheEntryDesc& entryDesc, std::shared_ptr<IEncodedImage> image)
{
+9 -8
View File
@@ -86,11 +86,9 @@ namespace CoverArt
class Grabber : public IGrabber
{
public:
Grabber(const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath,
std::size_t maxCacheEntries,
std::size_t maxFileSize,
unsigned jpegQuality);
Grabber(Database::Db& db,
const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath);
Grabber(const Grabber&) = delete;
Grabber& operator=(const Grabber&) = delete;
@@ -98,9 +96,10 @@ namespace CoverArt
Grabber& operator=(Grabber&&) = delete;
private:
std::shared_ptr<IEncodedImage> getFromTrack(Database::Session& dbSession, Database::TrackId trackId, ImageSize width) override;
std::shared_ptr<IEncodedImage> getFromRelease(Database::Session& dbSession, Database::ReleaseId releaseId, ImageSize width) override;
std::shared_ptr<IEncodedImage> getFromTrack(Database::TrackId trackId, ImageSize width) override;
std::shared_ptr<IEncodedImage> getFromRelease(Database::ReleaseId releaseId, ImageSize width) override;
void flushCache() override;
void setJpegQuality(unsigned quality) override;
std::shared_ptr<IEncodedImage> getFromTrack(Database::Session& dbSession, Database::TrackId trackId, ImageSize width, bool allowReleaseFallback);
std::unique_ptr<IEncodedImage> getFromAvMediaFile(const Av::IAudioFile& input, ImageSize width) const;
@@ -114,6 +113,8 @@ namespace CoverArt
bool checkCoverFile(const std::filesystem::path& directoryPath) const;
Database::Db& _db;
std::shared_mutex _cacheMutex;
std::unordered_map<CacheEntryDesc, std::shared_ptr<IEncodedImage>> _cache;
std::unordered_map<ImageSize, std::shared_ptr<IEncodedImage>> _defaultCoverCache;
@@ -129,7 +130,7 @@ namespace CoverArt
static inline const std::vector<std::filesystem::path> _fileExtensions {".jpg", ".jpeg", ".png", ".bmp"}; // TODO parametrize
const std::size_t _maxFileSize;
static inline const std::vector<std::string> _preferredFileNames {"cover", "front"}; // TODO parametrize
const unsigned _jpegQuality;
unsigned _jpegQuality;
};
} // namespace CoverArt
@@ -27,7 +27,7 @@
namespace Database
{
class Session;
class Db;
}
namespace CoverArt
@@ -37,17 +37,17 @@ namespace CoverArt
public:
virtual ~IGrabber() = default;
virtual std::shared_ptr<IEncodedImage> getFromTrack(Database::Session& dbSession, Database::TrackId trackId, ImageSize width) = 0;
virtual std::shared_ptr<IEncodedImage> getFromRelease(Database::Session& dbSession, Database::ReleaseId releaseId, ImageSize width) = 0;
virtual std::shared_ptr<IEncodedImage> getFromTrack(Database::TrackId trackId, ImageSize width) = 0;
virtual std::shared_ptr<IEncodedImage> getFromRelease(Database::ReleaseId releaseId, ImageSize width) = 0;
virtual void flushCache() = 0;
virtual void setJpegQuality(unsigned quality) = 0; // from 1 to 100
};
std::unique_ptr<IGrabber> createGrabber(const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath,
std::size_t maxCacheEntries,
std::size_t maxFileSize,
unsigned jpegQuality);
std::unique_ptr<IGrabber> createGrabber(Database::Db& db,
const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath);
} // namespace CoverArt
+2 -2
View File
@@ -1795,9 +1795,9 @@ handleGetCoverArt(RequestContext& context, const Wt::Http::Request& /*request*/,
std::shared_ptr<CoverArt::IEncodedImage> cover;
if (trackId)
cover = Service<CoverArt::IGrabber>::get()->getFromTrack(context.dbSession, *trackId, size);
cover = Service<CoverArt::IGrabber>::get()->getFromTrack(*trackId, size);
else if (releaseId)
cover = Service<CoverArt::IGrabber>::get()->getFromRelease(context.dbSession, *releaseId, size);
cover = Service<CoverArt::IGrabber>::get()->getFromRelease(*releaseId, size);
response.out().write(reinterpret_cast<const char*>(cover->getData()), cover->getDataSize());
response.setMimeType(std::string {cover->getMimeType()});