# -*- coding: utf-8 -*-
import re
import os
import os.path
import shutil
from PIL import Image
import time
import json
from ADC_function import *
from configparser import ConfigParser
import argparse
#=========website========
import fc2fans_club
import siro
import avsox
import javbus
import javdb
#=========website========
#初始化全局变量
Config = ConfigParser()
Config.read(config_file, encoding='UTF-8')
try:
option = ReadMediaWarehouse()
except:
print('[-]Config media_warehouse read failed!')
title=''
studio=''
year=''
outline=''
runtime=''
director=''
actor_list=[]
actor=''
release=''
number=''
cover=''
imagecut=''
tag=[]
cn_sub=''
multi_part=0
part=''
path=''
houzhui=''
website=''
json_data={}
actor_photo={}
cover_small=''
naming_rule =''#eval(config['Name_Rule']['naming_rule'])
location_rule=''#eval(config['Name_Rule']['location_rule'])
program_mode = Config['common']['main_mode']
failed_folder = Config['common']['failed_output_folder']
success_folder = Config['common']['success_output_folder']
#=====================本地文件处理===========================
def escapePath(path): # Remove escape literals
escapeLiterals = Config['escape']['literals']
backslash = '\\'
for literal in escapeLiterals:
path = path.replace(backslash+literal,'')
return path
def moveFailedFolder():
global filepath
print('[-]Move to Failed output folder')
shutil.move(filepath, str(os.getcwd()) + '/' + failed_folder + '/')
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")
args = parser.parse_args()
return (args.file, args.number)
def CreatFailedFolder():
if not os.path.exists(failed_folder+'/'): # 新建failed文件夹
try:
os.makedirs(failed_folder+'/')
except:
print("[-]failed!can not be make Failed output folder\n[-](Please run as Administrator)")
os._exit(0)
def getDataState(json_data): #元数据获取失败检测
if json_data['title'] == '' or json_data['title'] == 'None' or json_data['title'] == 'null':
return 0
else:
return 1
def getDataFromJSON(file_number): #从JSON返回元数据
global title
global studio
global year
global outline
global runtime
global director
global actor_list
global actor
global release
global number
global cover
global imagecut
global tag
global image_main
global cn_sub
global website
global actor_photo
global cover_small
global json_data
global naming_rule
global location_rule
# ================================================网站规则添加开始================================================
if re.match('^\d{5,}', file_number):
json_data = json.loads(avsox.main(file_number))
if getDataState(json_data) == 0: # 如果元数据获取失败,请求番号至其他网站抓取
json_data = json.loads(javdb.main(file_number))
#==
elif re.match('\d+\D+', file_number):
json_data = json.loads(siro.main(file_number))
if getDataState(json_data) == 0: # 如果元数据获取失败,请求番号至其他网站抓取
json_data = json.loads(javbus.main(file_number))
elif getDataState(json_data) == 0: # 如果元数据获取失败,请求番号至其他网站抓取
json_data = json.loads(javdb.main(file_number))
# ==
elif 'fc2' in file_number or 'FC2' in file_number:
json_data = json.loads(fc2fans_club.main(file_number))
# ==
elif 'HEYZO' in number or 'heyzo' in number or 'Heyzo' in number:
json_data = json.loads(avsox.main(file_number))
# ==
elif 'siro' in file_number or 'SIRO' in file_number or 'Siro' in file_number:
json_data = json.loads(siro.main(file_number))
# ==
else:
json_data = json.loads(javbus.main(file_number))
if getDataState(json_data) == 0: # 如果元数据获取失败,请求番号至其他网站抓取
json_data = json.loads(avsox.main(file_number))
elif getDataState(json_data) == 0: # 如果元数据获取失败,请求番号至其他网站抓取
json_data = json.loads(javdb.main(file_number))
# ================================================网站规则添加结束================================================
title = str(json_data['title']).replace(' ','')
studio = json_data['studio']
year = json_data['year']
outline = json_data['outline']
runtime = json_data['runtime']
director = json_data['director']
actor_list = str(json_data['actor']).strip("[ ]").replace("'", '').split(',') # 字符串转列表
release = json_data['release']
number = json_data['number']
cover = json_data['cover']
try:
cover_small = json_data['cover_small']
except:
cover_small=''
imagecut = json_data['imagecut']
tag = str(json_data['tag']).strip("[ ]").replace("'", '').replace(" ", '').split(',') # 字符串转列表 @
actor = str(actor_list).strip("[ ]").replace("'", '').replace(" ", '')
actor_photo = json_data['actor_photo']
website = json_data['website']
source = json_data['source']
if title == '' or number == '':
print('[-]Movie Data not found!')
moveFailedFolder()
if imagecut == '3':
DownloadFileWithFilename()
# ====================处理异常字符====================== #\/:*?"<>|
title = title.replace('\\', '')
title = title.replace('/', '')
title = title.replace(':', '')
title = title.replace('*', '')
title = title.replace('?', '')
title = title.replace('"', '')
title = title.replace('<', '')
title = title.replace('>', '')
title = title.replace('|', '')
tmpArr = cover_small.split(',')
if len(tmpArr) > 0:
cover_small = tmpArr[0].strip('\"').strip('\'')
# ====================处理异常字符 END================== #\/:*?"<>|
naming_rule = eval(config['Name_Rule']['naming_rule'])
location_rule = eval(config['Name_Rule']['location_rule'])
def smallCoverCheck():
if imagecut == 3:
if option == 'emby':
DownloadFileWithFilename(cover_small, '1.jpg', path)
try:
img = Image.open(path + '/1.jpg')
except Exception:
img = Image.open('1.jpg')
w = img.width
h = img.height
img.save(path + '/' + number + '.png')
time.sleep(1)
os.remove(path + '/1.jpg')
if option == 'kodi':
DownloadFileWithFilename(cover_small, '1.jpg', path)
img = Image.open(path + '/1.jpg')
w = img.width
h = img.height
img.save(path + '/' + number + '-poster.jpg')
time.sleep(1)
os.remove(path + '/1.jpg')
if option == 'plex':
DownloadFileWithFilename(cover_small, '1.jpg', path)
try:
img = Image.open(path + '/1.jpg')
except Exception:
img = Image.open('1.jpg')
w = img.width
h = img.height
img.save(path + '/poster.png')
os.remove(path + '/1.jpg')
def creatFolder(): #创建文件夹
global actor
global path
if len(os.getcwd()+path) > 240: #新建成功输出文件夹
path = success_folder+'/'+location_rule.replace("'actor'","'超多人'",3).replace("actor","'超多人'",3) #path为影片+元数据所在目录
else:
path = success_folder+'/'+location_rule
#print(path)
if not os.path.exists(path):
path = escapePath(path)
try:
os.makedirs(path)
except:
path = success_folder+'/'+location_rule.replace('/['+number+']-'+title,"/number")
path = escapePath(path)
#print(path)
os.makedirs(path)
#=====================资源下载部分===========================
def DownloadFileWithFilename(url,filename,path): #path = examle:photo , video.in the Project Folder!
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
while i < retry_count:
try:
if not proxy == '':
if not os.path.exists(path):
os.makedirs(path)
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'}
r = requests.get(url, headers=headers, timeout=timeout,proxies={"http": "http://" + str(proxy), "https": "https://" + str(proxy)})
if r == '':
print('[-]Movie Data not found!')
os._exit(0)
with open(str(path) + "/" + filename, "wb") as code:
code.write(r.content)
return
else:
if not os.path.exists(path):
os.makedirs(path)
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'}
r = requests.get(url, timeout=timeout, headers=headers)
if r == '':
print('[-]Movie Data not found!')
os._exit(0)
with open(str(path) + "/" + filename, "wb") as code:
code.write(r.content)
return
except requests.exceptions.RequestException:
i += 1
print('[-]Image Download : Connect retry '+str(i)+'/'+str(retry_count))
except requests.exceptions.ConnectionError:
i += 1
print('[-]Image Download : Connect retry '+str(i)+'/'+str(retry_count))
except requests.exceptions.ProxyError:
i += 1
print('[-]Image Download : Connect retry '+str(i)+'/'+str(retry_count))
except requests.exceptions.ConnectTimeout:
i += 1
print('[-]Image Download : Connect retry '+str(i)+'/'+str(retry_count))
print('[-]Connect Failed! Please check your Proxy or Network!')
moveFailedFolder()
def imageDownload(filepath): #封面是否下载成功,否则移动到failed
if option == 'emby':
if DownloadFileWithFilename(cover, number + '.jpg', path) == 'failed':
moveFailedFolder()
DownloadFileWithFilename(cover, number + '.jpg', path)
if multi_part == 1:
old_name = os.path.join(path, number + '.jpg')
new_name = os.path.join(path, number + part + '.jpg')
os.rename(old_name, new_name)
print('[+]Image Downloaded!', path + '/' + number + part + '.jpg')
else:
print('[+]Image Downloaded!', path + '/' + number + '.jpg')
elif option == 'kodi':
if DownloadFileWithFilename(cover, number + '-fanart.jpg', path) == 'failed':
moveFailedFolder()
DownloadFileWithFilename(cover, number + '-fanart.jpg', path)
print('[+]Image Downloaded!', path + '/' + number + '-fanart.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):
try:
if not os.path.exists(path):
os.makedirs(path)
if option == 'plex':
with open(path + "/" + number + ".nfo", "wt", encoding='UTF-8') as code:
print("", file=code)
print(" " + naming_rule + "", file=code)
print(" ", file=code)
print(" ", file=code)
print(" " + studio + "+", file=code)
print(" " + year + "", file=code)
print(" " + outline + "", file=code)
print(" " + outline + "", file=code)
print(" " + str(runtime).replace(" ", "") + "", file=code)
print(" " + director + "", file=code)
print(" poster.png", file=code)
print(" thumb.png", file=code)
print(" fanart.jpg", file=code)
try:
for key, value in actor_photo.items():
print(" ", file=code)
print(" " + key + "", file=code)
if not actor_photo == '': # or actor_photo == []:
print(" " + value + "", file=code)
print(" ", file=code)
except:
aaaa = ''
print(" " + studio + "", file=code)
print(" ", file=code)
if cn_sub == '1':
print(" 中文字幕", file=code)
try:
for i in str(json_data['tag']).strip("[ ]").replace("'", '').replace(" ", '').split(','):
print(" " + i + "", file=code)
except:
aaaaa = ''
try:
for i in str(json_data['tag']).strip("[ ]").replace("'", '').replace(" ", '').split(','):
print(" " + i + "", file=code)
except:
aaaaaaaa = ''
if cn_sub == '1':
print(" 中文字幕", file=code)
print(" " + number + "", file=code)
print(" " + release + "", file=code)
print(" " + cover + "", file=code)
print(" " + website + "", file=code)
print("", file=code)
print("[+]Writeed! " + path + "/" + number + ".nfo")
elif option == 'emby':
with open(path + "/" + number + ".nfo", "wt", encoding='UTF-8') as code:
print("", file=code)
print(" " + naming_rule + "", file=code)
print(" ", file=code)
print(" ", file=code)
print(" " + studio + "+", file=code)
print(" " + year + "", file=code)
print(" " + outline + "", file=code)
print(" " + outline + "", file=code)
print(" " + str(runtime).replace(" ", "") + "", file=code)
print(" " + director + "", file=code)
print(" " + number + ".png", file=code)
print(" " + number + ".png", file=code)
print(" " + number + '.jpg' + "", file=code)
try:
for key, value in actor_photo.items():
print(" ", file=code)
print(" " + key + "", file=code)
if not actor_photo == '': # or actor_photo == []:
print(" " + value + "", file=code)
print(" ", file=code)
except:
aaaa = ''
print(" " + studio + "", file=code)
print(" ", file=code)
if cn_sub == '1':
print(" 中文字幕", file=code)
try:
for i in tag:
print(" " + i + "", file=code)
except:
aaaaa = ''
try:
for i in tag:
print(" " + i + "", file=code)
except:
aaaaaaaa = ''
if cn_sub == '1':
print(" 中文字幕", file=code)
print(" " + number + "", file=code)
print(" " + release + "", file=code)
print(" " + cover + "", file=code)
print(" " + "https://www.javbus.com/" + number + "", file=code)
print("", file=code)
print("[+]Writeed! " + path + "/" + number + ".nfo")
elif option == 'kodi':
with open(path + "/" + number + ".nfo", "wt", encoding='UTF-8') as code:
print("", file=code)
print(" " + naming_rule + "", file=code)
print(" ", file=code)
print(" ", file=code)
print(" " + studio + "+", file=code)
print(" " + year + "", file=code)
print(" " + outline + "", file=code)
print(" " + outline + "", file=code)
print(" " + str(runtime).replace(" ", "") + "", file=code)
print(" " + director + "", file=code)
print(" " + number + "-poster.jpg", file=code)
print(" " + number + '-fanart.jpg' + "", file=code)
try:
for key, value in actor_photo.items():
print(" ", file=code)
print(" " + key + "", file=code)
if not actor_photo == '': # or actor_photo == []:
print(" " + value + "", file=code)
print(" ", file=code)
except:
aaaa = ''
print(" " + studio + "", file=code)
print(" ", file=code)
if cn_sub == '1':
print(" 中文字幕", file=code)
try:
for i in tag:
print(" " + i + "", file=code)
except:
aaaaa = ''
try:
for i in tag:
print(" " + i + "", file=code)
except:
aaaaaaaa = ''
if cn_sub == '1':
print(" 中文字幕", file=code)
print(" " + number + "", file=code)
print(" " + release + "", file=code)
print(" " + cover + "", file=code)
print(" " + "https://www.javbus.com/" + number + "", file=code)
print("", file=code)
print("[+]Writeed! " + path + "/" + number + ".nfo")
except IOError as e:
print("[-]Write Failed!")
print(e)
moveFailedFolder()
except Exception as e1:
print(e1)
print("[-]Write Failed!")
moveFailedFolder()
def cutImage():
if option == 'plex':
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!')
elif imagecut == 0:
img = Image.open(path + '/fanart.jpg')
w = img.width
h = img.height
img.save(path + '/poster.png')
elif option == 'emby':
if imagecut == 1:
try:
img = Image.open(path + '/' + number + '.jpg')
imgSize = img.size
w = img.width
h = img.height
img2 = img.crop((w / 1.9, 0, w, h))
img2.save(path + '/' + number + '.png')
except:
print('[-]Cover cut failed!')
elif imagecut == 0:
img = Image.open(path + '/' + number + '.jpg')
w = img.width
h = img.height
img.save(path + '/' + number + '.png')
elif option == 'kodi':
if imagecut == 1:
try:
img = Image.open(path + '/' + number + '-fanart.jpg')
imgSize = img.size
w = img.width
h = img.height
img2 = img.crop((w / 1.9, 0, w, h))
img2.save(path + '/' + number + '-poster.jpg')
except:
print('[-]Cover cut failed!')
elif imagecut == 0:
img = Image.open(path + '/' + number + '-fanart.jpg')
w = img.width
h = img.height
img.save(path + '/' + number + '-poster.jpg')
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())
if part == '-CD1' and option == 'kodi':
global number
number += part
try:
os.rename(filepath, path + '/' + number + houzhui)
except FileExistsError:
print('[-]File Exists! Please check your movie!')
print('[-]move to the root folder of the program.')
os._exit(0)
except PermissionError:
print('[-]Error! Please run as administrator!')
os._exit(0)
def renameJpgToBackdrop_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 option == 'kodi':
shutil.copy(path + '/' + number + '-fanart.jpg', path + '/Backdrop.jpg')
def renameBackdropToJpg_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 + '/Backdrop.jpg', path + '/' + number + '.jpg')
print('[+]Image Downloaded!', path + '/' + number + '.jpg')
if option == 'kodi':
print('跳过分集图片下载')
def get_part(filepath):
try:
if re.search('-CD\d+', filepath):
return re.findall('-CD\d+', filepath)[0]
except:
print("[-]failed!Please rename the filename again!")
moveFailedFolder()
def debug_mode():
try:
if config['debug_mode']['switch'] == '1':
print('[+] ---Debug info---')
for i, v in json_data.items():
if i == 'outline':
print('[+] -', i, ':', len(v), 'characters')
continue
if i == 'actor_photo' or i == 'year':
continue
print('[+] -', i, ':', v)
print('[+] ---Debug info---')
except:
aaa=''
if __name__ == '__main__':
filepath=argparse_get_file()[0] #影片的路径
if '-CD' in filepath or '-cd' in filepath:
multi_part = 1
part = get_part(filepath)
if '-c.' in filepath or '-C.' in filepath or '中文' in filepath or '字幕' in filepath:
cn_sub='1'
if argparse_get_file()[1] == '': #获取手动拉去影片获取的番号
try:
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!")
moveFailedFolder()
else:
number = argparse_get_file()[1]
CreatFailedFolder()
getDataFromJSON(number) # 定义番号
debug_mode()
creatFolder() # 创建文件夹
if program_mode == '1':
if part == '-CD1' or multi_part == 0:
smallCoverCheck()
imageDownload(filepath) # creatFoder会返回番号路径
if multi_part == 1 and option != 'kodi':
number += part
PrintFiles(filepath) # 打印文件
cutImage() # 裁剪图
renameJpgToBackdrop_copy()
else:
number += part
renameBackdropToJpg_copy()
pasteFileToFolder(filepath, path) # 移动文件
elif program_mode == '2':
pasteFileToFolder(filepath, path) # 移动文件