Example #1
0
def create_data_and_move(file_path: str, c: config.Config):
    # Normalized number, eg: 111xxx-222.mp4 -> xxx-222.mp4
    n_number = get_number(file_path)

    try:
        print("[!]Making Data for [{}], the number is [{}]".format(
            file_path, n_number))
        core_main(file_path, n_number, c)
        print("[*]======================================================")
    except Exception as err:
        print("[-] [{}] ERROR:".format(file_path))
        print('[-]', err)

        if c.soft_link():
            print("[-]Link {} to failed folder".format(file_path))
            dst = conf.failed_folder() + "/" + os.path.basename(file_path)
            if os.path.lexists(dst):
                os.unlink(dst)
            os.symlink(file_path, dst)
        else:
            try:
                print("[-]Move [{}] to failed folder".format(file_path))
                shutil.move(
                    file_path,
                    str(os.getcwd()) + "/" + conf.failed_folder() + "/")
            except Exception as err:
                print('[!]', err)
def create_data_and_move(file_path: str, c: config.Config, debug):
    # Normalized number, eg: 111xxx-222.mp4 -> xxx-222.mp4
    n_number = get_number(debug, file_path)

    try:
        print("[!]Making Data for [{}], the number is [{}]".format(
            file_path, n_number))
        core_main(file_path, n_number, c)
        print("[*]======================================================")
    except Exception as err:
        print("[-] [{}] ERROR:".format(file_path))
        print('[-]', err, '出现错误')

        # 3.7.2 New: Move or not move to failed folder.
        if c.failed_move() == False:
            if c.soft_link():
                print("[-]Link {} to failed folder".format(file_path))
                os.symlink(file_path,
                           str(os.getcwd()) + "/" + conf.failed_folder() + "/")
        elif c.failed_move() == True:
            if c.soft_link():
                print("[-]Link {} to failed folder".format(file_path))
                os.symlink(file_path,
                           str(os.getcwd()) + "/" + conf.failed_folder() + "/")
            else:
                try:
                    print("[-]Move [{}] to failed folder".format(file_path))
                    shutil.move(
                        file_path,
                        str(os.getcwd()) + "/" + conf.failed_folder() + "/")
                except Exception as err:
                    print('[!]', err)
def create_data_and_move(file_path: str, zero_op, oCC):
    # Normalized number, eg: 111xxx-222.mp4 -> xxx-222.mp4
    debug = config.getInstance().debug()
    n_number = get_number(debug, os.path.basename(file_path))
    file_path = os.path.abspath(file_path)

    if debug is True:
        print(f"[!] [{n_number}] As Number making data for '{file_path}'")
        if zero_op:
            return
        if n_number:
            core_main(file_path, n_number, oCC)
        else:
            print("[-] number empty ERROR")
            moveFailedFolder(file_path)
        print("[*]======================================================")
    else:
        try:
            print(f"[!] [{n_number}] As Number making data for '{file_path}'")
            if zero_op:
                return
            if n_number:
                core_main(file_path, n_number, oCC)
            else:
                raise ValueError("number empty")
            print("[*]======================================================")
        except Exception as err:
            print(f"[-] [{file_path}] ERROR:")
            print('[-]', err)

            try:
                moveFailedFolder(file_path)
            except Exception as err:
                print('[!]', err)
def create_data_and_move(file_path: str, c: config.Config):
    # Normalized number, eg: 111xxx-222.mp4 -> xxx-222.mp4
    n_number = get_number(file_path)

    print("[!]Making Data for [{}], the number is [{}]".format(
        file_path, n_number))
    core_main(file_path, n_number, c)
    print("[*]======================================================")
def create_data_and_move(file_path: str, c: config.Config, debug):
    # Normalized number, eg: 111xxx-222.mp4 -> xxx-222.mp4
    file_name = os.path.basename(file_path)
    n_number = get_number(debug, file_name)
    file_path = os.path.abspath(file_path)

    if c.useDatabase() is True:
        multi_part, part = get_part(n_number, file_path)
        alreadyInDB = database.addNumber(
            n_number + part, os.path.relpath(file_path, os.getcwd()))
        if alreadyInDB:
            print(
                "[!]Data for [{}] with number [{}] is in the database".format(
                    file_path, n_number))
            if not c.ignoreDatabase():
                return

    if debug == True:
        print("[!]Making Data for [{}], the number is [{}]".format(
            file_path, n_number))
        if n_number:
            core_main(file_path, n_number, c)
        else:
            print("[-] number empty ERROR")
        print("[*]======================================================")
    else:
        try:
            print("[!]Making Data for [{}], the number is [{}]".format(
                file_path, n_number))
            if n_number:
                core_main(file_path, n_number, c)
            else:
                raise ValueError("number empty")
            print("[*]======================================================")
        except Exception as err:
            print("[-] [{}] ERROR:".format(file_path))
            print('[-]', err)

            # 3.7.2 New: Move or not move to failed folder.
            if c.failed_move() == False:
                if c.soft_link():
                    print("[-]Link {} to failed folder".format(file_path))
                    os.symlink(file_path,
                               os.path.join(conf.failed_folder(), file_name))
            elif c.failed_move() == True:
                if c.soft_link():
                    print("[-]Link {} to failed folder".format(file_path))
                    os.symlink(file_path,
                               os.path.join(conf.failed_folder(), file_name))
                else:
                    try:
                        print(
                            "[-]Move [{}] to failed folder".format(file_path))
                        shutil.move(
                            file_path,
                            os.path.join(conf.failed_folder(), file_name))
                    except Exception as err:
                        print('[!]', err)
def create_data_and_move(file_path: str, c: config.Config, debug):
    # Normalized number, eg: 111xxx-222.mp4 -> xxx-222.mp4
    file_name = os.path.basename(file_path)
    n_number = get_number(debug, file_name)
    file_path = os.path.abspath(file_path)

    if debug == True:
        print("[!]Making Data for [{}], the number is [{}]".format(
            file_path, n_number))
        if n_number:
            core_main(file_path, n_number, c)
        else:
            print("[-] number empty ERROR")
        print("[*]======================================================")
    else:
        try:
            print("[!]Making Data for [{}], the number is [{}]".format(
                file_path, n_number))
            if n_number:
                core_main(file_path, n_number, c)
            else:
                raise ValueError("number empty")
            print("[*]======================================================")
        except Exception as err:
            print("[-] [{}] ERROR:".format(file_path))
            print('[-]', err)

            # 3.7.2 New: Move or not move to failed folder.
            if c.failed_move() == False:
                if c.soft_link():
                    print("[-]Link {} to failed folder".format(file_path))
                    os.symlink(file_path,
                               os.path.join(conf.failed_folder(), file_name))
            elif c.failed_move() == True:
                if c.soft_link():
                    print("[-]Link {} to failed folder".format(file_path))
                    os.symlink(file_path,
                               os.path.join(conf.failed_folder(), file_name))
                else:
                    try:
                        print(
                            "[-]Move [{}] to failed folder".format(file_path))
                        shutil.move(
                            file_path,
                            os.path.join(conf.failed_folder(), file_name))
                    except Exception as err:
                        print('[!]', err)
def create_data_and_move(file_path: str, c: config.Config,debug):
    # Normalized number, eg: 111xxx-222.mp4 -> xxx-222.mp4
    n_number = get_number(debug,file_path,c)

    # Grap keyword from file path for p**n (no number provided)
    if n_number:
        if debug == True:
            print("[!]Making Data for [{}], the number is [{}]".format(file_path, n_number))
            return core_main(file_path, n_number, c, 'jav')
            print("[*]======================================================")
        else:
            try:
                print("[!]Making Data for [{}], the number is [{}]".format(file_path, n_number))
                return core_main(file_path, n_number, c, 'jav')
                print("[*]======================================================")
            except Exception as err:
                print("[-] [{}] ERROR: {}".format(file_path, err))
                traceback.print_exc() 
                return ""

                # TODO:
                # If we got leftover in the directory, and we simply move the movie file outside of it,
                # , it would be problematic. The better way is to move the whole directory to failed folder.

                # 3.7.2 New: Move or not move to failed folder.
                # if c.failed_move() == False:
                #     if c.soft_link():
                #         print("[-]Link {} to failed folder".format(file_path))
                #         os.symlink(file_path, str(os.getcwd()) + "/" + conf.failed_folder() + "/")
                # elif c.failed_move() == True:
                #     if c.soft_link():
                #         print("[-]Link {} to failed folder".format(file_path))
                #         os.symlink(file_path, str(os.getcwd()) + "/" + conf.failed_folder() + "/")
                #     else:
                #         try:
                #             print("[-]Move [{}] to failed folder".format(file_path))
                #             shutil.move(file_path, str(os.getcwd()) + "/" + conf.failed_folder() + "/")
                #         except Exception as err:
                #             print('[!]', err)
    else:
        try:
            publisher, keyword = get_porn_keyword(debug,file_path,c)
            ## TODO: make a new path in core for p**n
            core_main(file_path, keyword, c, 'p**n')

        except ValueError as e:
            return ""
Example #8
0
def main(args: tuple) -> Path:
    (single_file_path, custom_number, logdir, regexstr, zero_op,
     no_net_op) = args
    conf = config.getInstance()
    main_mode = conf.main_mode()
    folder_path = ""
    if main_mode not in (1, 2, 3):
        print(
            f"[-]Main mode must be 1 or 2 or 3! You can run '{os.path.basename(sys.argv[0])} --help' for more help."
        )
        os._exit(4)

    signal.signal(signal.SIGINT, signal_handler)
    if sys.platform == 'win32':
        signal.signal(signal.SIGBREAK, sigdebug_handler)
    else:
        signal.signal(signal.SIGWINCH, sigdebug_handler)
    dupe_stdout_to_logfile(logdir)

    platform_total = str(' - ' + platform.platform() + ' \n[*] - ' +
                         platform.machine() + ' - Python-' +
                         platform.python_version())

    print('[*]================= Movie Data Capture =================')
    print('[*]' + version.center(54))
    print('[*]======================================================')
    print('[*]' + platform_total)
    print('[*]======================================================')
    print('[*] - 严禁在墙内宣传本项目 - ')
    print('[*]======================================================')

    start_time = time.time()
    print('[+]Start at', time.strftime("%Y-%m-%d %H:%M:%S"))

    print(f"[+]Load Config file '{conf.ini_path}'.")
    if conf.debug():
        print('[+]Enable debug')
    if conf.link_mode() in (1, 2):
        print('[!]Enable {} link'.format(
            ('soft', 'hard')[conf.link_mode() - 1]))
    if len(sys.argv) > 1:
        print('[!]CmdLine:', " ".join(sys.argv[1:]))
    print('[+]Main Working mode ## {}: {} ## {}{}{}'.format(
        *(main_mode,
          ['Scraping', 'Organizing', 'Scraping in analysis folder'][main_mode -
                                                                    1],
          "" if not conf.multi_threading() else ", multi_threading on",
          "" if conf.nfo_skip_days() ==
          0 else f", nfo_skip_days={conf.nfo_skip_days()}",
          "" if conf.stop_counter() ==
          0 else f", stop_counter={conf.stop_counter()}"
          ) if not single_file_path else ('-', 'Single File', '', '', '')))

    if conf.update_check():
        try:
            check_update(version)
        except Exception as e:
            print('[-]Update check failed!', e)

    create_failed_folder(conf.failed_folder())

    # Download Mapping Table, parallel version
    def fmd(f) -> typing.Tuple[str, Path]:
        """

        """
        return (
            'https://raw.githubusercontent.com/yoshiko2/Movie_Data_Capture/master/MappingTable/'
            + f, Path.home() / '.local' / 'share' / 'mdc' / f)

    map_tab = (fmd('mapping_actor.xml'), fmd('mapping_info.xml'),
               fmd('c_number.json'))
    for k, v in map_tab:
        if v.exists():
            if file_modification_days(str(v)) >= conf.mapping_table_validity():
                print("[+]Mapping Table Out of date! Remove", str(v))
                os.remove(str(v))
    try:
        res = parallel_download_files(
            ((k, v) for k, v in map_tab if not v.exists()))
        for i, fp in enumerate(res, start=1):
            if fp and len(fp):
                print(f"[+] [{i}/{len(res)}] Mapping Table Downloaded to {fp}")
            else:
                print(f"[-] [{i}/{len(res)}] Mapping Table Download failed")
    except Exception as e:
        print("[!] ==================== ERROR ====================")
        print("[!] " + "Mapping Table Download FAILED".center(47))
        print("[!] " + "无法连接github".center(47))
        print("[!] " + "请过几小时再试试".center(47))
        print("[-] " + "------ AUTO EXIT AFTER 30s !!! ------ ".center(47))
        time.sleep(30)
        os._exit(-1)

    # create OpenCC converter
    ccm = conf.cc_convert_mode()
    try:
        oCC = None if ccm == 0 else OpenCC('t2s.json' if ccm ==
                                           1 else 's2t.json')
    except:
        # some OS no OpenCC cpython, try opencc-python-reimplemented.
        # pip uninstall opencc && pip install opencc-python-reimplemented
        oCC = None if ccm == 0 else OpenCC('t2s' if ccm == 1 else 's2t')

    if not single_file_path == '':  # Single File
        print('[+]==================== Single File =====================')
        if custom_number == '':
            create_data_and_move_with_custom_number(
                single_file_path,
                get_number(conf.debug(), os.path.basename(single_file_path)),
                oCC)
        else:
            create_data_and_move_with_custom_number(single_file_path,
                                                    custom_number, oCC)
    else:
        folder_path = conf.source_folder()
        if not isinstance(folder_path, str) or folder_path == '':
            folder_path = os.path.abspath(".")

        movie_list = movie_lists(folder_path, regexstr)

        count = 0
        count_all = str(len(movie_list))
        print('[+]Find', count_all, 'movies.')
        print('[*]======================================================')
        stop_count = conf.stop_counter()
        if stop_count < 1:
            stop_count = 999999
        else:
            count_all = str(min(len(movie_list), stop_count))

        for movie_path in movie_list:  # 遍历电影列表 交给core处理
            count = count + 1
            percentage = str(count / int(count_all) * 100)[:4] + '%'
            print('[!] {:>30}{:>21}'.format(
                '- ' + percentage + ' [' + str(count) + '/' + count_all +
                '] -', time.strftime("%H:%M:%S")))
            create_data_and_move(movie_path, zero_op, no_net_op, oCC)
            if count >= stop_count:
                print("[!]Stop counter triggered!")
                break

    if conf.del_empty_folder() and not zero_op:
        rm_empty_folder(conf.success_folder())
        rm_empty_folder(conf.failed_folder())
        if len(folder_path):
            rm_empty_folder(folder_path)

    end_time = time.time()
    total_time = str(timedelta(seconds=end_time - start_time))
    print("[+]Running time",
          total_time[:len(total_time) if total_time.rfind('.') < 0 else -3],
          " End at", time.strftime("%Y-%m-%d %H:%M:%S"))

    print("[+]All finished!!!")

    return close_logfile(logdir)
Example #9
0
def movie_lists(source_folder, regexstr: str) -> typing.List[str]:
    conf = config.getInstance()
    main_mode = conf.main_mode()
    debug = conf.debug()
    nfo_skip_days = conf.nfo_skip_days()
    link_mode = conf.link_mode()
    file_type = conf.media_type().lower().split(",")
    trailerRE = re.compile(r'-trailer\.', re.IGNORECASE)
    cliRE = None
    if isinstance(regexstr, str) and len(regexstr):
        try:
            cliRE = re.compile(regexstr, re.IGNORECASE)
        except:
            pass
    failed_list_txt_path = Path(
        conf.failed_folder()).resolve() / 'failed_list.txt'
    failed_set = set()
    if (main_mode == 3 or link_mode) and not conf.ignore_failed_list():
        try:
            flist = failed_list_txt_path.read_text(
                encoding='utf-8').splitlines()
            failed_set = set(flist)
            if len(flist) != len(
                    failed_set
            ):  # 检查去重并写回,但是不改变failed_list.txt内条目的先后次序,重复的只保留最后的
                fset = failed_set.copy()
                for i in range(len(flist) - 1, -1, -1):
                    fset.remove(flist[i]) if flist[i] in fset else flist.pop(i)
                failed_list_txt_path.write_text('\n'.join(flist) + '\n',
                                                encoding='utf-8')
                assert len(fset) == 0 and len(flist) == len(failed_set)
        except:
            pass
    if not Path(source_folder).is_dir():
        print('[-]Source folder not found!')
        return []
    total = []
    source = Path(source_folder).resolve()
    skip_failed_cnt, skip_nfo_days_cnt = 0, 0
    escape_folder_set = set(re.split("[,,]", conf.escape_folder()))
    for full_name in source.glob(r'**/*'):
        if main_mode != 3 and set(full_name.parent.parts) & escape_folder_set:
            continue
        if not full_name.suffix.lower() in file_type:
            continue
        absf = str(full_name)
        if absf in failed_set:
            skip_failed_cnt += 1
            if debug:
                print('[!]Skip failed movie:', absf)
            continue
        is_sym = full_name.is_symlink()
        if main_mode != 3 and (is_sym or (full_name.stat().st_nlink > 1
                                          and not conf.scan_hardlink())
                               ):  # 短路布尔 符号链接不取stat(),因为符号链接可能指向不存在目标
            continue  # 模式不等于3下跳过软连接和未配置硬链接刮削
        # 调试用0字节样本允许通过,去除小于120MB的广告'苍老师强力推荐.mp4'(102.2MB)'黑道总裁.mp4'(98.4MB)'有趣的妹子激情表演.MP4'(95MB)'有趣的臺灣妹妹直播.mp4'(15.1MB)
        movie_size = 0 if is_sym else full_name.stat(
        ).st_size  # 同上 符号链接不取stat()及st_size,直接赋0跳过小视频检测
        if 0 < movie_size < 125829120:  # 1024*1024*120=125829120
            continue
        if cliRE and not cliRE.search(absf) or trailerRE.search(
                full_name.name):
            continue
        if main_mode == 3:
            nfo = full_name.with_suffix('.nfo')
            if not nfo.is_file():
                if debug:
                    print(f"[!]Metadata {nfo.name} not found for '{absf}'")
            elif nfo_skip_days > 0 and file_modification_days(
                    nfo) <= nfo_skip_days:
                skip_nfo_days_cnt += 1
                if debug:
                    print(
                        f"[!]Skip movie by it's .nfo which modified within {nfo_skip_days} days: '{absf}'"
                    )
                continue
        total.append(absf)

    if skip_failed_cnt:
        print(
            f"[!]Skip {skip_failed_cnt} movies in failed list '{failed_list_txt_path}'."
        )
    if skip_nfo_days_cnt:
        print(
            f"[!]Skip {skip_nfo_days_cnt} movies in source folder '{source}' who's .nfo modified within {nfo_skip_days} days."
        )
    if nfo_skip_days <= 0 or not link_mode or main_mode == 3:
        return total
    # 软连接方式,已经成功削刮的也需要从成功目录中检查.nfo更新天数,跳过N天内更新过的
    skip_numbers = set()
    success_folder = Path(conf.success_folder()).resolve()
    for f in success_folder.glob(r'**/*'):
        if not re.match(r'\.nfo$', f.suffix, re.IGNORECASE):
            continue
        if file_modification_days(f) > nfo_skip_days:
            continue
        number = get_number(False, f.stem)
        if not number:
            continue
        skip_numbers.add(number.lower())

    rm_list = []
    for f in total:
        n_number = get_number(False, os.path.basename(f))
        if n_number and n_number.lower() in skip_numbers:
            rm_list.append(f)
    for f in rm_list:
        total.remove(f)
        if debug:
            print(
                f"[!]Skip file successfully processed within {nfo_skip_days} days: '{f}'"
            )
    if len(rm_list):
        print(
            f"[!]Skip {len(rm_list)} movies in success folder '{success_folder}' who's .nfo modified within {nfo_skip_days} days."
        )

    return total
Example #10
0
        check_update(version)

    if conf.debug():
        print('[+]Enable debug')
    if conf.soft_link():
        print('[!]Enable soft link')

    create_failed_folder(conf.failed_folder())
    start_time = time.time()

    if not single_file_path == '':  #Single File
        print('[+]==================== Single File =====================')
        if custom_number == '':
            create_data_and_move_with_custom_number(
                single_file_path, conf,
                get_number(conf.debug(), os.path.basename(single_file_path)))
        else:
            create_data_and_move_with_custom_number(single_file_path, conf,
                                                    custom_number)
    else:
        if folder_path == '':
            folder_path = os.path.abspath(".")

        movie_list = movie_lists(folder_path,
                                 re.split("[,,]", conf.escape_folder()))

        count = 0
        count_all = str(len(movie_list))
        print('[+]Find', count_all, 'movies')

        for movie_path in movie_list:  # 遍历电影列表 交给core处理
def main():
    version = '5.0.2'
    urllib3.disable_warnings()  #Ignore http proxy warning

    # Read config.ini first, in argparse_function() need conf.failed_folder()
    conf = config.Config("config.ini")

    # Parse command line args
    single_file_path, custom_number, logdir, regexstr, zero_op = argparse_function(
        version)

    main_mode = conf.main_mode()
    if not main_mode in (1, 2, 3):
        print(
            f"[-]Main mode must be 1 or 2 or 3! You can run '{os.path.basename(sys.argv[0])} --help' for more help."
        )
        sys.exit(4)

    signal.signal(signal.SIGINT, signal_handler)
    if sys.platform == 'win32':
        signal.signal(signal.SIGBREAK, sigdebug_handler)
    else:
        signal.signal(signal.SIGWINCH, sigdebug_handler)
    dupe_stdout_to_logfile(logdir)

    print('[*]================== AV Data Capture ===================')
    print('[*]' + version.center(54))
    print('[*]' + "PRC国庆限定版".center(50))
    print('[*]======================================================')
    print('[*]严禁在墙内宣传本项目')

    start_time = time.time()
    print('[+]Start at', time.strftime("%Y-%m-%d %H:%M:%S"))

    if conf.update_check():
        check_update(version)

    print(f"[+]Load Config file '{conf.ini_path}'.")
    if conf.debug():
        print('[+]Enable debug')
    if conf.soft_link():
        print('[!]Enable soft link')
    if len(sys.argv) > 1:
        print('[!]CmdLine:', " ".join(sys.argv[1:]))
    print('[+]Main Working mode ## {}: {} ## {}{}{}'.format(
        *(main_mode,
          ['Scraping', 'Organizing', 'Scraping in analysis folder'][main_mode -
                                                                    1],
          "" if not conf.multi_threading() else ", multi_threading on",
          "" if conf.nfo_skip_days() ==
          0 else f", nfo_skip_days={conf.nfo_skip_days()}",
          "" if conf.stop_counter() ==
          0 else f", stop_counter={conf.stop_counter()}"
          ) if not single_file_path else ('-', 'Single File', '', '', '')))

    create_failed_folder(conf.failed_folder())

    if not single_file_path == '':  #Single File
        print('[+]==================== Single File =====================')
        if custom_number == '':
            create_data_and_move_with_custom_number(
                single_file_path,
                get_number(conf.debug(), os.path.basename(single_file_path)))
        else:
            create_data_and_move_with_custom_number(single_file_path,
                                                    custom_number)
    else:
        folder_path = conf.source_folder()
        if not isinstance(folder_path, str) or folder_path == '':
            folder_path = os.path.abspath(".")

        movie_list = movie_lists(folder_path, regexstr)

        count = 0
        count_all = str(len(movie_list))
        print('[+]Find', count_all, 'movies.')
        print('[*]======================================================')
        stop_count = conf.stop_counter()
        if stop_count < 1:
            stop_count = 999999
        else:
            count_all = str(min(len(movie_list), stop_count))

        for movie_path in movie_list:  # 遍历电影列表 交给core处理
            count = count + 1
            percentage = str(count / int(count_all) * 100)[:4] + '%'
            print('[!] {:>30}{:>21}'.format(
                '- ' + percentage + ' [' + str(count) + '/' + count_all +
                '] -', time.strftime("%H:%M:%S")))
            create_data_and_move(movie_path, zero_op)
            if count >= stop_count:
                print("[!]Stop counter triggered!")
                break

    if conf.del_empty_folder() and not zero_op:
        rm_empty_folder(conf.success_folder())
        rm_empty_folder(conf.failed_folder())
        if len(folder_path):
            rm_empty_folder(folder_path)

    end_time = time.time()
    total_time = str(timedelta(seconds=end_time - start_time))
    print("[+]Running time",
          total_time[:len(total_time) if total_time.rfind('.') < 0 else -3],
          " End at", time.strftime("%Y-%m-%d %H:%M:%S"))

    print("[+]All finished!!!")

    close_logfile(logdir)

    if not conf.auto_exit():
        input(
            "Press enter key exit, you can check the error message before you exit..."
        )

    sys.exit(0)
    if conf.update_check():
        check_update(version)

    if conf.debug():
        print('[+]Enable debug')
    if conf.soft_link():
        print('[!]Enable soft link')

    create_failed_folder(conf.failed_folder())
    start_time = time.time()

    if not single_file_path == '': #Single File
        print('[+]==================== Single File =====================')
        if custom_number == '':
            create_data_and_move_with_custom_number(single_file_path, conf, get_number(conf.debug(), os.path.basename(single_file_path)))
        else:
            create_data_and_move_with_custom_number(single_file_path, conf, custom_number)
    else:
        if folder_path == '':
            folder_path = os.path.abspath(".")

        movie_list = movie_lists(folder_path, re.split("[,,]", conf.escape_folder()))

        count = 0
        count_all = str(len(movie_list))
        print('[+]Find', count_all, 'movies')

        for movie_path in movie_list:  # 遍历电影列表 交给core处理
            count = count + 1
            percentage = str(count / int(count_all) * 100)[:4] + '%'
Example #13
0
def argparse_function(
        version: str,
        release: str) -> typing.Tuple[str, str, str, str, bool, bool]:
    conf = config.getInstance()
    parser = argparse.ArgumentParser(
        epilog=f"Load Config file '{conf.ini_path}'.")
    parser.add_argument("AnalysisPath",
                        default='',
                        nargs='?',
                        help="Analysis folder or single file.")
    parser.add_argument("-p",
                        "--path",
                        default='',
                        nargs='?',
                        help="Analysis folder.")
    parser.add_argument("-s",
                        "--success-output-folder",
                        default='',
                        nargs='?',
                        help="Success output folder.")
    parser.add_argument("-f",
                        "--failed-output-folder",
                        default='',
                        nargs='?',
                        help="Failed output folder.")
    parser.add_argument(
        "-m",
        "--main-mode",
        default='',
        nargs='?',
        help="Main mode. 1:Scraping 2:Organizing 3:Scraping in analysis folder"
    )
    # parser.add_argument("-C", "--config", default='config.ini', nargs='?', help="The config file Path.")
    parser.add_argument(
        "-L",
        "--link-mode",
        default='',
        nargs='?',
        help=
        "Create movie file link. 0:moving movie file, do not create link 1:soft link 2:try hard link first"
    )
    default_logdir = str(Path.home() / '.avlogs')
    parser.add_argument(
        "-o",
        "--log-dir",
        dest='logdir',
        default=default_logdir,
        nargs='?',
        help=
        f"""Duplicate stdout and stderr to logfiles in logging folder, default on.
        default folder for current user: '******'. Change default folder to an empty file,
        or use --log-dir= to turn log off.""")
    parser.add_argument("-q",
                        "--regex-query",
                        dest='regexstr',
                        default='',
                        nargs='?',
                        help="python re module regex filepath filtering.")
    parser.add_argument("-d",
                        "--nfo-skip-days",
                        dest='days',
                        default='',
                        nargs='?',
                        help="Override nfo_skip_days value in config.")
    parser.add_argument("-c",
                        "--stop-counter",
                        dest='cnt',
                        default='',
                        nargs='?',
                        help="Override stop_counter value in config.")
    parser.add_argument(
        "-R",
        "--rerun-delay",
        dest='delaytm',
        default='',
        nargs='?',
        help=
        "Delay (eg. 1h10m30s or 60 (second)) time and rerun, until all movies proceed. Note: stop_counter value in config or -c must none zero."
    )
    parser.add_argument("-i",
                        "--ignore-failed-list",
                        action="store_true",
                        help="Ignore failed list '{}'".format(
                            os.path.join(os.path.abspath(conf.failed_folder()),
                                         'failed_list.txt')))
    parser.add_argument("-a",
                        "--auto-exit",
                        action="store_true",
                        help="Auto exit after program complete")
    parser.add_argument(
        "-g",
        "--debug",
        action="store_true",
        help="Turn on debug mode to generate diagnostic log for issue report.")
    parser.add_argument(
        "-N",
        "--no-network-operation",
        action="store_true",
        help=
        "No network query, do not get metadata, for cover cropping purposes, only takes effect when main mode is 3."
    )
    parser.add_argument("-w",
                        "--website",
                        dest='site',
                        default='',
                        nargs='?',
                        help="Override [priority]website= in config.")
    parser.add_argument(
        "-D",
        "--download-images",
        dest='dnimg',
        action="store_true",
        help=
        "Override [common]download_only_missing_images=0 force invoke image downloading."
    )
    parser.add_argument(
        "-C",
        "--config-override",
        dest='cfgcmd',
        action='append',
        nargs=1,
        help=
        "Common use config override. Grammar: section:key=value[;[section:]key=value] eg. 'de:s=1' or 'debug_mode:switch=1' override[debug_mode]switch=1 Note:this parameters can be used multiple times"
    )
    parser.add_argument(
        "-z",
        "--zero-operation",
        dest='zero_op',
        action="store_true",
        help=
        """Only show job list of files and numbers, and **NO** actual operation
is performed. It may help you correct wrong numbers before real job.""")
    verrel = version if not len(release) else f"{version}-{release}"
    parser.add_argument("-v", "--version", action="version", version=verrel)

    args = parser.parse_args()

    def set_natural_number_or_none(sk, value):
        if isinstance(value, str) and value.isnumeric() and int(value) >= 0:
            conf.set_override(f'{sk}={value}')

    def set_str_or_none(sk, value):
        if isinstance(value, str) and len(value):
            conf.set_override(f'{sk}={value}')

    def set_bool_or_none(sk, value):
        if isinstance(value, bool) and value:
            conf.set_override(f'{sk}=1')

    set_natural_number_or_none("common:main_mode", args.main_mode)
    set_natural_number_or_none("common:link_mode", args.link_mode)
    set_str_or_none("common:source_folder", args.path)
    set_str_or_none("common:success_output_folder", args.success_output_folder)
    set_str_or_none("common:failed_output_folder", args.failed_output_folder)
    set_bool_or_none("common:auto_exit", args.auto_exit)
    set_natural_number_or_none("common:nfo_skip_days", args.days)
    set_natural_number_or_none("common:stop_counter", args.cnt)
    set_bool_or_none("common:ignore_failed_list", args.ignore_failed_list)
    set_str_or_none("common:rerun_delay", args.delaytm)
    set_str_or_none("priority:website", args.site)
    if isinstance(args.dnimg, bool) and args.dnimg:
        conf.set_override("common:download_only_missing_images=0")
    set_bool_or_none("debug_mode:switch", args.debug)
    regexstr = args.regexstr
    if isinstance(args.AnalysisPath, str) and len(args.AnalysisPath):
        ana_path = Path(args.AnalysisPath)
        if ana_path.is_file():
            sourcedir = ana_path.parent
            if sourcedir.is_dir():
                conf.set_override(f'common:source_folder={str(sourcedir)}')
                regexstr = get_number(False, ana_path.stem)
        elif ana_path.is_dir():
            conf.set_override(f"common:source_folder={str(ana_path)}")
    if isinstance(args.cfgcmd, list):
        for cmd in args.cfgcmd:
            conf.set_override(cmd[0])

    no_net_op = False
    if conf.main_mode() == 3:
        no_net_op = args.no_network_operation
        if no_net_op:
            conf.set_override(
                "common:stop_counter=0;rerun_delay=0s;face:aways_imagecut=1")

    return args.logdir, regexstr, args.zero_op, no_net_op, verrel, get_cpu_info(
    )