From e1059cc2624ea66001a1f4990f82396d082676af Mon Sep 17 00:00:00 2001 From: caiwx86 Date: Fri, 11 Jul 2025 15:12:15 +0800 Subject: [PATCH] update --- run.py | 6 ++-- src/common/ComicInfo.py | 7 +++-- src/common/utils.py | 68 ++++++++++++++++++++++++++++++++++++++++- src/sites/base.py | 13 ++++++-- 4 files changed, 86 insertions(+), 8 deletions(-) diff --git a/run.py b/run.py index 3536cb3..2f563cb 100644 --- a/run.py +++ b/run.py @@ -6,12 +6,12 @@ logger = setup_logging(__name__) async def main(): # 配置下载参数 - #manga_url = "https://rouman5.com/books/cm693tf2z0170dr07ve0hpa7s" + # manga_url = "https://rouman5.com/books/4355ff5c-98d7-45c0-95a9-b4023b8eb812" manga_list_url = "https://rouman5.com/books?continued=undefined" # 开始下载 - #await MangaManager().download_manga(manga_url) - for i in range(0,77): + # await MangaManager().download_manga(manga_url) + for i in range(0,80): await MangaManager().download_list_manga(f"{manga_list_url}&page={i}") if __name__ == "__main__": diff --git a/src/common/ComicInfo.py b/src/common/ComicInfo.py index 1f524f1..d526213 100644 --- a/src/common/ComicInfo.py +++ b/src/common/ComicInfo.py @@ -479,7 +479,7 @@ class ComicInfoXml: raise ValueError("请提供 cbz_path 或 xml_file 参数, 否则无法处理 XML 文件") return xml_parse(xml_content) - def update_comicinfo_count(self, count, cbz_path: Path) -> Path: + def update_comicinfo_count_or_number(self, cbz_path: Path, count = -1, number = -1) -> Path: """ 更新 ComicInfo.xml 中的 PageCount 字段 Args: cbz_path (Path): CBZ 文件路径 @@ -490,7 +490,10 @@ class ComicInfoXml: """ # 读取 ComicInfo.xml 文件 comicinfo = self._xml_file_to_comicinfo(cbz_path=cbz_path) - comicinfo.Count = count + if count != -1: + comicinfo.Count = count + if number != -1: + comicinfo.Number = number # 保存更新后的 ComicInfo.xml 文件 return self._parse_comicinfo(comicinfo, save_dir=os.path.dirname(cbz_path)) diff --git a/src/common/utils.py b/src/common/utils.py index 8c4cfeb..bf5b02b 100644 --- a/src/common/utils.py +++ b/src/common/utils.py @@ -875,4 +875,70 @@ class MangaUtils: ] if len(self.data) != original_count: self._build_index() - self._save_data() \ No newline at end of file + self._save_data() + +class KomgaAPI(): + import requests + from requests.auth import HTTPBasicAuth + + # 配置信息 + KOMGA_URL = "https://komga.caiwenxiu.cn" # 替换为你的Komga地址 + USERNAME = "caiwenxiu0806@163.com" # 管理员邮箱 + PASSWORD = "cwx@komga" + + def search_series_id(self, search_name): + """ + 搜索漫画系列 + :param search_name: 漫画名称 + :return: 返回搜索结果 + """ + response = self.requests.get( + f"{self.KOMGA_URL}/api/v1/series", + params={"search": search_name}, + auth=self.HTTPBasicAuth(self.USERNAME, self.PASSWORD) + ) + + # 解析结果 + if response.status_code == 200: + series_list = response.json()["content"] + for series in series_list: + if series['metadata']['title'] == search_name: + # 输出匹配的漫画信息 + print(f"找到漫画: {series['metadata']['title']}, ID: {series['id']}") + return series['id'] + break + print(f"类似标题: {series['metadata']['title']}, ID: {series['id']}") + else: + print(f"搜索失败: {response.status_code}") + + + def update_series_status(self, series_id, status): + """更新漫画系列状态""" + # 构建 API 端点 + endpoint = f"{self.KOMGA_URL}/api/v1/series/{series_id}/metadata" + + # 准备请求数据 + payload = { + "status": status + } + + # 发送 PATCH 请求 + response = self.requests.patch( + endpoint, + json=payload, + auth=self.HTTPBasicAuth(self.USERNAME, self.PASSWORD), + headers={"Content-Type": "application/json"} + ) + + # 检查响应 + if response.status_code == 200 or 204: + print(f"成功将系列 {series_id} 状态更新为 '{status}'") + return True + else: + print(f"更新失败: {response.status_code} - {response.text}") + return False + + def update_series_ended(self, series_name, series_status="ENDED"): + series_id = self.search_series_id(series_name) + """将漫画系列状态更新为已完结""" + return self.update_series_status(series_id, series_status) \ No newline at end of file diff --git a/src/sites/base.py b/src/sites/base.py index 6b4c0c8..eacb23f 100644 --- a/src/sites/base.py +++ b/src/sites/base.py @@ -82,7 +82,6 @@ class BaseSite(ABC): #async def get_chapter_list(self, info: MangaInfo) -> List[Dict[str, str]]: # """获取漫画章节列表""" # pass - async def get_chapter_list(self, manga_info: MangaInfo) -> List[Dict[str, str]]: """获取章节列表""" try: @@ -93,6 +92,7 @@ class BaseSite(ABC): last_chapter = list_chapter[-1] if list_chapter else [] # 临时添加end down_chapter = [] + downloaded_chapter = [] for chapter in list_chapter: cbz_path = FileNaming.chapter_cbz(manga_info=manga_info,chapter=chapter) if os.path.exists(cbz_path): @@ -102,7 +102,7 @@ class BaseSite(ABC): ci = ComicInfoXml()._xml_file_to_comicinfo(cbz_path=cbz_path) if ci.Count == "": # 生成ComicInfo.xml - xml_path = ComicInfoXml().update_comicinfo_count(count=len(list_chapter), cbz_path=cbz_path) + xml_path = ComicInfoXml().update_comicinfo_count_or_number(cbz_path=cbz_path, count=len(list_chapter)) # 更新ComicInfo.xml至CBZ文件中 CBZUtils().update_cbz_with_new_xml(cbz_path, xml_path.read_text(encoding="utf-8")) # 更新完成后删除临时生成的ComicInfo.xml @@ -111,7 +111,16 @@ class BaseSite(ABC): # 临时添加end logger.debug(f"{chapter.title} 章节已存在") chapter.status = "downloaded" + downloaded_chapter.append({ "name" : chapter.title, "status": chapter.status, "path" : cbz_path }) down_chapter.append(chapter) + if manga_info.status == "已完结": + from src.common.utils import KomgaAPI + if len(downloaded_chapter) == len(list_chapter): + logger.info(f"{manga_info.title} 漫画已完结, 章节已全部下载完成") + KomgaAPI().update_series_ended(manga_info.title) + logger.info(f"{manga_info.title} 漫画已完结, 已更新KOMGA状态") + else: + logger.info(f"{manga_info.title} 漫画已完结, 但章节未全部下载完成, 可能是网络问题或其他原因") return down_chapter except Exception as e: if isinstance(e, (ParseError, SiteError)):