diff --git a/src/libs/database/impl/Session.cpp b/src/libs/database/impl/Session.cpp index 081fe8a8..35eeb7df 100644 --- a/src/libs/database/impl/Session.cpp +++ b/src/libs/database/impl/Session.cpp @@ -40,7 +40,7 @@ namespace Database { -#define LMS_DATABASE_VERSION 12 +#define LMS_DATABASE_VERSION 13 using Version = std::size_t; @@ -151,6 +151,12 @@ CREATE TABLE IF NOT EXISTS "track_bookmark" ( // Just increment the scan version of the settings to make the next scheduled scan rescan everything ScanSettings::get(*this).modify()->incScanVersion(); } + else if (version == 12) + { + // Artist and release that have a baddly parsed name but a MBID had no chance to updat the name + // Just increment the scan version of the settings to make the next scheduled scan rescan everything + ScanSettings::get(*this).modify()->incScanVersion(); + } else { LMS_LOG(DB, ERROR) << "Database version " << version << " cannot be handled using migration"; diff --git a/src/libs/database/include/database/Artist.hpp b/src/libs/database/include/database/Artist.hpp index f53082c1..4d515c7f 100644 --- a/src/libs/database/include/database/Artist.hpp +++ b/src/libs/database/include/database/Artist.hpp @@ -71,8 +71,8 @@ class Artist : public Wt::Dbo::Dbo static std::vector getAllIdsWithClusters(Session& session, std::optional limit = {}); // Accessors - const std::string& getName(void) const { return _name; } - std::optional getMBID(void) const { return UUID::fromString(_MBID); } + const std::string& getName(void) const { return _name; } + std::optional getMBID(void) const { return UUID::fromString(_MBID); } std::vector> getReleases(const std::set& clusterIds = {}) const; // if non empty, get the releases that match all these clusters std::size_t getReleaseCount() const; @@ -86,7 +86,8 @@ class Artist : public Wt::Dbo::Dbo // size is the max number of cluster per cluster type std::vector>> getClusterGroups(std::vector> clusterTypes, std::size_t size) const; - void setMBID(const std::optional& mbid) { _MBID = mbid ? mbid->getAsString() : ""; } + void setName(std::string_view name) { _name = name; } + void setMBID(const std::optional& mbid) { _MBID = mbid ? mbid->getAsString() : ""; } void setSortName(const std::string& sortName); // Create diff --git a/src/libs/database/include/database/Release.hpp b/src/libs/database/include/database/Release.hpp index 695bcdc5..6360b90e 100644 --- a/src/libs/database/include/database/Release.hpp +++ b/src/libs/database/include/database/Release.hpp @@ -89,7 +89,7 @@ class Release : public Wt::Dbo::Dbo void setTotalTrackNumber(std::size_t num) { _totalTrackNumber = static_cast(num); } // Accessors - std::string getName() const { return _name; } + const std::string& getName() const { return _name; } std::optional getMBID() const { return UUID::fromString(_MBID); } std::optional getTotalTrackNumber() const; std::optional getTotalDiscNumber() const; @@ -101,7 +101,8 @@ class Release : public Wt::Dbo::Dbo bool hasVariousArtists() const; std::vector getSimilarReleases(std::optional offset = {}, std::optional count = {}) const; - void setMBID(const std::optional& mbid) { _MBID = mbid ? mbid->getAsString() : ""; } + void setName(std::string_view name) { _name = name; } + void setMBID(const std::optional& mbid) { _MBID = mbid ? mbid->getAsString() : ""; } template void persist(Action& a) diff --git a/src/libs/scanner/impl/MediaScanner.cpp b/src/libs/scanner/impl/MediaScanner.cpp index 236333d4..586f2995 100644 --- a/src/libs/scanner/impl/MediaScanner.cpp +++ b/src/libs/scanner/impl/MediaScanner.cpp @@ -98,7 +98,14 @@ getOrCreateArtists(Session& session, const std::vector& artist { artist = Artist::getByMBID(session, *artistInfo.musicBrainzArtistID); if (!artist) + { artist = Artist::create(session, artistInfo.name, artistInfo.musicBrainzArtistID); + } + else if (artist->getName() != artistInfo.name) + { + // Name may have been updated + artist.modify()->setName(artistInfo.name); + } artists.emplace_back(std::move(artist)); continue; @@ -139,7 +146,14 @@ getOrCreateRelease(Session& session, const MetaData::Album& album) { release = Release::getByMBID(session, *album.musicBrainzAlbumID); if (!release) + { release = Release::create(session, album.name, album.musicBrainzAlbumID); + } + else if (release->getName() != album.name) + { + // Name may have been updated + release.modify()->setName(album.name); + } return release; }