upd
This commit is contained in:
58
src/sources/base.py
Normal file
58
src/sources/base.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""
|
||||
Базовые модели данных и Protocol-интерфейс для источников манги.
|
||||
"""
|
||||
from dataclasses import dataclass, field
|
||||
from pathlib import Path
|
||||
from typing import Optional, Protocol, runtime_checkable
|
||||
|
||||
from playwright.async_api import Page
|
||||
|
||||
|
||||
# ──────────────────────────────────────────────
|
||||
# Модели данных (общие для всех источников)
|
||||
# ──────────────────────────────────────────────
|
||||
|
||||
@dataclass
|
||||
class Chapter:
|
||||
title: str
|
||||
url: str
|
||||
number: float = 0.0
|
||||
volume: int = 0
|
||||
|
||||
|
||||
@dataclass
|
||||
class MangaInfo:
|
||||
title: str
|
||||
url: str
|
||||
chapters: list[Chapter] = field(default_factory=list)
|
||||
pub_status: str = "unknown" # completed / ongoing / unknown
|
||||
title_ru: str = ""
|
||||
title_full: str = ""
|
||||
description: str = ""
|
||||
genres: list[str] = field(default_factory=list)
|
||||
|
||||
|
||||
# ──────────────────────────────────────────────
|
||||
# Интерфейс источника
|
||||
# ──────────────────────────────────────────────
|
||||
|
||||
@runtime_checkable
|
||||
class MangaSourceProtocol(Protocol):
|
||||
slug: str # уникальный код источника в коде ("readmanga")
|
||||
display_name: str # название для UI ("ReadManga")
|
||||
|
||||
async def get_manga_info(self, page: Page, url: str) -> Optional[MangaInfo]:
|
||||
"""Возвращает информацию о манге и список глав."""
|
||||
...
|
||||
|
||||
async def get_chapter_images_and_download(
|
||||
self,
|
||||
page: Page,
|
||||
chapter_url: str,
|
||||
dest_dir: Path,
|
||||
manga_url: Optional[str] = None,
|
||||
on_page: object = None,
|
||||
) -> list[Path]:
|
||||
"""Скачивает страницы главы в dest_dir и возвращает список путей."""
|
||||
...
|
||||
|
||||
Reference in New Issue
Block a user