diff --git a/src/state.py b/src/state.py index 5553095..d758fdd 100644 --- a/src/state.py +++ b/src/state.py @@ -20,6 +20,23 @@ _DEFAULT_READMANGA_DOMAINS = [ "3.readmanga.ru", ] +_ALLOWED_FMTS = frozenset({"cbz", "pdf", "epub"}) + + +def _now() -> str: + return datetime.now(timezone.utc).replace(tzinfo=None).isoformat() + + +def _extract_domain(url: str) -> str: + """Извлекает домен без www.""" + try: + domain = urlparse(url).netloc.lower() + if domain.startswith("www."): + domain = domain[4:] + return domain + except Exception: + return "" + class StateDB: def __init__(self, db_path: Path = DB_PATH): @@ -673,21 +690,3 @@ class StateDB: self.conn.close() -_ALLOWED_FMTS = frozenset({"cbz", "pdf", "epub"}) - - -def _now() -> str: - return datetime.now(timezone.utc).replace(tzinfo=None).isoformat() - - -def _extract_domain(url: str) -> str: - """Извлекает домен без www.""" - try: - domain = urlparse(url).netloc.lower() - if domain.startswith("www."): - domain = domain[4:] - return domain - except Exception: - return "" - - diff --git a/src/worker.py b/src/worker.py index 953612e..bfe2ee5 100644 --- a/src/worker.py +++ b/src/worker.py @@ -332,15 +332,21 @@ async def check_for_updates( pass db = StateDB() + db_lock = asyncio.Lock() + + async def db_call(fn, *args, **kwargs): + async with db_lock: + return fn(*args, **kwargs) + try: - db.set_last_checked(url) - db.add_history(manga_url=url, event_type="check_started") + await db_call(db.set_last_checked, url) + await db_call(db.add_history, manga_url=url, event_type="check_started") await emit({"type": "check_started", "url": url}) # Резолвим источник source = get_source_for_url(url, db) if source is None: - manga_row = db.get_manga(url) + manga_row = await db_call(db.get_manga, url) if manga_row and manga_row.get("source_id"): source = registry.get_by_db_id(manga_row["source_id"], db) if source is None: @@ -355,7 +361,8 @@ async def check_for_updates( return [] # Обновляем pub_status и количество глав - db.update_manga_info( + await db_call( + db.update_manga_info, url, title=manga.title_ru or manga.title, chapters_total=len(manga.chapters), @@ -365,12 +372,13 @@ async def check_for_updates( ) # Находим главы которых ещё нет в БД - known = {ch["chapter_url"] for ch in db.get_all_chapters(url)} + known = {ch["chapter_url"] for ch in await db_call(db.get_all_chapters, url)} new_chapters = [ch for ch in manga.chapters if ch.url not in known] for ch in new_chapters: - db.upsert_chapter(url, ch.url, ch.title, ch.number, ch.volume) - db.add_history( + await db_call(db.upsert_chapter, url, ch.url, ch.title, ch.number, ch.volume) + await db_call( + db.add_history, manga_url=url, event_type="new_chapter_found", chapter_url=ch.url, @@ -386,7 +394,8 @@ async def check_for_updates( "chapter_number": ch.number, }) - db.add_history( + await db_call( + db.add_history, manga_url=url, event_type="check_done", details=f"Найдено новых: {len(new_chapters)}",