def show_change(cur_artist, cur_album, items, info, dist, color=True): """Print out a representation of the changes that will be made if tags are changed from (cur_artist, cur_album, items) to info with distance dist. """ def show_album(artist, album): if artist: print_(' %s - %s' % (artist, album)) elif album: print_(' %s' % album) else: print_(' (unknown album)') # Identify the album in question. if cur_artist != info['artist'] or \ (cur_album != info['album'] and info['album'] != VARIOUS_ARTISTS): artist_l, artist_r = cur_artist or '', info['artist'] album_l, album_r = cur_album or '', info['album'] if artist_r == VARIOUS_ARTISTS: # Hide artists for VA releases. artist_l, artist_r = u'', u'' if color: artist_l, artist_r = ui.colordiff(artist_l, artist_r) album_l, album_r = ui.colordiff(album_l, album_r) print_("Correcting tags from:") show_album(artist_l, album_l) print_("To:") show_album(artist_r, album_r) else: print_("Tagging: %s - %s" % (info['artist'], info['album'])) # Distance/similarity. print_('(Similarity: %s)' % dist_string(dist, color)) # Tracks. for i, (item, track_data) in enumerate(zip(items, info['tracks'])): cur_track = str(item.track) new_track = str(i+1) cur_title = item.title new_title = track_data['title'] # Possibly colorize changes. if color: cur_title, new_title = ui.colordiff(cur_title, new_title) if cur_track != new_track: cur_track = ui.colorize('red', cur_track) new_track = ui.colorize('red', new_track) if cur_title != new_title and cur_track != new_track: print_(" * %s (%s) -> %s (%s)" % ( cur_title, cur_track, new_title, new_track )) elif cur_title != new_title: print_(" * %s -> %s" % (cur_title, new_title)) elif cur_track != new_track: print_(" * %s (%s -> %s)" % (item.title, cur_track, new_track))
def show_item_change(item, info, dist, color): """Print out the change that would occur by tagging `item` with the metadata from `info`. """ cur_artist, new_artist = item.artist, info.artist cur_title, new_title = item.title, info.title if cur_artist != new_artist or cur_title != new_title: if color: cur_artist, new_artist = ui.colordiff(cur_artist, new_artist) cur_title, new_title = ui.colordiff(cur_title, new_title) print_("Correcting track tags from:") print_(" %s - %s" % (cur_artist, cur_title)) print_("To:") print_(" %s - %s" % (new_artist, new_title)) else: print_("Tagging track: %s - %s" % (cur_artist, cur_title)) print_('(Similarity: %s)' % dist_string(dist, color))
def _showdiff(field, oldval, newval, color): """Prints out a human-readable field difference line.""" # Considering floats incomparable for perfect equality, introduce # an epsilon tolerance. if isinstance(oldval, float) and isinstance(newval, float) and \ abs(oldval - newval) < FLOAT_EPSILON: return if newval != oldval: if color: oldval, newval = ui.colordiff(oldval, newval) else: oldval, newval = unicode(oldval), unicode(newval) print_(u' %s: %s -> %s' % (field, oldval, newval))
def show_change(cur_artist, cur_album, items, info, dist, color=True): """Print out a representation of the changes that will be made if tags are changed from (cur_artist, cur_album, items) to info with distance dist. """ def show_album(artist, album, partial=False): if artist: album_description = u' %s - %s' % (artist, album) elif album: album_description = u' %s' % album else: album_description = u' (unknown album)' # Add a suffix if this is a partial match. if partial: warning = PARTIAL_MATCH_MESSAGE else: warning = None if color and warning: warning = ui.colorize('yellow', warning) out = album_description if warning: out += u' ' + warning print_(out) # Record if the match is partial or not. partial_match = None in items # Identify the album in question. if cur_artist != info.artist or \ (cur_album != info.album and info.album != VARIOUS_ARTISTS): artist_l, artist_r = cur_artist or '', info.artist album_l, album_r = cur_album or '', info.album if artist_r == VARIOUS_ARTISTS: # Hide artists for VA releases. artist_l, artist_r = u'', u'' if color: artist_l, artist_r = ui.colordiff(artist_l, artist_r) album_l, album_r = ui.colordiff(album_l, album_r) print_("Correcting tags from:") show_album(artist_l, album_l) print_("To:") show_album(artist_r, album_r) else: message = u"Tagging: %s - %s" % (info.artist, info.album) if partial_match: warning = PARTIAL_MATCH_MESSAGE if color: warning = ui.colorize('yellow', PARTIAL_MATCH_MESSAGE) message += u' ' + warning print_(message) # Distance/similarity. print_('(Similarity: %s)' % dist_string(dist, color)) # Tracks. missing_tracks = [] for i, (item, track_info) in enumerate(zip(items, info.tracks)): if not item: missing_tracks.append((i, track_info)) continue # Get displayable LHS and RHS values. cur_track = unicode(item.track) new_track = unicode(i+1) cur_title = item.title new_title = track_info.title if item.length and track_info.length: cur_length = ui.human_seconds_short(item.length) new_length = ui.human_seconds_short(track_info.length) if color: cur_length = ui.colorize('red', cur_length) new_length = ui.colorize('red', new_length) # Possibly colorize changes. if color: cur_title, new_title = ui.colordiff(cur_title, new_title) if cur_track != new_track: cur_track = ui.colorize('red', cur_track) new_track = ui.colorize('red', new_track) # Show filename (non-colorized) when title is not set. if not item.title.strip(): cur_title = displayable_path(os.path.basename(item.path)) if cur_title != new_title: lhs, rhs = cur_title, new_title if cur_track != new_track: lhs += u' (%s)' % cur_track rhs += u' (%s)' % new_track print_(u" * %s -> %s" % (lhs, rhs)) else: line = u' * %s' % item.title display = False if cur_track != new_track: display = True line += u' (%s -> %s)' % (cur_track, new_track) if item.length and track_info.length and \ abs(item.length - track_info.length) > 2.0: display = True line += u' (%s -> %s)' % (cur_length, new_length) if display: print_(line) for i, track_info in missing_tracks: line = u' * Missing track: %s (%d)' % (track_info.title, i+1) if color: line = ui.colorize('yellow', line) print_(line)
def show_change(cur_artist, cur_album, items, info, dist, color=True): """Print out a representation of the changes that will be made if tags are changed from (cur_artist, cur_album, items) to info with distance dist. """ def show_album(artist, album): if artist: print_(' %s - %s' % (artist, album)) elif album: print_(' %s' % album) else: print_(' (unknown album)') # Identify the album in question. if cur_artist != info.artist or \ (cur_album != info.album and info.album != VARIOUS_ARTISTS): artist_l, artist_r = cur_artist or '', info.artist album_l, album_r = cur_album or '', info.album if artist_r == VARIOUS_ARTISTS: # Hide artists for VA releases. artist_l, artist_r = u'', u'' if color: artist_l, artist_r = ui.colordiff(artist_l, artist_r) album_l, album_r = ui.colordiff(album_l, album_r) print_("Correcting tags from:") show_album(artist_l, album_l) print_("To:") show_album(artist_r, album_r) else: print_("Tagging: %s - %s" % (info.artist, info.album)) # Distance/similarity. print_('(Similarity: %s)' % dist_string(dist, color)) # Tracks. for i, (item, track_info) in enumerate(zip(items, info.tracks)): cur_track = str(item.track) new_track = str(i+1) cur_title = item.title new_title = track_info.title # Possibly colorize changes. if color: cur_title, new_title = ui.colordiff(cur_title, new_title) if cur_track != new_track: cur_track = ui.colorize('red', cur_track) new_track = ui.colorize('red', new_track) # Show filename (non-colorized) when title is not set. if not item.title.strip(): cur_title = os.path.basename(item.path) if cur_title != new_title and cur_track != new_track: print_(" * %s (%s) -> %s (%s)" % ( cur_title, cur_track, new_title, new_track )) elif cur_title != new_title: print_(" * %s -> %s" % (cur_title, new_title)) elif cur_track != new_track: print_(" * %s (%s -> %s)" % (item.title, cur_track, new_track))
def show_change(cur_artist, cur_album, match, color=True, per_disc_numbering=False): """Print out a representation of the changes that will be made if an album's tags are changed according to `match`, which must be an AlbumMatch object. """ def show_album(artist, album, partial=False): if artist: album_description = u' %s - %s' % (artist, album) elif album: album_description = u' %s' % album else: album_description = u' (unknown album)' # Add a suffix if this is a partial match. if partial: warning = PARTIAL_MATCH_MESSAGE else: warning = None if color and warning: warning = ui.colorize('yellow', warning) out = album_description if warning: out += u' ' + warning print_(out) def format_index(track_info): """Return a string representing the track index of the given TrackInfo object. """ if per_disc_numbering: if match.info.mediums > 1: return u'{0}-{1}'.format(track_info.medium, track_info.medium_index) else: return unicode(track_info.medium_index) else: return unicode(track_info.index) # Identify the album in question. if cur_artist != match.info.artist or \ (cur_album != match.info.album and match.info.album != VARIOUS_ARTISTS): artist_l, artist_r = cur_artist or '', match.info.artist album_l, album_r = cur_album or '', match.info.album if artist_r == VARIOUS_ARTISTS: # Hide artists for VA releases. artist_l, artist_r = u'', u'' if color: artist_l, artist_r = ui.colordiff(artist_l, artist_r) album_l, album_r = ui.colordiff(album_l, album_r) print_("Correcting tags from:") show_album(artist_l, album_l) print_("To:") show_album(artist_r, album_r) else: message = u"Tagging: %s - %s" % (match.info.artist, match.info.album) if match.extra_items or match.extra_tracks: warning = PARTIAL_MATCH_MESSAGE if color: warning = ui.colorize('yellow', PARTIAL_MATCH_MESSAGE) message += u' ' + warning print_(message) # Distance/similarity. print_('(Similarity: %s)' % dist_string(match.distance, color)) # Tracks. pairs = match.mapping.items() pairs.sort(key=lambda (_, track_info): track_info.index) for item, track_info in pairs: # Get displayable LHS and RHS values. cur_track = unicode(item.track) new_track = format_index(track_info) tracks_differ = item.track not in (track_info.index, track_info.medium_index) cur_title = item.title new_title = track_info.title if item.length and track_info.length: cur_length = ui.human_seconds_short(item.length) new_length = ui.human_seconds_short(track_info.length) if color: cur_length = ui.colorize('red', cur_length) new_length = ui.colorize('red', new_length) # Possibly colorize changes. if color: cur_title, new_title = ui.colordiff(cur_title, new_title) cur_track = ui.colorize('red', cur_track) new_track = ui.colorize('red', new_track) # Show filename (non-colorized) when title is not set. if not item.title.strip(): cur_title = displayable_path(os.path.basename(item.path)) if cur_title != new_title: lhs, rhs = cur_title, new_title if tracks_differ: lhs += u' (%s)' % cur_track rhs += u' (%s)' % new_track print_(u" * %s -> %s" % (lhs, rhs)) else: line = u' * %s' % item.title display = False if tracks_differ: display = True line += u' (%s -> %s)' % (cur_track, new_track) if item.length and track_info.length and \ abs(item.length - track_info.length) > 2.0: display = True line += u' (%s vs. %s)' % (cur_length, new_length) if display: print_(line) # Missing and unmatched tracks. for track_info in match.extra_tracks: line = u' * Missing track: {0} ({1})'.format(track_info.title, format_index(track_info)) if color: line = ui.colorize('yellow', line) print_(line) for item in match.extra_items: line = u' * Unmatched track: {0} ({1})'.format(item.title, item.track) if color: line = ui.colorize('yellow', line) print_(line)