From 7be16905bbeaf29f2d9e4c7bbe089377fa8e6ec2 Mon Sep 17 00:00:00 2001 From: Michael Wiencek Date: Sun, 17 Jul 2011 10:22:01 -0500 Subject: [PATCH] Run all metadata processor plugins inside _finalize_loading, before tagger script. (Fixes http://bugs.musicbrainz.org/ticket/5850) --- picard/album.py | 127 +++++++++++++++++++++++++----------------------- picard/track.py | 10 +--- 2 files changed, 68 insertions(+), 69 deletions(-) diff --git a/picard/album.py b/picard/album.py index 2c4c735c5..819539cef 100644 --- a/picard/album.py +++ b/picard/album.py @@ -19,8 +19,9 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import traceback +from collections import deque from PyQt4 import QtCore -from picard.metadata import Metadata, run_album_metadata_processors +from picard.metadata import Metadata, run_album_metadata_processors, run_track_metadata_processors from picard.dataobj import DataObject from picard.file import File from picard.track import Track @@ -47,6 +48,7 @@ class Album(DataObject, Item): self._requests = 0 self._discid = discid self._after_load_callbacks = queue.Queue() + self._metadata_plugins = deque() self.other_versions = [] self.unmatched_files = Cluster(_("Unmatched Files"), special=True, related_album=self, hide_if_empty=True) @@ -94,18 +96,6 @@ class Album(DataObject, Item): if m['musicbrainz_artistid'] == VARIOUS_ARTISTS_ID: m['albumartistsort'] = m['artistsort'] = m['albumartist'] = m['artist'] = self.config.setting['va_name'] - # Album metadata plugins - try: - run_album_metadata_processors(self, m, release_node) - except: - self.log.error(traceback.format_exc()) - - # Prepare parser for user's script - if self.config.setting["enable_tagger_script"]: - script = self.config.setting["tagger_script"] - else: - script = None - # Strip leading/trailing whitespace m.strip_whitespace() @@ -116,6 +106,9 @@ class Album(DataObject, Item): m['totaldiscs'] = release_node.medium_list[0].count + plugins = partial(run_album_metadata_processors, self, m, release_node) + self._metadata_plugins.append(plugins) + for medium in release_node.medium_list[0].medium: discnumber = medium.position[0].text track_list = medium.track_list[0] @@ -150,43 +143,14 @@ class Album(DataObject, Item): else: tm['compilation'] = '1' - t._customize_metadata(node, release_node, ignore_tags) + t._customize_metadata(ignore_tags) + plugins = partial(run_track_metadata_processors, self, tm, release_node, node) + self._metadata_plugins.append(plugins) self.tracks_str = " + ".join(track_counts) - if script: - parser = ScriptParser() - # Run tagger script for each track - for track in self._new_tracks: - tm = track.metadata - try: - parser.eval(script, tm) - except: - self.log.error(traceback.format_exc()) - # Strip leading/trailing whitespace - tm.strip_whitespace() - # Run tagger script for the album itself - try: - parser.eval(script, m) - except: - self.log.error(traceback.format_exc()) - return True - def _parse_release_group(self, document): - releases = document.metadata[0].release_group[0].release_list[0].release - for release in releases: - version = {} - version["mbid"] = release.id - if "date" in release.children: - version["date"] = release.date[0].text - if "country" in release.children: - version["country"] = release.country[0].text - version["tracks"] = " + ".join([m.track_list[0].count for m in release.medium_list[0].medium]) - version["format"] = media_formats_from_node(release.medium_list[0]) - self.other_versions.append(version) - self.other_versions.sort(key=lambda x: x["date"]) - def _release_request_finished(self, document, http, error): parsed = False try: @@ -213,6 +177,20 @@ class Album(DataObject, Item): if parsed or error: self._finalize_loading(error) + def _parse_release_group(self, document): + releases = document.metadata[0].release_group[0].release_list[0].release + for release in releases: + version = {} + version["mbid"] = release.id + if "date" in release.children: + version["date"] = release.date[0].text + if "country" in release.children: + version["country"] = release.country[0].text + version["tracks"] = " + ".join([m.track_list[0].count for m in release.medium_list[0].medium]) + version["format"] = media_formats_from_node(release.medium_list[0]) + self.other_versions.append(version) + self.other_versions.sort(key=lambda x: x["date"]) + def _release_group_request_finished(self, document, http, error): try: if error: @@ -234,22 +212,49 @@ class Album(DataObject, Item): del self._new_metadata del self._new_tracks self.update() - else: - if not self._requests: - for track in self.tracks: - for file in list(track.linked_files): - file.move(self.unmatched_files) - self.metadata = self._new_metadata - self.tracks = self._new_tracks - del self._new_metadata - del self._new_tracks - self.loaded = True - self.match_files(self.unmatched_files.files) - self.update() - self.tagger.window.set_statusbar_message('Album %s loaded', self.id, timeout=3000) - while self._after_load_callbacks.qsize() > 0: - func = self._after_load_callbacks.get() - func() + return + + # Run metadata plugins + while self._metadata_plugins: + try: + self._metadata_plugins.pop()() + except: + self.log.error(traceback.format_exc()) + + if not self._requests: + # Prepare parser for user's script + if self.config.setting["enable_tagger_script"]: + script = self.config.setting["tagger_script"] + if script: + parser = ScriptParser() + # Run tagger script for each track + for track in self._new_tracks: + try: + parser.eval(script, track.metadata) + except: + self.log.error(traceback.format_exc()) + # Strip leading/trailing whitespace + track.metadata.strip_whitespace() + # Run tagger script for the album itself + try: + parser.eval(script, self._new_metadata) + except: + self.log.error(traceback.format_exc()) + + for track in self.tracks: + for file in list(track.linked_files): + file.move(self.unmatched_files) + self.metadata = self._new_metadata + self.tracks = self._new_tracks + del self._new_metadata + del self._new_tracks + self.loaded = True + self.match_files(self.unmatched_files.files) + self.update() + self.tagger.window.set_statusbar_message('Album %s loaded', self.id, timeout=3000) + while self._after_load_callbacks.qsize() > 0: + func = self._after_load_callbacks.get() + func() def load(self): if self._requests: diff --git a/picard/track.py b/picard/track.py index 5d3417b22..4fc220863 100644 --- a/picard/track.py +++ b/picard/track.py @@ -19,7 +19,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore -from picard.metadata import Metadata, run_track_metadata_processors +from picard.metadata import Metadata from picard.dataobj import DataObject from picard.util import format_time, translate_artist, asciipunct, partial from picard.mbxml import recording_to_metadata @@ -137,7 +137,7 @@ class Track(DataObject): else: return m[column], similarity - def _customize_metadata(self, node, release, ignore_tags=None): + def _customize_metadata(self, ignore_tags=None): tm = self.metadata # 'Translate' artist name @@ -157,12 +157,6 @@ class Track(DataObject): if self.config.setting['convert_punctuation']: tm.apply_func(asciipunct) - # Track metadata plugins - try: - run_track_metadata_processors(self.album, tm, release, node) - except: - self.log.error(traceback.format_exc()) - def _convert_folksonomy_tags_to_genre(self, ignore_tags): # Combine release and track tags tags = dict(self.folksonomy_tags)