32 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
Yoshiko
a33b882592 Update update_check.json 2019-07-14 09:59:56 +08:00
Yoshiko
150b81453c Update 11.6 2019-07-14 09:58:46 +08:00
Yoshiko
a6df479b78 Update 11.6 2019-07-14 09:45:53 +08:00
Yoshiko
dd6445b2ba Update 11.6 2019-07-14 09:38:26 +08:00
Yoshiko
41051a915b Update README.md 2019-07-12 18:13:09 +08:00
Yoshiko
32ce390939 Update README.md 2019-07-12 18:08:45 +08:00
Yoshiko
8deec6a6c0 Update README.md 2019-07-12 18:08:20 +08:00
Yoshiko
0fab70ff3d Update README.md 2019-07-12 18:07:23 +08:00
Yoshiko
53bbb99a64 Update README.md 2019-07-12 17:59:46 +08:00
Yoshiko
0e712de805 Update README.md 2019-07-11 10:43:55 +08:00
Yoshiko
6f74254e96 Update README.md 2019-07-11 00:58:16 +08:00
Yoshiko
4220bd708b Update README.md 2019-07-11 00:49:23 +08:00
Yoshiko
3802d88972 Update README.md 2019-07-11 00:46:22 +08:00
Yoshiko
8cddbf1e1b Update README.md 2019-07-11 00:41:40 +08:00
Yoshiko
332326e5f6 Update README.md 2019-07-09 18:52:36 +08:00
Yoshiko
27f64a81d0 Update README.md 2019-07-09 17:57:09 +08:00
Yoshiko
7e3fa5ade8 Update README.md 2019-07-09 17:56:48 +08:00
10 changed files with 522 additions and 328 deletions

46
ADC_function.py Normal file → Executable file
View File

@@ -1,15 +1,19 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests import requests
from configparser import RawConfigParser from configparser import ConfigParser
import os import os
import re import re
from retrying import retry
import time import time
import sys import sys
config = RawConfigParser() config_file='config.ini'
if os.path.exists('config.ini'): config = ConfigParser()
if os.path.exists(config_file):
try: try:
config.read('config.ini', encoding='UTF-8') config.read(config_file, encoding='UTF-8')
except: except:
print('[-]Config.ini read failed! Please use the offical file!') print('[-]Config.ini read failed! Please use the offical file!')
else: else:
@@ -26,33 +30,54 @@ else:
print("", file=code) print("", file=code)
print("[update]",file=code) print("[update]",file=code)
print("update_check=1",file=code) print("update_check=1",file=code)
print("", file=code)
print("[media]", file=code)
print("media_warehouse=emby", file=code)
print("#emby or plex", file=code)
print("#plex only test!", file=code)
print("", file=code)
print("[directory_capture]", file=code)
print("switch=0", file=code)
print("directory=", file=code)
print("", file=code)
print("everyone switch:1=on, 0=off", file=code)
time.sleep(2) time.sleep(2)
print('[+]config.ini: created!') print('[+]config.ini: created!')
try: try:
config.read('config.ini', encoding='UTF-8') config.read(config_file, encoding='UTF-8')
except: except:
print('[-]Config.ini read failed! Please use the offical file!') print('[-]Config.ini read failed! Please use the offical file!')
def ReadMediaWarehouse():
return config['media']['media_warehouse']
def UpdateCheckSwitch(): def UpdateCheckSwitch():
check=str(config['update']['update_check']) check=str(config['update']['update_check'])
if check == '1': if check == '1':
return '1' return '1'
elif check == '0': elif check == '0':
return '0' return '0'
elif check == '':
return '0'
def get_html(url,cookies = None):#网页请求核心 def get_html(url,cookies = None):#网页请求核心
try:
proxy = config['proxy']['proxy']
timeout = int(config['proxy']['timeout'])
retry_count = int(config['proxy']['retry'])
except:
print('[-]Proxy config error! Please check the config.')
i = 0 i = 0
retry_count = int(config['proxy']['retry'])
while i < retry_count: while i < retry_count:
try: try:
if not str(config['proxy']['proxy']) == '': if not str(config['proxy']['proxy']) == '':
proxies = {"http": "http://" + str(config['proxy']['proxy']),"https": "https://" + str(config['proxy']['proxy'])} proxies = {"http": "http://" + proxy,"https": "https://" + proxy}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36'} headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36'}
getweb = requests.get(str(url), headers=headers, timeout=int(config['proxy']['timeout']),proxies=proxies, cookies=cookies) getweb = requests.get(str(url), headers=headers, timeout=timeout,proxies=proxies, cookies=cookies)
getweb.encoding = 'utf-8' getweb.encoding = 'utf-8'
return getweb.text return getweb.text
else: else:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'} headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
getweb = requests.get(str(url), headers=headers, timeout=int(config['proxy']['timeout']), cookies=cookies) getweb = requests.get(str(url), headers=headers, timeout=timeout, cookies=cookies)
getweb.encoding = 'utf-8' getweb.encoding = 'utf-8'
return getweb.text return getweb.text
except requests.exceptions.RequestException: except requests.exceptions.RequestException:
@@ -67,5 +92,6 @@ def get_html(url,cookies = None):#网页请求核心
except requests.exceptions.ConnectTimeout: except requests.exceptions.ConnectTimeout:
i += 1 i += 1
print('[-]Connect retry '+str(i)+'/'+str(retry_count)) print('[-]Connect retry '+str(i)+'/'+str(retry_count))
print('[-]Connect Failed! Please check your Proxy or Network!')

133
AV_Data_Capture.py Normal file → Executable file
View File

@@ -1,20 +1,28 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob import glob
import os import os
import time import time
import re import re
import sys import sys
import ADC_function from ADC_function import *
import json import json
import subprocess
import shutil import shutil
from configparser import ConfigParser
version='0.11.5' version='0.11.7'
os.chdir(os.getcwd()) os.chdir(os.getcwd())
def UpdateCheck(): input_dir='.' # 电影的读取与输出路径, 默认为当前路径
if ADC_function.UpdateCheckSwitch() == '1':
html2 = ADC_function.get_html('https://raw.githubusercontent.com/wenead99/AV_Data_Capture/master/update_check.json')
html = json.loads(str(html2))
config = ConfigParser()
config.read(config_file, encoding='UTF-8')
def UpdateCheck():
if UpdateCheckSwitch() == '1':
html = json.loads(get_html('https://raw.githubusercontent.com/wenead99/AV_Data_Capture/master/update_check.json'))
if not version == html['version']: if not version == html['version']:
print('[*] * New update ' + html['version'] + ' *') print('[*] * New update ' + html['version'] + ' *')
print('[*] * Download *') print('[*] * Download *')
@@ -22,35 +30,46 @@ def UpdateCheck():
print('[*]=====================================') print('[*]=====================================')
else: else:
print('[+]Update Check disabled!') print('[+]Update Check disabled!')
def movie_lists():
#MP4
a2 = glob.glob(r".\*.mp4")
# AVI
b2 = glob.glob(r".\*.avi")
# RMVB
c2 = glob.glob(r".\*.rmvb")
# WMV
d2 = glob.glob(r".\*.wmv")
# MOV
e2 = glob.glob(r".\*.mov")
# MKV
f2 = glob.glob(r".\*.mkv")
# FLV
g2 = glob.glob(r".\*.flv")
# TS
h2 = glob.glob(r".\*.ts")
total = a2+b2+c2+d2+e2+f2+g2+h2 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():
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 return total
def CreatFailedFolder(): def CreatFolder(folder_path):
if not os.path.exists('failed/'): # 新建failed文件夹 if not os.path.exists(folder_path): # 新建文件夹
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=[]
a.append(custom_nuber) a.append(custom_nuber)
return a return a
@@ -102,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[+][+]按回车键结束,你可以在结束之前查看和错误信息。")

393
README.md
View File

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

251
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
@@ -36,22 +39,30 @@ actor_photo={}
naming_rule =''#eval(config['Name_Rule']['naming_rule']) naming_rule =''#eval(config['Name_Rule']['naming_rule'])
location_rule=''#eval(config['Name_Rule']['location_rule']) location_rule=''#eval(config['Name_Rule']['location_rule'])
Config = ConfigParser()
Config.read(config_file, encoding='UTF-8')
try:
option = ReadMediaWarehouse()
except:
print('[-]Config media_warehouse read failed!')
#=====================本地文件处理=========================== #=====================本地文件处理===========================
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)
@@ -92,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))
@@ -159,16 +172,17 @@ def creatFolder(): #创建文件夹
os.makedirs(path) os.makedirs(path)
#=====================资源下载部分=========================== #=====================资源下载部分===========================
def DownloadFileWithFilename(url,filename,path): #path = examle:photo , video.in the Project Folder! def DownloadFileWithFilename(url,filename,path): #path = examle:photo , video.in the Project Folder!
config = ConfigParser() try:
config.read('config.ini', encoding='UTF-8') proxy = Config['proxy']['proxy']
proxy = str(config['proxy']['proxy']) timeout = int(Config['proxy']['timeout'])
timeout = int(config['proxy']['timeout']) retry_count = int(Config['proxy']['retry'])
retry_count = int(config['proxy']['retry']) except:
print('[-]Proxy config error! Please check the config.')
i = 0 i = 0
while i < retry_count: while i < retry_count:
try: try:
if not str(config['proxy']['proxy']) == '': if not proxy == '':
if not os.path.exists(path): if not os.path.exists(path):
os.makedirs(path) os.makedirs(path)
headers = { headers = {
@@ -204,13 +218,19 @@ def DownloadFileWithFilename(url,filename,path): #path = examle:photo , video.in
except requests.exceptions.ConnectTimeout: except requests.exceptions.ConnectTimeout:
i += 1 i += 1
print('[-]Image Download : Connect retry '+str(i)+'/'+str(retry_count)) print('[-]Image Download : Connect retry '+str(i)+'/'+str(retry_count))
print('[-]Connect Failed! Please check your Proxy or Network!')
moveFailedFolder() moveFailedFolder()
def imageDownload(filepath): #封面是否下载成功否则移动到failed def imageDownload(filepath): #封面是否下载成功否则移动到failed
global path if option == 'emby':
if DownloadFileWithFilename(cover,'fanart.jpg', path) == 'failed': if DownloadFileWithFilename(cover, number + '.jpg', path) == 'failed':
moveFailedFolder() moveFailedFolder()
DownloadFileWithFilename(cover, 'fanart.jpg', path) DownloadFileWithFilename(cover, number + '.jpg', path)
print('[+]Image Downloaded!', path +'/fanart.jpg') print('[+]Image Downloaded!', path + '/' + number + '.jpg')
elif option == 'plex':
if DownloadFileWithFilename(cover, 'fanart.jpg', path) == 'failed':
moveFailedFolder()
DownloadFileWithFilename(cover, 'fanart.jpg', path)
print('[+]Image Downloaded!', path + '/fanart.jpg')
def PrintFiles(filepath): def PrintFiles(filepath):
#global path #global path
global title global title
@@ -219,52 +239,100 @@ def PrintFiles(filepath):
try: try:
if not os.path.exists(path): if not os.path.exists(path):
os.makedirs(path) os.makedirs(path)
with open(path + "/" + number + ".nfo", "wt", encoding='UTF-8') as code: if option == 'plex':
print("<movie>", file=code) with open(path + "/" + number + ".nfo", "wt", encoding='UTF-8') as code:
print(" <title>" + naming_rule + "</title>", file=code) print("<movie>", file=code)
print(" <set>", file=code) print(" <title>" + naming_rule + "</title>", file=code)
print(" </set>", file=code) print(" <set>", file=code)
print(" <studio>" + studio + "+</studio>", file=code) print(" </set>", file=code)
print(" <year>" + year + "</year>", file=code) print(" <studio>" + studio + "+</studio>", file=code)
print(" <outline>"+outline+"</outline>", file=code) print(" <year>" + year + "</year>", file=code)
print(" <plot>"+outline+"</plot>", file=code) print(" <outline>" + outline + "</outline>", file=code)
print(" <runtime>"+str(runtime).replace(" ","")+"</runtime>", file=code) print(" <plot>" + outline + "</plot>", file=code)
print(" <director>" + director + "</director>", file=code) print(" <runtime>" + str(runtime).replace(" ", "") + "</runtime>", file=code)
print(" <poster>poster.png</poster>", file=code) print(" <director>" + director + "</director>", file=code)
print(" <thumb>thumb.png</thumb>", file=code) print(" <poster>poster.png</poster>", file=code)
print(" <fanart>fanart.jpg</fanart>", file=code) print(" <thumb>thumb.png</thumb>", file=code)
try: print(" <fanart>fanart.jpg</fanart>", file=code)
for key, value in actor_photo.items(): try:
print(" <actor>", file=code) for key, value in actor_photo.items():
print(" <name>" + key + "</name>", file=code) print(" <actor>", file=code)
if not actor_photo == '': # or actor_photo == []: print(" <name>" + key + "</name>", file=code)
print(" <thumb>" + value + "</thumb>", file=code) if not actor_photo == '': # or actor_photo == []:
print(" </actor>", file=code) print(" <thumb>" + value + "</thumb>", file=code)
except: print(" </actor>", file=code)
aaaa='' except:
print(" <maker>" + studio + "</maker>", file=code) aaaa = ''
print(" <label>", file=code) print(" <maker>" + studio + "</maker>", file=code)
print(" </label>", file=code) print(" <label>", file=code)
if cn_sub == '1': print(" </label>", file=code)
print(" <tag>中文字幕</tag>", file=code) if cn_sub == '1':
try: print(" <tag>中文字幕</tag>", file=code)
for i in tag: try:
print(" <tag>" + i + "</tag>", file=code) for i in tag:
except: print(" <tag>" + i + "</tag>", file=code)
aaaaa='' except:
try: aaaaa = ''
for i in tag: try:
print(" <genre>" + i + "</genre>", file=code) for i in tag:
except: print(" <genre>" + i + "</genre>", file=code)
aaaaaaaa='' except:
if cn_sub == '1': aaaaaaaa = ''
print(" <genre>中文字幕</genre>", file=code) if cn_sub == '1':
print(" <num>" + number + "</num>", file=code) print(" <genre>中文字幕</genre>", file=code)
print(" <release>" + release + "</release>", file=code) print(" <num>" + number + "</num>", file=code)
print(" <cover>"+cover+"</cover>", file=code) print(" <release>" + release + "</release>", file=code)
print(" <website>" + website + "</website>", file=code) print(" <cover>" + cover + "</cover>", file=code)
print("</movie>", file=code) print(" <website>" + website + "</website>", file=code)
print("[+]Writeed! "+path + "/" + number + ".nfo") print("</movie>", file=code)
print("[+]Writeed! " + path + "/" + number + ".nfo")
elif option == 'emby':
with open(path + "/" + number + ".nfo", "wt", encoding='UTF-8') as code:
print("<movie>", file=code)
print(" <title>" + naming_rule + "</title>", file=code)
print(" <set>", file=code)
print(" </set>", file=code)
print(" <studio>" + studio + "+</studio>", file=code)
print(" <year>" + year + "</year>", file=code)
print(" <outline>" + outline + "</outline>", file=code)
print(" <plot>" + outline + "</plot>", file=code)
print(" <runtime>" + str(runtime).replace(" ", "") + "</runtime>", file=code)
print(" <director>" + director + "</director>", file=code)
print(" <poster>" + number + ".png</poster>", file=code)
print(" <thumb>" + number + ".png</thumb>", file=code)
print(" <fanart>" + number + '.jpg' + "</fanart>", file=code)
try:
for key, value in actor_photo.items():
print(" <actor>", file=code)
print(" <name>" + key + "</name>", file=code)
if not actor_photo == '': # or actor_photo == []:
print(" <thumb>" + value + "</thumb>", file=code)
print(" </actor>", file=code)
except:
aaaa = ''
print(" <maker>" + studio + "</maker>", file=code)
print(" <label>", file=code)
print(" </label>", file=code)
if cn_sub == '1':
print(" <tag>中文字幕</tag>", file=code)
try:
for i in tag:
print(" <tag>" + i + "</tag>", file=code)
except:
aaaaa = ''
try:
for i in tag:
print(" <genre>" + i + "</genre>", file=code)
except:
aaaaaaaa = ''
if cn_sub == '1':
print(" <genre>中文字幕</genre>", file=code)
print(" <num>" + number + "</num>", file=code)
print(" <release>" + release + "</release>", file=code)
print(" <cover>" + cover + "</cover>", file=code)
print(" <website>" + "https://www.javbus.com/" + number + "</website>", file=code)
print("</movie>", file=code)
print("[+]Writeed! " + path + "/" + number + ".nfo")
except IOError as e: except IOError as e:
print("[-]Write Failed!") print("[-]Write Failed!")
print(e) print(e)
@@ -274,29 +342,54 @@ def PrintFiles(filepath):
print("[-]Write Failed!") print("[-]Write Failed!")
moveFailedFolder() moveFailedFolder()
def cutImage(): def cutImage():
if imagecut == 1: if option == 'plex':
try: if imagecut == 1:
try:
img = Image.open(path + '/fanart.jpg')
imgSize = img.size
w = img.width
h = img.height
img2 = img.crop((w / 1.9, 0, w, h))
img2.save(path + '/poster.png')
except:
print('[-]Cover cut failed!')
else:
img = Image.open(path + '/fanart.jpg') img = Image.open(path + '/fanart.jpg')
imgSize = img.size
w = img.width w = img.width
h = img.height h = img.height
img2 = img.crop((w / 1.9, 0, w, h)) img.save(path + '/poster.png')
img2.save(path + '/poster.png') elif option == 'emby':
except: if imagecut == 1:
print('[-]Cover cut failed!') try:
else: img = Image.open(path + '/' + number + '.jpg')
img = Image.open(path + '/fanart.jpg') imgSize = img.size
w = img.width w = img.width
h = img.height h = img.height
img.save(path + '/poster.png') img2 = img.crop((w / 1.9, 0, w, h))
img2.save(path + '/' + number + '.png')
except:
print('[-]Cover cut failed!')
else:
img = Image.open(path + '/' + number + '.jpg')
w = img.width
h = img.height
img.save(path + '/' + number + '.png')
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())
os.rename(filepath, number + houzhui) os.rename(filepath, number + houzhui)
shutil.move(number + houzhui, path) try:
def renameJpgToBackdrop_copy(): shutil.move(number + houzhui, path)
shutil.copy(path + '/fanart.jpg', path + '/Backdrop.jpg') except:
shutil.copy(path + '/poster.png', path + '/thumb.png') print('[-]File Exists! Please check your movie!')
print('[-]move to the root folder of the program.')
os._exit(0)
def moveJpgToBackdrop_copy():
if option == 'plex':
shutil.copy(path + '/fanart.jpg', path + '/Backdrop.jpg')
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] #影片的路径
@@ -309,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]
@@ -320,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.5", "version": "0.11.7",
"version_show":"Beta 11.5", "version_show":"Beta 11.7",
"download": "https://github.com/wenead99/AV_Data_Capture/releases" "download": "https://github.com/wenead99/AV_Data_Capture/releases"
} }