144 lines
6.7 KiB
Python
144 lines
6.7 KiB
Python
import json,os,time,random,shutil
|
||
from utils.NetUtils import htmlUtils
|
||
from utils.FileUtils import imageUtils
|
||
from utils.ComicUtils import CBZUtils
|
||
from utils.NetUtils import downloadUtils
|
||
from utils.ComicUtils import ntfy
|
||
from utils.FileUtils import fileUtils as fu
|
||
from domain.Domains import domains
|
||
from common.ComicInfo import ComicInfoUtils as ciUtils
|
||
from common.ComicInfo import ComicInfo as ci
|
||
from common.Comic import Comic
|
||
from common.Comic import ListComic
|
||
from common.Constant import ComicPath
|
||
|
||
class baseComic:
|
||
count_chapter = 0
|
||
|
||
#校验该漫画是否为最新
|
||
# Y/跳过 N/下载 返回下载链接
|
||
@classmethod
|
||
def updateComics(cls,chapters_xpath):
|
||
comics = ListComic.getListComicsLinksUpdateAt()
|
||
try:
|
||
(book_name,comic_href,updated) = [comics[0],comics[1],comics[2]]
|
||
except:
|
||
return False
|
||
cls.updateOneComic(book_name,comic_href,updated,chapters_xpath)
|
||
return True
|
||
|
||
@classmethod
|
||
def updateOneComic(cls,book_name,comic_href,update_at,chapters_xpath):
|
||
#白名单跳过
|
||
if ciUtils.getIsComicNameSkips(book_name): return None
|
||
if not ciUtils.isUpdateComic():
|
||
ntfy.sendMsg(f"开始下载 漫画:{book_name}")
|
||
Comic.setCurrentDownLink(comic_href)
|
||
else:
|
||
ntfy.sendMsg(f"{book_name} 已是最新")
|
||
chapters = htmlUtils.xpathData(chapters_xpath,url=comic_href,update=False)
|
||
chapter_index = 1
|
||
for chapter in chapters:
|
||
Comic.setNumber(chapter_index)
|
||
Comic.setChapter(chapter)
|
||
cbz_path = ComicPath.getNewCBZComicChapter("file")
|
||
icon_path = ComicPath.getNewIconComicChapter("file")
|
||
CBZUtils.replaceZip(cbz_path)
|
||
#判断漫画是否完成
|
||
if ciUtils.isProgress(ciUtils.PROGRESS_DONE) and not os.path.exists(cbz_path): ciUtils.isProgress(ciUtils.PROGRESS_DONE,remove=True)
|
||
if not os.path.exists(cbz_path):
|
||
ciUtils.updateLastDate("0")
|
||
Comic.setCurrentDownLink(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,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:
|
||
Comic.setChapterName(chapters[cls.count_chapter])
|
||
Comic.setNumber(cls.count_chapter+1)
|
||
#存在完成配置文件 但文件不存在 将清空完成配置文件
|
||
if ciUtils.isProgress(ciUtils.PROGRESS_DONE) and not fu.exists(ComicPath.getNewCBZComicChapter("file")):
|
||
ciUtils.isProgress(ciUtils.PROGRESS_DONE,remove=True)
|
||
#不存在完成配置文件 则允许下载
|
||
if not ciUtils.isProgress(ciUtils.PROGRESS_DONE):
|
||
cls.comicChapters(href,scramble=True,sleep=random.randint(1,5))
|
||
cls.count_chapter += 1
|
||
#一本漫画下载后等待
|
||
#清空文件夹
|
||
if os.path.exists(ComicPath.getDirComic()): shutil.rmtree(ComicPath.getDirComic())
|
||
if sleep != None: time.sleep(sleep)
|
||
#完成 更新最近一次时间
|
||
ciUtils.updateLastDate()
|
||
|
||
'''
|
||
|
||
读取某章节下所有图片
|
||
'''
|
||
@classmethod
|
||
def comicChapters(cls,chapter_url,scramble=None,sleep=None):
|
||
is_next = False
|
||
#try:
|
||
cls.Onechapter(chapter_url,scramble)
|
||
#进入下个阶段
|
||
#章节图片全部下载后,调用下载封面
|
||
if ciUtils.isProgress(ciUtils.PROGRESS_DOWN): downloadUtils.download_comic_icon()
|
||
#下个阶段
|
||
if ciUtils.isProgress(ciUtils.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(Comic.getLenChapters()))
|
||
Comic.setNumber(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
|
||
#下载图片
|
||
is_next = cls.comicChapterDownload(chapter_url)
|
||
ciUtils.nextInfoToImgChapter()
|
||
#下载完成后, 开始解密图片
|
||
chapter_dir = ComicPath.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))
|
||
#进入下一阶段
|
||
ciUtils.nextImgToDownloadChapter()
|
||
return is_next
|
||
|
||
@classmethod
|
||
def comicChapterDownload(cls,url,is_next=True):
|
||
#获取本次工程的HOME目录
|
||
try:
|
||
domains.setdomain(url)
|
||
except:
|
||
htmlUtils.remove_HtmlCache(url)
|
||
cls.comicChapterDownload(url,is_next)
|
||
|
||
(list_img,files_name,chapter_name,book_name) = [Comic.chapter_imgs,Comic.file_chapter_imgs,
|
||
Comic.chapter,Comic.comic_name]
|
||
#保存信息
|
||
ciUtils.nextSaveInfoChapter(chapter_name,list_img)
|
||
#验证数据是已存在且是否完整
|
||
cbz_file = ComicPath.getNewFileCBZComicChapter()
|
||
#更新Icon
|
||
ComicPath.getNewIconComicChapter()
|
||
#检验CBZ文件
|
||
CBZUtils.verCBZComic(cbz_file)
|
||
is_next = CBZUtils.nextCBZ()
|
||
is_old=CBZUtils.updateOldCBZ(files_name)
|
||
#不存在ComicInfo.xml则生成
|
||
if is_next and fu.notExists(ci.getPathComicInfoXML()): ci.writeComicInfoXML(chapter_name)
|
||
if is_next:
|
||
# ntfy.sendMsg(f"{book_name} {chapter_name} 下载中")
|
||
downloadUtils.download_images(list_img,ComicPath.getDirComicChapter(),files_name=files_name,concurrency=None,timeout=8)
|
||
# ntfy.sendMsg("等待数据检验中...",sleep=0.5)
|
||
is_next = fu.equImages(ComicPath.getDirComicChapter(),list_img)
|
||
# if not is_next: ntfy.sendMsg(msg=f"下载数据(不完整,{int(repeat*2)}秒钟后尝试第{repeat}次",sleep=int(repeat*2))
|
||
# repeat += 1
|
||
return is_next |