diff --git a/beetsplug/mbsync.py b/beetsplug/mbsync.py index 48d102df8..a751d4d27 100644 --- a/beetsplug/mbsync.py +++ b/beetsplug/mbsync.py @@ -22,17 +22,38 @@ from beets import autotag, library, ui, util log = logging.getLogger('beets') +def _print_and_apply_changes(lib, item, move, pretend, write): + changes = {} + for key in library.ITEM_KEYS_META: + if item.dirty[key]: + changes[key] = item.old_data[key], getattr(item, key) + if not changes: + return + + # Something changed. + ui.print_obj(item, lib) + for key, (oldval, newval) in changes.iteritems(): + ui.commands._showdiff(key, oldval, newval) + + # If we're just pretending, then don't move or save. + if not pretend: + # Move the item if it's in the library. + if move and lib.directory in util.ancestry(item.path): + lib.move(item) + + if write: + item.write() + lib.store(item) + + def mbsync_func(lib, opts, args): move = opts.move pretend = opts.pretend write = opts.write - if opts.album and opts.singleton: - return with lib.transaction(): - singletons = [item for item in lib.items(ui.decargs(args)) - if item.album_id is None] if not opts.album else [] - albums = lib.albums(ui.decargs(args)) if not opts.singleton else [] + singletons = lib.items(ui.decargs(args + ['singleton'])) + albums = lib.albums(ui.decargs(args)) for s in singletons: if not s.mb_trackid: @@ -40,31 +61,11 @@ def mbsync_func(lib, opts, args): .format(s.title)) continue - old_data = dict(s.record) + s.old_data = dict(s.record) candidates, _ = autotag.match.tag_item(s, search_id=s.mb_trackid) match = candidates[0] autotag.apply_item_metadata(s, match.info) - changes = {} - for key in library.ITEM_KEYS_META: - if s.dirty[key]: - changes[key] = old_data[key], getattr(s, key) - if changes: - # Something changed. - ui.print_obj(s, lib) - for key, (oldval, newval) in changes.iteritems(): - ui.commands._showdiff(key, oldval, newval) - - # If we're just pretending, then don't move or save. - if pretend: - continue - - # Move the item if it's in the library. - if move and lib.directory in util.ancestry(s.path): - lib.move(s) - - if write: - s.write() - lib.store(s) + _print_and_apply_changes(lib, s, move, pretend, write) for a in albums: if not a.mb_albumid: @@ -81,39 +82,17 @@ def mbsync_func(lib, opts, args): autotag.apply_metadata(match.info, match.mapping) for item in items: - changes = {} - for key in library.ITEM_KEYS_META: - if item.dirty[key]: - changes[key] = item.old_data[key], getattr(item, key) - if changes: - # Something changed. - ui.print_obj(item, lib) - for key, (oldval, newval) in changes.iteritems(): - ui.commands._showdiff(key, oldval, newval) + _print_and_apply_changes(lib, item, move, pretend, write) - # If we're just pretending, then don't move or save. - if pretend: - continue + if not pretend: + # Update album structure to reflect an item in it. + for key in library.ALBUM_KEYS_ITEM: + setattr(a, key, getattr(items[0], key)) - # Move the item if it's in the library. - if move and lib.directory in util.ancestry(item.path): - lib.move(item) - - if write: - item.write() - lib.store(item) - - if pretend: - continue - - # Update album structure to reflect an item in it. - for key in library.ALBUM_KEYS_ITEM: - setattr(a, key, getattr(items[0], key)) - - # Move album art (and any inconsistent items). - if move and lib.directory in util.ancestry(items[0].path): - log.debug(u'moving album {0}'.format(a.id)) - a.move() + # Move album art (and any inconsistent items). + if move and lib.directory in util.ancestry(items[0].path): + log.debug(u'moving album {0}'.format(a.id)) + a.move() class MBSyncPlugin(BeetsPlugin): @@ -123,10 +102,6 @@ class MBSyncPlugin(BeetsPlugin): def commands(self): cmd = ui.Subcommand('mbsync', help='update metadata from musicbrainz') - cmd.parser.add_option('-a', '--album', action='store_true', - help='only query for albums') - cmd.parser.add_option('-s', '--singleton', action='store_true', - help='only query for singletons') cmd.parser.add_option('-p', '--pretend', action='store_true', help='show all changes but do nothing') cmd.parser.add_option('-M', '--nomove', action='store_false', diff --git a/docs/plugins/mbsync.rst b/docs/plugins/mbsync.rst index 95733e9d9..4023618b0 100644 --- a/docs/plugins/mbsync.rst +++ b/docs/plugins/mbsync.rst @@ -15,10 +15,10 @@ Usage ----- Enable the plugin and then run ``beet mbsync QUERY`` to fetch updated metadata -for a part of your collection. By default this will use the given query to -search for albums and singletons. You can use the ``-a`` (``--album``) and -``-s`` (``--singleton``) command line flags to only search for albums or -singletons respectively. +for a part of your collection. Since the MusicBrainZ API allows for more +efficient queries for full albums this will by run separately for all albums and +all singletons(tracks that are not part of an album) so it will use the given +query to search for both albums and singletons. To only preview the changes that would be made, use the ``-p`` (``--pretend``) flag. By default all the new metadata will be written to the files and the files