import json,os,time,random,shutil from utils.HtmlUtils import htmlUtils from utils.FileUtils import imageUtils from utils.comic.ComicInfo import comicInfo as ci from utils.CBZUtils import CBZUtils from utils.downloader import download_images from utils.downloader import download_comic_icon from utils.Ntfy import ntfy from entity.down.RouMan import comicCommon as RouManComicCommon from entity.down.JM import comicCommon as JMComicCommon from entity.down.BaoZi import comicCommon as BaoZiComicCommon from utils.comic.PathStr import pathStr from utils.FileUtils import fileUtils as fu class baseComic: count_chapter = 0 #校验该漫画是否为最新 # Y/跳过 N/下载 返回下载链接 @classmethod def updateComics(cls): (book_name,comic_href,updated) = [ci.getComicName(),ci.getCurrentChapterImg(),ci.getUpdateAt()] #白名单跳过 if ci.getIsComicNameSkips(book_name): return None if not ci.isUpdateComic(): ntfy.sendMsg(f"开始下载 漫画:{book_name}") return comic_href else: ntfy.sendMsg(f"{book_name} 已是最新") chapters = htmlUtils.xpathData('//div[contains(@class,"bookid_chapterBox")]//div[contains(@class,"bookid_chapter")]/a/text()',url=comic_href,update=False) chapter_index = 1 for chapter in chapters: ci.setChapterIndex(chapter_index) ci.setChapterName(chapter) cbz_path = ci.getNewCBZComicChapter("file") icon_path = ci.getNewIconComicChapter("file") CBZUtils.replaceZip(cbz_path) #判断漫画是否完成 if ci.isProgress(ci.PROGRESS_DONE) and not os.path.exists(cbz_path): ci.isProgress(ci.PROGRESS_DONE,remove=True) if not os.path.exists(cbz_path): ci.updateComicDate("0") return comic_href chapter_index = chapter_index + 1 return None @classmethod def oneComic(cls,url,title,author,icon,tags,dep,chapters,chapter_href,alias=None,genre=None,lang="zh",age_rating=None,sleep=None): ci.setComicInfo(homepage=url,comicname=title,alias=ci.setComicNames(title+","+alias), author=author,icon=icon,tags=tags,dep=dep,genre=genre,lang=lang,age_rating=age_rating,chapters=chapters) cls.count_chapter = 0 for href in chapter_href: ci.setChapterName(chapters[cls.count_chapter]) ci.setChapterIndex(cls.count_chapter+1) #存在完成配置文件 但文件不存在 将清空完成配置文件 if ci.isProgress(ci.PROGRESS_DONE) and not fu.exists(ci.getNewCBZComicChapter("file")): ci.isProgress(ci.PROGRESS_DONE,remove=True) #不存在完成配置文件 则允许下载 if not ci.isProgress(ci.PROGRESS_DONE): cls.comicChapters(href,scramble=True,sleep=random.randint(1,5)) cls.count_chapter += 1 #一本漫画下载后等待 #清空文件夹 if os.path.exists(ci.getDirComic()): shutil.rmtree(ci.getDirComic()) if sleep != None: time.sleep(sleep) ''' 读取某章节下所有图片 ''' @classmethod def comicChapters(cls,chapter_url,scramble=None,sleep=None): try: cls.Onechapter(chapter_url,scramble) #进入下个阶段 #章节图片全部下载后,调用下载封面 if ci.isProgress(ci.PROGRESS_DOWN): download_comic_icon() #下个阶段 if ci.isProgress(ci.PROGRESS_CBZ): is_next = CBZUtils.packAutoComicChapterCBZ() except Exception as e: is_next = ntfy.sendMsg(f"{ci.getComicName()} 下载出错了",error=e) ntfy.sendMsg(f"预计总章节大小:{cls.count_chapter + 1} / "+ str(ci.getLenChapters())) ci.setChapterIndex(cls.count_chapter + 1) if sleep != None and is_next: ntfy.sendMsg(f"{sleep} 秒后开始下载下一个章节",sleep=sleep) #根据章节地址下载全部图片,并将文件名scramble开头的图片进行解密 @classmethod def Onechapter(cls,chapter_url,scramble=None): is_next = True if not str(chapter_url).startswith("http"): chapter_url = ci.getBaseUrl() + chapter_url #下载图片 try: is_next = cls.comicChapterDownload(chapter_url) except: htmlUtils.remove_HtmlCache(chapter_url) ci.nextInfoToImgChapter() #下载完成后, 开始解密图片 chapter_dir = ci.getDirComicChapter() if scramble and os.path.exists(chapter_dir): #获取章节图片路径 dirs = os.listdir(chapter_dir) for img in dirs: if img.startswith("scramble="): imageUtils.encode_scramble_image(os.path.join(chapter_dir,img)) #进入下一阶段 ci.nextImgToDownloadChapter() return is_next @classmethod def comicChapterDownload(cls,url,is_next=True): #获取本次工程的HOME目录 comic_main = pathStr.getComicMain() if comic_main == pathStr.comic_jm: JMComicCommon.comicChapterDownload(url) if comic_main == pathStr.comic_bz: BaoZiComicCommon.comicChapterDownload(url) if comic_main == pathStr.comic_rm: RouManComicCommon.comicChapterDownload(url) if comic_main == None: print("comic_main为空,退出中...") & exit() (list_img,files_name,chapter_name,book_name) = [ci.getChapterListImg(),ci.getChapterFilesName(),ci.getChapter(),ci.getComicName()] ci.setChapterImgs(list_img) #保存信息 ci.nextSaveInfoChapter(chapter_name, list_img) #验证数据是已存在且是否完整 #cbz_path = ci.getDirCBZComicChapter()+".CBZ" cbz_file = ci.getNewFileCBZComicChapter() #更新Icon ci.getNewIconComicChapter() #检验CBZ文件 CBZUtils.verCBZComic(cbz_file) if is_next and fu.notExists(ci.getPathComicInfoXML()): #print("不存在ComicInfo.xml 生成中...") ci.setPages(files_name) ci.writeComicInfoXML(chapter_name) is_next = CBZUtils.nextCBZ(list_img) repeat = 1 while is_next and repeat <= 10 and not CBZUtils.updateOldCBZ(files_name): ntfy.sendMsg(f"{book_name} {chapter_name} 下载中") download_images(list_img,ci.getDirComicChapter(), files_name=files_name,concurrency=None,timeout=10) equ_next = len(",".join(os.listdir(ci.getDirComicChapter())).split(".jpg"))-1 == len(list_img) if not equ_next: sleep_time = int(repeat)*2 time.sleep(sleep_time) ntfy.sendMsg(f"下载数据(不完整,{sleep_time}秒钟后尝试第{repeat}次") repeat += 1 return is_next