add comicinfo.xml update cbz
This commit is contained in:
1 parent
97449dca0b
commit
cfae12f9b2
6 files changed
+83
-32
No files matched your search
@@ -69,6 +69,7 @@ class Extractor:
|
||||
"""提取漫画信息并返回 MangaInfo 实例"""
|
||||
selectors = self.config.get_selector('manga_list')
|
||||
info_data = {}
|
||||
info_data['base_url'] = self.config.base_url
|
||||
for key, selector in selectors.items():
|
||||
if isinstance(selector, str):
|
||||
element = self.processor.select(tree, selector)
|
||||
|
||||
+12
-2
@@ -72,6 +72,14 @@ class Chapter(BaseModel):
|
||||
#images: List[ImageItem] = []
|
||||
|
||||
class ListManga(BaseModel):
|
||||
|
||||
base_url: str
|
||||
"""漫画网站域名"""
|
||||
@field_validator('base_url', mode='before')
|
||||
def validate_base_url(cls, v):
|
||||
cls.base_url = v
|
||||
return v
|
||||
|
||||
title: List[str]
|
||||
|
||||
url: List[HttpUrl]
|
||||
@@ -81,10 +89,12 @@ class ListManga(BaseModel):
|
||||
list_url = []
|
||||
for url in v:
|
||||
if isinstance(url, str) and not url.startswith('http'):
|
||||
list_url.append(HttpUrl("https://rouman5.com" + url))
|
||||
list_url.append(HttpUrl(cls.base_url + url))
|
||||
return list_url
|
||||
|
||||
created_at: List[str] = []
|
||||
updated_at: List[str] = []
|
||||
|
||||
last_updated: List[str] = []
|
||||
|
||||
class MangaInfo(BaseModel):
|
||||
project: str
|
||||
|
||||
+16
-11
@@ -730,18 +730,22 @@ class MangaUtils:
|
||||
save_data = []
|
||||
|
||||
for manga in self.data:
|
||||
created_at = manga["created_at"]
|
||||
if isinstance(created_at, datetime):
|
||||
updated_at = manga["updated_at"]
|
||||
last_updated = manga["last_updated"]
|
||||
if isinstance(updated_at, datetime):
|
||||
str_strftime = '%Y%m%d'
|
||||
created_at = created_at.strftime(str_strftime)
|
||||
save_data.append({"name" : manga["name"] , "created_at" : created_at})
|
||||
updated_at = updated_at.strftime(str_strftime)
|
||||
if isinstance(last_updated, datetime):
|
||||
str_strftime = '%Y%m%d'
|
||||
last_updated = last_updated.strftime(str_strftime)
|
||||
save_data.append({"name" : manga["name"] , "updated_at" : updated_at , "last_updated" : last_updated})
|
||||
|
||||
with self.lock:
|
||||
with open(temp_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(save_data, f, indent=2, ensure_ascii=False)
|
||||
temp_path.replace(self.file_path)
|
||||
|
||||
def add_manga(self, name: str, created_at: str = None) -> bool:
|
||||
def add_manga(self, name: str, updated_at: str = None) -> bool:
|
||||
"""添加新漫画"""
|
||||
if not self.validate_name(name):
|
||||
raise ValueError("无效的漫画名称")
|
||||
@@ -750,13 +754,14 @@ class MangaUtils:
|
||||
self.delete_manga(name)
|
||||
|
||||
str_strftime = '%Y%m%d'
|
||||
time = created_at or datetime.now()
|
||||
if isinstance(time , datetime):
|
||||
time = time.strftime(str_strftime)
|
||||
now_time = datetime.now()
|
||||
if isinstance(now_time , datetime):
|
||||
now_time = now_time.strftime(str_strftime)
|
||||
|
||||
new_manga = {
|
||||
"name": name.strip(),
|
||||
"created_at": time
|
||||
"updated_at": updated_at,
|
||||
"last_updated": now_time
|
||||
}
|
||||
|
||||
self.data.append(new_manga)
|
||||
@@ -804,7 +809,7 @@ class MangaUtils:
|
||||
if sort_by == "name":
|
||||
return sorted(self.data, key=lambda x: x['name'])
|
||||
elif sort_by == "date":
|
||||
return sorted(self.data, key=lambda x: x['created_at'])
|
||||
return sorted(self.data, key=lambda x: x['updated_at'])
|
||||
return self.data.copy()
|
||||
|
||||
def validate_name(self, name: str) -> bool:
|
||||
@@ -817,7 +822,7 @@ class MangaUtils:
|
||||
"""批量导入漫画"""
|
||||
for manga in mangas:
|
||||
if self.validate_name(manga["name"]):
|
||||
self.add_manga(manga["name"], manga.get("created_at"))
|
||||
self.add_manga(manga["name"], manga.get("updated_at"))
|
||||
|
||||
def find_duplicates(self) -> List[str]:
|
||||
"""查找可能的重复条目(简单版本)"""
|
||||
|
||||
+10
-10
@@ -151,21 +151,21 @@ class MangaManager:
|
||||
raise MangaException(f"不支持的网站: {manga_url}")
|
||||
async with list_site_handler() as site:
|
||||
manga_list = await site.get_manga_list(manga_url)
|
||||
for title,url,created_at in zip(manga_list.title, manga_list.url, manga_list.created_at):
|
||||
for title,url,updated_at in zip(manga_list.title, manga_list.url, manga_list.updated_at):
|
||||
title = FileNaming.chinese_file_name(title)
|
||||
save_manga = MangaUtils().search_manga(title)
|
||||
created = None
|
||||
if save_manga != None: created = save_manga.get('created_at', None)
|
||||
if created != None and created_at == created:
|
||||
created = save_manga.get('created_at', None)
|
||||
updated = None
|
||||
if save_manga != None: updated = save_manga.get('updated_at', None)
|
||||
if updated != None and updated_at == updated:
|
||||
updated = save_manga.get('updated_at', None)
|
||||
logger.info(f"{save_manga} 已存在")
|
||||
else:
|
||||
logger.info(f"开始下载 漫画: {title}")
|
||||
logger.info(f"{url}")
|
||||
await self.download_manga(str(url), title = title, created_at = created_at)
|
||||
await self.download_manga(str(url), title = title, updated_at = updated_at )
|
||||
|
||||
@classmethod
|
||||
async def download_manga(cls, url: str, title: str = None, created_at: str = None, save_dir: Path = BASE_IMAGES_DIR):
|
||||
async def download_manga(cls, url: str, title: str = None, updated_at: str = None, save_dir: Path = BASE_IMAGES_DIR):
|
||||
"""下载漫画"""
|
||||
manager = MangaManager(save_dir)
|
||||
|
||||
@@ -204,9 +204,9 @@ class MangaManager:
|
||||
logger.error(f"下载出错: {result['error']}")
|
||||
|
||||
# 全部下载完成
|
||||
if int(total_chapters) == int(success_chapters) and title != None and created_at != None:
|
||||
MangaUtils().add_manga(title, created_at=created_at)
|
||||
logger.info(f"全部完成 {title}, {created_at}")
|
||||
if int(total_chapters) == int(success_chapters) and title != None and updated_at != None:
|
||||
MangaUtils().add_manga(title, updated_at=updated_at)
|
||||
logger.info(f"全部完成 {title}, {updated_at}")
|
||||
except MangaException as e:
|
||||
logger.error(f"下载失败: {str(e)}")
|
||||
except Exception as e:
|
||||
|
||||
Reference in new issue
Block a user