def func(lib, opts, args): # The "write to files" option corresponds to the # import_write config value. write = ui.should_write() if opts.writerest: self.writerest_indexes(opts.writerest) for item in lib.items(ui.decargs(args)): if not opts.local_only and not self.config['local']: self.fetch_item_lyrics( lib, item, write, opts.force_refetch or self.config['force'], ) if item.lyrics: if opts.printlyr: ui.print_(item.lyrics) if opts.writerest: self.writerest(opts.writerest, item) if opts.writerest: # flush last artist self.writerest(opts.writerest, None) ui.print_(u'ReST files generated. to build, use one of:') ui.print_(u' sphinx-build -b html %s _build/html' % opts.writerest) ui.print_(u' sphinx-build -b epub %s _build/epub' % opts.writerest) ui.print_( (u' sphinx-build -b latex %s _build/latex ' u'&& make -C _build/latex all-pdf') % opts.writerest)
def lastgenre_func(lib, opts, args): write = ui.should_write() self.config.set_args(opts) if opts.album: # Fetch genres for whole albums for album in lib.albums(ui.decargs(args)): album.genre, src = self._get_genre(album) self._log.info(u'genre for album {0} ({1}): {0.genre}', album, src) album.store() for item in album.items(): # If we're using track-level sources, also look up each # track on the album. if 'track' in self.sources: item.genre, src = self._get_genre(item) item.store() self._log.info( u'genre for track {0} ({1}): {0.genre}', item, src) if write: item.try_write() else: # Just query singletons, i.e. items that are not part of # an album for item in lib.items(ui.decargs(args)): item.genre, src = self._get_genre(item) self._log.debug(u'added last.fm item genre ({0}): {1}', src, item.genre) item.store()
def func(lib, opts, args): # The "write to files" option corresponds to the # import_write config value. write = ui.should_write() if opts.writerest: self.writerest_indexes(opts.writerest) for item in lib.items(ui.decargs(args)): if not opts.local_only and not self.config['local']: self.fetch_item_lyrics( lib, item, write, opts.force_refetch or self.config['force'], ) if item.lyrics: if opts.printlyr: ui.print_(item.lyrics) if opts.writerest: self.writerest(opts.writerest, item) if opts.writerest: # flush last artist self.writerest(opts.writerest, None) ui.print_(u'ReST files generated. to build, use one of:') ui.print_(u' sphinx-build -b html %s _build/html' % opts.writerest) ui.print_(u' sphinx-build -b epub %s _build/epub' % opts.writerest) ui.print_((u' sphinx-build -b latex %s _build/latex ' u'&& make -C _build/latex all-pdf') % opts.writerest)
def command_func(self, lib, opts, args): try: write = ui.should_write(opts.write) force = opts.force # Bypass self.open_pool() if called with `--threads 0` if opts.threads != 0: threads = opts.threads or self.config['threads'].get(int) self.open_pool(threads) if opts.album: albums = lib.albums(ui.decargs(args)) self._log.info("Analyzing {} albums ~ {} backend...".format( len(albums), self.backend_name)) for album in albums: self.handle_album(album, write, force) else: items = lib.items(ui.decargs(args)) self._log.info("Analyzing {} tracks ~ {} backend...".format( len(items), self.backend_name)) for item in items: self.handle_track(item, write, force) self.close_pool() except (SystemExit, KeyboardInterrupt): # Silence interrupt exceptions pass
def func(lib, opts, args): # The "write to files" option corresponds to the # import_write config value. write = ui.should_write() for item in lib.items(ui.decargs(args)): self.fetch_item_lyrics(lib, item, write, opts.force_refetch or self.config["force"]) if opts.printlyr and item.lyrics: ui.print_(item.lyrics)
def save_changes(self, objs): """Save a list of updated Model objects to the database. """ # Save to the database and possibly write tags. for ob in objs: if ob._dirty: self._log.debug(u'saving changes to {}', ob) ob.try_sync(ui.should_write(), ui.should_move())
def save_write(self, objs): """Save a list of updated Model objects to the database. """ # Save to the database and possibly write tags. for ob in objs: if ob._dirty: self._log.debug("saving changes to {}", ob) ob.try_sync(ui.should_write())
def process_album(self, album): """Automatically embed art after art has been set """ if self.config['auto'] and ui.should_write(): max_width = self.config['maxwidth'].get(int) art.embed_album(self._log, album, max_width, True, self.config['compare_threshold'].get(int), self.config['ifempty'].get(bool)) self.remove_artfile(album)
def fetch_func(lib, opts, args): self.config.set_args(opts) write = ui.should_write() for item in lib.items(ui.decargs(args)): self._log.info(u'{0}', item) if self.config['force'] or self.requires_update(item): song = self.fetch_song(item) if song: self.apply_metadata(item, song, write)
def func(lib, opts, args): write = ui.should_write(opts.write) force = opts.force if opts.album: for album in lib.albums(ui.decargs(args)): self.handle_album(album, write, force) else: self.handle_tracks(lib.items(ui.decargs(args)), write, force)
def func(lib, opts, args): write = ui.should_write() if opts.album: for album in lib.albums(ui.decargs(args)): self.handle_album(album, write) else: for item in lib.items(ui.decargs(args)): self.handle_track(item, write)
def func(lib, opts, args): self.config.set_args(opts) drop_feat = self.config["drop"].get(bool) write = ui.should_write() for item in lib.items(ui.decargs(args)): self.ft_in_title(item, drop_feat) item.store() if write: item.try_write()
def func(self, lib, opts, args): """Command handler for the mbsync function. """ move = ui.should_move(opts.move) pretend = opts.pretend write = ui.should_write(opts.write) query = ui.decargs(args) self.singletons(lib, query, move, pretend, write) self.albums(lib, query, move, pretend, write)
def func(self, lib, opts, args): """Command handler for the bpsync function. """ move = ui.should_move(opts.move) pretend = opts.pretend write = ui.should_write(opts.write) query = ui.decargs(args) self.singletons(lib, query, move, pretend, write) self.albums(lib, query, move, pretend, write)
def func(lib, opts, args): self.config.set_args(opts) force_parent = self.config['force'].get(bool) write = ui.should_write() for item in lib.items(ui.decargs(args)): self.find_work(item, force_parent) item.store() if write: item.try_write()
def func(lib, opts, args): self.config.set_args(opts) drop_feat = self.config['drop'].get(bool) write = ui.should_write() for item in lib.items(ui.decargs(args)): self.ft_in_title(item, drop_feat) item.store() if write: item.try_write()
def func(lib, opts, args): # The "write to files" option corresponds to the # import_write config value. write = ui.should_write() for item in lib.items(ui.decargs(args)): self.fetch_item_lyrics( lib, item, write, opts.force_refetch or self.config['force'], ) if opts.printlyr and item.lyrics: ui.print_(item.lyrics)
def func(lib, opts, args): self._log.setLevel(logging.INFO) write = ui.should_write() if opts.album: for album in lib.albums(ui.decargs(args)): self.handle_album(album, write) else: for item in lib.items(ui.decargs(args)): self.handle_track(item, write)
def command(self, lib, opts, args): write = ui.should_write() items = lib.items(ui.decargs(args)) total_items = len(items) for num, item in enumerate(items): self._log.info(u'{0}/{1} {2}', num + 1, total_items, util.displayable_path(item.path)) new_comments = self.build_structured_comment(item) self._log.info(u'{0}', new_comments) if not opts.dry_run: if new_comments != item.comments or opts.force: self.write_structured_comment(item, new_comments, write)
def import_begin(self, session): self.should_write = ui.should_write() self.should_move = ui.should_move() for name, model_cls in [('album', Album), ('singleton', Item)]: modifies = self.get_modifies(self.config['modify_' + name].items(), model_cls, 'modify_' + name) setattr(self, name + '_modifies', modifies) self.album_item_modifies = [] for albumquery, itemmodifies in self.config['modify_album_items'].items(): albumdbquery, _ = parse_query_string(util.as_string(albumquery), Album) modifies = self.get_modifies(itemmodifies.items(), Item, u'modify_album_items.{0}'.format(albumquery)) self.album_item_modifies.append((albumdbquery, modifies))
def update_track_rating(self, item, opts): should_write = ui.should_write() self._log.debug(u'Getting rating for {0}', item) # Get any rating already in the file rating = item.userrating if 'userrating' in item else None self._log.debug(u'Found rating value "{0}"', rating) if not self.valid_rating(rating) or opts.overwrite: item['userrating'] = int(opts.update) if opts.sync or opts.all: item['externalrating'] = int(opts.update) if should_write and item.try_write(): item.store() self._log.info(u'Applied rating {0}', opts.update) else: # We should consider asking here self._log.info(u'skip already-rated track {0}', item.path)
def import_track_rating(self, item, opts): should_write = ui.should_write() self._log.debug(u'Getting rating for {0}', item) # Get any rating already in the file rating = item.userrating if 'userrating' in item else None self._log.debug(u'Found rating value "{0}"', rating) if 'externalrating' in item: imported_rating = item.externalrating self._log.debug(u'Found external rating value "{0}"', imported_rating) if not rating or opts.overwrite: item.userrating = int(imported_rating) if should_write and item.try_write(): item.store() self._log.info(u'Applied rating {0}', imported_rating) else: # We should consider asking here self._log.info(u'skip already-rated track {0}', item.path)
def submit_items(log, userkey, items, chunksize=64): """Submit fingerprints for the items to the Acoustid server. """ data = [] # The running list of dictionaries to submit. def submit_chunk(): """Submit the current accumulated fingerprint data.""" log.info('submitting {0} fingerprints', len(data)) try: acoustid.submit(API_KEY, userkey, data) except acoustid.AcoustidError as exc: log.warning('acoustid submission error: {0}', exc) del data[:] for item in items: fp = fingerprint_item(log, item, write=ui.should_write()) # Construct a submission dictionary for this item. item_data = { 'duration': int(item.length), 'fingerprint': fp, } if item.mb_trackid: item_data['mbid'] = item.mb_trackid log.debug('submitting MBID') else: item_data.update({ 'track': item.title, 'artist': item.artist, 'album': item.album, 'albumartist': item.albumartist, 'year': item.year, 'trackno': item.track, 'discno': item.disc, }) log.debug('submitting textual metadata') data.append(item_data) # If we have enough data, submit a chunk. if len(data) >= chunksize: submit_chunk() # Submit remaining data in a final chunk. if data: submit_chunk()
def lastgenre_func(lib, opts, args): write = ui.should_write() self.config.set_args(opts) for album in lib.albums(ui.decargs(args)): album.genre, src = self._get_genre(album) self._log.info(u"genre for album {0} ({1}): {0.genre}", album, src) album.store() for item in album.items(): # If we're using track-level sources, also look up each # track on the album. if "track" in self.sources: item.genre, src = self._get_genre(item) item.store() self._log.info(u"genre for track {0} ({1}): {0.genre}", item, src) if write: item.try_write()
def lastgenre_func(lib, opts, args): write = ui.should_write() self.config.set_args(opts) for album in lib.albums(ui.decargs(args)): album.genre, src = self._get_genre(album) self._log.info(u'genre for album {0} ({1}): {0.genre}', album, src) album.store() for item in album.items(): # If we're using track-level sources, also look up each # track on the album. if 'track' in self.sources: item.genre, src = self._get_genre(item) item.store() self._log.info(u'genre for track {0} ({1}): {0.genre}', item, src) if write: item.try_write()
def command(self, lib, opts, args): self.find_key(lib.items(ui.decargs(args)), write=ui.should_write())
def command(self, lib, opts, args): items = lib.items(ui.decargs(args)) write = ui.should_write() self.get_bpm(items, write)
def fingerprint_cmd_func(lib, opts, args): for item in lib.items(ui.decargs(args)): fingerprint_item(self._log, item, write=ui.should_write())
def modify_func(self, lib, opts, args): query, mods, dels = modify_parse_args(decargs(args)) if not mods and not dels: raise ui.UserError(u'no modifications specified') self.modify_items(lib, mods, dels, query, ui.should_write(opts.write), ui.should_move(opts.move), opts.album, not opts.yes)
def func(lib, opts, args): items = lib.items(ui.decargs(args)) self._fetch_info(items, ui.should_write(), opts.force_refetch or self.config['force'])
def func(lib, opts, args): items = lib.items(ui.decargs(args)) self._get_info(items, ui.should_write(), opts.force_recalc or self.config['force'])
def func(lib, opts, args): items = lib.items(ui.decargs(args)) self._fetch_info(items, ui.should_write())