Fix listener

This commit is contained in:
Zoe Roux 2025-05-19 02:04:31 +02:00
parent 9c451a865e
commit df23cf54d7
No known key found for this signature in database
2 changed files with 25 additions and 19 deletions

View File

@ -1,5 +1,5 @@
import logging import logging
from asyncio import CancelledError, TaskGroup, create_task from asyncio import CancelledError, TaskGroup, create_task, sleep
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from fastapi import FastAPI from fastapi import FastAPI
@ -25,15 +25,21 @@ async def lifespan(_):
get_db() as db, get_db() as db,
KyooClient() as client, KyooClient() as client,
TheMovieDatabase() as tmdb, TheMovieDatabase() as tmdb,
RequestProcessor(db, client, tmdb) as processor,
): ):
# there's no way someone else used the same id, right? # there's no way someone else used the same id, right?
is_master = await db.fetchval("select pg_try_advisory_lock(198347)") is_master = await db.fetchval("select pg_try_advisory_lock(198347)")
if is_master: if is_master:
await migrate() await migrate()
async with get_db() as db: async with get_db() as scanner_db:
scanner = FsScanner(client, RequestCreator(db)) processor = RequestProcessor(db, client, tmdb)
tasks = create_task(background_startup(scanner, processor, is_master)) scanner = FsScanner(client, RequestCreator(scanner_db))
tasks = create_task(
background_startup(
scanner,
processor,
is_master,
)
)
yield yield
_ = tasks.cancel() _ = tasks.cancel()
@ -44,7 +50,7 @@ async def background_startup(
is_master: bool | None, is_master: bool | None,
): ):
async with TaskGroup() as tg: async with TaskGroup() as tg:
_ = tg.create_task(processor.listen()) _ = tg.create_task(processor.listen(tg))
if is_master: if is_master:
_ = tg.create_task(scanner.monitor()) _ = tg.create_task(scanner.monitor())
_ = tg.create_task(scanner.scan(remove_deleted=True)) _ = tg.create_task(scanner.scan(remove_deleted=True))

View File

@ -1,10 +1,11 @@
from __future__ import annotations from __future__ import annotations
from asyncio import CancelledError, Future, TaskGroup, sleep
from logging import getLogger from logging import getLogger
from types import TracebackType from types import TracebackType
from typing import Literal from typing import Literal, cast
from asyncpg import Connection from asyncpg import Connection, Pool
from pydantic import Field, TypeAdapter from pydantic import Field, TypeAdapter
from .client import KyooClient from .client import KyooClient
@ -68,18 +69,17 @@ class RequestProcessor:
self._client = client self._client = client
self._providers = providers self._providers = providers
async def __aenter__(self): async def listen(self, tg: TaskGroup):
logger.info("Listening for requestes") def process(*_):
await self._database.add_listener("scanner_requests", self.process_all) _ = tg.create_task(self.process_all())
return self
async def __aexit__( try:
self, logger.info("Listening for requestes")
exc_type: type[BaseException] | None, await self._database.add_listener("scanner_requests", process)
exc_value: BaseException | None, await Future()
traceback: TracebackType | None, except CancelledError as e:
): logger.info("Stopped listening for requsets")
await self._database.remove_listener("scanner_requests", self.process_all) await self._database.remove_listener("scanner_requests", process)
async def process_all(self): async def process_all(self):
found = True found = True