diff --git a/src/libs/database/impl/TrackEmbeddedImage.cpp b/src/libs/database/impl/TrackEmbeddedImage.cpp index 0bf1df18..c6116b5f 100644 --- a/src/libs/database/impl/TrackEmbeddedImage.cpp +++ b/src/libs/database/impl/TrackEmbeddedImage.cpp @@ -41,8 +41,9 @@ namespace lms::db if (params.track.isValid() || params.release.isValid() || params.trackList.isValid() - || params.sortMethod == TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize - || params.sortMethod == TrackEmbeddedImageSortMethod::FrontTypeThenSize) + || params.imageType.has_value() + || 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"); @@ -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.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) { case TrackEmbeddedImageSortMethod::None: 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); 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); break; } diff --git a/src/libs/database/include/database/TrackEmbeddedImage.hpp b/src/libs/database/include/database/TrackEmbeddedImage.hpp index a5efb896..e323e093 100644 --- a/src/libs/database/include/database/TrackEmbeddedImage.hpp +++ b/src/libs/database/include/database/TrackEmbeddedImage.hpp @@ -49,6 +49,7 @@ namespace lms::db TrackId track; ReleaseId release; TrackListId trackList; + std::optional imageType; TrackEmbeddedImageSortMethod sortMethod{ TrackEmbeddedImageSortMethod::None }; FindParameters& setRange(std::optional _range) @@ -71,6 +72,11 @@ namespace lms::db trackList = _trackList; return *this; } + FindParameters& setImageType(std::optional _imageType) + { + imageType = _imageType; + return *this; + } FindParameters& setSortMethod(TrackEmbeddedImageSortMethod _sortMethod) { sortMethod = _sortMethod; diff --git a/src/libs/database/include/database/Types.hpp b/src/libs/database/include/database/Types.hpp index a126c12e..74bee666 100644 --- a/src/libs/database/include/database/Types.hpp +++ b/src/libs/database/include/database/Types.hpp @@ -171,8 +171,9 @@ namespace lms::db enum class TrackEmbeddedImageSortMethod { None, - MediaTypeThenFrontTypeThenSize, - FrontTypeThenSize, + SizeDesc, + MediaTypeThenFrontTypeThenSizeDescDesc, + FrontTypeThenSizeDesc, }; enum class TrackListSortMethod diff --git a/src/libs/database/test/TrackEmbeddedImage.cpp b/src/libs/database/test/TrackEmbeddedImage.cpp index 0a06fd24..c33d9ffb 100644 --- a/src/libs/database/test/TrackEmbeddedImage.cpp +++ b/src/libs/database/test/TrackEmbeddedImage.cpp @@ -133,19 +133,43 @@ namespace lms::db::tests auto transaction{ session.createReadTransaction() }; TrackEmbeddedImage::FindParameters params; - params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSize); + 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::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() }; TrackEmbeddedImage::FindParameters params; params.setRelease(release.getId()); - params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); + params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc); bool visited{}; TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; }); @@ -162,7 +186,7 @@ namespace lms::db::tests TrackEmbeddedImage::FindParameters params; params.setRelease(release.getId()); - params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); + params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc); bool visited{}; TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; }); @@ -174,7 +198,7 @@ namespace lms::db::tests TrackEmbeddedImage::FindParameters params; params.setTrack(track.getId()); - params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSize); + params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc); bool visited{}; TrackEmbeddedImage::find(session, params, [&](const auto&) { visited = true; }); @@ -196,6 +220,7 @@ namespace lms::db::tests { auto transaction{ session.createWriteTransaction() }; link1.get().modify()->setType(ImageType::FrontCover); + image1.get().modify()->setSize(750); link2.get().modify()->setType(ImageType::Media); image2.get().modify()->setSize(1000); link3.get().modify()->setType(ImageType::Media); @@ -206,7 +231,7 @@ namespace lms::db::tests auto transaction{ session.createReadTransaction() }; TrackEmbeddedImage::FindParameters params; - params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSize); + params.setSortMethod(TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc); std::vector visitedIds; 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() }; TrackEmbeddedImage::FindParameters params; - params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); + params.setSortMethod(TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc); std::vector visitedIds; 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[2], image1.getId()); } + + { + auto transaction{ session.createReadTransaction() }; + + TrackEmbeddedImage::FindParameters params; + params.setSortMethod(TrackEmbeddedImageSortMethod::SizeDesc); + + std::vector 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) diff --git a/src/libs/services/artwork/impl/ArtworkService.cpp b/src/libs/services/artwork/impl/ArtworkService.cpp index 4c4da83d..006d21d5 100644 --- a/src/libs/services/artwork/impl/ArtworkService.cpp +++ b/src/libs/services/artwork/impl/ArtworkService.cpp @@ -161,7 +161,7 @@ namespace lms::cover db::TrackEmbeddedImage::FindParameters params; params.setTrack(trackId); - params.setSortMethod(db::TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); + params.setSortMethod(db::TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc); params.setRange(db::Range{ .offset = 0, .size = 1 }); db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) { @@ -184,6 +184,25 @@ namespace lms::cover 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) { db::Session& session{ _db.getTLSSession() }; @@ -202,7 +221,7 @@ namespace lms::cover { db::TrackEmbeddedImage::FindParameters params; params.setRelease(releaseId); - params.setSortMethod(db::TrackEmbeddedImageSortMethod::FrontTypeThenSize); + params.setSortMethod(db::TrackEmbeddedImageSortMethod::FrontTypeThenSizeDesc); params.setRange(db::Range{ .offset = 0, .size = 1 }); db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) { @@ -223,7 +242,7 @@ namespace lms::cover db::TrackEmbeddedImage::FindParameters params; params.setTrackList(trackListId); - params.setSortMethod(db::TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSize); + params.setSortMethod(db::TrackEmbeddedImageSortMethod::MediaTypeThenFrontTypeThenSizeDescDesc); params.setRange(db::Range{ .offset = 0, .size = 1 }); db::TrackEmbeddedImage::find(session, params, [&](const db::TrackEmbeddedImage::pointer& image) { diff --git a/src/libs/services/artwork/impl/ArtworkService.hpp b/src/libs/services/artwork/impl/ArtworkService.hpp index 9d90d1a7..a5dd7a4d 100644 --- a/src/libs/services/artwork/impl/ArtworkService.hpp +++ b/src/libs/services/artwork/impl/ArtworkService.hpp @@ -49,6 +49,7 @@ namespace lms::cover private: ImageFindResult findArtistImage(db::ArtistId artistId) override; ImageFindResult findTrackImage(db::TrackId trackId) override; + ImageFindResult findTrackMediaImage(db::TrackId trackId) override; ImageFindResult findReleaseImage(db::ReleaseId releaseId) override; ImageFindResult findTrackListImage(db::TrackListId trackListId) override; diff --git a/src/libs/services/artwork/include/services/artwork/IArtworkService.hpp b/src/libs/services/artwork/include/services/artwork/IArtworkService.hpp index 90a8319c..220bde91 100644 --- a/src/libs/services/artwork/include/services/artwork/IArtworkService.hpp +++ b/src/libs/services/artwork/include/services/artwork/IArtworkService.hpp @@ -51,7 +51,10 @@ namespace lms::cover // Will get Disc/Media artwork if available, otherwise, will fallback on release artwork 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 findTrackListImage(db::TrackListId trackListId) = 0;