Пример #1
0
    def setup(self):
        # absolute path to the file is pretty useful
        self.path = os.path.abspath(os.path.dirname(__file__))

        def build_path(path):
            if not os.path.exists(path):
                os.mkdir(path)

            return path

        def join_path(path):
            return os.path.join(self.path, path)

        self.files = build_path(join_path('files'))
        self.subfolder = build_path(join_path('subfolder'))
        self.organised = build_path(join_path('organised'))
        self.renamed = join_path('renamed')

        for path in (self.files, self.subfolder):
            self.build_files(path)

        # instantiate tvr
        self.config = Config()
        self.config.config['defaults']['renamed'] = self.files
        self.tv = TvRenamr(self.files, self.config, cache=False)

        self._file = File('The Big Bang Theory', '3', ['01'], '.mp4')
        self._file.episodes[0].title = 'The Electric Can Opener Fluctuation'
Пример #2
0
def worker(queue, working_dir, config_path):
    log = logging.getLogger('tvrd.worker')
    while True:
        item = queue.get()  # should be file or folder
        if os.path.isfile(item):
            item = os.path.split(item)[1]
        log.debug('Found: {0}'.format(item))
        try:
            tv = TvRenamr(working_dir, Config(config_path))
            episode = Episode(**tv.extract_details_from_file(item))
            episode.title = tv.retrieve_episode_name(episode)
            episode.show_name = tv.format_show_name(episode.show_name)
            destination = tv.rename(item, tv.build_path(episode))

            remove_torrent(item)

            log.log(21, os.path.splitext(os.path.split(destination)[1])[0])
        except Exception as e:
            for msg in e.args:
                kwargs = {'type': e.__repr__()[:e.__repr__().index('(')], 'error': msg}
                log.critical('{type}: {error}'.format(**kwargs))
            continue
        time.sleep(1)  # don't use 100% cpu
        queue.task_done()
Пример #3
0
def tv():
    config = Config()
    config.config['defaults']['renamed'] = FILES
    return TvRenamr(files, config, cache=False)
Пример #4
0
def rename(config, canonical, debug, dry_run, episode,  # pylint: disable-msg=too-many-arguments
           ignore_filelist, log_file, log_level, name,  # pylint: disable-msg=too-many-arguments
           no_cache, output_format, organise, partial,  # pylint: disable-msg=too-many-arguments
           quiet, recursive, rename_dir, regex, season,  # pylint: disable-msg=too-many-arguments
           show, show_override, specials, the, paths):  # pylint: disable-msg=too-many-arguments

    if debug:
        log_level = 10
    start_logging(log_file, log_level, quiet)
    logger = functools.partial(log.log, level=26)

    if dry_run or debug:
        start_dry_run(logger)

    for current_dir, filename in build_file_list(paths, recursive, ignore_filelist):
        try:
            tv = TvRenamr(current_dir, debug, dry_run, no_cache)

            _file = File(**tv.extract_details_from_file(
                filename,
                user_regex=regex,
                partial=partial,
            ))
            # TODO: Warn setting season & episode will override *all* episodes
            _file.user_overrides(show, season, episode)
            _file.safety_check()

            config = get_config(config)

            for episode in _file.episodes:
                canonical = config.get(
                    'canonical',
                    _file.show_name,
                    default=episode.file_.show_name,
                    override=canonical
                )

                # TODO: Warn setting name will override *all* episodes
                episode.title = tv.retrieve_episode_title(
                    episode,
                    canonical=canonical,
                    override=name,
                )

            show = config.get_output(_file.show_name, override=show_override)
            the = config.get('the', show=_file.show_name, override=the)
            _file.show_name = tv.format_show_name(show, the=the)

            _file.set_output_format(config.get(
                'format',
                _file.show_name,
                default=_file.output_format,
                override=output_format
            ))

            organise = config.get(
                'organise',
                _file.show_name,
                default=False,
                override=organise
            )
            rename_dir = config.get(
                'renamed',
                _file.show_name,
                default=current_dir,
                override=rename_dir
            )
            specials_folder = config.get(
                'specials_folder',
                _file.show_name,
                default='Season 0',
                override=specials,
            )
            path = tv.build_path(
                _file,
                rename_dir=rename_dir,
                organise=organise,
                specials_folder=specials_folder,
            )

            tv.rename(filename, path)
        except errors.NoNetworkConnectionException:
            if dry_run or debug:
                stop_dry_run(logger)
            sys.exit(1)
        except (AttributeError,
                errors.EmptyEpisodeTitleException,
                errors.EpisodeNotFoundException,
                errors.IncorrectCustomRegularExpressionSyntaxException,
                errors.InvalidXMLException,
                errors.MissingInformationException,
                errors.OutputFormatMissingSyntaxException,
                errors.PathExistsException,
                errors.ShowNotFoundException,
                errors.UnexpectedFormatException) as e:
            continue
        except Exception as e:
            if debug:
                # In debug mode, show the full traceback.
                raise
            for msg in e.args:
                log.critical('Error: %s', msg)
            sys.exit(1)

        # if we're not doing a dry run add a blank line for clarity
        if not (debug and dry_run):
            log.info('')

    if dry_run or debug:
        stop_dry_run(logger)
Пример #5
0
def rename(
    config,
    canonical,
    debug,
    dry_run,
    episode,  # pylint: disable-msg=too-many-arguments
    ignore_filelist,
    log_file,
    log_level,
    name,  # pylint: disable-msg=too-many-arguments
    no_cache,
    output_format,
    organise,
    partial,  # pylint: disable-msg=too-many-arguments
    quiet,
    recursive,
    rename_dir,
    regex,
    season,  # pylint: disable-msg=too-many-arguments
    show,
    show_override,
    specials,
    symlink,
    the,  # pylint: disable-msg=too-many-arguments
    paths):  # pylint: disable-msg=too-many-arguments

    logger = functools.partial(log.log, 26)

    if dry_run or debug:
        start_dry_run(logger)

    if not paths:
        paths = [os.getcwd()]

    for current_dir, filename in build_file_list(paths, recursive,
                                                 ignore_filelist):
        try:
            tv = TvRenamr(current_dir, debug, dry_run, symlink, no_cache)

            _file = File(**tv.extract_details_from_file(
                filename,
                user_regex=regex,
                partial=partial,
            ))
            # TODO: Warn setting season & episode will override *all* episodes
            _file.user_overrides(show, season, episode)
            _file.safety_check()

            conf = get_config(config)

            for ep in _file.episodes:
                canonical = conf.get('canonical',
                                     _file.show_name,
                                     default=ep.file_.show_name,
                                     override=canonical)

                # TODO: Warn setting name will override *all* episodes
                ep.title = tv.retrieve_episode_title(
                    ep,
                    canonical=canonical,
                    override=name,
                )

                # TODO: make this a sanitisation method on ep?
                ep.title = ep.title.replace('/', '-')

            show = conf.get_output(_file.show_name, override=show_override)
            the = conf.get('the', show=_file.show_name, override=the)
            _file.show_name = tv.format_show_name(show, the=the)

            _file.set_output_format(
                conf.get('format',
                         _file.show_name,
                         default=_file.output_format,
                         override=output_format))

            organise = conf.get('organise',
                                _file.show_name,
                                default=False,
                                override=organise)
            rename_dir = conf.get('renamed',
                                  _file.show_name,
                                  default=current_dir,
                                  override=rename_dir)
            specials_folder = conf.get(
                'specials_folder',
                _file.show_name,
                default='Season 0',
                override=specials,
            )
            path = tv.build_path(
                _file,
                rename_dir=rename_dir,
                organise=organise,
                specials_folder=specials_folder,
            )

            tv.rename(filename, path)
        except errors.NetworkException:
            if dry_run or debug:
                stop_dry_run(logger)
            sys.exit(1)
        except (AttributeError, errors.EmptyEpisodeTitleException,
                errors.EpisodeNotFoundException,
                errors.IncorrectRegExpException, errors.InvalidXMLException,
                errors.MissingInformationException,
                errors.OutputFormatMissingSyntaxException,
                errors.PathExistsException, errors.ShowNotFoundException,
                errors.UnexpectedFormatException) as e:
            continue
        except Exception as e:
            if debug:
                # In debug mode, show the full traceback.
                raise
            for msg in e.args:
                log.critical('Error: %s', msg)
            sys.exit(1)

        # if we're not doing a dry run add a blank line for clarity
        if not (debug and dry_run):
            log.info('')

    if dry_run or debug:
        stop_dry_run(logger)
Пример #6
0
 def test_instantiate_core(self):
     assert isinstance(TvRenamr('/', self.config), TvRenamr)
Пример #7
0
def rename(config, copy, canonical, debug, dry_run,  # pylint: disable-msg=too-many-arguments
           episode, ignore_filelist, log_file,  # pylint: disable-msg=too-many-arguments
           log_level, name, no_cache, output_format,  # pylint: disable-msg=too-many-arguments
           organise, partial, quiet, recursive,  # pylint: disable-msg=too-many-arguments
           rename_dir, regex, season, show,  # pylint: disable-msg=too-many-arguments
           show_override, specials, symlink, the,  # pylint: disable-msg=too-many-arguments
           paths):  # pylint: disable-msg=too-many-arguments

    if debug:
        log_level = 10
    start_logging(log_file, log_level, quiet)
    logger = functools.partial(log.log, 26)

    if dry_run or debug:
        start_dry_run(logger)

    if copy and symlink:
        raise click.UsageError("You can't use --copy and --symlink at the same time.")

    if not paths:
        paths = [os.getcwd()]

    for current_dir, filename in build_file_list(paths, recursive, ignore_filelist):
        try:
            tv = TvRenamr(current_dir, debug, dry_run, no_cache)

            _file = File(**tv.extract_details_from_file(
                filename,
                user_regex=regex,
                partial=partial,
            ))
            # TODO: Warn setting season & episode will override *all* episodes
            _file.user_overrides(show, season, episode)
            _file.safety_check()

            conf = get_config(config)

            for ep in _file.episodes:
                canonical = conf.get(
                    'canonical',
                    _file.show_name,
                    default=ep.file_.show_name,
                    override=canonical
                )

                # TODO: Warn setting name will override *all* episodes
                ep.title = tv.retrieve_episode_title(
                    ep,
                    canonical=canonical,
                    override=name,
                )

                # TODO: make this a sanitisation method on ep?
                ep.title = ep.title.replace('/', '-')

            show = conf.get_output(_file.show_name, override=show_override)
            the = conf.get('the', show=_file.show_name, override=the)
            _file.show_name = tv.format_show_name(show, the=the)

            _file.set_output_format(conf.get(
                'format',
                _file.show_name,
                default=_file.output_format,
                override=output_format
            ))

            copy = conf.get(
                'copy',
                _file.show_name,
                default=False,
                override=copy
            )
            organise = conf.get(
                'organise',
                _file.show_name,
                default=True,
                override=organise
            )
            rename_dir = conf.get(
                'renamed',
                _file.show_name,
                default=current_dir,
                override=rename_dir
            )
            specials_folder = conf.get(
                'specials_folder',
                _file.show_name,
                default='Season 0',
                override=specials,
            )
            symlink = conf.get(
                'symlink',
                _file.show_name,
                default=False,
                override=symlink
            )
            path = tv.build_path(
                _file,
                rename_dir=rename_dir,
                organise=organise,
                specials_folder=specials_folder,
            )

            tv.rename(filename, path, copy, symlink)
        except errors.NetworkException:
            if dry_run or debug:
                stop_dry_run(logger)
            sys.exit(1)
        except (AttributeError,
                errors.EmptyEpisodeTitleException,
                errors.EpisodeNotFoundException,
                errors.IncorrectRegExpException,
                errors.InvalidXMLException,
                errors.MissingInformationException,
                errors.OutputFormatMissingSyntaxException,
                errors.PathExistsException,
                errors.ShowNotFoundException,
                errors.UnexpectedFormatException) as e:
            continue
        except Exception as e:
            if debug:
                # In debug mode, show the full traceback.
                raise
            for msg in e.args:
                log.critical('Error: %s', msg)
            sys.exit(1)

        # if we're not doing a dry run add a blank line for clarity
        if not (debug and dry_run):
            log.info('')

    if dry_run or debug:
        stop_dry_run(logger)
Пример #8
0
def test_instantiate_core():
    assert isinstance(TvRenamr('/', Config()), TvRenamr)