Added a helper to get the disc cover for a given track

This commit is contained in:
emeric
2025-06-15 14:41:58 +02:00
parent 4b3e8032cb
commit f906212fc4
7 changed files with 92 additions and 16 deletions
+11 -4
View File
@@ -41,8 +41,9 @@ namespace lms::db
if (params.track.isValid() if (params.track.isValid()
|| params.release.isValid() || params.release.isValid()
|| params.trackList.isValid() || params.trackList.isValid()
|| params.sortMethod == TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize || params.imageType.has_value()
|| params.sortMethod == TrackEmbeddedImageSortMethod::FrontTypeThenSize) || params.sortMethod == TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc
|| params.sortMethod == TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc)
{ {
query.join("track_embedded_image_link t_e_i_l ON t_e_i_l.track_embedded_image_id = t_e_i.id"); query.join("track_embedded_image_link t_e_i_l ON t_e_i_l.track_embedded_image_id = t_e_i.id");
@@ -60,16 +61,22 @@ namespace lms::db
query.join("tracklist_entry t_l_e ON t_l_e.track_id = t_e_i_l.track_id"); query.join("tracklist_entry t_l_e ON t_l_e.track_id = t_e_i_l.track_id");
query.where("t_l_e.tracklist_id = ?").bind(params.trackList); query.where("t_l_e.tracklist_id = ?").bind(params.trackList);
} }
if (params.imageType.has_value())
query.where("t_e_i_l.type = ?").bind(params.imageType.value());
} }
switch (params.sortMethod) switch (params.sortMethod)
{ {
case TrackEmbeddedImageSortMethod::None: case TrackEmbeddedImageSortMethod::None:
break; break;
case TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize: case TrackEmbeddedImageSortMethod::SizeDesc:
query.orderBy("t_e_i.size DESC");
break;
case TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc:
query.orderBy("CASE t_e_i_l.type WHEN ? THEN 1 WHEN ? THEN 2 ELSE 3 END, t_e_i.size DESC").bind(ImageType::Media).bind(ImageType::FrontCover); query.orderBy("CASE t_e_i_l.type WHEN ? THEN 1 WHEN ? THEN 2 ELSE 3 END, t_e_i.size DESC").bind(ImageType::Media).bind(ImageType::FrontCover);
break; break;
case TrackEmbeddedImageSortMethod::FrontTypeThenSize: case TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc:
query.orderBy("CASE WHEN t_e_i_l.type = ? THEN 0 ELSE 1 END, t_e_i.size DESC").bind(ImageType::FrontCover); query.orderBy("CASE WHEN t_e_i_l.type = ? THEN 0 ELSE 1 END, t_e_i.size DESC").bind(ImageType::FrontCover);
break; break;
} }
@@ -49,6 +49,7 @@ namespace lms::db
TrackId track; TrackId track;
ReleaseId release; ReleaseId release;
TrackListId trackList; TrackListId trackList;
std::optional<ImageType> imageType;
TrackEmbeddedImageSortMethod sortMethod{ TrackEmbeddedImageSortMethod::None }; TrackEmbeddedImageSortMethod sortMethod{ TrackEmbeddedImageSortMethod::None };
FindParameters& setRange(std::optional<Range> _range) FindParameters& setRange(std::optional<Range> _range)
@@ -71,6 +72,11 @@ namespace lms::db
trackList = _trackList; trackList = _trackList;
return *this; return *this;
} }
FindParameters& setImageType(std::optional<ImageType> _imageType)
{
imageType = _imageType;
return *this;
}
FindParameters& setSortMethod(TrackEmbeddedImageSortMethod _sortMethod) FindParameters& setSortMethod(TrackEmbeddedImageSortMethod _sortMethod)
{ {
sortMethod = _sortMethod; sortMethod = _sortMethod;
+3 -2
View File
@@ -171,8 +171,9 @@ namespace lms::db
enum class TrackEmbeddedImageSortMethod enum class TrackEmbeddedImageSortMethod
{ {
None, None,
MediaTypeThenFrontTypeThenSize, SizeDesc,
FrontTypeThenSize, MediaTypeThenFrontTypeThenSizeDescDesc,
FrontTypeThenSizeDesc,
}; };
enum class TrackListSortMethod enum class TrackListSortMethod
+45 -6
View File
@@ -133,19 +133,43 @@ namespace lms::db::tests
auto transaction{ session.createReadTransaction() }; auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params; TrackEmbeddedImage::FindParameters params;
params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSize); params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc);
bool visited{}; bool visited{};
TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; }); TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; });
EXPECT_TRUE(visited); EXPECT_TRUE(visited);
} }
{
auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params;
params.setImageType(ImageType::FrontCover);
params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc);
bool visited{};
TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; });
EXPECT_TRUE(visited);
}
{
auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params;
params.setImageType(ImageType::Media);
params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc);
bool visited{};
TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; });
EXPECT_FALSE(visited);
}
{ {
auto transaction{ session.createReadTransaction() }; auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params; TrackEmbeddedImage::FindParameters params;
params.setRelease(release.getId()); params.setRelease(release.getId());
params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc);
bool visited{}; bool visited{};
TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; }); TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; });
@@ -162,7 +186,7 @@ namespace lms::db::tests
TrackEmbeddedImage::FindParameters params; TrackEmbeddedImage::FindParameters params;
params.setRelease(release.getId()); params.setRelease(release.getId());
params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc);
bool visited{}; bool visited{};
TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; }); TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; });
@@ -174,7 +198,7 @@ namespace lms::db::tests
TrackEmbeddedImage::FindParameters params; TrackEmbeddedImage::FindParameters params;
params.setTrack(track.getId()); params.setTrack(track.getId());
params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSize); params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc);
bool visited{}; bool visited{};
TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; }); TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; });
@@ -196,6 +220,7 @@ namespace lms::db::tests
{ {
auto transaction{ session.createWriteTransaction() }; auto transaction{ session.createWriteTransaction() };
link1.get().modify()->setType(ImageType::FrontCover); link1.get().modify()->setType(ImageType::FrontCover);
image1.get().modify()->setSize(750);
link2.get().modify()->setType(ImageType::Media); link2.get().modify()->setType(ImageType::Media);
image2.get().modify()->setSize(1000); image2.get().modify()->setSize(1000);
link3.get().modify()->setType(ImageType::Media); link3.get().modify()->setType(ImageType::Media);
@@ -206,7 +231,7 @@ namespace lms::db::tests
auto transaction{ session.createReadTransaction() }; auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params; TrackEmbeddedImage::FindParameters params;
params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSize); params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc);
std::vector<TrackEmbeddedImageId> visitedIds; std::vector<TrackEmbeddedImageId> visitedIds;
TrackEmbeddedImage::find(session, params, [&](const TrackEmbeddedImage::pointer& image) { visitedIds.push_back(image->getId()); }); TrackEmbeddedImage::find(session, params, [&](const TrackEmbeddedImage::pointer& image) { visitedIds.push_back(image->getId()); });
@@ -220,7 +245,7 @@ namespace lms::db::tests
auto transaction{ session.createReadTransaction() }; auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params; TrackEmbeddedImage::FindParameters params;
params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc);
std::vector<TrackEmbeddedImageId> visitedIds; std::vector<TrackEmbeddedImageId> visitedIds;
TrackEmbeddedImage::find(session, params, [&](const TrackEmbeddedImage::pointer& image) { visitedIds.push_back(image->getId()); }); TrackEmbeddedImage::find(session, params, [&](const TrackEmbeddedImage::pointer& image) { visitedIds.push_back(image->getId()); });
@@ -229,6 +254,20 @@ namespace lms::db::tests
EXPECT_EQ(visitedIds[1], image2.getId()); EXPECT_EQ(visitedIds[1], image2.getId());
EXPECT_EQ(visitedIds[2], image1.getId()); EXPECT_EQ(visitedIds[2], image1.getId());
} }
{
auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params;
params.setSortMethod(TrackEmbeddedImageSortMethod::SizeDesc);
std::vector<TrackEmbeddedImageId> visitedIds;
TrackEmbeddedImage::find(session, params, [&](const TrackEmbeddedImage::pointer& image) { visitedIds.push_back(image->getId()); });
ASSERT_EQ(visitedIds.size(), 3);
EXPECT_EQ(visitedIds[0], image3.getId());
EXPECT_EQ(visitedIds[2], image1.getId());
EXPECT_EQ(visitedIds[1], image2.getId());
}
} }
TEST_F(DatabaseFixture, Track_findByEmbeddedImage) TEST_F(DatabaseFixture, Track_findByEmbeddedImage)
@@ -161,7 +161,7 @@ namespace lms::cover
db::TrackEmbeddedImage::FindParameters params; db::TrackEmbeddedImage::FindParameters params;
params.setTrack(trackId); params.setTrack(trackId);
params.setSortMethod(db::TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); params.setSortMethod(db::TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc);
params.setRange(db::Range{ .offset = 0, .size = 1 }); params.setRange(db::Range{ .offset = 0, .size = 1 });
db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) { db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) {
@@ -184,6 +184,25 @@ namespace lms::cover
return res; return res;
} }
ArtworkService::ImageFindResult ArtworkService::findTrackMediaImage(db::TrackId trackId)
{
db::Session& session{ _db.getTLSSession() };
auto transaction{ session.createReadTransaction() };
ImageFindResult res;
db::TrackEmbeddedImage::FindParameters params;
params.setTrack(trackId);
params.setImageType(db::ImageType::Media);
params.setSortMethod(db::TrackEmbeddedImageSortMethod::SizeDesc);
params.setRange(db::Range{ .offset = 0, .size = 1 });
db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) {
res = image->getId();
});
return res;
}
ArtworkService::ImageFindResult ArtworkService::findReleaseImage(db::ReleaseId releaseId) ArtworkService::ImageFindResult ArtworkService::findReleaseImage(db::ReleaseId releaseId)
{ {
db::Session& session{ _db.getTLSSession() }; db::Session& session{ _db.getTLSSession() };
@@ -202,7 +221,7 @@ namespace lms::cover
{ {
db::TrackEmbeddedImage::FindParameters params; db::TrackEmbeddedImage::FindParameters params;
params.setRelease(releaseId); params.setRelease(releaseId);
params.setSortMethod(db::TrackEmbeddedImageSortMethod::FrontTypeThenSize); params.setSortMethod(db::TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc);
params.setRange(db::Range{ .offset = 0, .size = 1 }); params.setRange(db::Range{ .offset = 0, .size = 1 });
db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) { db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) {
@@ -223,7 +242,7 @@ namespace lms::cover
db::TrackEmbeddedImage::FindParameters params; db::TrackEmbeddedImage::FindParameters params;
params.setTrackList(trackListId); params.setTrackList(trackListId);
params.setSortMethod(db::TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); params.setSortMethod(db::TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc);
params.setRange(db::Range{ .offset = 0, .size = 1 }); params.setRange(db::Range{ .offset = 0, .size = 1 });
db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) { db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) {
@@ -49,6 +49,7 @@ namespace lms::cover
private: private:
ImageFindResult findArtistImage(db::ArtistId artistId) override; ImageFindResult findArtistImage(db::ArtistId artistId) override;
ImageFindResult findTrackImage(db::TrackId trackId) override; ImageFindResult findTrackImage(db::TrackId trackId) override;
ImageFindResult findTrackMediaImage(db::TrackId trackId) override;
ImageFindResult findReleaseImage(db::ReleaseId releaseId) override; ImageFindResult findReleaseImage(db::ReleaseId releaseId) override;
ImageFindResult findTrackListImage(db::TrackListId trackListId) override; ImageFindResult findTrackListImage(db::TrackListId trackListId) override;
@@ -51,7 +51,10 @@ namespace lms::cover
// Will get Disc/Media artwork if available, otherwise, will fallback on release artwork // Will get Disc/Media artwork if available, otherwise, will fallback on release artwork
virtual ImageFindResult findTrackImage(db::TrackId trackId) = 0; virtual ImageFindResult findTrackImage(db::TrackId trackId) = 0;
// Will get Release if available, otherwise, will fallback on embedded artworks // Will get Disc/Media artwork if available, no fallback
virtual ImageFindResult findTrackMediaImage(db::TrackId trackId) = 0;
// Will get Release if available, otherwise, will fallback on embedded artworks
virtual ImageFindResult findReleaseImage(db::ReleaseId releaseId) = 0; virtual ImageFindResult findReleaseImage(db::ReleaseId releaseId) = 0;
virtual ImageFindResult findTrackListImage(db::TrackListId trackListId) = 0; virtual ImageFindResult findTrackListImage(db::TrackListId trackListId) = 0;