# -*- coding: utf-8 -*-
import os.path
import shutil
from PIL import Image
import json
from ADC_function import *
from MediaServer import *
from AV_Data_Capture import config
import lazyxml
# =========website========
from SiteSource import avsox, javdb, fc2fans_club, javbus, fanza, mgstage
import requests
from enum import Enum, auto
# =====================本地文件处理===========================
def escapePath(path, escapeLiterals): # Remove escape literals
# escapeLiterals = Config['escape']['literals']
backslash = '\\'
for literal in escapeLiterals:
path = path.replace(backslash + literal, '')
return path
def moveFailedFolder(filepath, failed_folder):
if failed_folder.strip() == '':
print('[+]Failed output folder is Empty')
else:
print('[-]Move to Failed output folder')
shutil.move(filepath, failed_folder)
return
def CreatFailedFolder(failed_folder):
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)")
return
# 根据番号获取字典数据
class SiteSource(Enum):
AVSOX = auto()
FC2 = auto()
FANZA = auto()
JAVDB = auto()
JAVBUS = auto()
MGSTAGE = auto()
def getDataFromJSON(file_number): # 从JSON返回元数据
"""
iterate through all services and fetch the data
"""
func_mapping = {
"avsox": avsox.main,
"fc2": fc2fans_club.main,
"fanza": fanza.main,
"javdb": javdb.main,
"javbus": javbus.main,
"mgstage": mgstage.main,
}
# default fetch order list, from the begining to the end
sources = ["javbus", "javdb", "fanza", "mgstage", "fc2", "avsox"]
# if the input file name matches centain rules,
# move some web service to the begining of the list
if re.match(r"^\d{5,}", file_number) or re.match(r'heyzo', file_number, re.IGNORECASE):
sources.insert(0, sources.pop(sources.index("avsox")))
elif re.match(r"\d+\D+", file_number) or re.match(r'siro', file_number, re.IGNORECASE):
sources.insert(0, sources.pop(sources.index("mgstage")))
sources.insert(0, sources.pop(sources.index("fanza")))
elif re.match(r'fc2', file_number, re.IGNORECASE):
sources.insert(0, sources.pop(sources.index("fc2")))
for source in sources:
json_data = json.loads(func_mapping[source](file_number))
# if any service return a valid return, break
if getDataState(json_data) != 0:
break
# ================================================网站规则添加结束================================================
title = json_data['title']
actor_list = str(json_data['actor']).strip("[ ]").replace("'", '').split(',') # 字符串转列表
release = json_data['release']
number = json_data['number']
studio = json_data['studio']
source = json_data['source']
runtime = json_data['runtime']
outline = json_data['runtime']
label = json_data['label']
year = json_data['year']
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(" ", '')
if title == '' or number == '':
raise Exception('[-]Movie Data not found!')
# if imagecut == '3':
# DownloadFileWithFilename()
# ====================处理异常字符====================== #\/:*?"<>|
title = re.sub(r'[#\\/:*?"<>|\]]', '', title, 0, re.IGNORECASE)
release = release.replace('/', '-')
tmpArr = cover_small.split(',')
if len(tmpArr) > 0:
cover_small = tmpArr[0].strip('\"').strip('\'')
# ====================处理异常字符 END================== #\/:*?"<>|
naming_rule = eval(config.naming_rule)
location_rule = eval(config.location_rule)
# 返回处理后的json_data
json_data['title'] = title
json_data['actor'] = actor
json_data['release'] = release
json_data['cover_small'] = cover_small
json_data['tag'] = tag
json_data['naming_rule'] = naming_rule
json_data['location_rule'] = location_rule
json_data['year'] = year
return json_data
def get_info(json_data): # 返回json里的数据
title = json_data['title']
studio = json_data['studio']
year = json_data['year']
outline = json_data['outline']
runtime = json_data['runtime']
director = json_data['director']
actor_photo = json_data['actor_photo']
release = json_data['release']
number = json_data['number']
cover = json_data['cover']
website = json_data['website']
return title, studio, year, outline, runtime, director, actor_photo, release, number, cover, website
def download_cover_file(url, name, folder_path):
"""
download small cover
:param url: url
:param name: name same as movie's name without ext
:param folder_path: dir to save
:return:
"""
filename = config.media_server.poster_name(name)
DownloadFileWithFilename(url, filename, folder_path)
def smallCoverCheck(path, number, imagecut, cover_small, c_word, option, filepath, failed_folder):
if imagecut == 3:
if option == 'emby':
DownloadFileWithFilename(cover_small, '1.jpg', path, filepath, failed_folder)
try:
img = Image.open(path + '/1.jpg')
except Exception:
img = Image.open('1.jpg')
w = img.width
h = img.height
img.save(path + '/' + number + c_word + '.png')
time.sleep(1)
os.remove(path + '/1.jpg')
if option == 'kodi':
DownloadFileWithFilename(cover_small, '1.jpg', path, filepath, failed_folder)
try:
img = Image.open(path + '/1.jpg')
except Exception:
img = Image.open('1.jpg')
w = img.width
h = img.height
img.save(path + '/' + number + c_word + '-poster.jpg')
time.sleep(1)
os.remove(path + '/1.jpg')
if option == 'plex':
DownloadFileWithFilename(cover_small, '1.jpg', path, filepath, failed_folder)
try:
img = Image.open(path + '/1.jpg')
except Exception:
img = Image.open('1.jpg')
w = img.width
h = img.height
img.save(path + '/poster.jpg')
os.remove(path + '/1.jpg')
def creatFolder(success_folder, location_rule, json_data, escapeLiterals): # 创建文件夹
title, studio, year, outline, runtime, director, actor_photo, release, number, cover, website = get_info(json_data)
if len(location_rule) > 240: # 新建成功输出文件夹
path = success_folder + '/' + location_rule.replace("'actor'", "'manypeople'", 3).replace("actor",
"'manypeople'",
3) # path为影片+元数据所在目录
else:
path = success_folder + '/' + location_rule
# print(path)
if not os.path.exists(path):
path = escapePath(path, escapeLiterals)
try:
os.makedirs(path)
except:
path = success_folder + '/' + location_rule.replace('/[' + number + ']-' + title, "/number")
path = escapePath(path, escapeLiterals)
os.makedirs(path)
return path
# =====================资源下载部分===========================
def download_file(url, folder, name_with_ext):
"""
download file
:param url: source url
:param name_with_ext: full name like 'mike.jpg'
:param folder: folder path
:return: full path if downloaded file like '/Users/proj/AV_Data_Capture/mike.jpg'
"""
proxy_dict = {"http": str(config.proxy), "https": str(config.proxy)} if config.proxy else None
i = 0
while i < config.retry:
try:
if not os.path.exists(folder):
os.makedirs(folder)
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=config.timeout, proxies=proxy_dict)
if r == '':
print('[-]Movie Data not found!')
return
with open(str(folder) + "/" + name_with_ext, "wb") as code:
code.write(r.content)
return str(folder) + "/" + name_with_ext
except requests.exceptions.RequestException:
i += 1
print('[-]Image Download : Connect retry ' + str(i) + '/' + str(config.retry))
except requests.exceptions.ConnectionError:
i += 1
print('[-]Image Download : Connect retry ' + str(i) + '/' + str(config.retry))
except requests.exceptions.ProxyError:
i += 1
print('[-]Image Download : Connect retry ' + str(i) + '/' + str(config.retry))
except requests.exceptions.ConnectTimeout:
i += 1
print('[-]Image Download : Connect retry ' + str(i) + '/' + str(config.retry))
def DownloadFileWithFilename(url, filename, path): # path = examle:photo , video.in the Project Folder!
proxy, timeout, retry_count = get_network_settings()
i = 0
proxy_dict = {"http": str(config.proxy), "https": str(config.proxy)} if proxy else None
while i < retry_count:
try:
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=proxy_dict)
if r == '':
print('[-]Movie Data not found!')
return
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(filepath, failed_folder)
return
def download_image(url, name, folder):
"""
download img
:param url: source
:param name: name
:param folder: folder to save
:return:
"""
name_with_ext = config.media_server.image_name(name)
download_file(url, folder, name_with_ext)
def imageDownload(option, cover, number, c_word, path, multi_part, filepath, failed_folder): # 封面是否下载成功,否则移动到failed
if option == 'emby': # name.jpg
if DownloadFileWithFilename(cover, number + c_word + '.jpg', path, filepath, failed_folder) == 'failed':
moveFailedFolder(filepath, failed_folder)
return
DownloadFileWithFilename(cover, number + c_word + '.jpg', path, filepath, failed_folder)
if not os.path.getsize(path + '/' + number + c_word + '.jpg') == 0:
print('[+]Image Downloaded!', path + '/' + number + c_word + '.jpg')
return
i = 1
while i <= int(config.retry):
if os.path.getsize(path + '/' + number + c_word + '.jpg') == 0:
print('[!]Image Download Failed! Trying again. [' + config.retry + '/3]')
DownloadFileWithFilename(cover, number + c_word + '.jpg', path, filepath, failed_folder)
i = i + 1
continue
else:
break
if multi_part == 1:
old_name = os.path.join(path, number + c_word + '.jpg')
new_name = os.path.join(path, number + c_word + '.jpg')
os.rename(old_name, new_name)
print('[+]Image Downloaded!', path + '/' + number + c_word + '.jpg')
else:
print('[+]Image Downloaded!', path + '/' + number + c_word + '.jpg')
elif option == 'plex': # fanart.jpg
if DownloadFileWithFilename(cover, 'fanart.jpg', path, filepath, failed_folder) == 'failed':
moveFailedFolder(filepath, failed_folder)
return
DownloadFileWithFilename(cover, 'fanart.jpg', path, filepath, failed_folder)
if not os.path.getsize(path + '/fanart.jpg') == 0:
print('[+]Image Downloaded!', path + '/fanart.jpg')
return
i = 1
while i <= int(config.retry):
if os.path.getsize(path + '/fanart.jpg') == 0:
print('[!]Image Download Failed! Trying again. [' + config.retry + '/3]')
DownloadFileWithFilename(cover, 'fanart.jpg', path, filepath, failed_folder)
i = i + 1
continue
else:
break
if not os.path.getsize(path + '/' + number + c_word + '.jpg') == 0:
print('[!]Image Download Failed! Trying again.')
DownloadFileWithFilename(cover, number + c_word + '.jpg', path, filepath, failed_folder)
print('[+]Image Downloaded!', path + '/fanart.jpg')
elif option == 'kodi': # [name]-fanart.jpg
if DownloadFileWithFilename(cover, number + c_word + '-fanart.jpg', path, filepath, failed_folder) == 'failed':
moveFailedFolder(filepath, failed_folder)
return
DownloadFileWithFilename(cover, number + c_word + '-fanart.jpg', path, filepath, failed_folder)
if not os.path.getsize(path + '/' + number + c_word + '-fanart.jpg') == 0:
print('[+]Image Downloaded!', path + '/' + number + c_word + '-fanart.jpg')
return
i = 1
while i <= int(config.retry):
if os.path.getsize(path + '/' + number + c_word + '-fanart.jpg') == 0:
print('[!]Image Download Failed! Trying again. [' + config.retry + '/3]')
DownloadFileWithFilename(cover, number + c_word + '-fanart.jpg', path, filepath, failed_folder)
i = i + 1
continue
else:
break
print('[+]Image Downloaded!', path + '/' + number + c_word + '-fanart.jpg')
def make_nfo_file(nfo, nfo_name, folder_path):
"""
make xxx.nfo in folder
:param nfo_name: name
:param nfo: nfo dict
:param folder_path: where to create file, default temp_folder
:return:
"""
title, studio, year, outline, runtime, director, actor_photo, release, number, cover, website = get_info(nfo)
naming_rule = nfo['naming_rule']
tag = nfo['tag']
path = folder_path
c_word = ''
cn_sub = ''
part = ''
# path_file = path + "/" + number + c_word + ".nfo", "wt"
path_file = path + "/" + nfo_name + c_word + ".nfo"
lazyxml.dump
try:
if not os.path.exists(path):
os.makedirs(path)
if config.media_server == MediaServer.PLEX:
with open(path_file, "wt", encoding='UTF-8') as code:
print('', file=code)
print("", file=code)
print(" " + naming_rule + part + "", 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.jpg", 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 value == '': # 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(tag).strip("[ ]").replace("'", '').replace(" ", '').split(','):
print(" " + i + "", file=code)
except:
aaaaa = ''
try:
for i in str(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 config.media_server == MediaServer.EMBY:
with open(path_file, "wt", encoding='UTF-8') as code:
print('', file=code)
print("", file=code)
print(" " + naming_rule + part + "", 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 + c_word + ".png", file=code)
print(" " + number + c_word + ".png", file=code)
print(" " + number + c_word + '.jpg' + "", file=code)
try:
for key, value in actor_photo.items():
print(" ", file=code)
print(" " + key + "", file=code)
if not value == '': # 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(" " + website + "", file=code)
print("", file=code)
print("[+]Writeed! " + path + "/" + number + c_word + ".nfo")
elif config.media_server == MediaServer.KODI:
with open(path_file, "wt", encoding='UTF-8') as code:
print('', file=code)
print("", file=code)
print(" " + naming_rule + part + "", 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 + c_word + "-poster.jpg", file=code)
print(" " + number + c_word + '-fanart.jpg' + "", file=code)
try:
for key, value in actor_photo.items():
print(" ", file=code)
print(" " + key + "", file=code)
if not value == '': # 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(" " + website + "", file=code)
print("", file=code)
print("[+]Writeed! " + path + "/" + number + c_word + ".nfo")
except IOError as e:
print("[-]Write Failed! :" + e)
# print(e)
# moveFailedFolder(filepath, failed_folder)
return
except Exception as e:
print("[-]Write Failed! :" + e)
# moveFailedFolder(filepath, failed_folder)
return
def PrintFiles(option, path, c_word, naming_rule, part, cn_sub, json_data, filepath, failed_folder, tag):
title, studio, year, outline, runtime, director, actor_photo, release, number, cover, website = get_info(json_data)
try:
if not os.path.exists(path):
os.makedirs(path)
if option == 'plex':
with open(path + "/" + number + c_word + ".nfo", "wt", encoding='UTF-8') as code:
print('', file=code)
print("", file=code)
print(" " + naming_rule + part + "", 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.jpg", 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 value == '': # 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 + c_word + ".nfo", "wt", encoding='UTF-8') as code:
print('', file=code)
print("", file=code)
print(" " + naming_rule + part + "", 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 + c_word + ".png", file=code)
print(" " + number + c_word + ".png", file=code)
print(" " + number + c_word + '.jpg' + "", file=code)
try:
for key, value in actor_photo.items():
print(" ", file=code)
print(" " + key + "", file=code)
if not value == '': # 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(" " + website + "", file=code)
print("", file=code)
print("[+]Writeed! " + path + "/" + number + c_word + ".nfo")
elif option == 'kodi':
with open(path + "/" + number + c_word + ".nfo", "wt", encoding='UTF-8') as code:
print('', file=code)
print("", file=code)
print(" " + naming_rule + part + "", 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 + c_word + "-poster.jpg", file=code)
print(" " + number + c_word + '-fanart.jpg' + "", file=code)
try:
for key, value in actor_photo.items():
print(" ", file=code)
print(" " + key + "", file=code)
if not value == '': # 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(" " + website + "", file=code)
print("", file=code)
print("[+]Writeed! " + path + "/" + number + c_word + ".nfo")
except IOError as e:
print("[-]Write Failed!")
print(e)
moveFailedFolder(filepath, failed_folder)
return
except Exception as e1:
print(e1)
print("[-]Write Failed!")
moveFailedFolder(filepath, failed_folder)
return
def crop_image(crop_style, name, path):
try:
origin_image = Image.open(path + '/' + config.media_server.image_name(name))
if crop_style == 1:
cropped_image = origin_image.crop((origin_image.width / 1.9, 0, origin_image.width, origin_image.height))
else:
cropped_image = origin_image
cropped_image.save(path + '/' + config.media_server.poster_name(name))
except Exception as e:
print('[-]Cover cut failed:' + e)
def cutImage(option, imagecut, path, number, c_word):
if option == 'plex':
if imagecut == 1: # 截取右侧封面 fanart.jpg 截取为poster.jpg
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.jpg')
except:
print('[-]Cover cut failed!')
elif imagecut == 0: # 改名 fanart.jpg ->poster.jpg
img = Image.open(path + '/fanart.jpg')
w = img.width
h = img.height
img.save(path + '/poster.jpg')
elif option == 'emby':
if imagecut == 1: # 截取右侧封面 [name].jpg 截取为 [name].jpg
try:
img = Image.open(path + '/' + number + c_word + '.jpg')
imgSize = img.size
w = img.width
h = img.height
img2 = img.crop((w / 1.9, 0, w, h))
img2.save(path + '/' + number + c_word + '.png')
except:
print('[-]Cover cut failed!')
elif imagecut == 0: # [name].jpg -> [name].png
img = Image.open(path + '/' + number + c_word + '.jpg')
img.save(path + '/' + number + c_word + '.png')
elif option == 'kodi':
if imagecut == 1: # 截取右侧封面 [name]-fanart.jpg 截取为 [name]-poster.jpg
try:
img = Image.open(path + '/' + number + c_word + '-fanart.jpg')
w = img.width
h = img.height
img2 = img.crop((w / 1.9, 0, w, h))
img2.save(path + '/' + number + c_word + '-poster.jpg')
except:
print('[-]Cover cut failed!')
elif imagecut == 0: # [name]-fanart.jpg 截取为 [name]-poster.jpg
img = Image.open(path + '/' + number + c_word + '-fanart.jpg')
try:
img = img.convert('RGB')
img.save(path + '/' + number + c_word + '-poster.jpg')
except:
img = img.convert('RGB')
img.save(path + '/' + number + c_word + '-poster.jpg')
def pasteFileToFolder(filepath, path, number, c_word): # 文件路径,番号,后缀,要移动至的位置
houzhui = str(re.search('[.](avi|rmvb|wmv|mov|mp4|mkv|flv|ts|webm)$', filepath, re.IGNORECASE).group())
try:
if config.soft_link == '1': # 如果soft_link=1 使用软链接
os.symlink(filepath, path + '/' + number + c_word + houzhui)
else:
os.rename(filepath, path + '/' + number + c_word + houzhui)
if os.path.exists(config.search_folder + '/' + number + c_word + '.srt'): # 字幕移动
os.rename(config.search_folder + '/' + number + c_word + '.srt', path + '/' + number + c_word + '.srt')
print('[+]Sub moved!')
elif os.path.exists(config.search_folder + '/' + number + c_word + '.ssa'):
os.rename(os.getcwd() + '/' + number + c_word + '.ssa', path + '/' + number + c_word + '.ssa')
print('[+]Sub moved!')
elif os.path.exists(config.search_folder + '/' + number + c_word + '.sub'):
os.rename(os.getcwd() + '/' + number + c_word + '.sub', path + '/' + number + c_word + '.sub')
print('[+]Sub moved!')
except FileExistsError:
print('[-]File Exists! Please check your movie!')
print('[-]move to the root folder of the program.')
return
except PermissionError:
print('[-]Error! Please run as administrator!')
return
def pasteFileToFolder_mode2(filepath, path, multi_part, number, part, c_word): # 文件路径,番号,后缀,要移动至的位置
if multi_part == 1:
number += part # 这时number会被附加上CD1后缀
houzhui = str(re.search('[.](avi|rmvb|wmv|mov|mp4|mkv|flv|ts|webm)$', filepath, re.IGNORECASE).group())
try:
if config.soft_link== '1':
os.symlink(filepath, path + '/' + number + part + c_word + houzhui)
else:
os.rename(filepath, path + '/' + number + part + c_word + houzhui)
if os.path.exists(number + '.srt'): # 字幕移动
os.rename(number + part + c_word + '.srt', path + '/' + number + part + c_word + '.srt')
print('[+]Sub moved!')
elif os.path.exists(number + part + c_word + '.ass'):
os.rename(number + part + c_word + '.ass', path + '/' + number + part + c_word + '.ass')
print('[+]Sub moved!')
elif os.path.exists(number + part + c_word + '.sub'):
os.rename(number + part + c_word + '.sub', path + '/' + number + part + c_word + '.sub')
print('[+]Sub moved!')
print('[!]Success')
except FileExistsError:
print('[-]File Exists! Please check your movie!')
print('[-]move to the root folder of the program.')
return
except PermissionError:
print('[-]Error! Please run as administrator!')
return
def copy_images_to_background_image(name, path):
shutil.copy(path + "/" + config.media_server.image_name(name), path + "/Backdrop.jpg")
if config.media_server == MediaServer.PLEX:
shutil.copy(path + "/" + config.media_server.poster_name(name), path + '/thumb.png')
def copyRenameJpgToBackdrop(option, path, number, c_word):
if option == 'plex':
shutil.copy(path + '/fanart.jpg', path + '/Backdrop.jpg')
shutil.copy(path + '/poster.jpg', path + '/thumb.png')
if option == 'emby':
shutil.copy(path + '/' + number + c_word + '.jpg', path + '/Backdrop.jpg')
if option == 'kodi':
shutil.copy(path + '/' + number + c_word + '-fanart.jpg', path + '/Backdrop.jpg')
def get_part(filepath, failed_folder):
try:
if re.search('-CD\d+', filepath):
return re.findall('-CD\d+', filepath)[0]
if re.search('-cd\d+', filepath):
return re.findall('-cd\d+', filepath)[0]
except:
print("[-]failed!Please rename the filename again!")
moveFailedFolder(filepath, failed_folder)
return
def debug_mode(json_data):
try:
if config.debug_mode == '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('[+] -', "%-11s" % i, ':', v)
print('[+] ---Debug info---')
except:
aaa = ''
def core_main(number_th):
# =======================================================================初始化所需变量
multi_part = 0
part = ''
c_word = ''
option = ''
cn_sub = ''
# filepath = file_path # 影片的路径
number = number_th
json_data = getDataFromJSON(number) # 定义番号
# if json_data.get('number') != number:
# fix issue #119
# the root cause is we normalize the search id
# PrintFiles() will use the normalized id from website,
# but pasteFileToFolder() still use the input raw search id
# so the solution is: use the normalized search id
# number = json_data["number"]
# imagecut = json_data['imagecut']
# tag = json_data['tag']
# =======================================================================判断-C,-CD后缀
# if '-CD' in filepath or '-cd' in filepath:
# multi_part = 1
# part = get_part(filepath, config.failed_folder)
# if '-c.' in filepath or '-C.' in filepath or '中文' in filepath or '字幕' in filepath:
# cn_sub = '1'
# c_word = '-C' # 中文字幕影片后缀
# CreatFailedFolder(config.failed_folder) # 创建输出失败目录
# debug_mode(json_data) # 调试模式检测
return json_data
# path = creatFolder(config.success_folder, json_data['location_rule'], json_data, config.escape_literals) # 创建文件夹
# =======================================================================刮削模式
# if config.program_mode == '1':
# if multi_part == 1:
# number += part # 这时number会被附加上CD1后缀
# smallCoverCheck(path, number, imagecut, json_data['cover_small'], c_word, option, filepath, config.failed_folder) # 检查小封面
# imageDownload(option, json_data['cover'], number, c_word, path, multi_part, filepath, config.failed_folder) # creatFoder会返回番号路径
# cutImage(option, imagecut, path, number, c_word) # 裁剪图
# copyRenameJpgToBackdrop(option, path, number, c_word)
# PrintFiles(option, path, c_word, json_data['naming_rule'], part, cn_sub, json_data, filepath, config.failed_folder, tag) # 打印文件 .nfo
# pasteFileToFolder(filepath, path, number, c_word) # 移动文件
# # =======================================================================整理模式
# elif config.program_mode == '2':
# pasteFileToFolder_mode2(filepath, path, multi_part, number, part, c_word) # 移动文件