import json,os from typing import Any from xml.dom.minidom import Document from common.Constant import pathStr from utils.FileUtils import dbUtils as db from utils.FileUtils import fileUtils from common.Comic import Comic from common.Constant import ComicPath class ComicInfoEntity: @classmethod def getNodes(cls): return [Comic.dict_chapter,Comic.dict_comic_name,Comic.dict_number,Comic.dict_comic_names, Comic.dict_dep,Comic.dict_year,Comic.dict_month,Comic.dict_day,Comic.dict_author, Comic.dict_cbs,Comic.dict_genre,Comic.dict_tags,Comic.dict_page_count, Comic.dict_language,Comic.dict_agerating,Comic.dict_pages] @classmethod def getJsonNodes(cls): return [Comic.dict_chapter,Comic.dict_comic_name,Comic.dict_icon,Comic.dict_number, Comic.dict_comic_names, Comic.dict_dep,Comic.dict_year,Comic.dict_month,Comic.dict_day,Comic.dict_author, Comic.dict_cbs,Comic.dict_genre,Comic.dict_tags,Comic.dict_page_count, Comic.dict_language,Comic.dict_agerating,Comic.dict_pages,Comic.dict_chapter_imgs] class ComicInfo: COMIC_ICON_NAME = "000" IS_NEW_ICON = False document = Document() path_comic_info = None @classmethod def parseExec(cls,data,exec,start_add=None,item=True): if data !=None and exec != None: dots = str(exec).split(".") if not isinstance(data,dict): data = json.loads(data) for dot in dots: data = data.get(dot) if start_add != None and data != None: data = start_add+data return data @classmethod def setNodeAndValue(cls,node,value): if value != None: if isinstance(value,str): c_node = cls.document.createElement(node) child_node = cls.document.createTextNode(value) c_node.appendChild(child_node) return c_node else: return value return None #页数 @classmethod def setPages(cls,values): if values != None and isinstance(values,list): suffix = "."+str(values[0]).split(".")[-1] join_list=",".join(values).replace(suffix,"") values = join_list.split(",") Comic.setPageCount(len(values)+1 if cls.IS_NEW_ICON else len(values)) root_node = cls.document.createElement("Pages") if cls.IS_NEW_ICON: #添加封面 icon_node = cls.document.createElement("Page") icon_node.setAttribute("Image",cls.COMIC_ICON_NAME) icon_node.setAttribute("Type","FrontCover") root_node.appendChild(icon_node) for page in values: c_node = cls.document.createElement("Page") page = page.split("_")[-1] c_node.setAttribute("Image",page) root_node.appendChild(c_node) Comic.dict_pages = Comic.setField(Comic.dict_pages,root_node,convert=False) @classmethod def getBaseUrl(cls,url=None): if url == None: url = Comic.getHomePage() (num,index) = [3,0] for x in range(0, num): index = str(url).find("/",index)+1 return url[0:index-1] #XML根文档 @classmethod def root_node(cls,root_value): return cls.document.createElement(root_value) @classmethod def add_nodes(cls,root,list_value): if len(list_value) == 0: return list_value for value in list_value: #Comic.chapter if value[0] != None: root.appendChild(cls.setNodeAndValue(value[2],value[0])) @classmethod def writeComicInfoXML(cls,overlay=False): root = cls.root_node("ComicInfo") new_document = Document() new_document.appendChild(root) cls.add_nodes(root,ComicInfoEntity.getNodes()) save_path = ComicPath.getPathComicInfoXML() with open(save_path, "w", encoding="utf-8") as fo: new_document.writexml(fo, indent='', addindent='\t', newl='\n', encoding="utf-8") fo.close() print(f"已生成文件... {save_path}") @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 = ",".join(set(str(str(author).replace("&",",").replace(" ",",")).split(","))) Comic.setHomePage(homepage) Comic.setIcon(icon) Comic.setListChapter(chapters) Comic.setUpdateAt(update_at) Comic.setComicName(str(comicname)) #if alias != None: comicInfo.setComicNames(alias) Comic.setAuthor(author) Comic.setTags(tags) Comic.setDep(dep) #comicInfo.setCBS("韩漫") if genre != None: Comic.setGenre(genre) Comic.setLanguage(lang) Comic.setAgeRating(age_rating) Comic.setCurrentChapterImg(current_chapter_img) @classmethod def writeJson(cls): dict_data = {} nodes = ComicInfoEntity.getJsonNodes() for node in nodes: key = Comic.getFieldNode(node) value = Comic.getFieldOrigin(node) if isinstance(value,list): value = ",".join(value) if key != None and isinstance(value,str): child_dict = { key : value} dict_data.update(child_dict) s = json.dumps(dict_data,ensure_ascii=False) with open(ComicPath.getPathConfComicChapterJson(mkdir=True),"w") as fs: fs.write(s) class ComicInfoUtils: PROGRESS_DOWN = "down" PROGRESS_CBZ = "cbz" PROGRESS_DONE = "done" PROGRESS_FAIL = "fail" IS_NEW_ICON = False list_skip = [] @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 setProgress(cls,progress): db.set(Comic.getOriginChapterName(),progress,Comic.getOriginComicName()) @classmethod def isProgress(cls,progress,remove=None): if remove: cls.setProgress("None") return db.query(Comic.getOriginChapterName(),progress,Comic.getOriginComicName()) #判断是否完成 @classmethod def isProgressDone(cls): return cls.isProgress(cls.PROGRESS_DONE) #设置为完成 @classmethod def setProgressDone(cls): return cls.setProgress(cls.PROGRESS_DONE) #设置未完成 @classmethod def setProgressFail(cls): return cls.setProgress(cls.PROGRESS_FAIL) @classmethod def isProgressDown(cls): return cls.isProgress(cls.PROGRESS_DOWN) @classmethod def setProgressDown(cls): return cls.setProgress(cls.PROGRESS_DOWN) @classmethod def isProgressCBZ(cls): return cls.isProgress(cls.PROGRESS_CBZ) @classmethod def setProgressCBZ(cls): return cls.setProgress(cls.PROGRESS_CBZ) @classmethod def iconDB(cls): db.set(Comic.getOriginComicName(),Comic.getIcon(),"icons") @classmethod def equIcon(cls): return db.query(Comic.getOriginComicName(),Comic.getIcon(),"icons") @classmethod def updateLastDate(cls,date=None): update_at = Comic.getUpdateAt() if date != None: update_at = date db.set(Comic.getOriginComicName(), update_at, "update") @classmethod def isUpdateComic(cls,comic_name,update_at=None): if update_at == None: update_at = Comic.getUpdateAt() return db.query(comic_name, update_at,"update") @classmethod def comicChapterDownload(cls,imgs,names): Comic.setChapterImgs(imgs) ComicInfo.setPages(names) Comic.setChapterFilesName(names)