def classify_files(jav, num_fail, settings, dict_data, list_classify_basis, root_classify): # 如果需要归类,且不是针对文件夹来归类 if settings.bool_classify and not settings.bool_classify_folder: # 移动的目标文件夹路径 root_dest = root_classify + sep for j in list_classify_basis: root_dest += dict_data[j].rstrip( ) # 【临时变量】归类的目标文件夹路径 C:\Users\JuneRain\Desktop\测试文件夹\葵司\ # 还不存在该文件夹,新建 if not exists(root_dest): makedirs(root_dest) path_new = root_dest + sep + jav.name # 【临时变量】新的影片路径 # 目标文件夹没有相同的影片,防止用户已经有一个“avop-127.mp4”,现在又来一个 if not exists(path_new): rename(jav.path, path_new) print(' >归类视频文件完成') # 移动字幕 if jav.subtitle: path_subtitle_new = root_dest + sep + jav.subtitle # 【临时变量】新的字幕路径 if jav.path_subtitle != path_subtitle_new: rename(jav.path_subtitle, path_subtitle_new) # 不再更新 jav.path_subtitle,下面不会再操作 字幕文件 print(' >归类字幕文件完成') jav.root = root_dest # 【更新】jav.root else: num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!归类失败,重复的影片,归类的目标文件夹已经存在相同的影片:' + path_new + '\n') raise FileExistsError # 【终止对该jav的整理】 return jav, num_fail
def classify_folder(jav, num_fail, settings, dict_data, list_classify_basis, root_classify, root, bool_separate_folder, num_all_episodes): if settings.bool_classify and settings.bool_classify_folder and jav.episode == num_all_episodes: # 需要移动文件夹,且,是该影片的最后一集 # 用户选择的文件夹是一部影片的独立文件夹,为了避免在这个文件夹里又生成新的归类文件夹 if bool_separate_folder and root_classify.startswith(root): print(' >无法归类,请选择该文件夹的上级文件夹作它的归类根目录') return num_fail # 归类放置的目标文件夹 root_dest = root_classify + sep # 移动的目标文件夹 for j in list_classify_basis: root_dest += dict_data[j].rstrip( ' .' ) # 【临时变量】 文件夹移动的目标上级文件夹 C:\Users\JuneRain\Desktop\测试文件夹\1\葵司\ root_new = root_dest + sep + jav.folder # 【临时变量】 文件夹移动的目标路径 C:\Users\JuneRain\Desktop\测试文件夹\1\葵司\【葵司】AVOP-127\ # print(root_new) # 还不存在归类的目标文件夹 if not exists(root_new): makedirs(root_new) # 把现在文件夹里的东西都搬过去 jav_files = listdir(jav.root) for i in jav_files: rename(jav.root + sep + i, root_new + sep + i) # 删除“旧房子”,这是javsdt唯一的删除操作,而且os.rmdir只能删除空文件夹 rmdir(jav.root) print(' >归类文件夹完成') # 用户已经有了这个文件夹,可能以前处理过同车牌的视频 else: num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!归类失败,归类的目标位置已存在相同文件夹:' + root_new + '\n') raise FileExistsError return num_fail
def rename_folder(jav, num_fail, settings, dict_data, list_name_folder, bool_separate_folder, num_all_episodes): if settings.bool_rename_folder: # 构造 新文件夹名folder_new folder_new = '' for j in list_name_folder: folder_new += (dict_data[j]) folder_new = folder_new.rstrip(' .') # 【临时变量】新的所在文件夹。去除末尾空格和“.” # 是独立文件夹,才会重命名文件夹 if bool_separate_folder: # 当前视频是该车牌的最后一集,他的兄弟姐妹已经处理完成,才会重命名它们的“家”。 if jav.episode == num_all_episodes: list_root_now = jav.root.split(sep) del list_root_now[-1] root_new = sep.join( list_root_now) + sep + folder_new # 【临时变量】新的影片所在文件夹路径。 # 想要重命名的目标影片文件夹不存在 if not exists(root_new): rename(jav.root, root_new) jav.root = root_new # 【更新】jav.root # 目标影片文件夹存在,但就是现在的文件夹,即新旧相同 elif jav.root == root_new: pass # 真的有一个同名的文件夹了 else: num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!重命名文件夹失败,已存在相同文件夹:' + root_new + '\n') raise FileExistsError # 【终止对该jav的整理】 print(' >重命名文件夹完成') # 不是独立的文件夹,建立独立的文件夹 else: path_separate_folder = jav.root + sep + folder_new # 【临时变量】需要创建的的影片所在文件夹。 # 确认没有同名文件夹 if not exists(path_separate_folder): makedirs(path_separate_folder) path_new = path_separate_folder + sep + jav.name # 【临时变量】新的影片路径 # 如果这个文件夹是现成的,在它内部确认有没有“abc-123.mp4”。 if not exists(path_new): rename(jav.path, path_new) # 移动字幕 if jav.subtitle: path_subtitle_new = path_separate_folder + sep + jav.subtitle # 【临时变量】新的字幕路径 rename(jav.path_subtitle, path_subtitle_new) # 下面不会操作 字幕文件 了,jav.path_subtitle不再更新 print(' >移动字幕到独立文件夹') jav.root = path_separate_folder # 【更新】jav.root # 里面已有“avop-127.mp4”,这不是它的家。 else: num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!创建独立文件夹失败,已存在相同的视频文件:' + path_new + '\n') raise FileExistsError # 【终止对该jav的整理】 return jav, num_fail
def rename_mp4(jav, num_fail, settings, dict_data, list_name_video, path_relative, str_cd): if settings.bool_rename_video: # 构造新文件名,不带文件类型后缀 name_without_ext = '' for j in list_name_video: name_without_ext += dict_data[j] name_without_ext = name_without_ext.rstrip( ) + str_cd # 去除末尾空格,否则windows会自动删除空格,导致程序仍以为带空格 path_new = jav.root + sep + name_without_ext + jav.type # 【临时变量】path_new 视频文件的新路径 # 一般情况,不存在同名视频文件 if not exists(path_new): rename(jav.path, path_new) record_video_old(jav.path, path_new) # 已存在目标文件,但就是现在的文件 elif jav.path.upper() == path_new.upper(): try: rename(jav.path, path_new) # windows本地磁盘,“abc-123.mp4”重命名为“abc-123.mp4”或“ABC-123.mp4”没问题,但有用户反映,挂载的磁盘会报错“file exists error” except: num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!请自行重命名大小写:' + path_relative + '\n') # 存在目标文件,不是现在的文件。 else: num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!重命名影片失败,重复的影片,已经有相同文件名的视频了:' + path_new + '\n') raise FileExistsError # 【终止对该jav的整理】 dict_data['视频'] = name_without_ext # 【更新】 dict_data['视频'] jav.name = name_without_ext + jav.type # 【更新】jav.name,重命名操作可能不成功,但之后的操作仍然围绕成功的jav.name来命名 print(' >修改文件名' + str_cd + '完成') # 重命名字幕 if jav.subtitle and settings.bool_rename_subtitle: subtitle_new = name_without_ext + jav.subtitle_type # 【临时变量】subtitle_new path_subtitle_new = jav.root + sep + subtitle_new # 【临时变量】path_subtitle_new if jav.path_subtitle != path_subtitle_new: rename(jav.path_subtitle, path_subtitle_new) jav.subtitle = subtitle_new # 【更新】 jav.subtitle 字幕完整文件名 print(' >修改字幕名完成') return dict_data, jav, num_fail
'是否流出'] = settings.custom_divulge_expression if bool_divulge else '' # 影片的相对于所选文件夹的路径,用于报错 path_relative = sep + jav.path.replace(root_choose, '') # 获取nfo信息的javdb网页 try: # 用户指定了网址,则直接得到jav所在网址 if '图书馆' in jav.name: url_appointg = re.search(r'仓库(.+?)\.', jav.name) if str(url_appointg) != 'None': url_on_web = url_db + 'v/' + url_appointg.group(1) else: num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!你指定的javdb网址有错误:' + path_relative + '\n') continue # 【退出对该jav的整理】 # 用户没有指定网址,则去搜索 else: url_search_web = url_db + 'search?q=' + jav.car + '&f=all' print(' >搜索车牌:', url_search_web) # 得到javdb搜索网页html html_web, cookies = get_search_db_html( url_search_web, cookies, proxy_db) # 尝试找movie-box 0链接 1车牌 list_search_results = re.findall( r'href="/v/(.+?)" class="box" title=".+?"[\s\S]*?uid">(.+?)</div>', html_web, re.DOTALL) # 匹配处理“标题” # print(list_search_results) if list_search_results: # 搜索结果页面只有一个box
# 程序接下来是在javlibrary搜索信息,但可以设置去javbus下载图片。如果javlibrary上的搜索结果不唯一,那么再去javbus下载图片可能导致张冠李戴。 bool_unique = True # javlibrary有唯一的搜素结果。如果 bool_unique 变化为 false,就不会去javbus下载图片。 # 获取nfo信息的javlibrary网页 try: # 用户指定了网址,则直接得到jav所在网址 if '图书馆' in jav.name: url_appointg = re.search(r'图书馆(jav.+?)\.', jav.name) if str(url_appointg) != 'None': url_search_web = url_library + '?v=' + url_appointg.group( 1) else: num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!你指定的library网址有错误:' + path_relative + '\n') continue # 【退出对该jav的整理】 # 用户没有指定网址,则去搜索 else: url_search_web = url_library + 'vl_searchbyid.php?keyword=' + jav.car print(' >搜索车牌:', url_search_web) # 得到javlibrary搜索网页html html_web = get_library_html(url_search_web, proxy_library) # 从前:搜索结果,大部分情况就是这个影片的网页(搜索结果唯一,javlibrary会自动跳转到该jav唯一的网页),另一种情况是多个搜索结果的网页 # 1.1.2版本请无视这一行:访问javlibrary需要cloudflare的通行证,自动跳转时,cookie会发生变化,导致用现有cookie无权访问跳转后的页面。所以现在程序不希望requests帮助自动跳转,而是只得到跳转前网页上的线索,再自行访问这个跳转目标网页。 # 尝试找标题,第一种情况:找得到,就是这个影片的网页。 titleg = re.search(r'<title>([A-Z].+?) - JAVLibrary</title>', html_web) # 匹配处理“标题” # 搜索结果就是AV的页面。事实上,现在只有用户指定了网址,这一步判定才能成功。现在要么是多个搜索结果的网页,要么是跳转前的几句html语句,根本不可能“搜索一下就是AV的页面”。 if str(titleg) != 'None':
url_on_web = url_321 + 'video/' + url_appointg.group(1) print(' >获取信息:', url_on_web) html_web = get_321_html(url_on_web, proxy_321) # 尝试找标题,jav321上的标题不包含车牌,title_only表示单纯的标题 titleg = re.search(r'<h3>(.+?) <small>', html_web) # 匹配处理“标题” # 搜索结果就是AV的页面 if str(titleg) != 'None': title_only = titleg.group(1) print(title_only) # 找不到标题,jav321找不到影片 else: # print(html_web) num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!你指定的jav321网址找不到影片:' + path_relative + '\n') continue # 【退出对该jav的整理】 else: num_fail += 1 record_fail(' >第' + str(num_fail) + '个失败!你指定的jav321网址有错误:' + path_relative + '\n') continue # 【退出对该jav的整理】 # 用户没有指定网址,则去搜索 else: # 得到jav321搜索网页html print(' >搜索车牌:', url_search_321) html_web = post_321_html(url_search_321, {'sn': jav.car}, proxy_321) # print(html_web)