From e67e49bfe47674cf4237a873fc50e9a44b429762 Mon Sep 17 00:00:00 2001 From: Sophist Date: Mon, 3 Mar 2014 12:59:37 +0000 Subject: [PATCH] Bug fixes Handle missing data correctly. Handle unset preferred releases countries and formats Move priority handling from releasegroup to itemviews so that if there are two albums from same Release Group, then the list is displayed correctly for each. --- picard/releasegroup.py | 59 ++++++++++++++++++++++++------------------ picard/ui/itemviews.py | 24 ++++++++++++++--- 2 files changed, 54 insertions(+), 29 deletions(-) diff --git a/picard/releasegroup.py b/picard/releasegroup.py index d07d1b4ca..141cd1ef2 100644 --- a/picard/releasegroup.py +++ b/picard/releasegroup.py @@ -35,43 +35,44 @@ class ReleaseGroup(DataObject): self.metadata = Metadata() self.loaded = False self.versions = [] + self.version_headings = '' self.loaded_albums = set() self.refcount = 0 - def load_versions(self, callback, obj): + def load_versions(self, callback): kwargs = {"release-group": self.id, "limit": 100} - self.tagger.xmlws.browse_releases(partial(self._request_finished, callback, obj), **kwargs) + self.tagger.xmlws.browse_releases(partial(self._request_finished, callback), **kwargs) - def _parse_versions(self, document, obj): + def _parse_versions(self, document): """Parse document and return a list of releases""" del self.versions[:] data = [] - albumtracks = obj.get_num_total_files() if obj.get_num_total_files() else len(obj.tracks) - preferred_countries = config.setting["preferred_release_countries"] - preferred_formats = config.setting["preferred_release_formats"] - namekeys = ("tracks", "year", "country", "format", "label", "cat no") extrakeys = ("packaging", "barcode", "disambiguation") - matches = ("trackmatch", "countrymatch", "formatmatch") for node in document.metadata[0].release_list[0].release: labels, catnums = label_info_from_node(node.label_info_list[0]) - totaltracks = sum([int(m.track_list[0].count) for m in node.medium_list[0].medium]) - country = node.country[0].text if "country" in node.children else "??" - format = media_formats_from_node(node.medium_list[0]) - priority = { - "trackmatch": "0" if totaltracks == albumtracks else "?", - "countrymatch": "%02d" % preferred_countries.index(country) if country in preferred_countries else "??", - "formatmatch": "%02d" % preferred_formats.index(format) if format in preferred_formats else "??", - } + + countries = [] + if 'release_event_list' in node.children: + for release_event in node.release_event_list[0].release_event: + if "area" in release_event.children: + countries.append(release_event.area[0].iso_3166_1_code_list[0].iso_3166_1_code[0].text) + + formats = [] + for medium in node.medium_list[0].medium: + if "format" in medium.children: + formats.append(medium.format[0].text) release = { "id": node.id, "year": node.date[0].text[:4] if "date" in node.children else "????", - "country": country, - "format": format, - "label": ", ".join(set(labels)), + "country": "+".join(countries) if countries + else node.country[0].text if "country" in node.children + else "??", + "format": media_formats_from_node(node.medium_list[0]), + "label": ", ".join([' '.join(x.split(' ')[:2]) for x in set(labels)]), "cat no": ", ".join(set(catnums)), - "tracks": " + ".join([m.track_list[0].count for m in node.medium_list[0].medium]), + "tracks": "+".join([m.track_list[0].count for m in node.medium_list[0].medium]), "barcode": node.barcode[0].text if "barcode" in node.children @@ -86,7 +87,9 @@ class ReleaseGroup(DataObject): if "disambiguation" in node.children else None, "_disambiguate_name": list(), - "priority": "".join([priority[k] for k in matches]), + "totaltracks": sum([int(m.track_list[0].count) for m in node.medium_list[0].medium]), + "countries": countries, + "formats": formats, } data.append(release) @@ -109,17 +112,23 @@ class ReleaseGroup(DataObject): for release in releases: dis = " / ".join(filter(None, uniqify(release['_disambiguate_name']))).replace("&", "&&") disname = name if not dis else name + ' / ' + dis - self.versions.append({'id': release['id'], 'name': disname, 'priority': release['priority']}) - self.versions.sort(key=lambda x: x['priority'] + x['name']) + version = { + 'id': release['id'], + 'name': disname, + 'totaltracks': release['totaltracks'], + 'countries': release['countries'], + 'formats': release['formats'], + } + self.versions.append(version) self.version_headings = " / ".join([k.title() for k in namekeys]) - def _request_finished(self, callback, obj, document, http, error): + def _request_finished(self, callback, document, http, error): try: if error: log.error("%r", unicode(http.errorString())) else: try: - self._parse_versions(document, obj) + self._parse_versions(document) except: error = True log.error(traceback.format_exc()) diff --git a/picard/ui/itemviews.py b/picard/ui/itemviews.py index 11adbdba0..4e5355728 100644 --- a/picard/ui/itemviews.py +++ b/picard/ui/itemviews.py @@ -306,10 +306,26 @@ class BaseTreeView(QtGui.QTreeWidget): font = heading.font() font.setBold(True) heading.setFont(font) - releases_menu.addSeparator() + + versions = obj.release_group.versions + + albumtracks = obj.get_num_total_files() if obj.get_num_total_files() else len(obj.tracks) + preferred_countries = config.setting["preferred_release_countries"] + preferred_formats = config.setting["preferred_release_formats"] + matches = ("trackmatch", "countrymatch", "formatmatch") + priorities = {} + for version in versions: + priority = { + "trackmatch": "0" if version['totaltracks'] == albumtracks else "?", + "countrymatch": "0" if len(preferred_countries) == 0 or set(preferred_countries) & set(version['countries']) else "?", + "formatmatch": "0" if len(preferred_formats) == 0 or set(preferred_formats) & set(version['formats']) else "?", + } + priorities[version['id']] = "".join([priority[k] for k in matches]) + versions.sort(key=lambda version: priorities[version['id']] + version['name']) + priority = normal = False - for version in obj.release_group.versions: - if not normal and "?" in version['priority']: + for version in versions: + if not normal and "?" in priorities[version['id']]: if priority: releases_menu.addSeparator() normal = True @@ -324,7 +340,7 @@ class BaseTreeView(QtGui.QTreeWidget): if obj.release_group.loaded: _add_other_versions() else: - obj.release_group.load_versions(_add_other_versions, obj) + obj.release_group.load_versions(_add_other_versions) releases_menu.setEnabled(True) else: releases_menu.setEnabled(False)