Now resolve the preferred artist artworks during scan steps
This commit is contained in:
@@ -21,9 +21,9 @@
|
||||
#include <Wt/Dbo/WtSqlTraits.h>
|
||||
|
||||
#include "core/ILogger.hpp"
|
||||
#include "database/Artwork.hpp"
|
||||
#include "database/Cluster.hpp"
|
||||
#include "database/Directory.hpp"
|
||||
#include "database/Image.hpp"
|
||||
#include "database/Release.hpp"
|
||||
#include "database/Session.hpp"
|
||||
#include "database/Track.hpp"
|
||||
@@ -315,14 +315,14 @@ AND NOT EXISTS (
|
||||
return getMBID().has_value();
|
||||
}
|
||||
|
||||
ObjectPtr<Image> Artist::getImage() const
|
||||
ObjectPtr<Artwork> Artist::getPreferredArtwork() const
|
||||
{
|
||||
return ObjectPtr<Image>{ _image };
|
||||
return ObjectPtr<Artwork>{ _preferredArtwork };
|
||||
}
|
||||
|
||||
ImageId Artist::getImageId() const
|
||||
ArtworkId Artist::getPreferredArtworkId() const
|
||||
{
|
||||
return _image.id();
|
||||
return _preferredArtwork.id();
|
||||
}
|
||||
|
||||
RangeResults<ArtistId> Artist::findSimilarArtistIds(core::EnumSet<TrackArtistLinkType> artistLinkTypes, std::optional<Range> range) const
|
||||
@@ -421,8 +421,8 @@ AND NOT EXISTS (
|
||||
LMS_LOG(DB, WARNING, "Artist sort name too long, truncated to '" << _sortName << "'");
|
||||
}
|
||||
|
||||
void Artist::setImage(ObjectPtr<Image> image)
|
||||
void Artist::setPreferredArtwork(ObjectPtr<Artwork> artwork)
|
||||
{
|
||||
_image = getDboPtr(image);
|
||||
_preferredArtwork = getDboPtr(artwork);
|
||||
}
|
||||
} // namespace lms::db
|
||||
|
||||
@@ -1245,7 +1245,6 @@ FROM tracklist)");
|
||||
"comment" text not null,
|
||||
"preferred_artwork_id" bigint,
|
||||
constraint "fk_release_preferred_artwork" foreign key ("preferred_artwork_id") references "artwork" ("id") on delete set null deferrable initially deferred))");
|
||||
|
||||
// Migrate data, with the new preferred_artwork_id field set to null
|
||||
utils::executeCommand(*session.getDboSession(), R"(INSERT INTO release_backup
|
||||
SELECT
|
||||
@@ -1310,7 +1309,6 @@ FROM release)");
|
||||
constraint "fk_track_preferred_artwork" foreign key ("preferred_artwork_id") references "artwork" ("id") on delete set null deferrable initially deferred,
|
||||
constraint "fk_track_preferred_media_artwork" foreign key ("preferred_media_artwork_id") references "artwork" ("id") on delete set null deferrable initially deferred
|
||||
))");
|
||||
|
||||
// Migrate data, with the new preferred_artwork_id and preferred_media_artwork_id fields set to null
|
||||
utils::executeCommand(*session.getDboSession(), R"(INSERT INTO track_backup
|
||||
SELECT
|
||||
@@ -1354,6 +1352,30 @@ FROM track)");
|
||||
utils::executeCommand(*session.getDboSession(), "DROP TABLE track");
|
||||
utils::executeCommand(*session.getDboSession(), "ALTER TABLE track_backup RENAME TO track");
|
||||
|
||||
// Replaced image by artwork for artist
|
||||
utils::executeCommand(*session.getDboSession(), R"(CREATE TABLE IF NOT EXISTS "artist_backup" (
|
||||
"id" integer primary key autoincrement,
|
||||
"version" integer not null,
|
||||
"name" text not null,
|
||||
"sort_name" text not null,
|
||||
"mbid" text not null,
|
||||
"preferred_artwork_id" bigint,
|
||||
constraint "fk_artist_preferred_artwork" foreign key ("preferred_artwork_id") references "artwork" ("id") on delete set null deferrable initially deferred
|
||||
))");
|
||||
// Migrate data, with the new preferred_artwork_id field set to null
|
||||
utils::executeCommand(*session.getDboSession(), R"(INSERT INTO artist_backup
|
||||
SELECT
|
||||
id,
|
||||
version,
|
||||
name,
|
||||
sort_name,
|
||||
mbid,
|
||||
NULL as preferred_artwork_id
|
||||
FROM artist)");
|
||||
|
||||
utils::executeCommand(*session.getDboSession(), "DROP TABLE artist");
|
||||
utils::executeCommand(*session.getDboSession(), "ALTER TABLE artist_backup RENAME TO artist");
|
||||
|
||||
// Just increment the scan version of the settings to make the next scan rescan everything
|
||||
utils::executeCommand(*session.getDboSession(), "UPDATE scan_settings SET audio_scan_version = audio_scan_version + 1");
|
||||
}
|
||||
|
||||
@@ -198,7 +198,6 @@ namespace lms::db
|
||||
{
|
||||
auto transaction{ createWriteTransaction() };
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS artist_id_idx ON artist(id)");
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS artist_image_idx ON artist(image_id)");
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS artist_name_mbid_idx ON artist(name, mbid)");
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS artist_sort_name_nocase_idx ON artist(sort_name COLLATE NOCASE)");
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS artist_mbid_idx ON artist(mbid)");
|
||||
|
||||
@@ -31,9 +31,9 @@
|
||||
#include "core/EnumSet.hpp"
|
||||
#include "core/UUID.hpp"
|
||||
#include "database/ArtistId.hpp"
|
||||
#include "database/ArtworkId.hpp"
|
||||
#include "database/ClusterId.hpp"
|
||||
#include "database/Filters.hpp"
|
||||
#include "database/ImageId.hpp"
|
||||
#include "database/MediaLibraryId.hpp"
|
||||
#include "database/Object.hpp"
|
||||
#include "database/ReleaseId.hpp"
|
||||
@@ -43,10 +43,9 @@
|
||||
|
||||
namespace lms::db
|
||||
{
|
||||
|
||||
class Artwork;
|
||||
class Cluster;
|
||||
class ClusterType;
|
||||
class Image;
|
||||
class Release;
|
||||
class Session;
|
||||
class StarredArtist;
|
||||
@@ -137,8 +136,8 @@ namespace lms::db
|
||||
const std::string& getSortName() const { return _sortName; }
|
||||
std::optional<core::UUID> getMBID() const;
|
||||
bool hasMBID() const;
|
||||
ObjectPtr<Image> getImage() const;
|
||||
ImageId getImageId() const;
|
||||
ObjectPtr<Artwork> getPreferredArtwork() const;
|
||||
ArtworkId getPreferredArtworkId() const;
|
||||
void visitLinks(std::function<void(const ObjectPtr<TrackArtistLink>& link)> visitor) const;
|
||||
|
||||
// No artistLinkTypes means get them all
|
||||
@@ -152,7 +151,7 @@ namespace lms::db
|
||||
void setName(std::string_view name);
|
||||
void setMBID(const std::optional<core::UUID>& mbid) { _mbid = mbid ? mbid->getAsString() : ""; }
|
||||
void setSortName(std::string_view sortName);
|
||||
void setImage(ObjectPtr<Image> image);
|
||||
void setPreferredArtwork(ObjectPtr<Artwork> artwork);
|
||||
|
||||
template<class Action>
|
||||
void persist(Action& a)
|
||||
@@ -161,7 +160,7 @@ namespace lms::db
|
||||
Wt::Dbo::field(a, _sortName, "sort_name");
|
||||
Wt::Dbo::field(a, _mbid, "mbid");
|
||||
|
||||
Wt::Dbo::belongsTo(a, _image, "image", Wt::Dbo::OnDeleteSetNull);
|
||||
Wt::Dbo::belongsTo(a, _preferredArtwork, "preferred_artwork", Wt::Dbo::OnDeleteSetNull);
|
||||
Wt::Dbo::hasMany(a, _trackArtistLinks, Wt::Dbo::ManyToOne, "artist");
|
||||
Wt::Dbo::hasMany(a, _starredArtists, Wt::Dbo::ManyToMany, "user_starred_artists", "", Wt::Dbo::OnDeleteCascade);
|
||||
}
|
||||
@@ -178,7 +177,7 @@ namespace lms::db
|
||||
std::string _sortName;
|
||||
std::string _mbid; // Musicbrainz Identifier
|
||||
|
||||
Wt::Dbo::ptr<Image> _image;
|
||||
Wt::Dbo::ptr<Artwork> _preferredArtwork;
|
||||
Wt::Dbo::collection<Wt::Dbo::ptr<TrackArtistLink>> _trackArtistLinks; // Tracks involving this artist
|
||||
Wt::Dbo::collection<Wt::Dbo::ptr<StarredArtist>> _starredArtists; // starred entries for this artist
|
||||
};
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
|
||||
namespace lms::db
|
||||
{
|
||||
class Artist;
|
||||
class Directory;
|
||||
class Session;
|
||||
|
||||
@@ -99,7 +98,6 @@ namespace lms::db
|
||||
Wt::Dbo::field(a, _width, "width");
|
||||
Wt::Dbo::field(a, _height, "height");
|
||||
|
||||
Wt::Dbo::hasMany(a, _artists, Wt::Dbo::ManyToOne, "image");
|
||||
Wt::Dbo::belongsTo(a, _directory, "directory", Wt::Dbo::OnDeleteCascade);
|
||||
}
|
||||
|
||||
@@ -115,7 +113,6 @@ namespace lms::db
|
||||
int _width{};
|
||||
int _height{};
|
||||
|
||||
Wt::Dbo::collection<Wt::Dbo::ptr<Artist>> _artists;
|
||||
Wt::Dbo::ptr<Directory> _directory;
|
||||
};
|
||||
} // namespace lms::db
|
||||
|
||||
@@ -19,10 +19,12 @@
|
||||
|
||||
#include "Common.hpp"
|
||||
|
||||
#include "database/Artwork.hpp"
|
||||
#include "database/Image.hpp"
|
||||
|
||||
namespace lms::db::tests
|
||||
{
|
||||
using ScopedArtwork = ScopedEntity<db::Artwork>;
|
||||
using ScopedImage = ScopedEntity<db::Image>;
|
||||
|
||||
TEST_F(DatabaseFixture, Artist)
|
||||
@@ -711,27 +713,28 @@ namespace lms::db::tests
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(DatabaseFixture, Artist_image)
|
||||
TEST_F(DatabaseFixture, Artist_artwork)
|
||||
{
|
||||
ScopedArtist release{ session, "MyArtist" };
|
||||
ScopedImage image{ session, "/image1.jpg" };
|
||||
ScopedArtwork artwork{ session, image.lockAndGet() };
|
||||
|
||||
ScopedArtist artist{ session, "MyArtist" };
|
||||
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
EXPECT_FALSE(release.get()->getImage());
|
||||
EXPECT_FALSE(artist.get()->getPreferredArtwork());
|
||||
}
|
||||
|
||||
ScopedImage image{ session, "/myImage" };
|
||||
|
||||
{
|
||||
auto transaction{ session.createWriteTransaction() };
|
||||
release.get().modify()->setImage(image.get());
|
||||
artist.get().modify()->setPreferredArtwork(artwork.get());
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
auto artistImage(release.get()->getImage());
|
||||
ASSERT_TRUE(artistImage);
|
||||
EXPECT_EQ(artistImage->getId(), image.getId());
|
||||
auto artistArtwork(artist.get()->getPreferredArtwork());
|
||||
ASSERT_TRUE(artistArtwork);
|
||||
EXPECT_EQ(artistArtwork->getId(), artwork.getId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user