diff --git a/picard/mbxml.py b/picard/mbxml.py index d58481577..31910e1a5 100644 --- a/picard/mbxml.py +++ b/picard/mbxml.py @@ -281,6 +281,17 @@ def recording_to_metadata(node, track): m['~recordingcomment'] = nodes[0].text elif name == 'artist_credit': artist_credit_to_metadata(nodes[0], m) + if 'name_credit' in nodes[0].children: + for name_credit in nodes[0].name_credit: + if 'artist' in name_credit.children: + for artist in name_credit.artist: + trackartist = track.append_track_artist(artist.id) + if 'tag_list' in artist.children: + add_folksonomy_tags(artist.tag_list[0], + trackartist) + if 'user_tag_list' in artist.children: + add_user_folksonomy_tags(artist.user_tag_list[0], + trackartist) elif name == 'relation_list': _relations_to_metadata(nodes, m) elif name == 'tag_list': diff --git a/picard/track.py b/picard/track.py index 8bc8d8f3d..3a96d4eb2 100644 --- a/picard/track.py +++ b/picard/track.py @@ -37,6 +37,11 @@ _TRANSLATE_TAGS = { } +class TrackArtist(DataObject): + def __init__(self, id): + DataObject.__init__(self, id) + + class Track(DataObject, Item): def __init__(self, id, album=None): @@ -45,6 +50,7 @@ class Track(DataObject, Item): self.linked_files = [] self.num_linked_files = 0 self.metadata = Metadata() + self._track_artists = [] def __repr__(self): return '' % (self.id, self.metadata["title"]) @@ -118,10 +124,10 @@ class Track(DataObject, Item): def is_pregap(self): return self.metadata['~pregap'] == '1' - + def is_data(self): return self.metadata['~datatrack'] == '1' - + def is_silence(self): return self.metadata['~silence'] == '1' @@ -136,6 +142,13 @@ class Track(DataObject, Item): return True return False + def append_track_artist(self, id): + """Append artist id to the list of track artists + and return an TrackArtist instance""" + track_artist = TrackArtist(id) + self._track_artists.append(track_artist) + return track_artist + def _customize_metadata(self): tm = self.metadata @@ -163,8 +176,13 @@ class Track(DataObject, Item): if self.album.release_group: self.merge_folksonomy_tags(tags, self.album.release_group.folksonomy_tags) if not tags and config.setting['artists_tags']: - for artist in self.album.get_album_artists(): - self.merge_folksonomy_tags(tags, artist.folksonomy_tags) + # For compilations use each track's artists to look up tags + if self.metadata['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID: + for artist in self._track_artists: + self.merge_folksonomy_tags(tags, artist.folksonomy_tags) + else: + for artist in self.album.get_album_artists(): + self.merge_folksonomy_tags(tags, artist.folksonomy_tags) # Ignore tags with zero or lower score tags = dict((name, count) for name, count in tags.items() if count > 0) if not tags: