From aa55c3fe480cc689f62b8a0e0dc092f02f0d55dc Mon Sep 17 00:00:00 2001 From: Rahul Raturi Date: Sat, 4 Jun 2016 11:16:07 +0530 Subject: [PATCH] Display sorted results * Sort the search results according to similarity measured by `metadata.compare_to_tracks`. * Display results above the threshold only. * Return list in case there is no release (in metadata.py). --- picard/metadata.py | 2 +- picard/ui/searchdialog.py | 96 ++++++++++++++++++++------------------- 2 files changed, 51 insertions(+), 47 deletions(-) diff --git a/picard/metadata.py b/picard/metadata.py index 74ca8e779..fc376f566 100644 --- a/picard/metadata.py +++ b/picard/metadata.py @@ -200,7 +200,7 @@ class Metadata(dict): if not releases: sim = linear_combination_of_weights(parts) - return (sim, None, None, track) + return [(sim, None, None, track)] result = [] for release in releases: diff --git a/picard/ui/searchdialog.py b/picard/ui/searchdialog.py index e4c9299f0..b4b4574f6 100644 --- a/picard/ui/searchdialog.py +++ b/picard/ui/searchdialog.py @@ -19,6 +19,7 @@ from PyQt4 import QtGui from operator import itemgetter from functools import partial +from picard import config from picard.file import File from picard.ui import PicardDialog from picard.ui.util import StandardButton @@ -78,13 +79,14 @@ class SearchDialog(PicardDialog): track_id, release_id, rg_id = self.search_results[sel_row][:3] if release_id: album = self.obj.parent.album - self.tagger.get_release_group_by_id(rg_id).loaded_albums.add(release_id) + self.tagger.get_release_group_by_id(rg_id).loaded_albums.add( + release_id) self.tagger.move_file_to_track(self.obj, release_id, track_id) self.tagger.remove_album(album) self.accept() - def parse_recording_node(self, track): - result = [] + def parse_match(self, match): + rg, release, track = match[1:] rec_id = track.id rec_title = track.title[0].text artist = artist_credit_from_node(track.artist_credit[0])[0] @@ -92,56 +94,58 @@ class SearchDialog(PicardDialog): length = format_time(track.length[0].text) except AttributeError: length = "" - if "release_list" in track.children and "release" in \ - track.release_list[0].children: - releases = track.release_list[0].release - for release in releases: - rel_id = release.id - rel_title = release.title[0].text - if "date" in release.children: - date = release.date[0].text - else: - date = None - if "country" in release.children: - country = release.country[0].text - else: - country = "" - rg = release.release_group[0] - rg_id = rg.id - types_list = [] - if "primary_type" in rg.children: - types_list.append(rg.primary_type[0].text) - if "secondary_type_list" in rg.children: - for sec in rg.secondary_type_list: - types_list.append(sec.secondary_type[0].text) - types = "+".join(types_list) + if release: + rel_id = release.id + rel_title = release.title[0].text + if "date" in release.children: + date = release.date[0].text + else: + date = None + if "country" in release.children: + country = release.country[0].text + else: + country = "" + rg_id = rg.id + types_list = [] + if "primary_type" in rg.children: + types_list.append(rg.primary_type[0].text) + if "secondary_type_list" in rg.children: + for sec in rg.secondary_type_list: + types_list.append(sec.secondary_type[0].text) + types = "+".join(types_list) - result.append((rec_id, rel_id, rg_id, rec_title, artist, - length, rel_title, date, country, types)) + result = (rec_id, rel_id, rg_id, rec_title, artist, length, + rel_title, date, country, types) else: - result.append((rec_id, "", "", rec_title, artist, length, "", "", - "", "")) - self.search_results.extend(result) + result = (rec_id, "", "", rec_title, artist, length, "", "", "", + "") + self.search_results.append(result) return result def show_tracks(self, obj, document, http, error): try: tracks = document.metadata[0].recording_list[0].recording except (AttributeError, IndexError): - tracks = [] + # No results to show + # To be done: Notify user about that, or just close the dialog + return - cur_row = 0 + tmp = [] for track in tracks: - result = self.parse_recording_node(track) - for item in result: - self.tracksTable.insertRow(cur_row) - title, artist, length, release, date, country, type = item[3:] - table_item = QtGui.QTableWidgetItem - self.tracksTable.setItem(cur_row, 0, table_item(title)) - self.tracksTable.setItem(cur_row, 1, table_item(length)) - self.tracksTable.setItem(cur_row, 2, table_item(artist)) - self.tracksTable.setItem(cur_row, 3, table_item(release)) - self.tracksTable.setItem(cur_row, 4, table_item(date)) - self.tracksTable.setItem(cur_row, 5, table_item(country)) - self.tracksTable.setItem(cur_row, 6, table_item(type)) - cur_row += 1 + tmp.extend(self.obj.orig_metadata.compare_to_track(track, + File.comparison_weights)) + + sorted_matches = [i for i in sorted(tmp, key=itemgetter(0), reverse=True) + if i[0] > config.setting['file_lookup_threshold']] + for row, match in enumerate(sorted_matches): + result = self.parse_match(match) + title, artist, length, release, date, country, type = result[3:] + table_item = QtGui.QTableWidgetItem + self.tracksTable.insertRow(row) + self.tracksTable.setItem(row, 0, table_item(title)) + self.tracksTable.setItem(row, 1, table_item(length)) + self.tracksTable.setItem(row, 2, table_item(artist)) + self.tracksTable.setItem(row, 3, table_item(release)) + self.tracksTable.setItem(row, 4, table_item(date)) + self.tracksTable.setItem(row, 5, table_item(country)) + self.tracksTable.setItem(row, 6, table_item(type))