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 ""
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)
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
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] + '%'
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( )