Пример #1
0
 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)
Пример #2
0
        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()
Пример #3
0
        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()
Пример #4
0
 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)
Пример #5
0
    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
Пример #6
0
 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)
Пример #7
0
 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())
Пример #8
0
 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())
Пример #9
0
 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)
Пример #10
0
 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)
Пример #11
0
 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)
Пример #12
0
 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)
Пример #13
0
        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)
Пример #14
0
        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)
Пример #15
0
        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()
Пример #16
0
    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)
Пример #17
0
    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)
Пример #18
0
        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()
Пример #19
0
        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()
Пример #20
0
 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)
Пример #21
0
        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)
Пример #23
0
        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)
Пример #24
0
    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))
Пример #25
0
 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)
Пример #26
0
 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)
Пример #27
0
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()
Пример #28
0
        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()
Пример #29
0
        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()
Пример #30
0
 def command(self, lib, opts, args):
     self.find_key(lib.items(ui.decargs(args)), write=ui.should_write())
Пример #31
0
 def command(self, lib, opts, args):
     items = lib.items(ui.decargs(args))
     write = ui.should_write()
     self.get_bpm(items, write)
Пример #32
0
 def fingerprint_cmd_func(lib, opts, args):
     for item in lib.items(ui.decargs(args)):
         fingerprint_item(self._log, item, write=ui.should_write())
Пример #33
0
 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)
Пример #34
0
 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'])
Пример #35
0
 def fingerprint_cmd_func(lib, opts, args):
     for item in lib.items(ui.decargs(args)):
         fingerprint_item(self._log, item, write=ui.should_write())
Пример #36
0
 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'])
Пример #37
0
 def func(lib, opts, args):
     items = lib.items(ui.decargs(args))
     self._fetch_info(items, ui.should_write())
Пример #38
0
 def command(self, lib, opts, args):
     self.find_key(lib.items(ui.decargs(args)), write=ui.should_write())