diff --git a/picard/album.py b/picard/album.py index 67505fb98..e547fc8a0 100644 --- a/picard/album.py +++ b/picard/album.py @@ -116,7 +116,7 @@ class Album(DataObject, Item): self._new_metadata = Metadata() self._new_tracks = [] self._requests = 1 - self.tagger.xmlws.get_release_by_id(self.id, self._release_request_finished, inc=('tracks','artist')) + self.tagger.xmlws.get_release_by_id(self.id, self._release_request_finished, inc=('tracks', 'artist', 'artist-rels', 'release-events')) def update(self, update_tracks=True): self.tagger.emit(QtCore.SIGNAL("album_updated"), self, update_tracks) diff --git a/picard/mbxml.py b/picard/mbxml.py index 3f2fd5157..186291af8 100644 --- a/picard/mbxml.py +++ b/picard/mbxml.py @@ -20,6 +20,37 @@ from picard.util import format_time +_artist_rel_types = { + "Composer": "composer", + "Conductor": "conductor", + "PerformingOrchestra": "ensemble", + "Arranger": "arranger", + "Orchestrator": "arranger", + "Instrumentator": "arranger", + "Lyricist": "lyricist", + "Remixer": "remixer", + "Producer": "producer", + "Engineer": "engineer", + "Audio": "engineer", + #"Mastering": "engineer", + "Sound": "engineer", + "LiveSound": "engineer", + #"Mix": "engineer", + #"Recording": "engineer", +} + + +def _relations_to_metadata(relation_lists, m): + for relation_list in relation_lists: + if relation_list.target_type == 'Artist': + for relation in relation_list.relation: + try: + m.add(_artist_rel_types[relation.type], relation.artist[0].name[0].text) + except (KeyError, IndexError): + pass + # TODO: Release, Track, URL relations + + def artist_to_metadata(node, m, release=False): m['musicbrainz_artistid'] = node.attribs['id'] if release: @@ -48,12 +79,15 @@ def track_to_metadata(node, m): m['~#length'] = int(nodes[0].text) elif name == 'artist': artist_to_metadata(nodes[0], m) + elif name == 'relation_list': + _relations_to_metadata(nodes, m) if '~#length' not in m: m['~#length'] = 0 m['~length'] = format_time(m['~#length']) def release_to_metadata(node, m): + """Make metadata dict from a XML 'release' node.""" m['musicbrainz_albumid'] = node.attribs['id'] for name, nodes in node.children.iteritems(): if not nodes: @@ -64,3 +98,12 @@ def release_to_metadata(node, m): m['asin'] = nodes[0].text elif name == 'artist': artist_to_metadata(nodes[0], m, True) + elif name == 'relation_list': + _relations_to_metadata(nodes, m) + elif name == 'release_event_list': + # TODO: make prefered country configurable + m['date'] = nodes[0].event[0].date + try: + m['country'] = nodes[0].event[0].country + except (KeyError, IndexError): + pass