PICARD-1565: Consider all results returned from AcoustID lookups

Previously only the first result (which has the highest score) was used. Now all results are used, weighted by their scores.
This commit is contained in:
Philipp Wolfer
2019-12-02 13:53:45 +01:00
committed by GitHub
parent 855a850e4a
commit 2cc0b35cfe
2 changed files with 25 additions and 15 deletions

View File

@@ -33,6 +33,13 @@ from picard.const.sys import IS_FROZEN
from picard.util import find_executable
def get_score(node):
try:
return float(node.get('score', 1.0))
except (TypeError, ValueError):
return 1.0
class AcoustIDClient(QtCore.QObject):
def __init__(self):
@@ -76,18 +83,21 @@ class AcoustIDClient(QtCore.QObject):
recording_list = doc['recordings'] = []
status = document['status']
if status == 'ok':
results = document['results']
if results:
result = results[0]
file.metadata['acoustid_id'] = result['id']
if 'recordings' in result and result['recordings']:
max_sources = max([r.get('sources', 1) for r in result['recordings']] + [1])
for recording in result['recordings']:
parsed_recording = parse_recording(recording)
if parsed_recording is not None:
parsed_recording['score'] = recording.get('sources', 1) / max_sources * 100
recording_list.append(parsed_recording)
log.debug("AcoustID: Lookup successful for '%s'", file.filename)
results = document.get('results') or []
for result in results:
recordings = result.get('recordings') or []
max_sources = max([r.get('sources', 1) for r in recordings] + [1])
result_score = get_score(result)
for recording in recordings:
parsed_recording = parse_recording(recording)
if parsed_recording is not None:
# Calculate a score based on result score and sources for this
# recording relative to other recordings in this result
score = recording.get('sources', 1) / max_sources * 100
parsed_recording['score'] = score * result_score
parsed_recording['acoustid'] = result['id']
recording_list.append(parsed_recording)
log.debug("AcoustID: Lookup successful for '%s'", file.filename)
else:
mparms = {
'error': document['error']['message'],

View File

@@ -675,6 +675,7 @@ class File(QtCore.QObject, Item):
statusbar(N_("File '%(filename)s' identified!"))
(track_id, release_group_id, release_id, node) = trackmatch
if lookuptype == File.LOOKUP_ACOUSTID:
self.metadata['acoustid_id'] = node.get('acoustid')
self.tagger.acoustidmanager.add(self, track_id)
if release_group_id is not None:
releasegroup = self.tagger.get_release_group_by_id(release_group_id)
@@ -700,13 +701,12 @@ class File(QtCore.QObject, Item):
return None
else:
track_id = best_match.result.track['id']
release_group_id, release_id, node = None, None, None
release_group_id, release_id = None, None
if best_match.result.release:
release_group_id = best_match.result.releasegroup['id']
release_id = best_match.result.release['id']
elif 'title' in best_match.result.track:
node = best_match.result.track
node = best_match.result.track
return (track_id, release_group_id, release_id, node)
def lookup_metadata(self):