152 lines
7.3 KiB
Python
152 lines
7.3 KiB
Python
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.CBZUtils import verUtils
|
||
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
|
||
|
||
class baseComic:
|
||
count_chapter = 0
|
||
@classmethod
|
||
def comics(cls,book_name,comic_href,updated=None):
|
||
#不判断是否为空,ComicInfo方法内会自动判断
|
||
ci.setComicInfo(comicname=book_name,update_at=updated)
|
||
#白名单跳过
|
||
if ci.getIsComicNameSkips(book_name): return None
|
||
if not os.path.exists(ci.getDirConfComic()): ntfy.sendMsg(f"{random.randint(5,20)}秒后开始下载 漫画:{book_name}")
|
||
else: ntfy.sendMsg(f"已存在 漫画:{book_name}")
|
||
if ci.isUpdateComic(): 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",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,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 os.path.exists(ci.getNewCBZComicChapter("file")): ci.isProgress(ci.PROGRESS_DONE,remove=True)
|
||
if not ci.isProgress(ci.PROGRESS_DONE): cls.comicChapter(href,scramble=True,sleep=random.randint(5,15))
|
||
#存在就校验CBZ包是否完整
|
||
#if ci.nextExistsGetPath("done_"):
|
||
# verUtils.verCBZ()
|
||
cls.count_chapter += 1
|
||
#一本漫画下载后等待
|
||
#清空文件夹
|
||
if os.path.exists(ci.getDirComic()): shutil.rmtree(ci.getDirComic())
|
||
if sleep != None: time.sleep(sleep)
|
||
|
||
'''
|
||
|
||
读取某章节下所有图片
|
||
'''
|
||
@classmethod
|
||
def comicChapter(cls,chapter_url,scramble=None,sleep=None):
|
||
is_next = True
|
||
try:
|
||
is_next = 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 == True: ntfy.sendMsg(f"{sleep} 秒后开始下载下一个章节",sleep=sleep)
|
||
|
||
|
||
@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):
|
||
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 = ci.getChapterListImg()
|
||
files_name = ci.getChapterFilesName()
|
||
chapter_name = ci.getChapter()
|
||
book_name = ci.getComicName()
|
||
ci.setChapterImgs(list_img)
|
||
#保存信息
|
||
ci.nextSaveInfoChapter(chapter_name, list_img)
|
||
#验证数据是已存在且是否完整
|
||
#cbz_path = ci.getDirCBZComicChapter()+".CBZ"
|
||
cbz_path = ci.getNewCBZComicChapter()+".CBZ"
|
||
#更新Icon
|
||
ci.getNewIconComicChapter()
|
||
if os.path.exists(cbz_path):
|
||
if CBZUtils.PackCBZAndequZipLength:
|
||
ntfy.sendMsg(f"{book_name} {chapter_name} 数据完整,已跳过")
|
||
ci.nextDoneSave(list_img)
|
||
is_next = False
|
||
else:
|
||
ntfy.sendMsg(f"{book_name} {chapter_name} 数据不完整,尝试删除配置CBZ文件后重试")
|
||
try:
|
||
if os.path.getsize(cbz_path) < 300000: fileUtils.remove(cbz_path)
|
||
else: is_next = False
|
||
except:
|
||
ntfy(f"删除失败 {cbz_path}")
|
||
if is_next:
|
||
if not os.path.exists(ci.getPathComicInfoXML()):
|
||
#print("不存在ComicInfo.xml 生成中...")
|
||
ci.setPages(files_name)
|
||
ci.writeComicInfoXML(chapter_name)
|
||
ntfy.sendMsg(f"{book_name} {chapter_name} 下载中")
|
||
is_next = verUtils.verNextCBZ(list_img)
|
||
is_unzip = verUtils.existsUnzipCBZ(files_name)
|
||
repeat = 1
|
||
while not is_next and repeat <= 2 and not is_unzip:
|
||
download_images(list_img,ci.getDirComicChapter(), files_name=files_name,concurrency=10,timeout=60)
|
||
is_next = len(",".join(os.listdir(ci.getDirComicChapter())).split(".jpg"))-1 == len(list_img)
|
||
if not is_next:
|
||
sleep_time = 3+int(repeat)*2
|
||
time.sleep(sleep_time)
|
||
ntfy.sendMsg(f"下载数据(不完整,{sleep_time}秒钟后尝试第{repeat}次")
|
||
repeat += 1
|
||
return is_next |