Centralized artwork lookup logic

This commit is contained in:
emeric
2025-06-15 14:34:25 +02:00
parent a008ccfacc
commit df8dd91c4d
11 changed files with 173 additions and 114 deletions
@@ -25,10 +25,13 @@
#include "core/IConfig.hpp"
#include "core/ILogger.hpp"
#include "core/Utils.hpp"
#include "database/Artist.hpp"
#include "database/Db.hpp"
#include "database/Image.hpp"
#include "database/Release.hpp"
#include "database/Session.hpp"
#include "database/Track.hpp"
#include "database/TrackEmbeddedImage.hpp"
#include "image/Exception.hpp"
#include "image/IEncodedImage.hpp"
#include "image/Image.hpp"
@@ -178,6 +181,85 @@ namespace lms::cover
return {};
}
ArtworkService::ImageFindResult ArtworkService::findArtistImage(db::ArtistId artistId)
{
db::Session& session{ _db.getTLSSession() };
auto transaction{ session.createReadTransaction() };
ImageFindResult res;
if (const db::Artist::pointer artist{ db::Artist::find(session, artistId) })
{
if (const db::ImageId imageId{ artist->getImageId() }; imageId.isValid())
res = imageId;
// TODO fallback on first release?
}
return res;
}
ArtworkService::ImageFindResult ArtworkService::findPreferredTrackImage(db::TrackId trackId)
{
db::Session& session{ _db.getTLSSession() };
auto transaction{ session.createReadTransaction() };
ImageFindResult res;
db::TrackEmbeddedImage::FindParameters params;
params.setTrack(trackId);
params.setIsPreferred(true);
params.setRange(db::Range{ .offset = 0, .size = 1 });
db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) {
res = image->getId();
});
if (res.index() == 0)
{
if (db::Track::pointer track{ db::Track::find(session, trackId) })
{
if (const db::Release::pointer release{ track->getRelease() })
{
if (const db::ImageId imageId{ release->getImageId() }; imageId.isValid())
res = imageId;
}
}
}
return res;
}
ArtworkService::ImageFindResult ArtworkService::findReleaseImage(db::ReleaseId releaseId)
{
db::Session& session{ _db.getTLSSession() };
auto transaction{ session.createReadTransaction() };
ImageFindResult res;
const db::Release::pointer release{ db::Release::find(session, releaseId) };
if (release)
{
if (const db::ImageId imageId{ release->getImageId() }; imageId.isValid())
{
res = imageId;
}
else
{
db::TrackEmbeddedImage::FindParameters params;
params.setRelease(releaseId);
params.setIsPreferred(true);
params.setSortMethod(db::TrackEmbeddedImageSortMethod::FrontCoverAndSize);
params.setRange(db::Range{ .offset = 0, .size = 1 });
db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) {
res = image->getId();
});
}
}
return res;
}
std::shared_ptr<image::IEncodedImage> ArtworkService::getImage(db::ImageId imageId, std::optional<image::ImageSize> width)
{
const ImageCache::EntryDesc cacheEntryDesc{ imageId, width };
@@ -47,6 +47,10 @@ namespace lms::cover
ArtworkService& operator=(const ArtworkService&) = delete;
private:
ImageFindResult findArtistImage(db::ArtistId artistId) override;
ImageFindResult findPreferredTrackImage(db::TrackId trackId) override;
ImageFindResult findReleaseImage(db::ReleaseId releaseId) override;
std::shared_ptr<image::IEncodedImage> getImage(db::ImageId imageId, std::optional<image::ImageSize> width) override;
std::shared_ptr<image::IEncodedImage> getTrackEmbeddedImage(db::TrackEmbeddedImageId trackEmbeddedImageId, std::optional<image::ImageSize> width) override;
@@ -22,9 +22,13 @@
#include <filesystem>
#include <memory>
#include <optional>
#include <variant>
#include "database/ArtistId.hpp"
#include "database/ImageId.hpp"
#include "database/ReleaseId.hpp"
#include "database/TrackEmbeddedImageId.hpp"
#include "database/TrackId.hpp"
#include "image/IEncodedImage.hpp"
namespace lms::db
@@ -39,6 +43,13 @@ namespace lms::cover
public:
virtual ~IArtworkService() = default;
// Helpers to find artworks
using ImageFindResult = std::variant<std::monostate, db::ImageId, db::TrackEmbeddedImageId>;
virtual ImageFindResult findArtistImage(db::ArtistId artistId) = 0;
virtual ImageFindResult findPreferredTrackImage(db::TrackId trackId) = 0;
virtual ImageFindResult findReleaseImage(db::ReleaseId releaseId) = 0;
// Image retrieval
virtual std::shared_ptr<image::IEncodedImage> getImage(db::ImageId imageId, std::optional<image::ImageSize> width) = 0;
virtual std::shared_ptr<image::IEncodedImage> getTrackEmbeddedImage(db::TrackEmbeddedImageId trackEmbeddedImageId, std::optional<image::ImageSize> width) = 0;