From 108644736935fa5143ec2077ac56d7b94ff1eee0 Mon Sep 17 00:00:00 2001 From: RRRRRm Date: Mon, 5 Aug 2019 03:00:35 +0800 Subject: [PATCH 1/4] Fix the path error under Linux. Specify Python3 as the runtime. --- ADC_function.py | 1 + AV_Data_Capture.py | 41 +++++++++++++++++++++-------------------- core.py | 1 + fc2fans_club.py | 3 ++- javbus.py | 3 ++- javdb.py | 3 ++- siro.py | 3 ++- 7 files changed, 31 insertions(+), 24 deletions(-) mode change 100644 => 100755 ADC_function.py mode change 100644 => 100755 AV_Data_Capture.py mode change 100644 => 100755 core.py mode change 100644 => 100755 fc2fans_club.py mode change 100644 => 100755 javbus.py mode change 100644 => 100755 javdb.py mode change 100644 => 100755 siro.py diff --git a/ADC_function.py b/ADC_function.py old mode 100644 new mode 100755 index 476560e..2b76958 --- a/ADC_function.py +++ b/ADC_function.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # -*- coding: utf-8 -*- import requests diff --git a/AV_Data_Capture.py b/AV_Data_Capture.py old mode 100644 new mode 100755 index 7d4da3c..4788aa3 --- a/AV_Data_Capture.py +++ b/AV_Data_Capture.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # -*- coding: utf-8 -*- import glob @@ -30,26 +31,26 @@ def UpdateCheck(): print('[+]Update Check disabled!') def movie_lists(): if config['directory_capture']['switch'] == '0' or config['directory_capture']['switch'] == '': - a2 = glob.glob(r".\*.mp4") - b2 = glob.glob(r".\*.avi") - c2 = glob.glob(r".\*.rmvb") - d2 = glob.glob(r".\*.wmv") - e2 = glob.glob(r".\*.mov") - f2 = glob.glob(r".\*.mkv") - g2 = glob.glob(r".\*.flv") - h2 = glob.glob(r".\*.ts") + a2 = glob.glob(r'./*.mp4') # 使用 '/' 可以同时兼容Linux + b2 = glob.glob(r'./*.avi') + c2 = glob.glob(r'./*.rmvb') + d2 = glob.glob(r'./*.wmv') + e2 = glob.glob(r'./*.mov') + f2 = glob.glob(r'./*.mkv') + g2 = glob.glob(r'./*.flv') + h2 = glob.glob(r'./*.ts') total = a2 + b2 + c2 + d2 + e2 + f2 + g2 + h2 return total elif config['directory_capture']['switch'] == '1': directory = config['directory_capture']['directory'] - a2 = glob.glob(r".\\" + directory + "\*.mp4") - b2 = glob.glob(r".\\" + directory + "\*.avi") - c2 = glob.glob(r".\\" + directory + "\*.rmvb") - d2 = glob.glob(r".\\" + directory + "\*.wmv") - e2 = glob.glob(r".\\" + directory + "\*.mov") - f2 = glob.glob(r".\\" + directory + "\*.mkv") - g2 = glob.glob(r".\\" + directory + "\*.flv") - h2 = glob.glob(r".\\" + directory + "\*.ts") + a2 = glob.glob(r"./" + directory + "/*.mp4") + b2 = glob.glob(r"./" + directory + "/*.avi") + c2 = glob.glob(r"./" + directory + "/*.rmvb") + d2 = glob.glob(r"./" + directory + "/*.wmv") + e2 = glob.glob(r"./" + directory + "/*.mov") + f2 = glob.glob(r"./" + directory + "/*.mkv") + g2 = glob.glob(r"./" + directory + "/*.flv") + h2 = glob.glob(r"./" + directory + "/*.ts") total = a2 + b2 + c2 + d2 + e2 + f2 + g2 + h2 return total def CreatFailedFolder(): @@ -121,11 +122,11 @@ def getNumber(filepath): def RunCore(): if os.path.exists('core.py'): - os.system('python core.py' + ' "' + i + '" --number "'+getNumber(i)+'"') #从py文件启动(用于源码py) + os.popen(sys.executable + ' core.py' + ' "' + i + '" --number "'+getNumber(i)+'"') #从py文件启动(用于源码py) elif os.path.exists('core.exe'): - os.system('core.exe' + ' "' + i + '" --number "'+getNumber(i)+'"') #从exe启动(用于EXE版程序) + os.popen('core.exe' + ' "' + i + '" --number "'+getNumber(i)+'"') #从exe启动(用于EXE版程序) elif os.path.exists('core.py') and os.path.exists('core.exe'): - os.system('python core.py' + ' "' + i + '" --number "' + getNumber(i) + '"') #从py文件启动(用于源码py) + os.popen(sys.executable + ' core.py' + ' "' + i + '" --number "' + getNumber(i) + '"') #从py文件启动(用于源码py) if __name__ =='__main__': print('[*]===========AV Data Capture===========') @@ -147,4 +148,4 @@ if __name__ =='__main__': CEF('JAV_output') print("[+]All finished!!!") - input("[+][+]Press enter key exit, you can check the error messge before you exit.\n[+][+]按回车键结束,你可以在结束之前查看和错误信息。") \ No newline at end of file + input("[+][+]Press enter key exit, you can check the error messge before you exit.\n[+][+]按回车键结束,你可以在结束之前查看和错误信息。") diff --git a/core.py b/core.py old mode 100644 new mode 100755 index 0120dda..b9a41c8 --- a/core.py +++ b/core.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # -*- coding: utf-8 -*- import re diff --git a/fc2fans_club.py b/fc2fans_club.py old mode 100644 new mode 100755 index 9915a87..3b0686a --- a/fc2fans_club.py +++ b/fc2fans_club.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import re from lxml import etree#need install import json @@ -81,4 +82,4 @@ def main(number2): js = json.dumps(dic, ensure_ascii=False, sort_keys=True, indent=4, separators=(',', ':'),)#.encode('UTF-8') return js -#print(main('1051725')) \ No newline at end of file +#print(main('1051725')) diff --git a/javbus.py b/javbus.py old mode 100644 new mode 100755 index 6f3a465..a36f934 --- a/javbus.py +++ b/javbus.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import re import requests #need install from pyquery import PyQuery as pq#need install @@ -173,4 +174,4 @@ def main_uncensored(number): js2 = javdb.main(number) return js2 - return js \ No newline at end of file + return js diff --git a/javdb.py b/javdb.py old mode 100644 new mode 100755 index 3723117..faf96aa --- a/javdb.py +++ b/javdb.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import re from lxml import etree import json @@ -137,4 +138,4 @@ def main(number): js = json.dumps(dic, ensure_ascii=False, sort_keys=True, indent=4, separators=(',', ':'), ) # .encode('UTF-8') return js -#print(main('061519-861')) \ No newline at end of file +#print(main('061519-861')) diff --git a/siro.py b/siro.py old mode 100644 new mode 100755 index 0cd8b09..6cbc1ee --- a/siro.py +++ b/siro.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import re from lxml import etree import json @@ -101,4 +102,4 @@ def main(number2): js = json.dumps(dic, ensure_ascii=False, sort_keys=True, indent=4, separators=(',', ':'),)#.encode('UTF-8') return js -#print(main('300maan-373')) \ No newline at end of file +#print(main('300maan-373')) From 00db4741bc6bd3d2bec13f0da7d6bdb907331f71 Mon Sep 17 00:00:00 2001 From: RRRRRm Date: Mon, 5 Aug 2019 15:48:44 +0800 Subject: [PATCH 2/4] Calling core.py asynchronously. Allow to specify input and output paths. --- AV_Data_Capture.py | 116 ++++++++++++++++++++++++++++----------------- config.ini | 9 ++-- core.py | 17 ++++--- 3 files changed, 87 insertions(+), 55 deletions(-) diff --git a/AV_Data_Capture.py b/AV_Data_Capture.py index 4788aa3..12cddc8 100755 --- a/AV_Data_Capture.py +++ b/AV_Data_Capture.py @@ -8,12 +8,16 @@ import re import sys from ADC_function import * import json +import subprocess import shutil from configparser import ConfigParser version='0.11.6' os.chdir(os.getcwd()) +input_dir='.' # 电影的读取与输出路径, 默认为当前路径 +output_dir='.' + config = ConfigParser() config.read(config_file, encoding='UTF-8') @@ -29,36 +33,50 @@ def UpdateCheck(): print('[*]=====================================') else: print('[+]Update Check disabled!') + +def set_directory(): # 设置读取与存放路径 + global input_dir + global output_dir + # 配置项switch为1且定义了新的路径时, 更改默认存取路径 + if config['directory_capture']['switch'] == '1': + custom_input = config['directory_capture']['input_directory'] + custom_output = config['directory_capture']['output_directory'] + if custom_input != '': # 自定义了输入路径 + input_dir = format_path(custom_input) + # 若自定义了输入路径, 输出路径默认在输入路径下 + output_dir = input_dir + output_dir = format_path(custom_output) if custom_output != '' else output_dir # 自定义了输出路径 + CreatFolder(output_dir) + CreatFolder(input_dir) + print('[+]Working directory is "' + os.getcwd() + '".') + print('[+]Using "' + input_dir + '" as input directory.') + print('[+]Using "' + output_dir + '" as output directory.') + +def format_path(path): # 使路径兼容Linux与MacOS + if path.find('\\'): # 是仅兼容Windows的路径格式 + path_list=path.split('\\') + path='/'.join(path_list) # 转换为可移植的路径格式 + return path + + def movie_lists(): - if config['directory_capture']['switch'] == '0' or config['directory_capture']['switch'] == '': - a2 = glob.glob(r'./*.mp4') # 使用 '/' 可以同时兼容Linux - b2 = glob.glob(r'./*.avi') - c2 = glob.glob(r'./*.rmvb') - d2 = glob.glob(r'./*.wmv') - e2 = glob.glob(r'./*.mov') - f2 = glob.glob(r'./*.mkv') - g2 = glob.glob(r'./*.flv') - h2 = glob.glob(r'./*.ts') - total = a2 + b2 + c2 + d2 + e2 + f2 + g2 + h2 - return total - elif config['directory_capture']['switch'] == '1': - directory = config['directory_capture']['directory'] - a2 = glob.glob(r"./" + directory + "/*.mp4") - b2 = glob.glob(r"./" + directory + "/*.avi") - c2 = glob.glob(r"./" + directory + "/*.rmvb") - d2 = glob.glob(r"./" + directory + "/*.wmv") - e2 = glob.glob(r"./" + directory + "/*.mov") - f2 = glob.glob(r"./" + directory + "/*.mkv") - g2 = glob.glob(r"./" + directory + "/*.flv") - h2 = glob.glob(r"./" + directory + "/*.ts") - total = a2 + b2 + c2 + d2 + e2 + f2 + g2 + h2 - return total -def CreatFailedFolder(): - if not os.path.exists('failed/'): # 新建failed文件夹 + a2 = glob.glob( input_dir + "/*.mp4") + b2 = glob.glob( input_dir + "/*.avi") + c2 = glob.glob( input_dir + "/*.rmvb") + d2 = glob.glob( input_dir + "/*.wmv") + e2 = glob.glob( input_dir + "/*.mov") + f2 = glob.glob( input_dir + "/*.mkv") + g2 = glob.glob( input_dir + "/*.flv") + h2 = glob.glob( input_dir + "/*.ts") + total = a2 + b2 + c2 + d2 + e2 + f2 + g2 + h2 + return total +def CreatFolder(folder_path): + if not os.path.exists(folder_path): # 新建文件夹 try: - os.makedirs('failed/') + print('[+]Creating ' + folder_path) + os.makedirs(folder_path) except: - print("[-]failed!can not be make folder 'failed'\n[-](Please run as Administrator)") + print("[-]failed!can not be make folder '"+folder_path+"'\n[-](Please run as Administrator)") os._exit(0) def lists_from_test(custom_nuber): #电影列表 a=[] @@ -112,40 +130,50 @@ def getNumber(filepath): print('[-]' + str(os.path.basename(filepath)) + ' Cannot catch the number :') print('[-]' + str(os.path.basename(filepath)) + ' :', e) print('[-]Move ' + os.path.basename(filepath) + ' to failed folder') - - shutil.move(filepath, str(os.getcwd()) + '/' + 'failed/') + shutil.move(filepath, output_dir + '/failed/') except IOError as e2: print('[-]' + str(os.path.basename(filepath)) + ' Cannot catch the number :') print('[-]' + str(os.path.basename(filepath)) + ' :', e2) print('[-]Move ' + os.path.basename(filepath) + ' to failed folder') - shutil.move(filepath, str(os.getcwd()) + '/' + 'failed/') + shutil.move(filepath, output_dir + '/failed/') -def RunCore(): +def RunCore(movie): + # 异步调用core.py, core.py作为子线程执行, 本程序继续执行. if os.path.exists('core.py'): - os.popen(sys.executable + ' core.py' + ' "' + i + '" --number "'+getNumber(i)+'"') #从py文件启动(用于源码py) + cmd_arg=[sys.executable,'core.py',movie,'--number',getNumber(movie),'--output',output_dir] #从py文件启动(用于源码py) elif os.path.exists('core.exe'): - os.popen('core.exe' + ' "' + i + '" --number "'+getNumber(i)+'"') #从exe启动(用于EXE版程序) + cmd_arg=['core.exe',movie,'--number',getNumber(movie),'--output',output_dir] #从exe启动(用于EXE版程序) elif os.path.exists('core.py') and os.path.exists('core.exe'): - os.popen(sys.executable + ' core.py' + ' "' + i + '" --number "' + getNumber(i) + '"') #从py文件启动(用于源码py) + cmd_arg=[sys.executable,'core.py',movie,'--number',getNumber(movie),'--output',output_dir] #从py文件启动(用于源码py) + process=subprocess.Popen(cmd_arg) + return process if __name__ =='__main__': print('[*]===========AV Data Capture===========') print('[*] Version '+version) print('[*]=====================================') - CreatFailedFolder() UpdateCheck() os.chdir(os.getcwd()) + set_directory() + CreatFolder(output_dir+'/failed') count = 0 - count_all = str(len(movie_lists())) - for i in movie_lists(): #遍历电影列表 交给core处理 - count = count + 1 - percentage = str(count/int(count_all)*100)[:4]+'%' + movies = movie_lists() + count_all = str(len(movies)) + print('[+]Find ' + str(len(movies)) + ' movies.') + process_list=[] + for movie in movies: #遍历电影列表 交给core处理 + print("[!]Making Data for [" + movie + "], the number is [" + getNumber(movie) + "]") + process=RunCore(movie) + process_list.append(process) + print("[*]=====================================") + for i in range(len(movies)): + process_list[i].communicate() + percentage = str((i+1)/int(count_all)*100)[:4]+'%' print('[!] - '+percentage+' ['+str(count)+'/'+count_all+'] -') - print("[!]Making Data for [" + i + "], the number is [" + getNumber(i) + "]") - RunCore() - print("[*]=====================================") - - CEF('JAV_output') + print("[!]The [" + getNumber(movies[i]) + "] process is done.") + print("[*]=====================================") + + CEF(input_dir) print("[+]All finished!!!") input("[+][+]Press enter key exit, you can check the error messge before you exit.\n[+][+]按回车键结束,你可以在结束之前查看和错误信息。") diff --git a/config.ini b/config.ini index 6dfb5e3..1603af1 100644 --- a/config.ini +++ b/config.ini @@ -1,5 +1,5 @@ [proxy] -proxy=127.0.0.1:1080 +proxy=127.0.0.1:8001 timeout=10 retry=3 @@ -16,7 +16,8 @@ media_warehouse=emby #plex only test! [directory_capture] -switch=0 -directory= +switch=1 +input_directory= +output_directory= -#everyone switch:1=on, 0=off \ No newline at end of file +#everyone switch:1=on, 0=off diff --git a/core.py b/core.py index b9a41c8..c99540c 100755 --- a/core.py +++ b/core.py @@ -32,6 +32,7 @@ imagecut='' tag=[] cn_sub='' path='' +output_dir='' houzhui='' website='' json_data={} @@ -50,18 +51,19 @@ except: def moveFailedFolder(): global filepath print('[-]Move to "failed"') - shutil.move(filepath, str(os.getcwd()) + '/' + 'failed/') + shutil.move(filepath, output_dir + '/failed/') os._exit(0) def argparse_get_file(): parser = argparse.ArgumentParser() - parser.add_argument("--number", help="Enter Number on here", default='') parser.add_argument("file", help="Write the file path on here") + parser.add_argument("--number", help="Enter Number on here", default='') + parser.add_argument("--output", help="Enter Output directory here", default='') args = parser.parse_args() - return (args.file, args.number) + return (args.file, args.number, args.output) def CreatFailedFolder(): - if not os.path.exists('failed/'): # 新建failed文件夹 + if not os.path.exists(output_dir+'/failed/'): # 新建failed文件夹 try: - os.makedirs('failed/') + os.makedirs(output_dir+'/failed/') except: print("[-]failed!can not be make folder 'failed'\n[-](Please run as Administrator)") os._exit(0) @@ -155,10 +157,10 @@ def creatFolder(): #创建文件夹 global actor global path if len(actor) > 240: #新建成功输出文件夹 - path = location_rule.replace("'actor'","'超多人'",3).replace("actor","'超多人'",3) #path为影片+元数据所在目录 + path = output_dir + '/' + location_rule.replace("'actor'","'超多人'",3).replace("actor","'超多人'",3) #path为影片+元数据所在目录 #print(path) else: - path = location_rule + path = output_dir + '/' + location_rule #print(path) if not os.path.exists(path): try: @@ -408,6 +410,7 @@ if __name__ == '__main__': moveFailedFolder() else: number = argparse_get_file()[1] + output_dir = argparse_get_file()[2] CreatFailedFolder() getDataFromJSON(number) # 定义番号 creatFolder() # 创建文件夹 From 1bc924a6ac5dd2744cd68a5395c3de6ef43116cd Mon Sep 17 00:00:00 2001 From: RRRRRm Date: Mon, 5 Aug 2019 15:57:46 +0800 Subject: [PATCH 3/4] Update README.md --- README.md | 419 +++++++++++++++++++++++++++--------------------------- 1 file changed, 210 insertions(+), 209 deletions(-) diff --git a/README.md b/README.md index 1179ba3..c49b75f 100644 --- a/README.md +++ b/README.md @@ -1,209 +1,210 @@ -# AV Data Capture - - - -![](https://img.shields.io/badge/build-passing-brightgreen.svg?style=flat-square) -![](https://img.shields.io/github/downloads/yoshiko2/av_data_capture/total.svg?style=flat-square)
-![](https://img.shields.io/github/license/yoshiko2/av_data_capture.svg?style=flat-square) -![](https://img.shields.io/github/release/yoshiko2/av_data_capture.svg?style=flat-square)
- - -**日本电影元数据 抓取工具 | 刮削器**,配合本地影片管理软件EMBY,KODI管理本地影片,该软件起到分类与元数据抓取作用,利用元数据信息来分类,供本地影片分类整理使用。 - -# 目录 -* [免责声明](#免责声明) -* [注意](#注意) -* [你问我答 FAQ](#你问我答-faq) -* [效果图](#效果图) -* [如何使用](#如何使用) -* [下载](#下载) -* [简明教程](#简要教程) -* [模块安装](#1请安装模块在cmd终端逐条输入以下命令安装) -* [配置](#2配置configini) -* [运行软件](#4运行-av_data_capturepyexe) -* [异常处理(重要)](#5异常处理重要) -* [导入至媒体库](#7把jav_output文件夹导入到embykodi中根据封面选片子享受手冲乐趣) -* [写在后面](#8写在后面) - -# 免责声明 -1.本软件仅供**技术交流,学术交流**使用,本项目旨在学习 Python3
-2.本软件禁止用于任何非法用途
-3.使用者使用该软件产生的一切法律后果由使用者承担
-4.不可使用于商业和个人其他意图
- -# 注意 -**推荐用法: 使用该软件后,对于不能正常获取元数据的电影可以用 Everaver 来补救**
-暂不支持多P电影
- -# 你问我答 FAQ -### F:这软件能下片吗? -**Q**:该软件不提供任何影片下载地址,仅供本地影片分类整理使用。 -### F:什么是元数据? -**Q**:元数据包括了影片的:封面,导演,演员,简介,类型...... -### F:软件收费吗? -**Q**:软件永久免费。除了 **作者** 钦点以外,给那些 **利用本软件牟利** 的人送上 **骨灰盒-全家族 | 崭新出厂** -### F:软件运行异常怎么办? -**Q**:认真看 [异常处理(重要)](#5异常处理重要) - -# 效果图 -**图片来自网络**,由于相关法律法规,具体效果请自行联想 -![](https://i.loli.net/2019/07/04/5d1cf9bb1b08b86592.jpg) -![](https://i.loli.net/2019/07/04/5d1cf9bb2696937880.jpg)
- -# 如何使用 -### 下载 -* release的程序可脱离**python环境**运行,可跳过 [模块安装](#1请安装模块在cmd终端逐条输入以下命令安装)
Release 下载地址(**仅限Windows**):
[![](https://img.shields.io/badge/%E4%B8%8B%E8%BD%BD-windows-blue.svg?style=for-the-badge&logo=windows)](https://github.com/yoshiko2/AV_Data_Capture/releases/download/0.11.6/Beta11.6.zip)
-* Linux,MacOS请下载源码包运行 - -* Windows Python环境:[点击前往](https://www.python.org/downloads/windows/) 选中executable installer下载 -* MacOS Python环境:[点击前往](https://www.python.org/downloads/mac-osx/) -* Linux Python环境:Linux用户懂的吧,不解释下载地址 -### 简要教程:
-**1.把软件拉到和电影的同一目录
2.设置ini文件的代理(路由器拥有自动代理功能的可以把proxy=后面内容去掉)
3.运行软件等待完成
4.把JAV_output导入至KODI,EMBY中。
详细请看以下教程**
- -## 1.请安装模块,在CMD/终端逐条输入以下命令安装 -```python -pip install requests -``` -### -```python -pip install pyquery -``` -### -```python -pip install lxml -``` -### -```python -pip install Beautifulsoup4 -``` -### -```python -pip install pillow -``` -### - -## 2.配置config.ini -config.ini ->[proxy]
->proxy=127.0.0.1:1080
->timeout=10
->retry=3
-> ->[Name_Rule]
->location_rule='JAV_output/'+actor+'/['+number+']-'+title
->naming_rule=number+'-'+title
-> ->[update]
->update_check=1
-> ->[media]
->media_warehouse=emby
->#emby or plex
->#plex only test!
-> ->[directory_capture]
->switch=0
->directory=
-> ->#everyone switch:1=on, 0=off
- -### 1.网络设置 -#### * 针对“某些地区”的代理设置 -打开```config.ini```,在```[proxy]```下的```proxy```行设置本地代理地址和端口,支持Shadowxxxx/X,V2XXX本地代理端口:
-例子:```proxy=127.0.0.1:1080```
素人系列抓取建议使用日本代理
-**路由器拥有自动代理功能的可以把proxy=后面内容去掉**
-**本地代理软件开全局模式的同志同上**
-**如果遇到tineout错误,可以把文件的proxy=后面的地址和端口删除,并开启vpn全局模式,或者重启电脑,vpn,网卡**
-#### 连接超时重试设置 ->[proxy]
->timeout=10
- -10为超时重试时间 单位:秒 -#### 连接重试次数设置 ->[proxy]
->retry=3
-3即为重试次数 - -#### 检查更新开关 ->[update]
->update_check=1
-0为关闭,1为开启,不建议关闭 -PLEX请安装插件:```XBMCnfoMoviesImporter``` - -##### 媒体库选择 ->[media]
->media_warehouse=emby
->#emby or plex
->#plex only test!
-建议选择emby, plex不完善 - -#### 抓取目录选择 ->[directory_capture]
->switch=0
->directory=
-switch为1时,directory才会被触发,抓取程序目录下的directory目录下的电影;如果为0则不触发,抓取和程序同一目录下的影片,directory不生效 - -### (可选)设置自定义目录和影片重命名规则 -**已有默认配置**
-##### 命名参数
->title = 片名
->actor = 演员
->studio = 公司
->director = 导演
->release = 发售日
->year = 发行年份
->number = 番号
->cover = 封面链接
->tag = 类型
->outline = 简介
->runtime = 时长
-##### **例子**:
-目录结构规则:```location_rule='JAV_output/'+actor+'/'+number```
**不推荐修改时在这里添加title**,有时title过长,因为Windows API问题,抓取数据时新建文件夹容易出错。
-影片命名规则:```naming_rule='['+number+']-'+title```
**在EMBY,KODI等本地媒体库显示的标题,不影响目录结构下影片文件的命名**,依旧是 番号+后缀。 -### 3.更新开关 ->[update]
update_check=1
-1为开,0为关 -## 3.把软件拷贝和电影的统一目录下 -## 4.运行 ```AV_Data_capture.py/.exe``` -当文件名包含:
-中文,字幕,-c., -C., 处理元数据时会加上**中文字幕**标签 -## 5.异常处理(重要) -### 请确保软件是完整地!确保ini文件内容是和下载提供ini文件内容的一致的! -### 关于软件打开就闪退 -可以打开cmd命令提示符,把 ```AV_Data_capture.py/.exe```拖进cmd窗口回车运行,查看错误,出现的错误信息**依据以下条目解决** -### 关于 ```Updata_check``` 和 ```JSON``` 相关的错误 -跳转 [网络设置](#1网络设置) -### 关于```FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'JAV_output''``` -在软件所在文件夹下新建 JAV_output 文件夹,可能是你没有把软件拉到和电影的同一目录 -### 关于连接拒绝的错误 -请设置好[代理](#1针对某些地区的代理设置)
-### 关于Nonetype,xpath报错 -同上
-### 关于番号提取失败或者异常 -**目前可以提取元素的影片:JAVBUS上有元数据的电影,素人系列:300Maan,259luxu,siro等,FC2系列**
->下一张图片来自Pockies的blog 原作者已授权
- -![](https://raw.githubusercontent.com/Pockies/pic/master/741f9461gy1g1cxc31t41j20i804zdgo.jpg) - -目前作者已经完善了番号提取机制,功能较为强大,可提取上述文件名的的番号,如果出现提取失败或者异常的情况,请用以下规则命名
-**妈蛋不要喂软件那么多野鸡片子,不让软件好好活了,操** -``` -COSQ-004.mp4 -``` - -针对 **野鸡番号** ,你需要把文件名命名为与抓取网站提供的番号一致(文件拓展名除外),然后把文件拖拽至core.exe/.py
-**野鸡番号**:比如 ```XXX-XXX-1```, ```1301XX-MINA_YUKA``` 这种**野鸡**番号,在javbus等资料库存在的作品。
**重要**:除了 **影片文件名** ```XXXX-XXX-C```,后面这种-C的是指电影有中文字幕!
-条件:文件名中间要有下划线或者减号"_","-",没有多余的内容只有番号为最佳,可以让软件更好获取元数据 -对于多影片重命名,可以用[ReNamer](http://www.den4b.com/products/renamer)来批量重命名
-### 关于PIL/image.py -暂时无解,可能是网络问题或者pillow模块打包问题,你可以用源码运行(要安装好第一步的模块) - - -## 6.软件会自动把元数据获取成功的电影移动到JAV_output文件夹中,根据演员分类,失败的电影移动到failed文件夹中。 -## 7.把JAV_output文件夹导入到EMBY,KODI中,等待元数据刷新,完成 -## 8.写在后面 -怎么样,看着自己的日本电影被这样完美地管理,是不是感觉成就感爆棚呢?
-**tg官方电报群:[ 点击进群](https://t.me/AV_Data_Capture_Official)**
- - +# AV Data Capture + + + +![](https://img.shields.io/badge/build-passing-brightgreen.svg?style=flat-square) +![](https://img.shields.io/github/downloads/yoshiko2/av_data_capture/total.svg?style=flat-square)
+![](https://img.shields.io/github/license/yoshiko2/av_data_capture.svg?style=flat-square) +![](https://img.shields.io/github/release/yoshiko2/av_data_capture.svg?style=flat-square)
+ + +**日本电影元数据 抓取工具 | 刮削器**,配合本地影片管理软件EMBY,KODI管理本地影片,该软件起到分类与元数据抓取作用,利用元数据信息来分类,供本地影片分类整理使用。 + +# 目录 +* [免责声明](#免责声明) +* [注意](#注意) +* [你问我答 FAQ](#你问我答-faq) +* [效果图](#效果图) +* [如何使用](#如何使用) +* [下载](#下载) +* [简明教程](#简要教程) +* [模块安装](#1请安装模块在cmd终端逐条输入以下命令安装) +* [配置](#2配置configini) +* [运行软件](#4运行-av_data_capturepyexe) +* [异常处理(重要)](#5异常处理重要) +* [导入至媒体库](#7把jav_output文件夹导入到embykodi中根据封面选片子享受手冲乐趣) +* [写在后面](#8写在后面) + +# 免责声明 +1.本软件仅供**技术交流,学术交流**使用,本项目旨在学习 Python3
+2.本软件禁止用于任何非法用途
+3.使用者使用该软件产生的一切法律后果由使用者承担
+4.不可使用于商业和个人其他意图
+ +# 注意 +**推荐用法: 使用该软件后,对于不能正常获取元数据的电影可以用 Everaver 来补救**
+暂不支持多P电影
+ +# 你问我答 FAQ +### F:这软件能下片吗? +**Q**:该软件不提供任何影片下载地址,仅供本地影片分类整理使用。 +### F:什么是元数据? +**Q**:元数据包括了影片的:封面,导演,演员,简介,类型...... +### F:软件收费吗? +**Q**:软件永久免费。除了 **作者** 钦点以外,给那些 **利用本软件牟利** 的人送上 **骨灰盒-全家族 | 崭新出厂** +### F:软件运行异常怎么办? +**Q**:认真看 [异常处理(重要)](#5异常处理重要) + +# 效果图 +**图片来自网络**,由于相关法律法规,具体效果请自行联想 +![](https://i.loli.net/2019/07/04/5d1cf9bb1b08b86592.jpg) +![](https://i.loli.net/2019/07/04/5d1cf9bb2696937880.jpg)
+ +# 如何使用 +### 下载 +* release的程序可脱离**python环境**运行,可跳过 [模块安装](#1请安装模块在cmd终端逐条输入以下命令安装)
Release 下载地址(**仅限Windows**):
[![](https://img.shields.io/badge/%E4%B8%8B%E8%BD%BD-windows-blue.svg?style=for-the-badge&logo=windows)](https://github.com/yoshiko2/AV_Data_Capture/releases/download/0.11.6/Beta11.6.zip)
+* Linux,MacOS请下载源码包运行 + +* Windows Python环境:[点击前往](https://www.python.org/downloads/windows/) 选中executable installer下载 +* MacOS Python环境:[点击前往](https://www.python.org/downloads/mac-osx/) +* Linux Python环境:Linux用户懂的吧,不解释下载地址 +### 简要教程:
+**1.把软件拉到和电影的同一目录
2.设置ini文件的代理(路由器拥有自动代理功能的可以把proxy=后面内容去掉)
3.运行软件等待完成
4.把JAV_output导入至KODI,EMBY中。
详细请看以下教程**
+ +## 1.请安装模块,在CMD/终端逐条输入以下命令安装 +```python +pip install requests +``` +### +```python +pip install pyquery +``` +### +```python +pip install lxml +``` +### +```python +pip install Beautifulsoup4 +``` +### +```python +pip install pillow +``` +### + +## 2.配置config.ini +config.ini +>[proxy]
+>proxy=127.0.0.1:1080
+>timeout=10
+>retry=3
+> +>[Name_Rule]
+>location_rule='JAV_output/'+actor+'/['+number+']-'+title
+>naming_rule=number+'-'+title
+> +>[update]
+>update_check=1
+> +>[media]
+>media_warehouse=emby
+>#emby or plex
+>#plex only test!
+> +>[directory_capture]
+>switch=0
+>directory=
+> +>#everyone switch:1=on, 0=off
+ +### 1.网络设置 +#### * 针对“某些地区”的代理设置 +打开```config.ini```,在```[proxy]```下的```proxy```行设置本地代理地址和端口,支持Shadowxxxx/X,V2XXX本地代理端口:
+例子:```proxy=127.0.0.1:1080```
素人系列抓取建议使用日本代理
+**路由器拥有自动代理功能的可以把proxy=后面内容去掉**
+**本地代理软件开全局模式的同志同上**
+**如果遇到tineout错误,可以把文件的proxy=后面的地址和端口删除,并开启vpn全局模式,或者重启电脑,vpn,网卡**
+#### 连接超时重试设置 +>[proxy]
+>timeout=10
+ +10为超时重试时间 单位:秒 +#### 连接重试次数设置 +>[proxy]
+>retry=3
+3即为重试次数 + +#### 检查更新开关 +>[update]
+>update_check=1
+0为关闭,1为开启,不建议关闭 +PLEX请安装插件:```XBMCnfoMoviesImporter``` + +##### 媒体库选择 +>[media]
+>media_warehouse=emby
+>#emby or plex
+>#plex only test!
+建议选择emby, plex不完善 + +#### 抓取目录选择 +>[directory_capture]
+>switch=0
+>input_directory=
+>output_directory=
+switch为1时,目录自定义才会被触发,此时可以指定抓取任意目录下的影片, 并指定存放的目录;如果为0则不触发,抓取和程序同一目录下的影片,directory不生效. 如果仅指定input_directory, output_directory默认与input_directory相同. + +### (可选)设置自定义目录和影片重命名规则 +**已有默认配置**
+##### 命名参数
+>title = 片名
+>actor = 演员
+>studio = 公司
+>director = 导演
+>release = 发售日
+>year = 发行年份
+>number = 番号
+>cover = 封面链接
+>tag = 类型
+>outline = 简介
+>runtime = 时长
+##### **例子**:
+目录结构规则:```location_rule='JAV_output/'+actor+'/'+number```
**不推荐修改时在这里添加title**,有时title过长,因为Windows API问题,抓取数据时新建文件夹容易出错。
+影片命名规则:```naming_rule='['+number+']-'+title```
**在EMBY,KODI等本地媒体库显示的标题,不影响目录结构下影片文件的命名**,依旧是 番号+后缀。 +### 3.更新开关 +>[update]
update_check=1
+1为开,0为关 +## 3.把软件拷贝和电影的统一目录下 +## 4.运行 ```AV_Data_capture.py/.exe``` +当文件名包含:
+中文,字幕,-c., -C., 处理元数据时会加上**中文字幕**标签 +## 5.异常处理(重要) +### 请确保软件是完整地!确保ini文件内容是和下载提供ini文件内容的一致的! +### 关于软件打开就闪退 +可以打开cmd命令提示符,把 ```AV_Data_capture.py/.exe```拖进cmd窗口回车运行,查看错误,出现的错误信息**依据以下条目解决** +### 关于 ```Updata_check``` 和 ```JSON``` 相关的错误 +跳转 [网络设置](#1网络设置) +### 关于```FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'JAV_output''``` +在软件所在文件夹下新建 JAV_output 文件夹,可能是你没有把软件拉到和电影的同一目录 +### 关于连接拒绝的错误 +请设置好[代理](#1针对某些地区的代理设置)
+### 关于Nonetype,xpath报错 +同上
+### 关于番号提取失败或者异常 +**目前可以提取元素的影片:JAVBUS上有元数据的电影,素人系列:300Maan,259luxu,siro等,FC2系列**
+>下一张图片来自Pockies的blog 原作者已授权
+ +![](https://raw.githubusercontent.com/Pockies/pic/master/741f9461gy1g1cxc31t41j20i804zdgo.jpg) + +目前作者已经完善了番号提取机制,功能较为强大,可提取上述文件名的的番号,如果出现提取失败或者异常的情况,请用以下规则命名
+**妈蛋不要喂软件那么多野鸡片子,不让软件好好活了,操** +``` +COSQ-004.mp4 +``` + +针对 **野鸡番号** ,你需要把文件名命名为与抓取网站提供的番号一致(文件拓展名除外),然后把文件拖拽至core.exe/.py
+**野鸡番号**:比如 ```XXX-XXX-1```, ```1301XX-MINA_YUKA``` 这种**野鸡**番号,在javbus等资料库存在的作品。
**重要**:除了 **影片文件名** ```XXXX-XXX-C```,后面这种-C的是指电影有中文字幕!
+条件:文件名中间要有下划线或者减号"_","-",没有多余的内容只有番号为最佳,可以让软件更好获取元数据 +对于多影片重命名,可以用[ReNamer](http://www.den4b.com/products/renamer)来批量重命名
+### 关于PIL/image.py +暂时无解,可能是网络问题或者pillow模块打包问题,你可以用源码运行(要安装好第一步的模块) + + +## 6.软件会自动把元数据获取成功的电影移动到JAV_output文件夹中,根据演员分类,失败的电影移动到failed文件夹中。 +## 7.把JAV_output文件夹导入到EMBY,KODI中,等待元数据刷新,完成 +## 8.写在后面 +怎么样,看着自己的日本电影被这样完美地管理,是不是感觉成就感爆棚呢?
+**tg官方电报群:[ 点击进群](https://t.me/AV_Data_Capture_Official)**
+ + From 09dc684ff668bd6fdaa7c01dd27f079546558195 Mon Sep 17 00:00:00 2001 From: RRRRRm Date: Mon, 5 Aug 2019 20:39:41 +0800 Subject: [PATCH 4/4] Fix some bugs. --- AV_Data_Capture.py | 10 ++++++++-- core.py | 15 +++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/AV_Data_Capture.py b/AV_Data_Capture.py index 12cddc8..68ff587 100755 --- a/AV_Data_Capture.py +++ b/AV_Data_Capture.py @@ -130,11 +130,12 @@ def getNumber(filepath): print('[-]' + str(os.path.basename(filepath)) + ' Cannot catch the number :') print('[-]' + str(os.path.basename(filepath)) + ' :', e) print('[-]Move ' + os.path.basename(filepath) + ' to failed folder') + print('[-]' + filepath + ' -> ' + output_dir + '/failed/') shutil.move(filepath, output_dir + '/failed/') except IOError as e2: print('[-]' + str(os.path.basename(filepath)) + ' Cannot catch the number :') print('[-]' + str(os.path.basename(filepath)) + ' :', e2) - print('[-]Move ' + os.path.basename(filepath) + ' to failed folder') + print('[-]' + filepath + ' -> ' + output_dir + '/failed/') shutil.move(filepath, output_dir + '/failed/') def RunCore(movie): @@ -163,7 +164,12 @@ if __name__ =='__main__': print('[+]Find ' + str(len(movies)) + ' movies.') process_list=[] for movie in movies: #遍历电影列表 交给core处理 - print("[!]Making Data for [" + movie + "], the number is [" + getNumber(movie) + "]") + num=getNumber(movie) # 获取番号 + if num is None: + movies.remove(movie) # 未获取到番号, 则将影片从列表移除 + count_all=count_all-1 + continue + print("[!]Making Data for [" + movie + "], the number is [" + num + "]") process=RunCore(movie) process_list.append(process) print("[*]=====================================") diff --git a/core.py b/core.py index c99540c..f5cba0e 100755 --- a/core.py +++ b/core.py @@ -51,7 +51,8 @@ except: def moveFailedFolder(): global filepath print('[-]Move to "failed"') - shutil.move(filepath, output_dir + '/failed/') + print('[-]' + filepath + ' -> ' + output_dir + '/failed/') + os.rename(filepath, output_dir + '/failed/') os._exit(0) def argparse_get_file(): parser = argparse.ArgumentParser() @@ -377,18 +378,20 @@ def pasteFileToFolder(filepath, path): #文件路径,番号,后缀,要移 global houzhui houzhui = str(re.search('[.](AVI|RMVB|WMV|MOV|MP4|MKV|FLV|TS|avi|rmvb|wmv|mov|mp4|mkv|flv|ts)$', filepath).group()) try: - os.rename(filepath, number + houzhui) + print('[*]' + filepath + ' -> ' + output_dir + number + houzhui) + os.rename(filepath, output_dir + '/' + number + houzhui) except FileExistsError: print('[-]File Exists! Please check your movie!') print('[-]move to the root folder of the program.') os._exit(0) try: - shutil.move(number + houzhui, path) + print('[*]' + output_dir + '/' + number + houzhui + ' -> ' + path) + os.rename(output_dir + '/' + number + houzhui, path) except: print('[-]File Exists! Please check your movie!') print('[-]move to the root folder of the program.') os._exit(0) -def renameJpgToBackdrop_copy(): +def moveJpgToBackdrop_copy(): if option == 'plex': shutil.copy(path + '/fanart.jpg', path + '/Backdrop.jpg') shutil.copy(path + '/poster.png', path + '/thumb.png') @@ -406,7 +409,7 @@ if __name__ == '__main__': number = str(re.findall(r'(.+?)\.',str(re.search('([^<>/\\\\|:""\\*\\?]+)\\.\\w+$',filepath).group()))).strip("['']").replace('_','-') print("[!]Making Data for [" + number + "]") except: - print("[-]failed!Please rename the filename again!") + print("[-]failed!Please move the filename again!") moveFailedFolder() else: number = argparse_get_file()[1] @@ -418,4 +421,4 @@ if __name__ == '__main__': PrintFiles(filepath) # 打印文件 cutImage() # 裁剪图 pasteFileToFolder(filepath, path) # 移动文件 - renameJpgToBackdrop_copy() + moveJpgToBackdrop_copy()