Skip to content

Commit

Permalink
Improve artist handling
Browse files Browse the repository at this point in the history
Improve handling of artists for compilations, i.e. properly
set track artist as artist and album artist as compilation
artist. Also handle track artists featuring other artists.
Set compilation flag if most track artist differ from album artist.
  • Loading branch information
hambre committed Jan 5, 2024
1 parent e49e65f commit 60da512
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 3 deletions.
47 changes: 44 additions & 3 deletions mythplugins/mythmusic/mythmusic/musicbrainz.cpp
Expand Up @@ -63,10 +63,24 @@ static std::vector<std::string> queryArtists(const MusicBrainz5::CArtistCredit *
return artist_names;
}

std::string joinPhrase;
for (int a = 0; a < artist_credit->NameCreditList()->NumItems(); ++a)
{
auto *artist = artist_credit->NameCreditList()->Item(a)->Artist();
artist_names.emplace_back(artist->Name());
auto *nameCredit = artist_credit->NameCreditList()->Item(a);
auto *artist = nameCredit->Artist();
if (a == 0)
{
joinPhrase = nameCredit->JoinPhrase();
artist_names.emplace_back(artist->Name());
}
else if (!joinPhrase.empty())
{
artist_names.back() += joinPhrase + artist->Name();
}
else
{
artist_names.emplace_back(artist->Name());
}
}
return artist_names;
}
Expand Down Expand Up @@ -120,6 +134,7 @@ std::string MusicBrainz::queryRelease(const std::string &discId)
}
auto media = fullRelease->MediaMatchingDiscID(discId);
LOG(VB_MEDIA, LOG_DEBUG, QString("musicbrainz: Found %1 matching media").arg(media.NumItems()));
int artistDiff = 0;
for (int m = 0; m < media.NumItems(); ++m)
{
auto *medium = media.Item(m);
Expand Down Expand Up @@ -169,17 +184,34 @@ std::string MusicBrainz::queryRelease(const std::string &discId)
metadata.setLength(std::chrono::milliseconds(recording->Length()));
if (albumArtists.size() == 1)
{
metadata.setArtist(QString::fromStdString(albumArtists[0]));
metadata.setCompilationArtist(QString::fromStdString(albumArtists[0]));
}
else if(albumArtists.size() > 1)
{
metadata.setCompilationArtist(QObject::tr("Various Artists"));
}
if (artists.size() == 1)
{
metadata.setArtist(QString::fromStdString(artists[0]));
}
else if(artists.size() > 1)
{
metadata.setArtist(QObject::tr("Various Artists"));
}
if (metadata.CompilationArtist() != metadata.Artist())
{
artistDiff++;
}
metadata.setYear(QDate::fromString(QString::fromStdString(fullRelease->Date()), Qt::ISODate).year());
}
}
}
}
// Set compilation flag if album artist differs from track artists
// as there might be some tracks featuring guest artists we only set
// the compilation flag if at least half of the track artists differ
setCompilationFlag(artistDiff > m_tracks.count() / 2);

return fullRelease->ID();
}
}
Expand Down Expand Up @@ -219,6 +251,15 @@ std::string MusicBrainz::queryRelease(const std::string &discId)
return {};
}

void MusicBrainz::setCompilationFlag(bool isCompilation)
{
LOG(VB_MEDIA, LOG_DEBUG, QString("musicbrainz: Setting compilation flag: %1").arg(isCompilation));
for (auto &metadata : m_tracks)
{
metadata.setCompilation(isCompilation);
}
}

static void logError(CoverArtArchive::CCoverArt &coverArt)
{
LOG(VB_MEDIA, LOG_ERR, QString("musicbrainz: LastResult: %1").arg(coverArt.LastResult()));
Expand Down
5 changes: 5 additions & 0 deletions mythplugins/mythmusic/mythmusic/musicbrainz.h
Expand Up @@ -43,6 +43,11 @@ class MusicBrainz
void reset();
private:

/**
* Sets compilation flag for all metadata
*/
void setCompilationFlag(bool isCompilation);

#ifdef HAVE_MUSICBRAINZ

/// Query disc id for specified device
Expand Down

0 comments on commit 60da512

Please sign in to comment.