Skip to content

Commit

Permalink
Experimental branch for PICARD-43 (extended tag comparison)
Browse files Browse the repository at this point in the history
  • Loading branch information
mwiencek committed Dec 19, 2011
1 parent 794154a commit 4c51926
Show file tree
Hide file tree
Showing 28 changed files with 1,284 additions and 1,492 deletions.
9 changes: 6 additions & 3 deletions picard/album.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,11 +319,11 @@ def update(self, update_tracks=True):

def _add_file(self, track, file):
self._files += 1
self.update(False)
self.update(update_tracks=False)

def _remove_file(self, track, file):
self._files -= 1
self.update(False)
self.update(update_tracks=False)

def match_files(self, files, use_trackid=True):
"""Match files to tracks on this album, based on metadata similarity or trackid."""
Expand Down Expand Up @@ -381,7 +381,7 @@ def can_remove(self):
return True

def can_edit_tags(self):
return False
return True

def can_analyze(self):
return False
Expand All @@ -392,6 +392,9 @@ def can_autotag(self):
def can_refresh(self):
return True

def can_view_info(self):
return self._files > 0

def get_num_matched_tracks(self):
num = 0
for track in self.tracks:
Expand Down
32 changes: 20 additions & 12 deletions picard/cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,27 @@

class Cluster(QtCore.QObject, Item):

# Weights for different elements when comparing a cluster to a release
comparison_weights = {
'album': 17,
'artist': 6,
'totaltracks': 5,
'releasecountry': 2,
'format': 2,
}

def __init__(self, name, artist="", special=False, related_album=None, hide_if_empty=False):
QtCore.QObject.__init__(self)
self.item = None
self.metadata = Metadata()
self.metadata['album'] = name
self.metadata['artist'] = artist
self.metadata['albumartist'] = artist
self.metadata['totaltracks'] = 0
self.special = special
self.hide_if_empty = hide_if_empty
self.related_album = related_album
self.files = []
self.lookup_task = None
# Weights for different elements when comparing a cluster to a release
self.comparison_weights = { 'album' : 17, 'artist' : 6, 'totaltracks' : 5, 'releasecountry': 2, 'format': 2 }

def __repr__(self):
return '<Cluster %r>' % self.metadata['album']
Expand Down Expand Up @@ -75,10 +82,6 @@ def remove_file(self, file):
if not self.special and self.get_num_files() == 0:
self.tagger.remove_cluster(self)

def update_file(self, file):
if file.item:
file.item.update()

def update(self):
if self.item:
self.item.update()
Expand All @@ -103,7 +106,7 @@ def can_remove(self):

def can_edit_tags(self):
"""Return if this object supports tag editing."""
return False
return True

def can_analyze(self):
"""Return if this object can be fingerprinted."""
Expand All @@ -122,6 +125,8 @@ def column(self, column):
return ''
elif column == '~length':
return format_time(self.metadata.length)
elif column == 'artist':
return self.metadata['albumartist']
return self.metadata[column]

def _compare_to_release(self, release):
Expand All @@ -140,9 +145,9 @@ def _compare_to_release(self, release):
"""
total = 0.0
parts = []
w = self.comparison_weights
w = Cluster.comparison_weights

a = self.metadata['artist']
a = self.metadata['albumartist']
b = artist_credit_from_node(release.artist_credit[0], self.config)[0]
parts.append((similarity2(a, b), w["artist"]))
total += w["artist"]
Expand Down Expand Up @@ -183,8 +188,8 @@ def lookup_metadata(self):
""" Try to identify the cluster using the existing metadata. """
self.tagger.window.set_statusbar_message(N_("Looking up the metadata for cluster %s..."), self.metadata['album'])
self.lookup_task = self.tagger.xmlws.find_releases(self._lookup_finished,
artist=self.metadata.get('artist', ''),
release=self.metadata.get('album', ''),
artist=self.metadata['albumartist'],
release=self.metadata['album'],
tracks=str(len(self.files)),
limit=25)

Expand Down Expand Up @@ -263,6 +268,9 @@ def remove_file(self, file):
def lookup_metadata(self):
self.tagger.autotag(self.files)

def can_edit_tags(self):
return False


class ClusterList(list, Item):
"""A list of clusters."""
Expand Down
10 changes: 0 additions & 10 deletions picard/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,6 @@
PUID_SUBMIT_HOST = "musicbrainz.org"
PUID_SUBMIT_PORT = 80

# Amazon associate and developer ids
AMAZON_STORE_ASSOCIATE_IDS = {
u'amazon.ca': u'musicbrainz01-20',
u'amazon.co.jp': u'musicbrainz-22',
u'amazon.co.uk': u'musicbrainz0c-21',
u'amazon.com': u'musicbrainz0d-20',
u'amazon.de': u'musicbrainz00-21',
u'amazon.fr': u'musicbrainz0e-21',
}

# MusicDNS client ID
MUSICDNS_KEY = "0736ac2cd889ef77f26f6b5e3fb8a09c"

Expand Down
17 changes: 9 additions & 8 deletions picard/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ def _copy_metadata(self, metadata):
filename, extension = os.path.splitext(self.base_filename)
self.metadata.copy(metadata)
self.metadata['~extension'] = extension[1:].lower()
self.metadata['~length'] = format_time(self.metadata.length)
if 'title' not in self.metadata:
self.metadata['title'] = filename
if 'tracknumber' not in self.metadata:
Expand Down Expand Up @@ -180,6 +181,7 @@ def _saving_finished(self, next, result=None, error=None):
temp_info[info] = self.orig_metadata[info]
self.orig_metadata.copy(self.metadata)
self.orig_metadata.length = length
self.orig_metadata['~length'] = format_time(length)
for k, v in temp_info.items():
self.orig_metadata[k] = v
self.metadata.changed = False
Expand Down Expand Up @@ -365,9 +367,9 @@ def update(self, signal=True):
self.similarity = 1.0
if self.state in (File.CHANGED, File.NORMAL):
self.state = File.NORMAL
if signal:
if signal and self.item:
self.log.debug("Updating file %r", self)
self.parent.update_file(self)
self.item.update()

def can_save(self):
"""Return if this object can be saved."""
Expand All @@ -391,6 +393,9 @@ def can_autotag(self):
def can_refresh(self):
return False

def can_view_info(self):
return True

def _info(self, metadata, file):
if hasattr(file.info, 'length'):
metadata.length = int(file.info.length * 1000)
Expand All @@ -407,7 +412,6 @@ def _info(self, metadata, file):
def get_state(self):
return self._state


# in order to significantly speed up performance, the number of pending
# files is cached
num_pending_files = 0
Expand All @@ -427,12 +431,9 @@ def set_state(self, state, update=False):

def column(self, column):
m = self.metadata
if column == '~length':
return format_time(m.length)
elif column == "title" and not m["title"]:
if column == "title" and not m["title"]:
return self.base_filename
else:
return m[column]
return m[column]

def _compare_to_track(self, track):
"""
Expand Down
2 changes: 2 additions & 0 deletions picard/mbxml.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ def track_to_metadata(node, track, config):
m.length = int(nodes[0].text)
elif name == 'artist_credit':
artist_credit_to_metadata(nodes[0], m, config)
m['~length'] = format_time(m.length)


def recording_to_metadata(node, track, config):
Expand Down Expand Up @@ -238,6 +239,7 @@ def recording_to_metadata(node, track, config):
add_isrcs_to_metadata(nodes[0], m)
elif name == 'user_rating':
m['~rating'] = nodes[0].text
m['~length'] = format_time(m.length)


def medium_to_metadata(node, m):
Expand Down
Loading

0 comments on commit 4c51926

Please sign in to comment.