494 lines
18 KiB
Python
494 lines
18 KiB
Python
from xml.dom.minidom import Document
|
||
import os,re
|
||
from utils.comic.PathStr import pathStr
|
||
import json,shutil
|
||
from utils.FileUtils import dbUtils
|
||
from utils.ComicUtils import fontUtils
|
||
from utils.OldUtils import OldUtils
|
||
|
||
class comicInfo():
|
||
COMIC_ICON_NAME = "000"
|
||
COMIC_INFO_XML = "ComicInfo.xml"
|
||
PROGRESS_INFO = "info"
|
||
PROGRESS_DOWN = "download"
|
||
PROGRESS_IMG = "download"
|
||
PROGRESS_CBZ = "cbz"
|
||
PROGRESS_DONE = "done"
|
||
PROGRESS_NONE = "none"
|
||
|
||
IS_NEW_ICON = False
|
||
|
||
document = Document()
|
||
path_comic_info = None
|
||
|
||
root = "ComicInfo"
|
||
chapter = "Title"
|
||
comic_name = "Series"
|
||
number = "Number"
|
||
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"
|
||
age_rating = "AgeRating"
|
||
|
||
str_comic_name = None
|
||
str_chapter = None
|
||
str_number = 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
|
||
str_current_chapter_img = None
|
||
list_skip = []
|
||
|
||
chapter_node = None
|
||
comic_name_node = None
|
||
number_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
|
||
age_rating_node = None
|
||
|
||
@classmethod
|
||
def setNodeAndValue(cls,node,value):
|
||
if value != None:
|
||
c_node = cls.document.createElement(node)
|
||
node_text = cls.document.createTextNode(fontUtils.ChineseConvert(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 = fontUtils.ChineseConvert(cls.fixFileName(value))
|
||
OldUtils.setOldChapter(cls.fixFileName(value))
|
||
cls.chapter_node = cls.setNodeAndValue(cls.chapter,value)
|
||
|
||
@classmethod
|
||
def setComicValue(cls,value):
|
||
result = None
|
||
if value != None or value != "": result = value
|
||
return result
|
||
|
||
@classmethod
|
||
def setListChapter(cls, value): cls.str_list_chapter = cls.setComicValue(value)
|
||
@classmethod
|
||
def setChapterImgs(cls, value): cls.str_chapter_imgs = cls.setComicValue(value)
|
||
@classmethod
|
||
def setCurrentChapterImg(cls, value): cls.str_current_chapter_img = cls.setComicValue(value)
|
||
@classmethod
|
||
def getCurrentChapterImg(cls): return cls.str_current_chapter_img
|
||
@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 = fontUtils.ChineseConvert(cls.fixFileName(value))
|
||
OldUtils.setOldComicName(cls.fixFileName(value))
|
||
cls.comic_name_node = cls.setNodeAndValue(cls.comic_name, value)
|
||
|
||
@classmethod
|
||
def setComicNames(cls,value):
|
||
#去重
|
||
value = ",".join(set(str(fontUtils.ChineseConvert(value)).split(",")))
|
||
cls.comic_names_node = cls.setNodeAndValue(cls.comic_names,value)
|
||
@classmethod
|
||
def setNumber(cls,value):
|
||
cls.str_number = value
|
||
cls.number_node = cls.setNodeAndValue(cls.number, value)
|
||
@classmethod
|
||
def getNumber(cls): return cls.str_number
|
||
@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 setAgeRating(cls,value): cls.age_rating_node = cls.setNodeAndValue(cls.age_rating, 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 = cls.setComicValue(value)
|
||
cls.web_node = cls.setNodeAndValue(cls.web,cls.setComicValue(value))
|
||
|
||
@classmethod
|
||
def setChapterListImg(cls,value): cls.str_list_img=cls.setComicValue(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=cls.setComicValue(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 = cls.setComicValue(int(value))
|
||
cls.page_count_node = cls.setNodeAndValue(cls.page_count,cls.str_page_count)
|
||
|
||
@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(len(value)+1 if cls.IS_NEW_ICON else len(value))
|
||
root_node = cls.document.createElement(cls.pages)
|
||
if cls.IS_NEW_ICON:
|
||
#添加封面
|
||
icon_node = cls.document.createElement("Page")
|
||
icon_node.setAttribute("Image","000")
|
||
icon_node.setAttribute("Type","FrontCover")
|
||
root_node.appendChild(icon_node)
|
||
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 = cls.setComicValue(value)
|
||
return cls.str_icon
|
||
|
||
@classmethod
|
||
def setHomePage(cls, value): cls.str_homepage = cls.setComicValue(value)
|
||
@classmethod
|
||
def getHomePage(cls): return cls.str_homepage
|
||
@classmethod
|
||
def setUpdateAt(cls, value): cls.str_update_at = cls.setComicValue(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.setNumber(value)
|
||
cls.str_chapter_index = cls.setComicValue(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 getNewFileCBZComicChapter(cls,type="file"): return cls.getNewToComicChapter(".CBZ", type)
|
||
@classmethod
|
||
def getNewFileIconComicChapter(cls,type="file"): 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, cls.COMIC_INFO_XML)
|
||
except:
|
||
return None
|
||
return cls.path_comic_info
|
||
|
||
@classmethod
|
||
def writeComicInfoXML(cls,chapter=None,path=None,overlay=False):
|
||
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.number_node != None: root.appendChild(cls.number_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.age_rating_node != None: root.appendChild(cls.age_rating_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,cls.COMIC_INFO_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) and not overlay:
|
||
print(f"{cls.COMIC_INFO_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(f"{cls.COMIC_INFO_XML} 已生成 pathd=", cls.path_comic_info)
|
||
|
||
#文件保存
|
||
@classmethod
|
||
def file_save(cls,path,data,mode=None,print_msg=False):
|
||
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()
|
||
if print_msg:
|
||
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=None):
|
||
if data == None: data = cls.getChapterImgs()
|
||
if cls.str_chapter != chapter:
|
||
print(f"chapter {cls.str_chapter} 与 {chapter} 不一致,已自动跳过")
|
||
cls.setProgress(cls.PROGRESS_INFO)
|
||
cls.nextSavePath("info_",data)
|
||
|
||
@classmethod
|
||
def nextInfoToImgChapter(cls): cls.setProgress(cls.PROGRESS_IMG)
|
||
@classmethod
|
||
def nextImgToDownloadChapter(cls): cls.setProgress(cls.PROGRESS_DOWN)
|
||
@classmethod
|
||
def nextDownloadToCBZChapter(cls): cls.setProgress(cls.PROGRESS_CBZ)
|
||
@classmethod
|
||
def nextCBZToDoneChapter(cls): cls.setProgress(cls.PROGRESS_DONE)
|
||
@classmethod
|
||
def nextDoneSave(cls,data): cls.nextSavePath("done_",data)
|
||
@classmethod
|
||
def setProgress(cls,progress):
|
||
dbUtils.setComic(cls.str_chapter,progress,cls.str_comic_name)
|
||
|
||
@classmethod
|
||
def isProgress(cls,progress,remove=None):
|
||
if remove: cls.setProgress("None")
|
||
return dbUtils.query(cls.str_chapter,progress,cls.str_comic_name)
|
||
|
||
@classmethod
|
||
def iconDB(cls): dbUtils.setComic(cls.str_comic_name,cls.str_icon,"icons")
|
||
|
||
@classmethod
|
||
def equIcon(cls): return dbUtils.query(cls.str_comic_name,cls.str_icon,"icons")
|
||
|
||
@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):
|
||
update_at = cls.getUpdateAt()
|
||
if date != None:
|
||
update_at = date
|
||
dbUtils.setComic(cls.str_comic_name, update_at, "update")
|
||
|
||
@classmethod
|
||
def isUpdateComic(cls):
|
||
return dbUtils.query(cls.str_comic_name, cls.str_update_at,"update")
|
||
|
||
@classmethod
|
||
def comicChapterDownload(cls,imgs,names):
|
||
cls.setChapterImgs(imgs)
|
||
cls.setChapterListImg(imgs)
|
||
cls.setPages(names)
|
||
cls.setChapterFilesName(names)
|
||
|
||
@classmethod
|
||
def setComicInfo(cls,comicname=None,homepage=None,alias=None,author=None,icon=None,tags=None,
|
||
dep=None,genre=None,lang=None,age_rating=None,chapters=None,update_at=None,current_chapter_img=None):
|
||
author = str(author).replace("&",",").replace(" ",",")
|
||
cls.setHomePage(homepage)
|
||
cls.setComicName(str(comicname))
|
||
if alias != None: comicInfo.setComicNames(alias)
|
||
cls.setAuthor(author)
|
||
cls.setIcon(icon)
|
||
cls.setTags(tags)
|
||
cls.setDep(dep)
|
||
#comicInfo.setCBS("韩漫")
|
||
if genre != None: cls.setGenre(genre)
|
||
cls.setLang(lang)
|
||
cls.setAgeRating(age_rating)
|
||
cls.setListChapter(chapters)
|
||
cls.setUpdateAt(update_at)
|
||
cls.setCurrentChapterImg(current_chapter_img) |