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()
|
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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user