Added release comment support, ref #568
This commit is contained in:
@@ -35,7 +35,7 @@ namespace lms::db
|
|||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
static constexpr Version LMS_DATABASE_VERSION{ 80 };
|
static constexpr Version LMS_DATABASE_VERSION{ 81 };
|
||||||
}
|
}
|
||||||
|
|
||||||
VersionInfo::VersionInfo()
|
VersionInfo::VersionInfo()
|
||||||
@@ -1063,6 +1063,15 @@ FROM tracklist)");
|
|||||||
utils::executeCommand(*session.getDboSession(), "UPDATE scan_settings SET scan_version = scan_version + 1");
|
utils::executeCommand(*session.getDboSession(), "UPDATE scan_settings SET scan_version = scan_version + 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void migrateFromV80(Session& session)
|
||||||
|
{
|
||||||
|
// Add release comment support
|
||||||
|
utils::executeCommand(*session.getDboSession(), "ALTER TABLE release ADD COLUMN comment TEXT NOT NULL DEFAULT ''");
|
||||||
|
|
||||||
|
// Just increment the scan version of the settings to make the next scan rescan everything
|
||||||
|
utils::executeCommand(*session.getDboSession(), "UPDATE scan_settings SET scan_version = scan_version + 1");
|
||||||
|
}
|
||||||
|
|
||||||
bool doDbMigration(Session& session)
|
bool doDbMigration(Session& session)
|
||||||
{
|
{
|
||||||
constexpr std::string_view outdatedMsg{ "Outdated database, please rebuild it (delete the .db file and restart)" };
|
constexpr std::string_view outdatedMsg{ "Outdated database, please rebuild it (delete the .db file and restart)" };
|
||||||
@@ -1119,6 +1128,7 @@ FROM tracklist)");
|
|||||||
{ 77, migrateFromV77 },
|
{ 77, migrateFromV77 },
|
||||||
{ 78, migrateFromV78 },
|
{ 78, migrateFromV78 },
|
||||||
{ 79, migrateFromV79 },
|
{ 79, migrateFromV79 },
|
||||||
|
{ 80, migrateFromV80 },
|
||||||
};
|
};
|
||||||
|
|
||||||
bool migrationPerformed{};
|
bool migrationPerformed{};
|
||||||
|
|||||||
@@ -255,6 +255,7 @@ namespace lms::db
|
|||||||
void visitLabels(const std::function<void(const Label::pointer& label)>& _func) const;
|
void visitLabels(const std::function<void(const Label::pointer& label)>& _func) const;
|
||||||
core::EnumSet<Advisory> getAdvisories() const;
|
core::EnumSet<Advisory> getAdvisories() const;
|
||||||
std::string_view getBarcode() const { return _barcode; }
|
std::string_view getBarcode() const { return _barcode; }
|
||||||
|
std::string_view getComment() const { return _comment; }
|
||||||
ObjectPtr<Image> getImage() const;
|
ObjectPtr<Image> getImage() const;
|
||||||
|
|
||||||
// Setters
|
// Setters
|
||||||
@@ -270,6 +271,7 @@ namespace lms::db
|
|||||||
void addLabel(ObjectPtr<Label> releaseType);
|
void addLabel(ObjectPtr<Label> releaseType);
|
||||||
void addReleaseType(ObjectPtr<ReleaseType> releaseType);
|
void addReleaseType(ObjectPtr<ReleaseType> releaseType);
|
||||||
void setBarcode(std::string_view barcode) { _barcode = barcode; }
|
void setBarcode(std::string_view barcode) { _barcode = barcode; }
|
||||||
|
void setComment(std::string_view comment) { _comment = comment; }
|
||||||
void setImage(ObjectPtr<Image> image);
|
void setImage(ObjectPtr<Image> image);
|
||||||
|
|
||||||
// Get the artists of this release
|
// Get the artists of this release
|
||||||
@@ -291,6 +293,7 @@ namespace lms::db
|
|||||||
Wt::Dbo::field(a, _artistDisplayName, "artist_display_name");
|
Wt::Dbo::field(a, _artistDisplayName, "artist_display_name");
|
||||||
Wt::Dbo::field(a, _isCompilation, "is_compilation");
|
Wt::Dbo::field(a, _isCompilation, "is_compilation");
|
||||||
Wt::Dbo::field(a, _barcode, "barcode");
|
Wt::Dbo::field(a, _barcode, "barcode");
|
||||||
|
Wt::Dbo::field(a, _comment, "comment");
|
||||||
Wt::Dbo::hasMany(a, _tracks, Wt::Dbo::ManyToOne, "release");
|
Wt::Dbo::hasMany(a, _tracks, Wt::Dbo::ManyToOne, "release");
|
||||||
|
|
||||||
Wt::Dbo::belongsTo(a, _image, "image", Wt::Dbo::OnDeleteSetNull);
|
Wt::Dbo::belongsTo(a, _image, "image", Wt::Dbo::OnDeleteSetNull);
|
||||||
@@ -316,6 +319,7 @@ namespace lms::db
|
|||||||
std::string _artistDisplayName;
|
std::string _artistDisplayName;
|
||||||
bool _isCompilation{}; // See https://picard-docs.musicbrainz.org/en/appendices/tag_mapping.html#compilation-itunes-5
|
bool _isCompilation{}; // See https://picard-docs.musicbrainz.org/en/appendices/tag_mapping.html#compilation-itunes-5
|
||||||
std::string _barcode;
|
std::string _barcode;
|
||||||
|
std::string _comment;
|
||||||
|
|
||||||
Wt::Dbo::ptr<Image> _image;
|
Wt::Dbo::ptr<Image> _image;
|
||||||
Wt::Dbo::collection<Wt::Dbo::ptr<Track>> _tracks;
|
Wt::Dbo::collection<Wt::Dbo::ptr<Track>> _tracks;
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ namespace lms::metadata
|
|||||||
{ TagType::AlbumArtistSortOrder, { "ALBUMARTISTSORT", "TSO2" } },
|
{ TagType::AlbumArtistSortOrder, { "ALBUMARTISTSORT", "TSO2" } },
|
||||||
{ TagType::AlbumArtists, { "ALBUMARTISTS" } },
|
{ TagType::AlbumArtists, { "ALBUMARTISTS" } },
|
||||||
{ TagType::AlbumArtistsSortOrder, { "ALBUMARTISTSSORT" } },
|
{ TagType::AlbumArtistsSortOrder, { "ALBUMARTISTSSORT" } },
|
||||||
|
{ TagType::AlbumComment, { "ALBUMCOMMENT", "MUSICBRAINZ_ALBUMCOMMENT, MUSICBRAINZ ALBUM COMMENT", "MUSICBRAINZ/ALBUM COMMENT", "ALBUMVERSION", "VERSION" } },
|
||||||
{ TagType::AlbumSortOrder, { "ALBUMSORT", "ALBUM-SORT" } },
|
{ TagType::AlbumSortOrder, { "ALBUMSORT", "ALBUM-SORT" } },
|
||||||
{ TagType::Arranger, { "ARRANGER" } },
|
{ TagType::Arranger, { "ARRANGER" } },
|
||||||
{ TagType::Artist, { "ARTIST" } },
|
{ TagType::Artist, { "ARTIST" } },
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ namespace lms::metadata
|
|||||||
AlbumArtists, // non standard
|
AlbumArtists, // non standard
|
||||||
AlbumArtistSortOrder,
|
AlbumArtistSortOrder,
|
||||||
AlbumArtistsSortOrder, // non standard
|
AlbumArtistsSortOrder, // non standard
|
||||||
|
AlbumComment, // non standard
|
||||||
AlbumSortOrder,
|
AlbumSortOrder,
|
||||||
Arranger,
|
Arranger,
|
||||||
Artist,
|
Artist,
|
||||||
|
|||||||
@@ -520,6 +520,7 @@ namespace lms::metadata
|
|||||||
release->isCompilation = getTagValueAs<bool>(tagReader, TagType::Compilation).value_or(false);
|
release->isCompilation = getTagValueAs<bool>(tagReader, TagType::Compilation).value_or(false);
|
||||||
release->barcode = getTagValueAs<std::string>(tagReader, TagType::Barcode).value_or("");
|
release->barcode = getTagValueAs<std::string>(tagReader, TagType::Barcode).value_or("");
|
||||||
release->labels = getTagValuesAs<std::string>(tagReader, TagType::RecordLabel, _defaultTagDelimiters);
|
release->labels = getTagValuesAs<std::string>(tagReader, TagType::RecordLabel, _defaultTagDelimiters);
|
||||||
|
release->comment = getTagValueAs<std::string>(tagReader, TagType::AlbumComment).value_or("");
|
||||||
if (!release->mediumCount)
|
if (!release->mediumCount)
|
||||||
{
|
{
|
||||||
// mediumCount may be encoded as "position/count"
|
// mediumCount may be encoded as "position/count"
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ namespace lms::metadata
|
|||||||
{ TagType::AlbumArtistSortOrder, { "ALBUMARTISTSORT" } },
|
{ TagType::AlbumArtistSortOrder, { "ALBUMARTISTSORT" } },
|
||||||
{ TagType::AlbumArtists, { "ALBUMARTISTS" } },
|
{ TagType::AlbumArtists, { "ALBUMARTISTS" } },
|
||||||
{ TagType::AlbumArtistsSortOrder, { "ALBUMARTISTSSORT" } },
|
{ TagType::AlbumArtistsSortOrder, { "ALBUMARTISTSSORT" } },
|
||||||
|
{ TagType::AlbumComment, { "ALBUMCOMMENT", "MUSICBRAINZ_ALBUMCOMMENT, MUSICBRAINZ ALBUM COMMENT", "ALBUMVERSION", "VERSION" } },
|
||||||
{ TagType::AlbumSortOrder, { "ALBUMSORT" } },
|
{ TagType::AlbumSortOrder, { "ALBUMSORT" } },
|
||||||
{ TagType::Arranger, { "ARRANGER" } },
|
{ TagType::Arranger, { "ARRANGER" } },
|
||||||
{ TagType::Artist, { "ARTIST" } },
|
{ TagType::Artist, { "ARTIST" } },
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ namespace lms::metadata
|
|||||||
std::vector<std::string> releaseTypes;
|
std::vector<std::string> releaseTypes;
|
||||||
bool isCompilation{};
|
bool isCompilation{};
|
||||||
std::string barcode;
|
std::string barcode;
|
||||||
|
std::string comment;
|
||||||
|
|
||||||
auto operator<=>(const Release&) const = default;
|
auto operator<=>(const Release&) const = default;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ namespace lms::metadata
|
|||||||
{ TagType::AlbumArtist, { "MyAlbumArtist1 & MyAlbumArtist2" } },
|
{ TagType::AlbumArtist, { "MyAlbumArtist1 & MyAlbumArtist2" } },
|
||||||
{ TagType::AlbumArtists, { "MyAlbumArtist1", "MyAlbumArtist2" } },
|
{ TagType::AlbumArtists, { "MyAlbumArtist1", "MyAlbumArtist2" } },
|
||||||
{ TagType::AlbumArtistsSortOrder, { "MyAlbumArtist1SortName", "MyAlbumArtist2SortName" } },
|
{ TagType::AlbumArtistsSortOrder, { "MyAlbumArtist1SortName", "MyAlbumArtist2SortName" } },
|
||||||
|
{ TagType::AlbumComment, { "MyAlbumComment" } },
|
||||||
{ TagType::Barcode, { "MyBarcode" } },
|
{ TagType::Barcode, { "MyBarcode" } },
|
||||||
{ TagType::Comment, { "Comment1", "Comment2" } },
|
{ TagType::Comment, { "Comment1", "Comment2" } },
|
||||||
{ TagType::Compilation, { "1" } },
|
{ TagType::Compilation, { "1" } },
|
||||||
@@ -202,28 +203,30 @@ namespace lms::metadata
|
|||||||
|
|
||||||
// Release
|
// Release
|
||||||
ASSERT_TRUE(track->medium->release.has_value());
|
ASSERT_TRUE(track->medium->release.has_value());
|
||||||
EXPECT_EQ(track->medium->release->artistDisplayName, "MyAlbumArtist1 & MyAlbumArtist2");
|
const Release& release{ track->medium->release.value() };
|
||||||
ASSERT_EQ(track->medium->release->artists.size(), 2);
|
EXPECT_EQ(release.artistDisplayName, "MyAlbumArtist1 & MyAlbumArtist2");
|
||||||
EXPECT_EQ(track->medium->release->artists[0].name, "MyAlbumArtist1");
|
ASSERT_EQ(release.artists.size(), 2);
|
||||||
EXPECT_EQ(track->medium->release->artists[0].sortName, "MyAlbumArtist1SortName");
|
EXPECT_EQ(release.artists[0].name, "MyAlbumArtist1");
|
||||||
EXPECT_EQ(track->medium->release->artists[0].mbid, core::UUID::fromString("6fbf097c-1487-43e8-874b-50dd074398a7"));
|
EXPECT_EQ(release.artists[0].sortName, "MyAlbumArtist1SortName");
|
||||||
EXPECT_EQ(track->medium->release->artists[1].name, "MyAlbumArtist2");
|
EXPECT_EQ(release.artists[0].mbid, core::UUID::fromString("6fbf097c-1487-43e8-874b-50dd074398a7"));
|
||||||
EXPECT_EQ(track->medium->release->artists[1].sortName, "MyAlbumArtist2SortName");
|
EXPECT_EQ(release.artists[1].name, "MyAlbumArtist2");
|
||||||
EXPECT_EQ(track->medium->release->artists[1].mbid, core::UUID::fromString("5ed3d6b3-2aed-4a03-828c-3c4d4f7406e1"));
|
EXPECT_EQ(release.artists[1].sortName, "MyAlbumArtist2SortName");
|
||||||
EXPECT_TRUE(track->medium->release->isCompilation);
|
EXPECT_EQ(release.artists[1].mbid, core::UUID::fromString("5ed3d6b3-2aed-4a03-828c-3c4d4f7406e1"));
|
||||||
EXPECT_EQ(track->medium->release->barcode, "MyBarcode");
|
EXPECT_TRUE(release.isCompilation);
|
||||||
ASSERT_EQ(track->medium->release->labels.size(), 2);
|
EXPECT_EQ(release.barcode, "MyBarcode");
|
||||||
EXPECT_EQ(track->medium->release->labels[0], "Label1");
|
ASSERT_EQ(release.labels.size(), 2);
|
||||||
EXPECT_EQ(track->medium->release->labels[1], "Label2");
|
EXPECT_EQ(release.labels[0], "Label1");
|
||||||
ASSERT_TRUE(track->medium->release->mbid.has_value());
|
EXPECT_EQ(release.labels[1], "Label2");
|
||||||
EXPECT_EQ(track->medium->release->mbid.value(), core::UUID::fromString("3fa39992-b786-4585-a70e-85d5cc15ef69"));
|
ASSERT_TRUE(release.mbid.has_value());
|
||||||
EXPECT_EQ(track->medium->release->groupMBID.value(), core::UUID::fromString("5b1a5a44-8420-4426-9b86-d25dc8d04838"));
|
EXPECT_EQ(release.mbid.value(), core::UUID::fromString("3fa39992-b786-4585-a70e-85d5cc15ef69"));
|
||||||
EXPECT_EQ(track->medium->release->mediumCount, 3);
|
EXPECT_EQ(release.groupMBID.value(), core::UUID::fromString("5b1a5a44-8420-4426-9b86-d25dc8d04838"));
|
||||||
EXPECT_EQ(track->medium->release->name, "MyAlbum");
|
EXPECT_EQ(release.mediumCount, 3);
|
||||||
EXPECT_EQ(track->medium->release->sortName, "MyAlbumSortName");
|
EXPECT_EQ(release.name, "MyAlbum");
|
||||||
|
EXPECT_EQ(release.sortName, "MyAlbumSortName");
|
||||||
|
EXPECT_EQ(release.comment, "MyAlbumComment");
|
||||||
{
|
{
|
||||||
std::vector<std::string> expectedReleaseTypes{ "Album", "Compilation" };
|
std::vector<std::string> expectedReleaseTypes{ "Album", "Compilation" };
|
||||||
EXPECT_EQ(track->medium->release->releaseTypes, expectedReleaseTypes);
|
EXPECT_EQ(release.releaseTypes, expectedReleaseTypes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -166,6 +166,8 @@ namespace lms::scanner
|
|||||||
release.modify()->setCompilation(releaseInfo.isCompilation);
|
release.modify()->setCompilation(releaseInfo.isCompilation);
|
||||||
if (release->getBarcode() != releaseInfo.barcode)
|
if (release->getBarcode() != releaseInfo.barcode)
|
||||||
release.modify()->setBarcode(releaseInfo.barcode);
|
release.modify()->setBarcode(releaseInfo.barcode);
|
||||||
|
if (release->getComment() != releaseInfo.comment)
|
||||||
|
release.modify()->setComment(releaseInfo.comment);
|
||||||
if (release->getReleaseTypeNames() != releaseInfo.releaseTypes)
|
if (release->getReleaseTypeNames() != releaseInfo.releaseTypes)
|
||||||
{
|
{
|
||||||
release.modify()->clearReleaseTypes();
|
release.modify()->clearReleaseTypes();
|
||||||
|
|||||||
@@ -94,14 +94,17 @@ namespace lms::metadata
|
|||||||
if (release.mediumCount)
|
if (release.mediumCount)
|
||||||
std::cout << "\tMediumCount: " << *release.mediumCount << std::endl;
|
std::cout << "\tMediumCount: " << *release.mediumCount << std::endl;
|
||||||
|
|
||||||
if (!release.artistDisplayName.empty())
|
|
||||||
std::cout << "\tDisplay artist: " << release.artistDisplayName << std::endl;
|
|
||||||
|
|
||||||
std::cout << "\tIsCompilation: " << std::boolalpha << release.isCompilation << std::endl;
|
std::cout << "\tIsCompilation: " << std::boolalpha << release.isCompilation << std::endl;
|
||||||
|
|
||||||
if (!release.barcode.empty())
|
if (!release.barcode.empty())
|
||||||
std::cout << "\tBarcode: " << release.barcode << std::endl;
|
std::cout << "\tBarcode: " << release.barcode << std::endl;
|
||||||
|
|
||||||
|
if (!release.comment.empty())
|
||||||
|
std::cout << "\tComment: " << release.comment << std::endl;
|
||||||
|
|
||||||
|
if (!release.artistDisplayName.empty())
|
||||||
|
std::cout << "\tDisplay artist: " << release.artistDisplayName << std::endl;
|
||||||
|
|
||||||
for (const Artist& artist : release.artists)
|
for (const Artist& artist : release.artists)
|
||||||
std::cout << "\tRelease artist: " << artist << std::endl;
|
std::cout << "\tRelease artist: " << artist << std::endl;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user