mirror of
https://github.com/fergalmoran/picard.git
synced 2026-01-13 12:06:35 +00:00
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:
@@ -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'],
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user