Run all metadata processor plugins inside _finalize_loading, before tagger script. (Fixes http://bugs.musicbrainz.org/ticket/5850)

This commit is contained in:
Michael Wiencek
2011-07-17 10:22:01 -05:00
parent 54ff148410
commit 7be16905bb
2 changed files with 68 additions and 69 deletions

View File

@@ -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:

View File

@@ -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)