def correctMetadata(albumid, release, downloaded_track_list): logger.info('Writing metadata') items = [] for downloaded_track in downloaded_track_list: items.append(beets.library.Item.from_path(downloaded_track)) cur_artist, cur_album, out_tuples, rec = autotag.tag_album(items, search_artist=release['ArtistName'], search_album=release['AlbumTitle']) if rec == 'RECOMMEND_NONE': logger.warn('No accurate album match found for %s, %s - not writing metadata' % (release['ArtistName'], release['AlbumTitle'])) return distance, items, info = out_tuples[0] logger.debug('Beets recommendation: %s' % rec) autotag.apply_metadata(items, info) for item in items: item.write()
def apply_choices(config): """A coroutine for applying changes to albums during the autotag process. """ lib = _reopen_lib(config.lib) task = None while True: task = yield task if task.should_skip(): continue # Change metadata, move, and copy. if task.should_write_tags(): if task.is_album: autotag.apply_metadata(task.items, task.info) else: autotag.apply_item_metadata(task.item, task.info) items = task.items if task.is_album else [task.item] if config.copy and config.delete: task.old_paths = [os.path.realpath(syspath(item.path)) for item in items] for item in items: if config.copy: item.move(lib, True, task.is_album) if config.write and task.should_write_tags(): item.write() # Add items to library. We consolidate this at the end to avoid # locking while we do the copying and tag updates. try: if task.is_album: # Add an album. album = lib.add_album(task.items, infer_aa = task.should_infer_aa()) task.album_id = album.id else: # Add tracks. for item in items: lib.add(item) finally: lib.save()
def correctMetadata(albumid, release, downloaded_track_list): logger.info("Writing metadata") items = [] for downloaded_track in downloaded_track_list: items.append(beets.library.Item.from_path(downloaded_track)) cur_artist, cur_album, out_tuples, rec = autotag.tag_album( items, search_artist=release["ArtistName"], search_album=release["AlbumTitle"] ) if rec == "RECOMMEND_NONE": logger.warn("No accurate match found - not writing metadata") return distance, items, info = out_tuples[0] logger.debug("Beets recommendation: %s" % rec) autotag.apply_metadata(items, info) for item in items: item.write()
items.append(beets.library.Item.from_path(downloaded_track)) except Exception, e: logger.error("Beets couldn't create an Item from: " + downloaded_track + " - not a media file?" + str(e)) try: cur_artist, cur_album, out_tuples, rec = autotag.tag_album(items, search_artist=helpers.latinToAscii(release['ArtistName']), search_album=helpers.latinToAscii(release['AlbumTitle'])) except Exception, e: logger.error('Error getting recommendation: %s. Not writing metadata' % e) return if rec == 'RECOMMEND_NONE': logger.warn('No accurate album match found for %s, %s - not writing metadata' % (release['ArtistName'], release['AlbumTitle'])) return distance, items, info = out_tuples[0] logger.debug('Beets recommendation: %s' % rec) autotag.apply_metadata(items, info) if len(items) != len(downloaded_track_list): logger.warn("Mismatch between number of tracks downloaded and the metadata items, but I'll try to write it anyway") i = 1 for item in items: try: item.write() except Exception, e: logger.warn('Error writing metadata to track %i: %s' % (i,e)) i += 1 def embedLyrics(downloaded_track_list): logger.info('Adding lyrics')
return if rec == 'RECOMMEND_NONE': logger.warn('No accurate album match found for %s, %s - not writing metadata' % (release['ArtistName'], release['AlbumTitle'])) return if candidates: dist, info, mapping, extra_items, extra_tracks = candidates[0] else: logger.warn('No accurate album match found for %s, %s - not writing metadata' % (release['ArtistName'], release['AlbumTitle'])) return logger.info('Beets recommendation for tagging items: %s' % rec) # TODO: Handle extra_items & extra_tracks autotag.apply_metadata(info, mapping) for item in items: try: item.write() logger.info("Successfully applied metadata to: " + item.path.decode(headphones.SYS_ENCODING)) except Exception, e: logger.warn("Error writing metadata to " + item.path.decode(headphones.SYS_ENCODING) + ": " + str(e)) def embedLyrics(downloaded_track_list): logger.info('Adding lyrics') # TODO: If adding lyrics for flac & lossy, only fetch the lyrics once # and apply it to both files for downloaded_track in downloaded_track_list:
% (release['ArtistName'], release['AlbumTitle'])) return if candidates: dist, info, mapping, extra_items, extra_tracks = candidates[0] else: logger.warn( 'No accurate album match found for %s, %s - not writing metadata' % (release['ArtistName'], release['AlbumTitle'])) return logger.info('Beets recommendation for tagging items: %s' % rec) # TODO: Handle extra_items & extra_tracks autotag.apply_metadata(info, mapping) for item in items: try: item.write() logger.info( "Successfully applied metadata to: " + item.path.decode(headphones.SYS_ENCODING, 'replace')) except Exception, e: logger.warn( "Error writing metadata to " + item.path.decode(headphones.SYS_ENCODING, 'replace') + ": " + str(e)) def embedLyrics(downloaded_track_list):
def apply_choices(config): """A coroutine for applying changes to albums and singletons during the autotag process. """ task = None while True: task = yield task if task.should_skip(): continue items = task.imported_items() # Clear IDs in case the items are being re-tagged. for item in items: item.id = None item.album_id = None # Change metadata. if task.should_write_tags(): if task.is_album: autotag.apply_metadata( task.match.info, task.match.mapping, per_disc_numbering=config.per_disc_numbering ) else: autotag.apply_item_metadata(task.item, task.match.info) plugins.send('import_task_apply', config=config, task=task) # Infer album-level fields. if task.is_album: _infer_album_fields(task) # Find existing item entries that these are replacing (for # re-imports). Old album structures are automatically cleaned up # when the last item is removed. task.replaced_items = defaultdict(list) for item in items: dup_items = config.lib.items(library.MatchQuery('path', item.path)) for dup_item in dup_items: task.replaced_items[item].append(dup_item) log.debug('replacing item %i: %s' % (dup_item.id, displayable_path(item.path))) log.debug('%i of %i items replaced' % (len(task.replaced_items), len(items))) # Find old items that should be replaced as part of a duplicate # resolution. duplicate_items = [] if task.remove_duplicates: if task.is_album: for album in _duplicate_check(config.lib, task): duplicate_items += album.items() else: duplicate_items = _item_duplicate_check(config.lib, task) log.debug('removing %i old duplicated items' % len(duplicate_items)) # Delete duplicate files that are located inside the library # directory. for duplicate_path in [i.path for i in duplicate_items]: if config.lib.directory in util.ancestry(duplicate_path): log.debug(u'deleting replaced duplicate %s' % util.displayable_path(duplicate_path)) util.remove(duplicate_path) util.prune_dirs(os.path.dirname(duplicate_path), config.lib.directory) # Add items -- before path changes -- to the library. We add the # items now (rather than at the end) so that album structures # are in place before calls to destination(). with config.lib.transaction(): # Remove old items. for replaced in task.replaced_items.itervalues(): for item in replaced: config.lib.remove(item) for item in duplicate_items: config.lib.remove(item) # Add new ones. if task.is_album: # Add an album. album = config.lib.add_album(items) task.album_id = album.id else: # Add tracks. for item in items: config.lib.add(item)
def apply_choices(config): """A coroutine for applying changes to albums during the autotag process. """ lib = _reopen_lib(config.lib) task = None while True: task = yield task if task.should_skip(): continue items = [i for i in task.items if i] if task.is_album else [task.item] # Clear IDs in case the items are being re-tagged. for item in items: item.id = None item.album_id = None # Change metadata. if task.should_write_tags(): if task.is_album: autotag.apply_metadata(task.items, task.info) else: autotag.apply_item_metadata(task.item, task.info) # Infer album-level fields. if task.is_album: _infer_album_fields(task) # Find existing item entries that these are replacing (for # re-imports). Old album structures are automatically cleaned up # when the last item is removed. replaced_items = defaultdict(list) for item in items: dup_items = lib.items(library.MatchQuery('path', item.path)) for dup_item in dup_items: replaced_items[item].append(dup_item) log.debug('replacing item %i: %s' % (dup_item.id, displayable_path(item.path))) log.debug('%i of %i items replaced' % (len(replaced_items), len(items))) # Find old items that should be replaced as part of a duplicate # resolution. duplicate_items = [] if task.remove_duplicates: if task.is_album: for album in _duplicate_check(lib, task): duplicate_items += album.items() else: duplicate_items = _item_duplicate_check(lib, task) log.debug('removing %i old duplicated items' % len(duplicate_items)) # Delete duplicate files that are located inside the library # directory. for duplicate_path in [i.path for i in duplicate_items]: if lib.directory in util.ancestry(duplicate_path): log.debug(u'deleting replaced duplicate %s' % util.displayable_path(duplicate_path)) util.soft_remove(duplicate_path) util.prune_dirs(os.path.dirname(duplicate_path), lib.directory) # Move/copy files. task.old_paths = [item.path for item in items] for item in items: if config.copy: # If we're replacing an item, then move rather than # copying. old_path = item.path do_copy = not bool(replaced_items[item]) lib.move(item, do_copy, task.is_album) if not do_copy: # If we moved the item, remove the now-nonexistent # file from old_paths. task.old_paths.remove(old_path) if config.write and task.should_write_tags(): item.write() # Add items to library. We consolidate this at the end to avoid # locking while we do the copying and tag updates. try: # Remove old items. for replaced in replaced_items.itervalues(): for item in replaced: lib.remove(item) for item in duplicate_items: lib.remove(item) # Add new ones. if task.is_album: # Add an album. album = lib.add_album(items) task.album_id = album.id else: # Add tracks. for item in items: lib.add(item) finally: lib.save()
items, search_artist=helpers.latinToAscii(release['ArtistName']), search_album=helpers.latinToAscii(release['AlbumTitle'])) except Exception, e: logger.error('Error getting recommendation: %s. Not writing metadata' % e) return if rec == 'RECOMMEND_NONE': logger.warn( 'No accurate album match found for %s, %s - not writing metadata' % (release['ArtistName'], release['AlbumTitle'])) return distance, items, info = out_tuples[0] logger.debug('Beets recommendation: %s' % rec) autotag.apply_metadata(items, info) for item in items: item.write() def embedLyrics(downloaded_track_list): logger.info('Adding lyrics') for downloaded_track in downloaded_track_list: try: f = MediaFile(downloaded_track) except: logger.error('Could not read %s. Not checking lyrics' % downloaded_track)
def apply_choices(config): """A coroutine for applying changes to albums during the autotag process. """ lib = _reopen_lib(config.lib) task = None while True: task = yield task if task.should_skip(): continue items = task.items if task.is_album else [task.item] # Clear IDs in case the items are being re-tagged. for item in items: item.id = None item.album_id = None # Change metadata. if task.should_write_tags(): if task.is_album: autotag.apply_metadata(task.items, task.info) else: autotag.apply_item_metadata(task.item, task.info) # Infer album-level fields. if task.is_album: _infer_album_fields(task) # Find existing item entries that these are replacing. Old # album structures are automatically cleaned up when the # last item is removed. replaced_items = defaultdict(list) for item in items: dup_items = list(lib.items(library.MatchQuery("path", item.path))) for dup_item in dup_items: replaced_items[item].append(dup_item) log.debug("replacing item %i: %s" % (dup_item.id, item.path)) log.debug("%i of %i items replaced" % (len(replaced_items), len(items))) # Move/copy files. task.old_paths = [item.path for item in items] for item in items: if config.copy: # If we're replacing an item, then move rather than # copying. do_copy = not bool(replaced_items[item]) lib.move(item, do_copy, task.is_album) if config.write and task.should_write_tags(): item.write() # Add items to library. We consolidate this at the end to avoid # locking while we do the copying and tag updates. try: # Remove old items. for replaced in replaced_items.itervalues(): for item in replaced: lib.remove(item) # Add new ones. if task.is_album: # Add an album. album = lib.add_album(task.items) task.album_id = album.id else: # Add tracks. for item in items: lib.add(item) finally: lib.save()
def apply_choices(config): """A coroutine for applying changes to albums during the autotag process. """ lib = _reopen_lib(config.lib) task = None while True: task = yield task if task.should_skip(): continue items = task.items if task.is_album else [task.item] # Clear IDs in case the items are being re-tagged. for item in items: item.id = None item.album_id = None # Change metadata. if task.should_write_tags(): if task.is_album: autotag.apply_metadata(task.items, task.info) else: autotag.apply_item_metadata(task.item, task.info) # Infer album-level fields. if task.is_album: _infer_album_fields(task) # Find existing item entries that these are replacing. Old # album structures are automatically cleaned up when the # last item is removed. replaced_items = defaultdict(list) for item in items: dup_items = list(lib.items( library.MatchQuery('path', item.path) )) for dup_item in dup_items: replaced_items[item].append(dup_item) log.debug('replacing item %i: %s' % (dup_item.id, item.path)) log.debug('%i of %i items replaced' % (len(replaced_items), len(items))) # Move/copy files. task.old_paths = [item.path for item in items] for item in items: if config.copy: # If we're replacing an item, then move rather than # copying. do_copy = not bool(replaced_items[item]) lib.move(item, do_copy, task.is_album) if config.write and task.should_write_tags(): item.write() # Add items to library. We consolidate this at the end to avoid # locking while we do the copying and tag updates. try: # Remove old items. for replaced in replaced_items.itervalues(): for item in replaced: lib.remove(item) # Add new ones. if task.is_album: # Add an album. album = lib.add_album(task.items) task.album_id = album.id else: # Add tracks. for item in items: lib.add(item) finally: lib.save()