Use existing methods to parse results

There are existing methods to parse xml nodes of a recording. Use
them to avoid duplicating code.
For extracting country details, use separate functionality. Reason
being, current `release_to_metadata` method uses `country` element
to extract country details. This element is obsolete as there
can be multiple countries, and this element returns only one.
This commit is contained in:
Rahul Raturi
2016-07-17 23:58:36 +05:30
parent ba8c904ec2
commit 74dee64892
3 changed files with 36 additions and 58 deletions

View File

@@ -246,7 +246,7 @@ def media_formats_from_node(node):
def track_to_metadata(node, track):
m = track.metadata
recording_to_metadata(node.recording[0], track)
recording_to_metadata(node.recording[0], m, track)
m.add_unique('musicbrainz_trackid', node.id)
# overwrite with data we have on the track
for name, nodes in node.children.iteritems():
@@ -265,8 +265,7 @@ def track_to_metadata(node, track):
m['~length'] = format_time(m.length)
def recording_to_metadata(node, track):
m = track.metadata
def recording_to_metadata(node, m, track=None):
m.length = 0
m.add_unique('musicbrainz_recordingid', node.id)
for name, nodes in node.children.iteritems():
@@ -281,7 +280,7 @@ 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:
if 'name_credit' in nodes[0].children and track:
for name_credit in nodes[0].name_credit:
if 'artist' in name_credit.children:
for artist in name_credit.artist:
@@ -375,7 +374,7 @@ def release_to_metadata(node, m, album=None):
m['barcode'] = nodes[0].text
elif name == 'relation_list':
_relations_to_metadata(nodes, m)
elif name == 'label_info_list' and nodes[0].count != '0':
elif name == 'label_info_list' and getattr(nodes[0], "count", 0) != '0':
m['label'], m['catalognumber'] = label_info_from_node(nodes[0])
elif name == 'text_representation':
if 'language' in nodes[0].children:

View File

@@ -271,9 +271,9 @@ class NonAlbumTrack(Track):
log.error(traceback.format_exc())
def _parse_recording(self, recording):
recording_to_metadata(recording, self)
self._customize_metadata()
m = self.metadata
recording_to_metadata(recording, m, self)
self._customize_metadata()
run_track_metadata_processors(self.album, m, None, recording)
if config.setting["enable_tagger_script"]:
script = config.setting["tagger_script"]

View File

@@ -24,8 +24,14 @@ from picard.file import File
from picard.ui import PicardDialog
from picard.ui.util import StandardButton, ButtonLineEdit
from picard.util import format_time, icontheme
from picard.mbxml import artist_credit_from_node
from picard.mbxml import (
artist_credit_from_node,
recording_to_metadata,
release_to_metadata,
release_group_to_metadata
)
from picard.i18n import ugettext_attr
from picard.metadata import Metadata
class ResultTable(QtGui.QTableWidget):
@@ -291,97 +297,70 @@ class TrackSearchDialog(SearchDialog):
def display_results(self):
self.show_table(self.table_headers)
row = 0
for row, obj in enumerate(self.search_results):
track = obj[0]
table_item = QtGui.QTableWidgetItem
self.table.insertRow(row)
self.table.setItem(row, 0, table_item(track.get("title", "")))
self.table.setItem(row, 1, table_item(track.get("length", "")))
self.table.setItem(row, 1, table_item(track.get("~length", "")))
self.table.setItem(row, 2, table_item(track.get("artist", "")))
self.table.setItem(row, 3, table_item(track.get("release", "")))
self.table.setItem(row, 3, table_item(track.get("album", "")))
self.table.setItem(row, 4, table_item(track.get("date", "")))
self.table.setItem(row, 5, table_item(track.get("country", "")))
self.table.setItem(row, 6, table_item(track.get("release_type", "")))
self.table.setItem(row, 6, table_item(track.get("releasetype", "")))
def parse_tracks_from_xml(self, tracks_xml):
for node in tracks_xml:
track_id = node.id
track_title = node.title[0].text
track_artist = artist_credit_from_node(node.artist_credit[0])[0]
try:
track_length = format_time(node.length[0].text)
except AttributeError:
track_length = ""
if "release_list" in node.children and "release" in node.release_list[0].children:
releases = node.release_list[0].release
for release in releases:
track = dict()
track["id"] = track_id
track["title"] = track_title
track["artist"] = track_artist
track["length"] = track_length
track["release_id"] = release.id
track["release"] = release.title[0].text
if "date" in release.children:
track["date"] = release.date[0].text
if "release_event_list" in release.children:
for rel_node in node.release_list[0].release:
track = Metadata()
recording_to_metadata(node, track)
release_to_metadata(rel_node, track)
rg_node = rel_node.release_group[0]
release_group_to_metadata(rg_node, track)
if "release_event_list" in rel_node.children:
country = []
for re in release.release_event_list[0].release_event:
for re in rel_node.release_event_list[0].release_event:
try:
country.append(
re.area[0].iso_3166_1_code_list[0].iso_3166_1_code[0].text)
except AttributeError:
pass
track["country"] = ", ".join(country)
rg = release.release_group[0]
track["rg_id"] = rg.id
types_list = []
if "primary_type" in rg.children:
types_list.append(ugettext_attr(
rg.primary_type[0].text,
'release_group_primary_type'))
if "secondary_type_list" in rg.children:
for sec in rg.secondary_type_list:
types_list.append(ugettext_attr(
sec.secondary_type[0].text,
"release_group_secondary_type"))
track["release_type"] = "+".join(types_list)
self.search_results.append((track, node))
else:
track = dict()
track["id"] = track_id
track["title"] = track_title
track["artist"] = track_artist
track["length"] = track_length
track["release"] = _("Standalone Recording")
track = Metadata()
recording_to_metadata(node, track)
track["album"] = _("Standalone Recording")
self.search_results.append((track, node))
def load_selection(self, row=None):
track, node = self.search_results[row]
if track.get("release_id"):
if track.get("musicbrainz_albumid"):
# The track is not an NAT
self.tagger.get_release_group_by_id(track["rg_id"]).loaded_albums.add(
track["release_id"])
self.tagger.get_release_group_by_id(track["musicbrainz_releasegroupid"]).loaded_albums.add(
track["musicbrainz_albumid"])
if self.file_:
# Search is performed for a file
# Have to move that file from its existing album to the new one
if type(self.file_.parent).__name__ == "Track":
album = self.file_.parent.album
self.tagger.move_file_to_track(self.file_, track["release_id"], track["id"])
self.tagger.move_file_to_track(self.file_, track["musicbrainz_albumid"], track["musicbrainz_recordingid"])
if album._files == 0:
# Remove album if it has no more files associated
self.tagger.remove_album(album)
else:
self.tagger.move_file_to_track(self.file_, track["release_id"], track["id"])
self.tagger.move_file_to_track(self.file_, track["musicbrainz_albumid"], track["musicbrainz_recordingid"])
else:
# No files associated. Just a normal search.
self.tagger.load_album(track["release_id"])
self.tagger.load_album(track["musicbrainz_albumid"])
else:
# The track is a NAT
if self.file_:
album = self.file_.parent.album
self.tagger.move_file_to_nat(track["id"])
self.tagger.move_file_to_nat(track["musicbrainz_recordingid"])
if album._files == 0:
self.tagger.remove_album(album)
else:
self.tagger.load_nat(track["id"], node)
self.tagger.load_nat(track["musicbrainz_recordingid"], node)