15 Commits

Author SHA1 Message Date
Yoshiko
c66a53ade1 Update Beta 11.7 2019-08-06 16:46:21 +08:00
Yoshiko
7aec4c4b84 Update update_check.json 2019-08-06 16:37:16 +08:00
Yoshiko
cfb3511360 Update Beta 11.7 2019-08-06 16:36:45 +08:00
Yoshiko
2adcfacf27 Merge pull request #26 from RRRRRm/master
Fix the path error under Linux and specify Python3 as the runtime.
2019-08-05 22:52:57 +08:00
RRRRRm
09dc684ff6 Fix some bugs. 2019-08-05 20:39:41 +08:00
RRRRRm
1bc924a6ac Update README.md 2019-08-05 15:57:46 +08:00
RRRRRm
00db4741bc Calling core.py asynchronously. Allow to specify input and output paths. 2019-08-05 15:48:44 +08:00
RRRRRm
1086447369 Fix the path error under Linux. Specify Python3 as the runtime. 2019-08-05 03:00:35 +08:00
Yoshiko
642c8103c7 Update README.md 2019-07-24 08:51:40 +08:00
Yoshiko
b053ae614c Update README.md 2019-07-23 21:18:22 +08:00
Yoshiko
b7583afc9b Merge pull request #20 from biaji/master
Add encoding info to source
2019-07-21 10:28:03 +08:00
biAji
731b08f843 Add encoding info to source
According to PEP-263, add encoding info to source code
2019-07-18 09:22:28 +08:00
Yoshiko
64f235aaff Update README.md 2019-07-15 12:41:14 +08:00
Yoshiko
f0d5a2a45d Update 11.6 2019-07-14 15:07:04 +08:00
Yoshiko
01521fe390 Update 11.6 2019-07-14 10:06:49 +08:00
10 changed files with 328 additions and 279 deletions

3
ADC_function.py Normal file → Executable file
View File

@@ -1,3 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests import requests
from configparser import ConfigParser from configparser import ConfigParser
import os import os

130
AV_Data_Capture.py Normal file → Executable file
View File

@@ -1,3 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob import glob
import os import os
import time import time
@@ -5,20 +8,21 @@ import re
import sys import sys
from ADC_function import * from ADC_function import *
import json import json
import subprocess
import shutil import shutil
from configparser import ConfigParser from configparser import ConfigParser
version='0.11.6' version='0.11.7'
os.chdir(os.getcwd()) os.chdir(os.getcwd())
input_dir='.' # 电影的读取与输出路径, 默认为当前路径
config = ConfigParser() config = ConfigParser()
config.read(config_file, encoding='UTF-8') config.read(config_file, encoding='UTF-8')
def UpdateCheck(): def UpdateCheck():
if UpdateCheckSwitch() == '1': if UpdateCheckSwitch() == '1':
html2 = get_html('https://raw.githubusercontent.com/wenead99/AV_Data_Capture/master/update_check.json') html = json.loads(get_html('https://raw.githubusercontent.com/wenead99/AV_Data_Capture/master/update_check.json'))
html = json.loads(str(html2))
if not version == html['version']: if not version == html['version']:
print('[*] * New update ' + html['version'] + ' *') print('[*] * New update ' + html['version'] + ' *')
print('[*] * Download *') print('[*] * Download *')
@@ -26,36 +30,44 @@ def UpdateCheck():
print('[*]=====================================') print('[*]=====================================')
else: else:
print('[+]Update Check disabled!') print('[+]Update Check disabled!')
def set_directory(): # 设置读取与存放路径
global input_dir
# 配置项switch为1且定义了新的路径时, 更改默认存取路径
if config['directory_capture']['switch'] == '1':
custom_input = config['directory_capture']['input_directory']
if custom_input != '': # 自定义了输入路径
input_dir = format_path(custom_input)
# 若自定义了输入路径, 输出路径默认在输入路径下
CreatFolder(input_dir)
#print('[+]Working directory is "' + os.getcwd() + '".')
#print('[+]Using "' + input_dir + '" as input directory.')
def format_path(path): # 使路径兼容Linux与MacOS
if path.find('\\'): # 是仅兼容Windows的路径格式
path_list=path.split('\\')
path='/'.join(path_list) # 转换为可移植的路径格式
return path
def movie_lists(): def movie_lists():
if config['directory_capture']['switch'] == '0' or config['directory_capture']['switch'] == '': a2 = glob.glob( input_dir + "/*.mp4")
a2 = glob.glob(r".\*.mp4") b2 = glob.glob( input_dir + "/*.avi")
b2 = glob.glob(r".\*.avi") c2 = glob.glob( input_dir + "/*.rmvb")
c2 = glob.glob(r".\*.rmvb") d2 = glob.glob( input_dir + "/*.wmv")
d2 = glob.glob(r".\*.wmv") e2 = glob.glob( input_dir + "/*.mov")
e2 = glob.glob(r".\*.mov") f2 = glob.glob( input_dir + "/*.mkv")
f2 = glob.glob(r".\*.mkv") g2 = glob.glob( input_dir + "/*.flv")
g2 = glob.glob(r".\*.flv") h2 = glob.glob( input_dir + "/*.ts")
h2 = glob.glob(r".\*.ts") total = a2 + b2 + c2 + d2 + e2 + f2 + g2 + h2
total = a2 + b2 + c2 + d2 + e2 + f2 + g2 + h2 return total
return total def CreatFolder(folder_path):
elif config['directory_capture']['switch'] == '1': if not os.path.exists(folder_path): # 新建文件夹
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文件夹
try: try:
os.makedirs('failed/') print('[+]Creating ' + folder_path)
os.makedirs(folder_path)
except: 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) os._exit(0)
def lists_from_test(custom_nuber): #电影列表 def lists_from_test(custom_nuber): #电影列表
a=[] a=[]
@@ -109,40 +121,56 @@ def getNumber(filepath):
print('[-]' + str(os.path.basename(filepath)) + ' Cannot catch the number :') print('[-]' + str(os.path.basename(filepath)) + ' Cannot catch the number :')
print('[-]' + str(os.path.basename(filepath)) + ' :', e) print('[-]' + str(os.path.basename(filepath)) + ' :', e)
print('[-]Move ' + os.path.basename(filepath) + ' to failed folder') print('[-]Move ' + os.path.basename(filepath) + ' to failed folder')
#print('[-]' + filepath + ' -> ' + output_dir + '/failed/')
shutil.move(filepath, str(os.getcwd()) + '/' + 'failed/') #shutil.move(filepath, output_dir + '/failed/')
except IOError as e2: except IOError as e2:
print('[-]' + str(os.path.basename(filepath)) + ' Cannot catch the number :') print('[-]' + str(os.path.basename(filepath)) + ' Cannot catch the number :')
print('[-]' + str(os.path.basename(filepath)) + ' :', e2) print('[-]' + str(os.path.basename(filepath)) + ' :', e2)
print('[-]Move ' + os.path.basename(filepath) + ' to failed folder') #print('[-]' + filepath + ' -> ' + output_dir + '/failed/')
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'): if os.path.exists('core.py'):
os.system('python core.py' + ' "' + i + '" --number "'+getNumber(i)+'"') #从py文件启动用于源码py cmd_arg=[sys.executable,'core.py',movie,'--number',getNumber(movie)] #从py文件启动用于源码py
elif os.path.exists('core.exe'): elif os.path.exists('core.exe'):
os.system('core.exe' + ' "' + i + '" --number "'+getNumber(i)+'"') #从exe启动用于EXE版程序 cmd_arg=['core.exe',movie,'--number',getNumber(movie)] #从exe启动用于EXE版程序
elif os.path.exists('core.py') and os.path.exists('core.exe'): elif os.path.exists('core.py') and os.path.exists('core.exe'):
os.system('python core.py' + ' "' + i + '" --number "' + getNumber(i) + '"') #从py文件启动用于源码py cmd_arg=[sys.executable,'core.py',movie,'--number',getNumber(movie)] #从py文件启动用于源码py
process=subprocess.Popen(cmd_arg)
return process
if __name__ =='__main__': if __name__ =='__main__':
print('[*]===========AV Data Capture===========') print('[*]===========AV Data Capture===========')
print('[*] Version '+version) print('[*] Version '+version)
print('[*]=====================================') print('[*]=====================================')
CreatFailedFolder()
UpdateCheck() UpdateCheck()
os.chdir(os.getcwd()) os.chdir(os.getcwd())
set_directory()
count = 0 count = 0
count_all = str(len(movie_lists())) movies = movie_lists()
for i in movie_lists(): #遍历电影列表 交给core处理 count_all = str(len(movies))
count = count + 1 print('[+]Find ' + str(len(movies)) + ' movies.')
percentage = str(count/int(count_all)*100)[:4]+'%' process_list=[]
for movie in movies: #遍历电影列表 交给core处理
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("[*]=====================================")
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('[!] - '+percentage+' ['+str(count)+'/'+count_all+'] -')
print("[!]Making Data for [" + i + "], the number is [" + getNumber(i) + "]") print("[!]The [" + getNumber(movies[i]) + "] process is done.")
RunCore() print("[*]=====================================")
print("[*]=====================================")
CEF(input_dir)
CEF('JAV_output')
print("[+]All finished!!!") print("[+]All finished!!!")
input("[+][+]Press enter key exit, you can check the error messge before you exit.\n[+][+]按回车键结束,你可以在结束之前查看和错误信息。") input("[+][+]Press enter key exit, you can check the error messge before you exit.\n[+][+]按回车键结束,你可以在结束之前查看和错误信息。")

418
README.md
View File

@@ -1,208 +1,210 @@
# AV Data Capture # AV Data Capture
<a title="Hits" target="_blank" href="https://github.com/yoshiko2/AV_Data_Capture"><img src="https://hits.b3log.org/yoshiko2/AV_Data_Capture.svg"></a> <a title="Hits" target="_blank" href="https://github.com/yoshiko2/AV_Data_Capture"><img src="https://hits.b3log.org/yoshiko2/AV_Data_Capture.svg"></a>
![](https://img.shields.io/badge/build-passing-brightgreen.svg?style=flat-square) ![](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)<br> ![](https://img.shields.io/github/downloads/yoshiko2/av_data_capture/total.svg?style=flat-square)<br>
![](https://img.shields.io/github/license/yoshiko2/av_data_capture.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)<br> ![](https://img.shields.io/github/release/yoshiko2/av_data_capture.svg?style=flat-square)<br>
**日本电影元数据 抓取工具 | 刮削器**配合本地影片管理软件EMBY,KODI管理本地影片该软件起到分类与元数据抓取作用利用元数据信息来分类供本地影片分类整理使用。 **日本电影元数据 抓取工具 | 刮削器**配合本地影片管理软件EMBY,KODI管理本地影片该软件起到分类与元数据抓取作用利用元数据信息来分类供本地影片分类整理使用。
# 目录 # 目录
* [免责声明](#免责声明) * [免责声明](#免责声明)
* [注意](#注意) * [注意](#注意)
* [你问我答 FAQ](#你问我答-faq) * [你问我答 FAQ](#你问我答-faq)
* [效果图](#效果图) * [效果图](#效果图)
* [如何使用](#如何使用) * [如何使用](#如何使用)
* [下载](#下载) * [下载](#下载)
* [简明教程](#简要教程) * [简明教程](#简要教程)
* [模块安装](#1请安装模块在cmd终端逐条输入以下命令安装) * [模块安装](#1请安装模块在cmd终端逐条输入以下命令安装)
* [配置](#2配置configini) * [配置](#2配置configini)
* [运行软件](#4运行-av_data_capturepyexe) * [运行软件](#4运行-av_data_capturepyexe)
* [异常处理(重要)](#5异常处理重要) * [异常处理(重要)](#5异常处理重要)
* [导入至媒体库](#7把jav_output文件夹导入到embykodi中根据封面选片子享受手冲乐趣) * [导入至媒体库](#7把jav_output文件夹导入到embykodi中根据封面选片子享受手冲乐趣)
* [写在后面](#8写在后面) * [写在后面](#8写在后面)
# 免责声明 # 免责声明
1.本软件仅供**技术交流,学术交流**使用,本项目旨在学习 Python3<br> 1.本软件仅供**技术交流,学术交流**使用,本项目旨在学习 Python3<br>
2.本软件禁止用于任何非法用途<br> 2.本软件禁止用于任何非法用途<br>
3.使用者使用该软件产生的一切法律后果由使用者承担<br> 3.使用者使用该软件产生的一切法律后果由使用者承担<br>
4.不可使用于商业和个人其他意图<br> 4.不可使用于商业和个人其他意图<br>
# 注意 # 注意
**推荐用法: 使用该软件后,对于不能正常获取元数据的电影可以用 Everaver 来补救**<br> **推荐用法: 使用该软件后,对于不能正常获取元数据的电影可以用 Everaver 来补救**<br>
暂不支持多P电影<br> 暂不支持多P电影<br>
# 你问我答 FAQ # 你问我答 FAQ
### F这软件能下片吗 ### F这软件能下片吗
**Q**:该软件不提供任何影片下载地址,仅供本地影片分类整理使用。 **Q**:该软件不提供任何影片下载地址,仅供本地影片分类整理使用。
### F什么是元数据 ### F什么是元数据
**Q**:元数据包括了影片的:封面,导演,演员,简介,类型...... **Q**:元数据包括了影片的:封面,导演,演员,简介,类型......
### F软件收费吗 ### F软件收费吗
**Q**:软件永久免费。除了 **作者** 钦点以外,给那些 **利用本软件牟利** 的人送上 **骨灰盒-全家族 | 崭新出厂** **Q**:软件永久免费。除了 **作者** 钦点以外,给那些 **利用本软件牟利** 的人送上 **骨灰盒-全家族 | 崭新出厂**
### F软件运行异常怎么办 ### F软件运行异常怎么办
**Q**:认真看 [异常处理(重要)](#5异常处理重要) **Q**:认真看 [异常处理(重要)](#5异常处理重要)
# 效果图 # 效果图
**图片来自网络**,由于相关法律法规,具体效果请自行联想 **图片来自网络**,由于相关法律法规,具体效果请自行联想
![](https://i.loli.net/2019/07/04/5d1cf9bb1b08b86592.jpg) ![](https://i.loli.net/2019/07/04/5d1cf9bb1b08b86592.jpg)
![](https://i.loli.net/2019/07/04/5d1cf9bb2696937880.jpg)<br> ![](https://i.loli.net/2019/07/04/5d1cf9bb2696937880.jpg)<br>
# 如何使用 # 如何使用
### 下载 ### 下载
* release的程序可脱离**python环境**运行,可跳过 [模块安装](#1请安装模块在cmd终端逐条输入以下命令安装)<br>Release 下载地址(**仅限Windows**):<br>[![](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.5/Beta11.5.zip)<br> * release的程序可脱离**python环境**运行,可跳过 [模块安装](#1请安装模块在cmd终端逐条输入以下命令安装)<br>Release 下载地址(**仅限Windows**):<br>[![](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)<br>
* Linux,MacOS请下载源码包运行 * Linux,MacOS请下载源码包运行
* Windows Python环境:[点击前往](https://www.python.org/downloads/windows/) 选中executable installer下载 * Windows Python环境:[点击前往](https://www.python.org/downloads/windows/) 选中executable installer下载
* MacOS Python环境[点击前往](https://www.python.org/downloads/mac-osx/) * MacOS Python环境[点击前往](https://www.python.org/downloads/mac-osx/)
* Linux Python环境Linux用户懂的吧不解释下载地址 * Linux Python环境Linux用户懂的吧不解释下载地址
### 简要教程:<br> ### 简要教程:<br>
**1.把软件拉到和电影的同一目录<br>2.设置ini文件的代理路由器拥有自动代理功能的可以把proxy=后面内容去掉)<br>3.运行软件等待完成<br>4.把JAV_output导入至KODI,EMBY中。<br>详细请看以下教程**<br> **1.把软件拉到和电影的同一目录<br>2.设置ini文件的代理路由器拥有自动代理功能的可以把proxy=后面内容去掉)<br>3.运行软件等待完成<br>4.把JAV_output导入至KODI,EMBY中。<br>详细请看以下教程**<br>
## 1.请安装模块,在CMD/终端逐条输入以下命令安装 ## 1.请安装模块,在CMD/终端逐条输入以下命令安装
```python ```python
pip install requests pip install requests
``` ```
### ###
```python ```python
pip install pyquery pip install pyquery
``` ```
### ###
```python ```python
pip install lxml pip install lxml
``` ```
### ###
```python ```python
pip install Beautifulsoup4 pip install Beautifulsoup4
``` ```
### ###
```python ```python
pip install pillow pip install pillow
``` ```
### ###
## 2.配置config.ini ## 2.配置config.ini
config.ini config.ini
>[proxy]<br> >[proxy]<br>
>proxy=127.0.0.1:1080<br> >proxy=127.0.0.1:1080<br>
>timeout=10<br> >timeout=10<br>
>retry=3<br> >retry=3<br>
> >
>[Name_Rule]<br> >[Name_Rule]<br>
>location_rule='JAV_output/'+actor+'/['+number+']-'+title<br> >location_rule='JAV_output/'+actor+'/['+number+']-'+title<br>
>naming_rule=number+'-'+title<br> >naming_rule=number+'-'+title<br>
> >
>[update]<br> >[update]<br>
>update_check=1<br> >update_check=1<br>
> >
>[media]<br> >[media]<br>
>media_warehouse=emby<br> >media_warehouse=emby<br>
>#emby or plex<br> >#emby or plex<br>
>#plex only test!<br> >#plex only test!<br>
> >
>[directory_capture]<br> >[directory_capture]<br>
>switch=0<br> >switch=0<br>
>directory=<br> >directory=<br>
> >
>#everyone switch:1=on, 0=off<br> >#everyone switch:1=on, 0=off<br>
### 1.网络设置 ### 1.网络设置
#### * 针对“某些地区”的代理设置 #### * 针对“某些地区”的代理设置
打开```config.ini```,在```[proxy]```下的```proxy```行设置本地代理地址和端口支持Shadowxxxx/X,V2XXX本地代理端口:<br> 打开```config.ini```,在```[proxy]```下的```proxy```行设置本地代理地址和端口支持Shadowxxxx/X,V2XXX本地代理端口:<br>
例子:```proxy=127.0.0.1:1080```<br>素人系列抓取建议使用日本代理<br> 例子:```proxy=127.0.0.1:1080```<br>素人系列抓取建议使用日本代理<br>
**路由器拥有自动代理功能的可以把proxy=后面内容去掉**<br> **路由器拥有自动代理功能的可以把proxy=后面内容去掉**<br>
**本地代理软件开全局模式的同志同上**<br> **本地代理软件开全局模式的同志同上**<br>
**如果遇到tineout错误可以把文件的proxy=后面的地址和端口删除并开启vpn全局模式或者重启电脑vpn网卡**<br> **如果遇到tineout错误可以把文件的proxy=后面的地址和端口删除并开启vpn全局模式或者重启电脑vpn网卡**<br>
#### 连接超时重试设置 #### 连接超时重试设置
>[proxy]<br> >[proxy]<br>
>timeout=10<br> >timeout=10<br>
10为超时重试时间 单位:秒 10为超时重试时间 单位:秒
#### 连接重试次数设置 #### 连接重试次数设置
>[proxy]<br> >[proxy]<br>
>retry=3<br> >retry=3<br>
3即为重试次数 3即为重试次数
#### 检查更新开关 #### 检查更新开关
>[update]<br> >[update]<br>
>update_check=1<br> >update_check=1<br>
0为关闭1为开启不建议关闭 0为关闭1为开启不建议关闭
PLEX请安装插件```XBMCnfoMoviesImporter```
##### 媒体库选择
>[media]<br> ##### 媒体库选择
>media_warehouse=emby<br> >[media]<br>
>#emby or plex<br> >media_warehouse=emby<br>
>#plex only test!<br> >#emby or plex<br>
建议选择emby, plex不完善 >#plex only test!<br>
建议选择emby, plex不完善
#### 抓取目录选择
>[directory_capture]<br> #### 抓取目录选择
>switch=0<br> >[directory_capture]<br>
>directory=<br> >switch=0<br>
switch为1时directory才会被触发抓取程序目录下的directory目录下的电影如果为0则不触发抓取和程序同一目录下的影片directory不生效 >input_directory=<br>
>output_directory=<br>
### (可选)设置自定义目录和影片重命名规则 switch为1时目录自定义才会被触发此时可以指定抓取任意目录下的影片, 并指定存放的目录如果为0则不触发抓取和程序同一目录下的影片directory不生效. 如果仅指定input_directory, output_directory默认与input_directory相同.
**已有默认配置**<br>
##### 命名参数<br> ### (可选)设置自定义目录和影片重命名规则
>title = 片名<br> **已有默认配置**<br>
>actor = 演员<br> ##### 命名参数<br>
>studio = 公司<br> >title = 片名<br>
>director = 演<br> >actor = 演<br>
>release = 发售日<br> >studio = 公司<br>
>year = 发行年份<br> >director = 导演<br>
>number = 番号<br> >release = 发售日<br>
>cover = 封面链接<br> >year = 发行年份<br>
>tag = 类型<br> >number = 番号<br>
>outline = 简介<br> >cover = 封面链接<br>
>runtime = 时长<br> >tag = 类型<br>
##### **例子**:<br> >outline = 简介<br>
>目录结构规则:location_rule='JAV_output/'+actor+'/'+number **不推荐修改目录结构规则,抓取数据时新建文件夹容易出错**<br> >runtime = 时长<br>
>影片命名规则:naming_rule='['+number+']-'+title<br> **在EMBY,KODI等本地媒体库显示的标题** ##### **例子**:<br>
### 3.更新开关 目录结构规则:```location_rule='JAV_output/'+actor+'/'+number```<br> **不推荐修改时在这里添加title**有时title过长因为Windows API问题抓取数据时新建文件夹容易出错。<br>
>[update]<br>update_check=1<br> 影片命名规则:```naming_rule='['+number+']-'+title```<br> **在EMBY,KODI等本地媒体库显示的标题不影响目录结构下影片文件的命名**,依旧是 番号+后缀。
1为开0为 ### 3.更新开
## 3.把软件拷贝和电影的统一目录下 >[update]<br>update_check=1<br>
## 4.运行 ```AV_Data_capture.py/.exe``` 1为开0为关
当文件名包含:<br> ## 3.把软件拷贝和电影的统一目录下
中文,字幕,-c., -C., 处理元数据时会加上**中文字幕**标签 ## 4.运行 ```AV_Data_capture.py/.exe```
## 5.异常处理(重要) 当文件名包含:<br>
### 请确保软件是完整地确保ini文件内容是和下载提供ini文件内容的一致的 中文,字幕,-c., -C., 处理元数据时会加上**中文字幕**标签
### 关于软件打开就闪退 ## 5.异常处理(重要)
可以打开cmd命令提示符把 ```AV_Data_capture.py/.exe```拖进cmd窗口回车运行查看错误出现的错误信息**依据以下条目解决** ### 请确保软件是完整地确保ini文件内容是和下载提供ini文件内容的一致的
### 关于 ```Updata_check``` 和 ```JSON``` 相关的错误 ### 关于软件打开就闪退
跳转 [网络设置](#1网络设置) 可以打开cmd命令提示符把 ```AV_Data_capture.py/.exe```拖进cmd窗口回车运行查看错误出现的错误信息**依据以下条目解决**
### 关于```FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'JAV_output''``` ### 关于 ```Updata_check``` 和 ```JSON``` 相关的错误
在软件所在文件夹下新建 JAV_output 文件夹,可能是你没有把软件拉到和电影的同一目录 跳转 [网络设置](#1网络设置)
### 关于连接拒绝的错误 ### 关于```FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'JAV_output''```
请设置好[代理](#1针对某些地区的代理设置)<br> 在软件所在文件夹下新建 JAV_output 文件夹,可能是你没有把软件拉到和电影的同一目录
### 关于Nonetype,xpath报错 ### 关于连接拒绝的错误
同上<br> 请设置好[代理](#1针对某些地区的代理设置)<br>
### 关于番号提取失败或者异常 ### 关于Nonetype,xpath报错
**目前可以提取元素的影片:JAVBUS上有元数据的电影素人系列:300Maan,259luxu,siro等,FC2系列**<br> 同上<br>
>下一张图片来自Pockies的blog 原作者已授权<br> ### 关于番号提取失败或者异常
**目前可以提取元素的影片:JAVBUS上有元数据的电影素人系列:300Maan,259luxu,siro等,FC2系列**<br>
![](https://raw.githubusercontent.com/Pockies/pic/master/741f9461gy1g1cxc31t41j20i804zdgo.jpg) >下一张图片来自Pockies的blog 原作者已授权<br>
目前作者已经完善了番号提取机制,功能较为强大,可提取上述文件名的的番号,如果出现提取失败或者异常的情况,请用以下规则命名<br> ![](https://raw.githubusercontent.com/Pockies/pic/master/741f9461gy1g1cxc31t41j20i804zdgo.jpg)
**妈蛋不要喂软件那么多野鸡片子,不让软件好好活了,操**
``` 目前作者已经完善了番号提取机制,功能较为强大,可提取上述文件名的的番号,如果出现提取失败或者异常的情况,请用以下规则命名<br>
COSQ-004.mp4 **妈蛋不要喂软件那么多野鸡片子,不让软件好好活了,操**
``` ```
COSQ-004.mp4
针对 **野鸡番号** 你需要把文件名命名为与抓取网站提供的番号一致文件拓展名除外然后把文件拖拽至core.exe/.py<br> ```
**野鸡番号**:比如 ```XXX-XXX-1```, ```1301XX-MINA_YUKA``` 这种**野鸡**番号在javbus等资料库存在的作品。<br>**重要**:除了 **影片文件名** ```XXXX-XXX-C```,后面这种-C的是指电影有中文字幕<br>
条件:文件名中间要有下划线或者减号"_","-",没有多余的内容只有番号为最佳,可以让软件更好获取元数据 针对 **野鸡番号** 你需要把文件名命名为与抓取网站提供的番号一致文件拓展名除外然后把文件拖拽至core.exe/.py<br>
对于多影片重命名,可以用[ReNamer](http://www.den4b.com/products/renamer)来批量重命名<br> **野鸡番号**:比如 ```XXX-XXX-1```, ```1301XX-MINA_YUKA``` 这种**野鸡**番号在javbus等资料库存在的作品。<br>**重要**:除了 **影片文件名** ```XXXX-XXX-C```,后面这种-C的是指电影有中文字幕<br>
### 关于PIL/image.py 条件:文件名中间要有下划线或者减号"_","-",没有多余的内容只有番号为最佳,可以让软件更好获取元数据
暂时无解可能是网络问题或者pillow模块打包问题你可以用源码运行要安装好第一步的模块 对于多影片重命名,可以用[ReNamer](http://www.den4b.com/products/renamer)来批量重命名<br>
### 关于PIL/image.py
暂时无解可能是网络问题或者pillow模块打包问题你可以用源码运行要安装好第一步的模块
## 6.软件会自动把元数据获取成功的电影移动到JAV_output文件夹中根据演员分类失败的电影移动到failed文件夹中。
## 7.把JAV_output文件夹导入到EMBY,KODI中等待元数据刷新完成
## 8.写在后面 ## 6.软件会自动把元数据获取成功的电影移动到JAV_output文件夹中根据演员分类失败的电影移动到failed文件夹中。
怎么样,看着自己的日本电影被这样完美地管理,是不是感觉成就感爆棚呢?<br> ## 7.把JAV_output文件夹导入到EMBY,KODI中等待元数据刷新完成
**tg官方电报群:[ 点击进群](https://t.me/AV_Data_Capture_Official)**<br> ## 8.写在后面
怎么样,看着自己的日本电影被这样完美地管理,是不是感觉成就感爆棚呢?<br>
**tg官方电报群:[ 点击进群](https://t.me/AV_Data_Capture_Official)**<br>

View File

@@ -9,4 +9,13 @@ naming_rule=number+'-'+title
[update] [update]
update_check=1 update_check=1
#on=1,off=0
[media]
media_warehouse=emby
#emby or plex
#plex only test!
[directory_capture]
input_directory=
#everyone switch:1=on, 0=off

29
core.py Normal file → Executable file
View File

@@ -1,3 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re import re
import os import os
import os.path import os.path
@@ -47,18 +50,19 @@ except:
def moveFailedFolder(): def moveFailedFolder():
global filepath global filepath
print('[-]Move to "failed"') print('[-]Move to "failed"')
shutil.move(filepath, str(os.getcwd()) + '/' + 'failed/') #print('[-]' + filepath + ' -> ' + output_dir + '/failed/')
#os.rename(filepath, output_dir + '/failed/')
os._exit(0) os._exit(0)
def argparse_get_file(): def argparse_get_file():
parser = argparse.ArgumentParser() 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("file", help="Write the file path on here")
parser.add_argument("--number", help="Enter Number on here", default='')
args = parser.parse_args() args = parser.parse_args()
return (args.file, args.number) return (args.file, args.number)
def CreatFailedFolder(): def CreatFailedFolder():
if not os.path.exists('failed/'): # 新建failed文件夹 if not os.path.exists('/failed/'): # 新建failed文件夹
try: try:
os.makedirs('failed/') os.makedirs('/failed/')
except: except:
print("[-]failed!can not be make folder 'failed'\n[-](Please run as Administrator)") print("[-]failed!can not be make folder 'failed'\n[-](Please run as Administrator)")
os._exit(0) os._exit(0)
@@ -99,6 +103,8 @@ def getDataFromJSON(file_number): #从JSON返回元数据
elif 'FC2' in file_number: elif 'FC2' in file_number:
json_data = json.loads(fc2fans_club.main( json_data = json.loads(fc2fans_club.main(
file_number.strip('FC2_').strip('FC2-').strip('ppv-').strip('PPV-').strip('fc2_').strip('fc2-').strip('ppv-').strip('PPV-'))) file_number.strip('FC2_').strip('FC2-').strip('ppv-').strip('PPV-').strip('fc2_').strip('fc2-').strip('ppv-').strip('PPV-')))
elif 'siro' in number or 'SIRO' in number or 'Siro' in number:
json_data = json.loads(siro.main(file_number))
# =======================javbus.py======================= # =======================javbus.py=======================
else: else:
json_data = json.loads(javbus.main(file_number)) json_data = json.loads(javbus.main(file_number))
@@ -371,22 +377,19 @@ def cutImage():
def pasteFileToFolder(filepath, path): #文件路径,番号,后缀,要移动至的位置 def pasteFileToFolder(filepath, path): #文件路径,番号,后缀,要移动至的位置
global houzhui global houzhui
houzhui = str(re.search('[.](AVI|RMVB|WMV|MOV|MP4|MKV|FLV|TS|avi|rmvb|wmv|mov|mp4|mkv|flv|ts)$', filepath).group()) 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)
os.rename(filepath, number + houzhui)
except FileExistsError:
print('[-]File Exists! Please check your movie!')
print('[-]move to the root folder of the program.')
os._exit(0)
try: try:
shutil.move(number + houzhui, path) shutil.move(number + houzhui, path)
except: except:
print('[-]File Exists! Please check your movie!') print('[-]File Exists! Please check your movie!')
print('[-]move to the root folder of the program.') print('[-]move to the root folder of the program.')
os._exit(0) os._exit(0)
def renameJpgToBackdrop_copy(): def moveJpgToBackdrop_copy():
if option == 'plex': if option == 'plex':
shutil.copy(path + '/fanart.jpg', path + '/Backdrop.jpg') shutil.copy(path + '/fanart.jpg', path + '/Backdrop.jpg')
shutil.copy(path + '/poster.png', path + '/thumb.png') shutil.copy(path + '/poster.png', path + '/thumb.png')
if option == 'emby':
shutil.copy(path + '/' + number + '.jpg', path + '/Backdrop.jpg')
if __name__ == '__main__': if __name__ == '__main__':
filepath=argparse_get_file()[0] #影片的路径 filepath=argparse_get_file()[0] #影片的路径
@@ -399,7 +402,7 @@ if __name__ == '__main__':
number = str(re.findall(r'(.+?)\.',str(re.search('([^<>/\\\\|:""\\*\\?]+)\\.\\w+$',filepath).group()))).strip("['']").replace('_','-') number = str(re.findall(r'(.+?)\.',str(re.search('([^<>/\\\\|:""\\*\\?]+)\\.\\w+$',filepath).group()))).strip("['']").replace('_','-')
print("[!]Making Data for [" + number + "]") print("[!]Making Data for [" + number + "]")
except: except:
print("[-]failed!Please rename the filename again!") print("[-]failed!Please move the filename again!")
moveFailedFolder() moveFailedFolder()
else: else:
number = argparse_get_file()[1] number = argparse_get_file()[1]
@@ -410,4 +413,4 @@ if __name__ == '__main__':
PrintFiles(filepath) # 打印文件 PrintFiles(filepath) # 打印文件
cutImage() # 裁剪图 cutImage() # 裁剪图
pasteFileToFolder(filepath, path) # 移动文件 pasteFileToFolder(filepath, path) # 移动文件
renameJpgToBackdrop_copy() moveJpgToBackdrop_copy()

3
fc2fans_club.py Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!/usr/bin/env python3
import re import re
from lxml import etree#need install from lxml import etree#need install
import json 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') js = json.dumps(dic, ensure_ascii=False, sort_keys=True, indent=4, separators=(',', ':'),)#.encode('UTF-8')
return js return js
#print(main('1051725')) #print(main('1051725'))

3
javbus.py Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!/usr/bin/env python3
import re import re
import requests #need install import requests #need install
from pyquery import PyQuery as pq#need install from pyquery import PyQuery as pq#need install
@@ -173,4 +174,4 @@ def main_uncensored(number):
js2 = javdb.main(number) js2 = javdb.main(number)
return js2 return js2
return js return js

3
javdb.py Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!/usr/bin/env python3
import re import re
from lxml import etree from lxml import etree
import json 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') js = json.dumps(dic, ensure_ascii=False, sort_keys=True, indent=4, separators=(',', ':'), ) # .encode('UTF-8')
return js return js
#print(main('061519-861')) #print(main('061519-861'))

3
siro.py Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!/usr/bin/env python3
import re import re
from lxml import etree from lxml import etree
import json 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') js = json.dumps(dic, ensure_ascii=False, sort_keys=True, indent=4, separators=(',', ':'),)#.encode('UTF-8')
return js return js
#print(main('300maan-373')) #print(main('300maan-373'))

View File

@@ -1,5 +1,5 @@
{ {
"version": "0.11.6", "version": "0.11.7",
"version_show":"Beta 11.6", "version_show":"Beta 11.7",
"download": "https://github.com/wenead99/AV_Data_Capture/releases" "download": "https://github.com/wenead99/AV_Data_Capture/releases"
} }