187 lines
6.9 KiB
Python
187 lines
6.9 KiB
Python
import json
|
||
import os,shutil,time
|
||
from datetime import datetime
|
||
from pathlib import Path
|
||
from zipfile import ZipFile
|
||
from utils.comic.ComicInfo import comicInfo
|
||
from utils.Ntfy import ntfy
|
||
from utils.FileUtils import fileUtils
|
||
|
||
class CBZUtils:
|
||
|
||
@classmethod
|
||
def getCBZ_Dir(cls): return comicInfo.getNewCBZComicChapter()
|
||
|
||
@classmethod
|
||
def getCBZ_Path(cls): return cls.getCBZ_Dir()+".CBZ"
|
||
|
||
@classmethod
|
||
def readDirsOrFiles(cls,dir,type):
|
||
data = []
|
||
files = os.listdir(dir)
|
||
for file in files:
|
||
path = os.path.join(dir,file)
|
||
if type == "files" and os.path.isfile(path):
|
||
data.append(path)
|
||
if type == "dirs" and os.path.isdir(path):
|
||
data.append(path)
|
||
return data
|
||
|
||
@classmethod
|
||
def zip_compression(cls,source_dir, target_file):
|
||
target_dir = os.path.dirname(target_file)
|
||
if not os.path.exists(target_dir):
|
||
os.makedirs(target_dir)
|
||
|
||
if not os.path.exists(target_file):
|
||
with ZipFile(target_file, mode='w') as zf:
|
||
for path, dir_names, filenames in os.walk(source_dir):
|
||
path = Path(path)
|
||
arc_dir = path.relative_to(source_dir)
|
||
y = 0
|
||
for filename in filenames:
|
||
y = y + 1
|
||
print("打包中:" + str(y) + "/" + str(len(filenames)), os.path.join(source_dir, filename))
|
||
zf.write(path.joinpath(filename), arc_dir.joinpath(filename))
|
||
zf.close()
|
||
ntfy.sendMsg(f"打包完成:{target_file}")
|
||
#md5_file = md5(target_file)
|
||
#print("md5:", md5_file)
|
||
#msg[target_file] = md5_file
|
||
else:
|
||
print("文件已存在:", target_file)
|
||
return len(filenames)
|
||
|
||
@classmethod
|
||
def packAutoComicChapterCBZ(cls):
|
||
chapter_path = comicInfo.getDirComicChapter()
|
||
if os.path.exists(chapter_path):
|
||
dirs = os.listdir(chapter_path)
|
||
for file in dirs:
|
||
if file.startswith("scramble="):
|
||
try:
|
||
os.remove(file)
|
||
except:
|
||
print(f"删除 {file} 发生错误,已跳过")
|
||
try:
|
||
size_zip = cls.zip_compression(chapter_path, cls.getCBZ_Path())
|
||
size_imgs = len(comicInfo.getChapterImgs())
|
||
if size_zip -1 == size_imgs:
|
||
ntfy.sendMsg(f"打包校验成功: {cls.getCBZ_Path()}")
|
||
comicInfo.nextCBZToDoneChapter()
|
||
return True
|
||
else:
|
||
ntfy.sendMsg(f"打包检验不完整:{cls.getCBZ_Path()}")
|
||
return False
|
||
|
||
except:
|
||
print("")
|
||
#ntfy.sendMsg("CBZ打包失败")
|
||
|
||
@classmethod
|
||
def zip_info(cls,zip_path=None):
|
||
if zip_path == None:
|
||
zip_path = cls.getCBZ_Path()
|
||
data = None
|
||
if os.path.exists(zip_path):
|
||
with ZipFile(zip_path, "r") as zfile:
|
||
data = zfile.namelist()
|
||
zfile.close()
|
||
return data
|
||
|
||
@classmethod
|
||
def replaceZip(cls,filepath,unpack_dir=None):
|
||
if not cls.compareFileDate(filepath): return None
|
||
if unpack_dir == None:
|
||
unpack_dir = str(filepath).split(".")[0]
|
||
fz = ZipFile(filepath, 'r')
|
||
for file in fz.namelist():
|
||
if file.endswith(".jpg"):
|
||
data = fz.read(file)
|
||
if len(data) < 500 and os.path.exists(filepath):
|
||
os.remove(filepath)
|
||
print(f"数据不完整,已删除:{filepath}")
|
||
if cls.compareFileDate(filepath):
|
||
os.utime(filepath)
|
||
print(f"已更新文件时间 {filepath}")
|
||
if os.path.exists(unpack_dir):
|
||
shutil.rmtree(unpack_dir)
|
||
# 删除删除main.ftl文件
|
||
#delete_filename = ''
|
||
#if os.path.exists(delete_filename):
|
||
# os.remove(delete_filename)
|
||
# time.sleep(60)
|
||
# shutil.copy(文件的路径,另一个目录);拷贝main.ftl到准备压缩的目录下
|
||
#cls.zip_compression()
|
||
#小于则运行
|
||
@classmethod
|
||
def compareFileDate(cls,filepath):
|
||
if os.path.exists(filepath):
|
||
ctime = os.path.getmtime(filepath)
|
||
str_ctime = datetime.fromtimestamp(int(ctime))
|
||
file_ctime = str(str_ctime.year)+"{:0>2d}".format(str_ctime.month)+"{:0>2d}".format(str_ctime.day)+"{:0>2d}".format(str_ctime.hour)
|
||
c_ctime = 2023011603
|
||
else:
|
||
return False
|
||
if int(file_ctime) < c_ctime:
|
||
return True
|
||
return False
|
||
|
||
class verUtils:
|
||
@classmethod
|
||
def verCBZ(cls,data=None):
|
||
zip_info = CBZUtils.zip_info()
|
||
if zip_info != None:
|
||
len_zip = len(zip_info) - 1
|
||
else:
|
||
len_zip = 0
|
||
info_data = None
|
||
if data == None:
|
||
info_path = comicInfo.nextSavePath("done_")
|
||
try:
|
||
with open(info_path,"r",encoding="utf-8") as fs:
|
||
info_data = json.loads(fs.read())
|
||
fs.close()
|
||
except:
|
||
ntfy.sendMsg("校验失败")
|
||
else:
|
||
info_data = data
|
||
if info_data != None:
|
||
if len(info_data) == len_zip:
|
||
return True
|
||
else:
|
||
ntfy.sendMsg("数据不完整,删除配置文件中")
|
||
try:
|
||
os.remove(comicInfo.nextSavePath("done_"))
|
||
ntfy.sendMsg("配置文件删除成功")
|
||
except:
|
||
ntfy.sendMsg("配置文件删除失败")
|
||
return False
|
||
else:
|
||
ntfy.sendMsg("info_data 为空")
|
||
return False
|
||
|
||
@classmethod
|
||
def verNextCBZ(cls,list_img):
|
||
#验证数据是已存在且是否完整
|
||
cbz_path = CBZUtils.getCBZ_Path()
|
||
is_next = False
|
||
if os.path.exists(cbz_path):
|
||
try:
|
||
cbz_size = len(CBZUtils.zip_info(cbz_path)) - 1
|
||
except:
|
||
cbz_size = 0
|
||
if len(list_img) == cbz_size:
|
||
ntfy.sendMsg(f"{comicInfo.getComicName()} {comicInfo.getChapter()} 数据完整,已跳过")
|
||
is_next = True
|
||
else:
|
||
ntfy.sendMsg(f"{comicInfo.getComicName()} {comicInfo.getChapter()} 数据不完整,尝试删除配置CBZ文件后重试")
|
||
try:
|
||
if cbz_size < len(list_img) or os.path.getsize(cbz_path) < 300000:
|
||
ntfy.sendMsg(f"删除 {cbz_path}")
|
||
os.remove(cbz_path)
|
||
else:
|
||
is_next = True
|
||
except:
|
||
ntfy(f"删除失败 {cbz_path}")
|
||
return is_next |