Added more fallbacks for track artworks

This commit is contained in:
emeric
2025-06-15 14:41:58 +02:00
parent 9629a8cc97
commit 3a7f010a7d
5 changed files with 220 additions and 38 deletions
+1
View File
@@ -229,6 +229,7 @@ namespace lms::db
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_embedded_image_link_id_idx ON track_embedded_image_link(id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_embedded_image_link_track_id_idx ON track_embedded_image_link(track_id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_embedded_image_link_track_embedded_image_id_track_id_idx ON track_embedded_image_link(track_embedded_image_id, track_id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_embedded_image_link_type_track_embedded_image_id_track_id_idx ON track_embedded_image_link(type,track_embedded_image_id,track_id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS image_directory_stem_idx ON image(directory_id, stem COLLATE NOCASE)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS image_id_idx ON image(id)");
+28 -3
View File
@@ -38,7 +38,9 @@ namespace lms::db
auto query{ session.getDboSession()->query<Wt::Dbo::ptr<TrackEmbeddedImage>>("SELECT t_e_i FROM track_embedded_image t_e_i") };
if (params.track.isValid()
if (params.artist.isValid()
|| params.discNumber.has_value()
|| params.track.isValid()
|| params.release.isValid()
|| params.trackList.isValid()
|| !params.imageTypes.empty()
@@ -47,13 +49,36 @@ namespace lms::db
{
query.join("track_embedded_image_link t_e_i_l ON t_e_i_l.track_embedded_image_id = t_e_i.id");
if (params.artist.isValid())
{
query.join("track_artist_link t_a_l ON t_a_l.track_id = t_e_i_l.track_id");
query.where("t_a_l.artist_id = ?").bind(params.artist);
if (!params.trackArtistLinkTypes.empty())
{
std::string clause{ "t_a_l.type IN (" };
for (const auto& type : params.trackArtistLinkTypes)
{
if (clause.back() != '(')
clause += ",";
clause += "?";
query.bind(type);
}
clause += ")";
query.where(clause);
}
}
if (params.track.isValid())
query.where("t_e_i_l.track_id = ?").bind(params.track);
if (params.release.isValid())
if (params.release.isValid() || params.discNumber.has_value())
{
query.join("track t ON t_e_i_l.track_id = t.id");
query.where("t.release_id = ?").bind(params.release);
if (params.release.isValid())
query.where("t.release_id = ?").bind(params.release);
if (params.discNumber.has_value())
query.where("t.disc_number = ?").bind(params.discNumber.value());
}
if (params.trackList.isValid())
@@ -26,6 +26,7 @@
#include <Wt/Dbo/Dbo.h>
#include "core/EnumSet.hpp"
#include "database/ArtistId.hpp"
#include "database/Object.hpp"
#include "database/ReleaseId.hpp"
#include "database/TrackEmbeddedImageId.hpp"
@@ -47,8 +48,11 @@ namespace lms::db
struct FindParameters
{
std::optional<Range> range;
ArtistId artist;
core::EnumSet<TrackArtistLinkType> trackArtistLinkTypes;
TrackId track;
ReleaseId release;
std::optional<int> discNumber;
TrackListId trackList;
core::EnumSet<ImageType> imageTypes;
TrackEmbeddedImageSortMethod sortMethod{ TrackEmbeddedImageSortMethod::None };
@@ -58,6 +62,13 @@ namespace lms::db
range = _range;
return *this;
}
FindParameters& setArtist(ArtistId _artist, core::EnumSet<TrackArtistLinkType> _trackArtistLinkTypes = {})
{
artist = _artist;
trackArtistLinkTypes = _trackArtistLinkTypes;
return *this;
}
FindParameters& setTrack(TrackId _track)
{
track = _track;
@@ -68,6 +79,11 @@ namespace lms::db
release = _release;
return *this;
}
FindParameters& setDiscNumber(std::optional<int> _discNumber)
{
discNumber = _discNumber;
return *this;
}
FindParameters& setTrackList(TrackListId _trackList)
{
trackList = _trackList;
@@ -271,6 +271,77 @@ namespace lms::db::tests
}
}
TEST_F(DatabaseFixture, TrackEmbeddedImage_findByParams_artist)
{
ScopedTrackEmbeddedImage image{ session };
ScopedTrack track{ session };
ScopedArtist artist{ session, "MyArtist" };
ScopedTrackEmbeddedImageLink link{ session, track.lockAndGet(), image.lockAndGet() };
{
auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
}
{
auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params;
params.setArtist(artist.getId());
bool visited{};
TrackEmbeddedImage::find(session, params, [&](const TrackEmbeddedImage::pointer&) { visited = true; });
ASSERT_TRUE(visited);
}
{
auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params;
params.setArtist(artist.getId(), { TrackArtistLinkType::ReleaseArtist });
bool visited{};
TrackEmbeddedImage::find(session, params, [&](const TrackEmbeddedImage::pointer&) { visited = true; });
ASSERT_FALSE(visited);
}
}
TEST_F(DatabaseFixture, TrackEmbeddedImage_findByParams_discNumber)
{
ScopedTrackEmbeddedImage image{ session };
ScopedTrack track{ session };
ScopedRelease release{ session, "MyRelease" };
ScopedTrackEmbeddedImageLink link{ session, track.lockAndGet(), image.lockAndGet() };
{
auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get());
track.get().modify()->setDiscNumber(1);
}
{
auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params;
params.setDiscNumber(1);
bool visited{};
TrackEmbeddedImage::find(session, params, [&](const TrackEmbeddedImage::pointer&) { visited = true; });
ASSERT_TRUE(visited);
}
{
auto transaction{ session.createReadTransaction() };
TrackEmbeddedImage::FindParameters params;
params.setDiscNumber(2);
bool visited{};
TrackEmbeddedImage::find(session, params, [&](const TrackEmbeddedImage::pointer&) { visited = true; });
ASSERT_FALSE(visited);
}
}
TEST_F(DatabaseFixture, Track_findByEmbeddedImage)
{
ScopedTrackEmbeddedImage image{ session };