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()});
+2 -6
View File
@@ -250,13 +250,9 @@ int main(int argc, char* argv[])
else
throw LmsException {"Bad value '" + authenticationBackend + "' for 'authentication-backend'"};
Service<CoverArt::IGrabber> coverArtService {CoverArt::createGrabber(argv[0],
server.appRoot() + "/images/unknown-cover.jpg",
config->getULong("cover-max-cache-size", 30) * 1000 * 1000,
config->getULong("cover-max-file-size", 10) * 1000 * 1000,
config->getULong("cover-jpeg-quality", 75))};
Service<CoverArt::IGrabber> coverArtService {CoverArt::createGrabber(database, argv[0], server.appRoot() + "/images/unknown-cover.jpg")};
Service<Recommendation::IEngine> recommendationEngineService {Recommendation::createEngine(database)};
Service<Scanner::IScanner> scannerService {Scanner::createScanner(/*ioContext,*/ database, *recommendationEngineService)};
Service<Scanner::IScanner> scannerService {Scanner::createScanner(database, *recommendationEngineService)};
scannerService->getEvents().scanComplete.connect([&]
{
+2 -2
View File
@@ -96,7 +96,7 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
return;
}
cover = Service<CoverArt::IGrabber>::get()->getFromTrack(LmsApp->getDbSession(), *trackId, *size);
cover = Service<CoverArt::IGrabber>::get()->getFromTrack(*trackId, *size);
}
else if (releaseIdStr)
{
@@ -106,7 +106,7 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
if (!releaseId)
return;
cover = Service<CoverArt::IGrabber>::get()->getFromRelease(LmsApp->getDbSession(), *releaseId, *size);
cover = Service<CoverArt::IGrabber>::get()->getFromRelease(*releaseId, *size);
}
else
{
+5 -9
View File
@@ -47,7 +47,7 @@ dumpTrackCovers(Database::Session& session, CoverArt::ImageSize width)
for (const Database::TrackId trackId : trackIds)
{
std::cout << "Getting cover for track id " << trackId.toString() << std::endl;
Service<CoverArt::IGrabber>::get()->getFromTrack(session, trackId, width);
Service<CoverArt::IGrabber>::get()->getFromTrack(trackId, width);
}
}
@@ -82,15 +82,11 @@ int main(int argc, char *argv[])
}
Service<IConfig> config {createConfig(vm["conf"].as<std::string>())};
Service<CoverArt::IGrabber> coverArtService {CoverArt::createGrabber(argv[0],
vm["default-cover"].as<std::string>(),
config->getULong("cover-max-cache-size", 30) * 1000 * 1000,
config->getULong("cover-max-file-size", 10) * 1000 * 1000,
config->getULong("cover-jpeg-quality", vm["quality"].as<unsigned>())
)};
Database::Db db {config->getPath("working-dir") / "lms.db"};
Service<CoverArt::IGrabber> coverArtService {CoverArt::createGrabber(db, argv[0], vm["default-cover"].as<std::string>())};
coverArtService->setJpegQuality(config->getULong("cover-jpeg-quality", vm["quality"].as<unsigned>()));
Database::Session session {db};
if (vm.count("tracks"))