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)