Allow artist tags that can't have mbid (composer, lyricist, etc.) to fallback on artists which have mbid (track artists, release artists)
This commit is contained in:
@@ -45,7 +45,10 @@ Artist::getByName(Session& session, const std::string& name)
|
|||||||
{
|
{
|
||||||
session.checkSharedLocked();
|
session.checkSharedLocked();
|
||||||
|
|
||||||
Wt::Dbo::collection<Artist::pointer> res = session.getDboSession().find<Artist>().where("name = ?").bind( std::string{name, 0, _maxNameLength} );
|
Wt::Dbo::collection<Artist::pointer> res = session.getDboSession().find<Artist>()
|
||||||
|
.where("name = ?").bind(std::string {name, 0, _maxNameLength})
|
||||||
|
.orderBy("LENGTH(mbid) DESC"); // put mbid entries first
|
||||||
|
|
||||||
return std::vector<Artist::pointer>(res.begin(), res.end());
|
return std::vector<Artist::pointer>(res.begin(), res.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
namespace Database {
|
namespace Database {
|
||||||
|
|
||||||
#define LMS_DATABASE_VERSION 27
|
#define LMS_DATABASE_VERSION 28
|
||||||
|
|
||||||
using Version = std::size_t;
|
using Version = std::size_t;
|
||||||
|
|
||||||
@@ -284,6 +284,12 @@ CREATE TABLE "user_backup" (
|
|||||||
// Just increment the scan version of the settings to make the next scheduled scan rescan everything
|
// Just increment the scan version of the settings to make the next scheduled scan rescan everything
|
||||||
ScanSettings::get(*this).modify()->incScanVersion();
|
ScanSettings::get(*this).modify()->incScanVersion();
|
||||||
}
|
}
|
||||||
|
else if (version == 27)
|
||||||
|
{
|
||||||
|
// Composer, mixer, etc. support, now fallback on MBID tagged entries as there is no mean to provide MBID by tags for these kinf od artists
|
||||||
|
// Just increment the scan version of the settings to make the next scheduled scan rescan everything
|
||||||
|
ScanSettings::get(*this).modify()->incScanVersion();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LMS_LOG(DB, ERROR) << "Database version " << version << " cannot be handled using migration";
|
LMS_LOG(DB, ERROR) << "Database version " << version << " cannot be handled using migration";
|
||||||
|
|||||||
@@ -56,13 +56,13 @@ class ScanSettings : public Wt::Dbo::Dbo<ScanSettings>
|
|||||||
static pointer get(Session& session);
|
static pointer get(Session& session);
|
||||||
|
|
||||||
// Getters
|
// Getters
|
||||||
std::size_t getScanVersion() const { return _scanVersion; }
|
std::size_t getScanVersion() const { return _scanVersion; }
|
||||||
std::filesystem::path getMediaDirectory() const { return _mediaDirectory; }
|
std::filesystem::path getMediaDirectory() const { return _mediaDirectory; }
|
||||||
Wt::WTime getUpdateStartTime() const { return _startTime; }
|
Wt::WTime getUpdateStartTime() const { return _startTime; }
|
||||||
UpdatePeriod getUpdatePeriod() const { return _updatePeriod; }
|
UpdatePeriod getUpdatePeriod() const { return _updatePeriod; }
|
||||||
std::vector<Wt::Dbo::ptr<ClusterType>> getClusterTypes() const;
|
std::vector<Wt::Dbo::ptr<ClusterType>> getClusterTypes() const;
|
||||||
std::unordered_set<std::filesystem::path> getAudioFileExtensions() const;
|
std::unordered_set<std::filesystem::path> getAudioFileExtensions() const;
|
||||||
RecommendationEngineType getRecommendationEngineType() const { return _recommendationEngineType; }
|
RecommendationEngineType getRecommendationEngineType() const { return _recommendationEngineType; }
|
||||||
|
|
||||||
// Setters
|
// Setters
|
||||||
void addAudioFileExtension(const std::filesystem::path& ext);
|
void addAudioFileExtension(const std::filesystem::path& ext);
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ updateArtistIfNeeded(const Artist::pointer& artist, const MetaData::Artist& arti
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Artist::pointer>
|
std::vector<Artist::pointer>
|
||||||
getOrCreateArtists(Session& session, const std::vector<MetaData::Artist>& artistsInfo)
|
getOrCreateArtists(Session& session, const std::vector<MetaData::Artist>& artistsInfo, bool allowFallbackOnMBIDEntries)
|
||||||
{
|
{
|
||||||
std::vector<Artist::pointer> artists;
|
std::vector<Artist::pointer> artists;
|
||||||
|
|
||||||
@@ -148,11 +148,11 @@ getOrCreateArtists(Session& session, const std::vector<MetaData::Artist>& artist
|
|||||||
for (const Artist::pointer& sameNamedArtist : Artist::getByName(session, artistInfo.name))
|
for (const Artist::pointer& sameNamedArtist : Artist::getByName(session, artistInfo.name))
|
||||||
{
|
{
|
||||||
// Do not fallback on artist that is correctly tagged
|
// Do not fallback on artist that is correctly tagged
|
||||||
if (!sameNamedArtist->getMBID())
|
if (!allowFallbackOnMBIDEntries && sameNamedArtist->getMBID())
|
||||||
{
|
continue;
|
||||||
artist = sameNamedArtist;
|
|
||||||
break;
|
artist = sameNamedArtist;
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// No Artist found with the same name and without MBID -> creating
|
// No Artist found with the same name and without MBID -> creating
|
||||||
@@ -771,28 +771,31 @@ MediaScanner::scanAudioFile(const std::filesystem::path& file, bool forceScan, S
|
|||||||
assert(track);
|
assert(track);
|
||||||
|
|
||||||
track.modify()->clearArtistLinks();
|
track.modify()->clearArtistLinks();
|
||||||
for (const Artist::pointer& artist : getOrCreateArtists(_dbSession, trackInfo->artists))
|
// Do not fallback on artists with the same name but having a MBID for artist and releaseArtists, as it may be corrected by properly tagging files
|
||||||
|
for (const Artist::pointer& artist : getOrCreateArtists(_dbSession, trackInfo->artists, false))
|
||||||
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, artist, Database::TrackArtistLinkType::Artist));
|
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, artist, Database::TrackArtistLinkType::Artist));
|
||||||
|
|
||||||
for (const Artist::pointer& releaseArtist : getOrCreateArtists(_dbSession, trackInfo->albumArtists))
|
for (const Artist::pointer& releaseArtist : getOrCreateArtists(_dbSession, trackInfo->albumArtists, false))
|
||||||
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, releaseArtist, Database::TrackArtistLinkType::ReleaseArtist));
|
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, releaseArtist, Database::TrackArtistLinkType::ReleaseArtist));
|
||||||
|
|
||||||
for (const Artist::pointer& conductor : getOrCreateArtists(_dbSession, trackInfo->conductorArtists))
|
// Allow fallbacks on artists with the same name even if they have MBID, since there is no tag to indicate the MBID of these artists
|
||||||
|
// We could ask MusicBrainz to get all the information, but that would heavily slow down the import process
|
||||||
|
for (const Artist::pointer& conductor : getOrCreateArtists(_dbSession, trackInfo->conductorArtists, true))
|
||||||
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, conductor, Database::TrackArtistLinkType::Conductor));
|
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, conductor, Database::TrackArtistLinkType::Conductor));
|
||||||
|
|
||||||
for (const Artist::pointer& composer : getOrCreateArtists(_dbSession, trackInfo->composerArtists))
|
for (const Artist::pointer& composer : getOrCreateArtists(_dbSession, trackInfo->composerArtists, true))
|
||||||
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, composer, Database::TrackArtistLinkType::Composer));
|
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, composer, Database::TrackArtistLinkType::Composer));
|
||||||
|
|
||||||
for (const Artist::pointer& lyricist : getOrCreateArtists(_dbSession, trackInfo->lyricistArtists))
|
for (const Artist::pointer& lyricist : getOrCreateArtists(_dbSession, trackInfo->lyricistArtists, true))
|
||||||
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, lyricist, Database::TrackArtistLinkType::Lyricist));
|
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, lyricist, Database::TrackArtistLinkType::Lyricist));
|
||||||
|
|
||||||
for (const Artist::pointer& mixer : getOrCreateArtists(_dbSession, trackInfo->mixerArtists))
|
for (const Artist::pointer& mixer : getOrCreateArtists(_dbSession, trackInfo->mixerArtists, true))
|
||||||
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, mixer, Database::TrackArtistLinkType::Mixer));
|
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, mixer, Database::TrackArtistLinkType::Mixer));
|
||||||
|
|
||||||
for (const Artist::pointer& producer : getOrCreateArtists(_dbSession, trackInfo->producerArtists))
|
for (const Artist::pointer& producer : getOrCreateArtists(_dbSession, trackInfo->producerArtists, true))
|
||||||
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, producer, Database::TrackArtistLinkType::Producer));
|
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, producer, Database::TrackArtistLinkType::Producer));
|
||||||
|
|
||||||
for (const Artist::pointer& remixer : getOrCreateArtists(_dbSession, trackInfo->remixerArtists))
|
for (const Artist::pointer& remixer : getOrCreateArtists(_dbSession, trackInfo->remixerArtists, true))
|
||||||
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, remixer, Database::TrackArtistLinkType::Remixer));
|
track.modify()->addArtistLink(Database::TrackArtistLink::create(_dbSession, track, remixer, Database::TrackArtistLinkType::Remixer));
|
||||||
|
|
||||||
track.modify()->setScanVersion(_scanVersion);
|
track.modify()->setScanVersion(_scanVersion);
|
||||||
|
|||||||
Reference in New Issue
Block a user