454 lines
15 KiB
Python
454 lines
15 KiB
Python
from xml.dom.minidom import Document
|
||
import os,re
|
||
from utils.comic.PathStr import pathStr
|
||
import json,shutil
|
||
|
||
|
||
class comicInfo():
|
||
document = Document()
|
||
path_comic_info = None
|
||
|
||
root = "ComicInfo"
|
||
chapter = "Title"
|
||
comic_name = "Series"
|
||
dep = "Summary"
|
||
author = "Writer"
|
||
genre = "Genre"
|
||
cbs = "Publisher"
|
||
lang = "LanguageISO"
|
||
comic_names = "SeriesGroup"
|
||
tags = "Tags"
|
||
date_year = "Year"
|
||
date_month = "Month"
|
||
date_day = "Day"
|
||
page_count = "PageCount"
|
||
pages = "Pages"
|
||
web = "Web"
|
||
|
||
str_comic_name = None
|
||
str_chapter = None
|
||
str_icon = None
|
||
str_homepage = None
|
||
str_listchapter = None
|
||
str_chapter_imgs = None
|
||
str_update_at = None
|
||
str_date_year = None
|
||
str_date_month = None
|
||
str_date_day = None
|
||
str_page_count = None
|
||
str_web = None
|
||
str_list_img = None
|
||
str_files_img = None
|
||
str_chapter_index= None
|
||
str_value1 = None
|
||
list_skip = []
|
||
|
||
chapter_node = None
|
||
comic_name_node = None
|
||
dep_node = None
|
||
author_node = None
|
||
genre_node = None
|
||
cbs_node = None
|
||
lang_node = None
|
||
comic_names_node = None
|
||
tags_node = None
|
||
date_year_node = None
|
||
date_month_node = None
|
||
date_day_node = None
|
||
page_count_node = None
|
||
pages_node = None
|
||
web_node = None
|
||
|
||
@classmethod
|
||
def setNodeAndValue(cls,node,value):
|
||
if value != None:
|
||
c_node = cls.document.createElement(node)
|
||
node_text = cls.document.createTextNode(str(value).replace("\n",""))
|
||
c_node.appendChild(node_text)
|
||
return c_node
|
||
return None
|
||
|
||
@classmethod
|
||
def root_node(cls): return cls.document.createElement(cls.root)
|
||
|
||
@classmethod
|
||
def setChapterName(cls,value):
|
||
cls.str_chapter = cls.fixFileName(value)
|
||
cls.chapter_node = cls.setNodeAndValue(cls.chapter,value)
|
||
|
||
@classmethod
|
||
def setListChapter(cls, value): cls.str_list_chapter = value
|
||
@classmethod
|
||
def setChapterImgs(cls, value): cls.str_chapter_imgs = value
|
||
@classmethod
|
||
def getChapterImgs(cls): return cls.str_chapter_imgs
|
||
@classmethod
|
||
def getLenChapters(cls): return len(cls.str_list_chapter)
|
||
@classmethod
|
||
def setComicName(cls,value):
|
||
cls.str_comic_name = cls.fixFileName(value)
|
||
cls.comic_name_node = cls.setNodeAndValue(cls.comic_name, value)
|
||
|
||
@classmethod
|
||
def setComicNames(cls,value): cls.comic_names_node = cls.setNodeAndValue(cls.comic_names,value)
|
||
@classmethod
|
||
def setDep(cls,value): cls.dep_node = cls.setNodeAndValue(cls.dep, value)
|
||
@classmethod
|
||
def setAuthor(cls,value): cls.author_node = cls.setNodeAndValue(cls.author,cls.getListToString(value))
|
||
@classmethod
|
||
def setLang(cls,value): cls.lang_node = cls.setNodeAndValue(cls.lang, value)
|
||
@classmethod
|
||
def setGenre(cls,value): cls.genre_node = cls.setNodeAndValue(cls.genre, cls.getListToString(value))
|
||
@classmethod
|
||
def setTags(cls,value): cls.tags_node = cls.setNodeAndValue(cls.tags,cls.getListToString(value))
|
||
@classmethod
|
||
def setCBS(cls,value): cls.cbs_node = cls.setNodeAndValue(cls.cbs,value)
|
||
|
||
@classmethod
|
||
def setWeb(cls,value):
|
||
cls.str_web = value
|
||
cls.web_node = cls.setNodeAndValue(cls.web,value)
|
||
|
||
@classmethod
|
||
def setChapterListImg(cls,value): cls.str_list_img=value
|
||
@classmethod
|
||
def setValue1(cls,value): cls.str_value1 = value
|
||
@classmethod
|
||
def getValue1(cls): return cls.str_value1
|
||
@classmethod
|
||
def getChapterListImg(cls): return cls.str_list_img
|
||
@classmethod
|
||
def setChapterFilesName(cls,value): cls.str_files_img=value
|
||
@classmethod
|
||
def getChapterFilesName(cls): return cls.str_files_img
|
||
@classmethod
|
||
def getWeb(cls): return cls.str_web
|
||
|
||
@classmethod
|
||
def setPageCount(cls,value):
|
||
cls.str_page_count = value
|
||
cls.page_count_node = cls.setNodeAndValue(cls.page_count,value)
|
||
|
||
@classmethod
|
||
def setPages(cls,value):
|
||
if value != None:
|
||
su = "."+str(value[0]).split(".")[-1]
|
||
join_list=",".join(value).replace(su,"")
|
||
value = join_list.split(",")
|
||
cls.setPageCount(str(len(value)))
|
||
root_node = cls.document.createElement(cls.pages)
|
||
for page in value:
|
||
c_node = cls.document.createElement("Page")
|
||
page = page.split("_")[-1]
|
||
c_node.setAttribute("Image",page)
|
||
root_node.appendChild(c_node)
|
||
cls.pages_node = root_node
|
||
|
||
@classmethod
|
||
def setDate(cls,value,split):
|
||
values = str(value).split(split)
|
||
cls.str_date_year = values[0]
|
||
cls.str_date_month = values[1]
|
||
cls.str_date_day = values[2]
|
||
cls.date_year_node = cls.setNodeAndValue(cls.date_year,values[0])
|
||
cls.date_month_node = cls.setNodeAndValue(cls.date_month,values[1])
|
||
cls.date_day_node = cls.setNodeAndValue(cls.date_day,values[2])
|
||
|
||
|
||
@classmethod
|
||
def setIcon(cls,value):
|
||
cls.str_icon = value
|
||
return cls.str_icon
|
||
|
||
@classmethod
|
||
def setHomePage(cls, value): cls.str_homepage = value
|
||
@classmethod
|
||
def getHomePage(cls): return cls.str_homepage
|
||
@classmethod
|
||
def setUpdateAt(cls, value): cls.str_update_at = value
|
||
@classmethod
|
||
def getUpdateAt(cls): return cls.str_update_at
|
||
@classmethod
|
||
def getListToString(cls,to_list):
|
||
value = to_list
|
||
if isinstance(to_list,list):
|
||
value = ",".join(to_list)
|
||
return value
|
||
|
||
@classmethod
|
||
def setChapterIndex(cls,value): cls.str_chapter_index = value
|
||
@classmethod
|
||
def getChapterIndex(cls): return cls.str_chapter_index
|
||
@classmethod
|
||
def setComicNameSkips(cls,value): return cls.list_skip.append(value)
|
||
@classmethod
|
||
def getIsComicNameSkips(cls,value): return value in ",".join(cls.list_skip)
|
||
|
||
@classmethod
|
||
def getBaseUrl(cls,url=None):
|
||
if url == None:
|
||
url = cls.str_homepage
|
||
num = 3
|
||
index = 0
|
||
for x in range(0, num):
|
||
index = str(url).find("/",index)+1
|
||
return url[0:index-1]
|
||
|
||
@classmethod
|
||
def getIcon(cls): return cls.str_icon
|
||
@classmethod
|
||
def getComicName(cls): return cls.str_comic_name
|
||
@classmethod
|
||
def getChapter(cls): return cls.str_chapter
|
||
|
||
@classmethod
|
||
def fixFileName(cls,filename,replace=None):
|
||
intab = r'[?*/\|.:><]'
|
||
str_replace = ""
|
||
if replace != None:
|
||
str_replace = replace
|
||
filename = re.sub(intab, str_replace, filename)
|
||
count = 1
|
||
while True:
|
||
str_file = filename[0-count]
|
||
if str_file == " ":
|
||
count += 1
|
||
else:
|
||
filename = filename[0:len(filename)+1-count]
|
||
break
|
||
return filename
|
||
|
||
@classmethod
|
||
def getDirConfComic(cls):
|
||
if cls.str_comic_name != None:
|
||
return os.path.join(pathStr.base_conf_path(), cls.str_comic_name)
|
||
else:
|
||
print("comicName不存在,退出中")
|
||
exit()
|
||
|
||
@classmethod
|
||
def getDirCBZComic(cls):
|
||
if cls.str_comic_name != None:
|
||
return os.path.join(pathStr.base_cbz(), cls.str_comic_name)
|
||
else:
|
||
print("comicName不存在,退出中 getDirCBZComic")
|
||
exit()
|
||
|
||
@classmethod
|
||
def getDirCBZComicChapter(cls):
|
||
if cls.str_comic_name != None and cls.str_chapter != None:
|
||
return os.path.join(pathStr.base_cbz(),cls.str_comic_name,cls.str_chapter)
|
||
else:
|
||
print("comicName不存在,退出中 getDirCBZComicChapter")
|
||
exit()
|
||
|
||
@classmethod
|
||
def getSortDirCBZComicChapter(cls):
|
||
if cls.str_comic_name != None and cls.str_chapter != None and cls.str_chapter_index != None:
|
||
return os.path.join(pathStr.base_cbz(),cls.str_comic_name,str(cls.str_chapter_index)+" "+cls.str_chapter)
|
||
else:
|
||
print("comicName不存在,退出中 getSortDirCBZComicChapter")
|
||
return None
|
||
|
||
@classmethod
|
||
def getNewCBZComicChapter(cls,type="dir"): return cls.getNewToComicChapter(".CBZ", type)
|
||
@classmethod
|
||
def getNewIconComicChapter(cls,type="dir"): return cls.getNewToComicChapter(".jpg", type)
|
||
|
||
@classmethod
|
||
def getNewToComicChapter(cls,su,type="dir"):
|
||
c_dir = cls.getDirCBZComicChapter()
|
||
s_dir = cls.getSortDirCBZComicChapter()
|
||
c_path = cls.getDirCBZComicChapter()+su
|
||
s_path = cls.getSortDirCBZComicChapter()+su
|
||
if os.path.exists(s_path) and s_path != None:
|
||
shutil.move(s_path, c_path)
|
||
print("文件已移动至:", c_path)
|
||
if type == "file":
|
||
return c_path
|
||
return c_dir
|
||
|
||
@classmethod
|
||
def getDirComic(cls):
|
||
if cls.str_comic_name != None:
|
||
return os.path.join(pathStr.base_comic_img(), cls.str_comic_name)
|
||
else:
|
||
print("comicName不存在,退出中")
|
||
exit()
|
||
|
||
@classmethod
|
||
def getDirComicChapter(cls):
|
||
if cls.str_comic_name != None and cls.str_chapter != None:
|
||
return os.path.join(pathStr.base_comic_img(),cls.str_comic_name,cls.str_chapter)
|
||
else:
|
||
print("comicName与chapter 不存在,退出中")
|
||
exit()
|
||
@classmethod
|
||
def getPathComicInfoXML(cls):
|
||
try:
|
||
cls.path_comic_info = os.path.join(pathStr.base_comic_img(),cls.str_comic_name,cls.str_chapter,"ComicInfo.xml")
|
||
except:
|
||
return None
|
||
return cls.path_comic_info
|
||
|
||
@classmethod
|
||
def writeComicInfoXML(cls,chapter,path=None):
|
||
root = cls.root_node()
|
||
new_document = Document()
|
||
new_document.appendChild(root)
|
||
if cls.chapter_node != None: root.appendChild(cls.chapter_node)
|
||
if cls.comic_name_node != None: root.appendChild(cls.comic_name_node)
|
||
if cls.dep_node != None: root.appendChild(cls.dep_node)
|
||
if cls.author_node != None: root.appendChild(cls.author_node)
|
||
if cls.genre_node != None: root.appendChild(cls.genre_node)
|
||
if cls.cbs_node != None: root.appendChild(cls.cbs_node)
|
||
if cls.lang_node != None: root.appendChild(cls.lang_node)
|
||
if cls.comic_names_node != None: root.appendChild(cls.comic_names_node)
|
||
if cls.tags_node != None: root.appendChild(cls.tags_node)
|
||
if cls.date_year_node != None: root.appendChild(cls.date_year_node)
|
||
if cls.date_month_node != None: root.appendChild(cls.date_month_node)
|
||
if cls.date_day_node != None: root.appendChild(cls.date_day_node)
|
||
if cls.page_count_node != None: root.appendChild(cls.page_count_node)
|
||
if cls.pages_node != None: root.appendChild(cls.pages_node)
|
||
cls.getPathComicInfoXML()
|
||
if path != None: cls.path_comic_info = os.path.join(path,"ComicInfo.xml")
|
||
base_dir = os.path.dirname(cls.path_comic_info)
|
||
if not os.path.exists(base_dir): os.makedirs(base_dir)
|
||
if os.path.exists(cls.path_comic_info):
|
||
print("ComicInfo.xml 已存在")
|
||
return None
|
||
with open(cls.path_comic_info , "w", encoding="utf-8") as fo:
|
||
new_document.writexml(fo, indent='', addindent='\t', newl='\n', encoding="utf-8")
|
||
fo.close()
|
||
print("ComicInfo.xml 已生成 pathd=", cls.path_comic_info)
|
||
|
||
#文件保存
|
||
@classmethod
|
||
def file_save(cls,path,data,mode=None):
|
||
result = {}
|
||
f = {}
|
||
dir_name = os.path.dirname(path)
|
||
if not os.path.exists(dir_name):
|
||
os.makedirs(dir_name)
|
||
|
||
save_path = os.path.join(path)
|
||
if os.path.exists(save_path):
|
||
os.remove(save_path)
|
||
data = json.dumps(data)
|
||
if mode == None:
|
||
mode = "w+"
|
||
try:
|
||
f = open(save_path, mode, encoding="utf-8")
|
||
f.write(data)
|
||
f.close()
|
||
print("data=",data)
|
||
result = path + "文件写入成功"
|
||
except:
|
||
result = path + "文件写入失败"
|
||
print(result)
|
||
return result
|
||
|
||
@classmethod
|
||
def nextSavePath(cls,next,data=None):
|
||
save_path = cls.getDirConfComic()+"/"+next+cls.str_chapter
|
||
if data != None:
|
||
cls.file_save(save_path, data)
|
||
return save_path
|
||
|
||
@classmethod
|
||
def nextSaveInfoChapter(cls,chapter,data):
|
||
if cls.str_chapter != chapter:
|
||
print(f"chapter {cls.str_chapter} 与 {chapter} 不一致,已自动跳过")
|
||
cls.nextSavePath("info_",data)
|
||
|
||
@classmethod
|
||
def nextInfoToImgChapter(cls):
|
||
info = cls.nextSavePath("info_")
|
||
img = cls.nextSavePath("img_")
|
||
shutil.move(info,img)
|
||
|
||
@classmethod
|
||
def nextImgToDownloadChapter(cls):
|
||
img = cls.nextSavePath("img_")
|
||
download = cls.nextSavePath("down_")
|
||
shutil.move(img, download)
|
||
|
||
@classmethod
|
||
def nextDownloadToCBZChapter(cls):
|
||
download = cls.nextSavePath("down_")
|
||
cbz = cls.nextSavePath("cbz_")
|
||
shutil.move(download, cbz)
|
||
|
||
@classmethod
|
||
def nextCBZToDoneChapter(cls):
|
||
cbz = cls.nextSavePath("cbz_")
|
||
done = cls.nextSavePath("done_")
|
||
shutil.move(cbz,done)
|
||
|
||
@classmethod
|
||
def nextDoneSave(cls,data): cls.nextSavePath("done_",data)
|
||
|
||
@classmethod
|
||
def nextExistsGetPath(cls,msg,remove=False):
|
||
path = cls.nextSavePath(msg)
|
||
is_exists = os.path.exists(path)
|
||
if remove and is_exists:
|
||
os.remove(path)
|
||
return is_exists
|
||
|
||
@classmethod
|
||
def setConfDirComicPath(cls,file_name,comic_name=None):
|
||
if comic_name != None:
|
||
cls.setComicName(comic_name)
|
||
return os.path.join(cls.getDirConfComic(),file_name)
|
||
|
||
@classmethod
|
||
def saveConfComicData(cls,file_name,data,comic_name=None): cls.file_save(cls.setConfDirComicPath(file_name,comic_name), data)
|
||
@classmethod
|
||
def getPathInitConfComicData(cls,file_name,comic_name=None): return cls.setConfDirComicPath(file_name,comic_name)
|
||
|
||
@classmethod
|
||
def updateComicDate(cls,date=None):
|
||
data = {}
|
||
update_at = cls.str_update_at
|
||
if date != None:
|
||
update_at = date
|
||
comic_name = cls.str_comic_name
|
||
update_path = pathStr.base_comic_update()
|
||
update_dir = os.path.dirname(update_path)
|
||
if not os.path.exists(update_dir):
|
||
os.makedirs(update_dir)
|
||
if os.path.exists(update_path):
|
||
with open(update_path,"r") as fs:
|
||
data = json.loads(fs.read())
|
||
fs.close()
|
||
data[comic_name] = update_at
|
||
with open(update_path,"w") as fs:
|
||
fs.write(json.dumps(data))
|
||
fs.close()
|
||
|
||
@classmethod
|
||
def isUpdateComic(cls):
|
||
is_update = True
|
||
data = {}
|
||
c_update_at = cls.str_update_at
|
||
comic_name = cls.str_comic_name
|
||
update_path = pathStr.base_comic_update()
|
||
update_dir = os.path.dirname(update_path)
|
||
if not os.path.exists(update_dir):
|
||
os.makedirs(update_dir)
|
||
try:
|
||
with open(update_path,"r") as fs:
|
||
data = json.loads(fs.read())
|
||
fs.close()
|
||
except:
|
||
data = {}
|
||
comic_update = data.get(comic_name)
|
||
if comic_name != None and comic_update == c_update_at:
|
||
is_update = False
|
||
return is_update
|
||
|
||
@classmethod
|
||
def comicChapterDownload(cls,imgs,names):
|
||
cls.setChapterListImg(imgs)
|
||
cls.setChapterFilesName(names) |