Added a helper to get the disc cover for a given track
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ namespace lms::db
|
||||
TrackId track;
|
||||
ReleaseId release;
|
||||
TrackListId trackList;
|
||||
std::optional<ImageType> imageType;
|
||||
TrackEmbeddedImageSortMethod sortMethod{ TrackEmbeddedImageSortMethod::None };
|
||||
|
||||
FindParameters& setRange(std::optional<Range> _range)
|
||||
@@ -71,6 +72,11 @@ namespace lms::db
|
||||
trackList = _trackList;
|
||||
return *this;
|
||||
}
|
||||
FindParameters& setImageType(std::optional<ImageType> _imageType)
|
||||
{
|
||||
imageType = _imageType;
|
||||
return *this;
|
||||
}
|
||||
FindParameters& setSortMethod(TrackEmbeddedImageSortMethod _sortMethod)
|
||||
{
|
||||
sortMethod = _sortMethod;
|
||||
|
||||
@@ -171,8 +171,9 @@ namespace lms::db
|
||||
enum class TrackEmbeddedImageSortMethod
|
||||
{
|
||||
None,
|
||||
MediaTypeThenFrontTypeThenSize,
|
||||
FrontTypeThenSize,
|
||||
SizeDesc,
|
||||
MediaTypeThenFrontTypeThenSizeDescDesc,
|
||||
FrontTypeThenSizeDesc,
|
||||
};
|
||||
|
||||
enum class TrackListSortMethod
|
||||
|
||||
@@ -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<TrackEmbeddedImageId> 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<TrackEmbeddedImageId> 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<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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user