From e2f02a279d80bff3c9a1bf0b667c88cfe4798a59 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 13 May 2025 21:53:22 +0200 Subject: [PATCH] fastapi's di is utter garbage --- scanner/scanner/__init__.py | 10 ++++------ scanner/scanner/fsscan.py | 16 ++++++++-------- scanner/scanner/providers/composite.py | 9 ++------- scanner/scanner/providers/themoviedatabase.py | 4 ++-- scanner/scanner/requests.py | 15 +++++---------- scanner/scanner/routers/routes.py | 5 ++--- scanner/scanner/utils.py | 2 +- 7 files changed, 24 insertions(+), 37 deletions(-) diff --git a/scanner/scanner/__init__.py b/scanner/scanner/__init__.py index 53a149ff..9141090d 100644 --- a/scanner/scanner/__init__.py +++ b/scanner/scanner/__init__.py @@ -5,7 +5,7 @@ from contextlib import asynccontextmanager from fastapi import FastAPI from scanner.client import KyooClient -from scanner.fsscan import Scanner +from scanner.fsscan import FsScanner from scanner.providers.composite import CompositeProvider from scanner.providers.themoviedatabase import TheMovieDatabase from scanner.requests import RequestCreator, RequestProcessor @@ -25,13 +25,11 @@ async def lifespan(_): get_db() as db, KyooClient() as client, TheMovieDatabase() as tmdb, - RequestProcessor(db, client, CompositeProvider(tmdb)) as processor + RequestProcessor(db, client, CompositeProvider(tmdb)) as processor, ): # creating the processor makes it listen to requests event in pg - async with ( - get_db() as db, - ): - scanner = Scanner(client, RequestCreator(db)) + async with get_db() as db: + scanner = FsScanner(client, RequestCreator(db)) # there's no way someone else used the same id, right? is_master = await db.fetchval("select pg_try_advisory_lock(198347)") if is_master: diff --git a/scanner/scanner/fsscan.py b/scanner/scanner/fsscan.py index 1a1fea2a..3d52ae39 100644 --- a/scanner/scanner/fsscan.py +++ b/scanner/scanner/fsscan.py @@ -3,12 +3,11 @@ import re from logging import getLogger from mimetypes import guess_file_type from os.path import dirname, exists, isdir, join -from typing import Annotated -from fastapi import Depends from watchfiles import Change, awatch from .client import KyooClient +from .database import get_db from .identifiers.identify import identify from .models.metadataid import EpisodeId, MetadataId from .models.videos import For, Video, VideoInfo @@ -17,12 +16,13 @@ from .requests import Request, RequestCreator logger = getLogger(__name__) -class Scanner: - def __init__( - self, - client: Annotated[KyooClient, Depends(KyooClient)], - requests: Annotated[RequestCreator, Depends(RequestCreator)], - ): +async def create_scanner(): + async with get_db() as db: + yield FsScanner(KyooClient(), RequestCreator(db)) + + +class FsScanner: + def __init__(self, client: KyooClient, requests: RequestCreator): self._client = client self._requests = requests self._info: VideoInfo = None # type: ignore diff --git a/scanner/scanner/providers/composite.py b/scanner/scanner/providers/composite.py index 2d79761b..dc52af8d 100644 --- a/scanner/scanner/providers/composite.py +++ b/scanner/scanner/providers/composite.py @@ -1,19 +1,14 @@ -from typing import Annotated, override +from typing import override -from fastapi import Depends from langcodes import Language from ..models.movie import Movie, SearchMovie from ..models.serie import SearchSerie, Serie from .provider import Provider -from .themoviedatabase import TheMovieDatabase class CompositeProvider(Provider): - def __init__( - self, - themoviedb: Annotated[TheMovieDatabase, Depends], - ): + def __init__(self, themoviedb: Provider): self._tvdb: Provider = None # type: ignore self._themoviedb = themoviedb diff --git a/scanner/scanner/providers/themoviedatabase.py b/scanner/scanner/providers/themoviedatabase.py index d3de61ca..6c7a71f9 100644 --- a/scanner/scanner/providers/themoviedatabase.py +++ b/scanner/scanner/providers/themoviedatabase.py @@ -19,13 +19,13 @@ from ..models.season import Season, SeasonTranslation from ..models.serie import SearchSerie, Serie, SerieStatus, SerieTranslation from ..models.staff import Character, Person, Role, Staff from ..models.studio import Studio, StudioTranslation -from ..utils import Singleton, clean, to_slug +from ..utils import clean, to_slug from .provider import Provider, ProviderError logger = getLogger(__name__) -class TheMovieDatabase(Provider, metaclass=Singleton): +class TheMovieDatabase(Provider): THEMOVIEDB_API_ACCESS_TOKEN = "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJjOWYzMjhhMDEwMTFiMjhmMjI0ODM3MTczOTVmYzNmYSIsIm5iZiI6MTU4MTYzMTExOS44NjgsInN1YiI6IjVlNDVjNjhmODNlZTY3MDAxMTFmMmU5NiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.CeXrQwgB3roCAVs-Z2ayLRx99VIJbym7XSpcRjGzyLA" def __init__(self) -> None: diff --git a/scanner/scanner/requests.py b/scanner/scanner/requests.py index ee348682..63b35320 100644 --- a/scanner/scanner/requests.py +++ b/scanner/scanner/requests.py @@ -2,14 +2,12 @@ from __future__ import annotations from logging import getLogger from types import TracebackType -from typing import Annotated, Literal +from typing import Literal from asyncpg import Connection -from fastapi import Depends from pydantic import Field, TypeAdapter from .client import KyooClient -from .database import get_db from .models.videos import Guess, Resource from .providers.composite import CompositeProvider from .utils import Model @@ -31,10 +29,7 @@ class Request(Model, extra="allow"): class RequestCreator: - def __init__( - self, - database: Annotated[Connection, Depends(get_db)], - ): + def __init__(self, database: Connection): self._database = database async def enqueue(self, requests: list[Request]): @@ -54,9 +49,9 @@ class RequestCreator: class RequestProcessor: def __init__( self, - database: Annotated[Connection, Depends(get_db)], - client: Annotated[KyooClient, Depends], - providers: Annotated[CompositeProvider, Depends], + database: Connection, + client: KyooClient, + providers: CompositeProvider, ): self._database = database self._client = client diff --git a/scanner/scanner/routers/routes.py b/scanner/scanner/routers/routes.py index 6354e0df..def3bc1c 100644 --- a/scanner/scanner/routers/routes.py +++ b/scanner/scanner/routers/routes.py @@ -2,7 +2,7 @@ from typing import Annotated from fastapi import APIRouter, BackgroundTasks, Depends, Security -from ..fsscan import Scanner +from ..fsscan import FsScanner, create_scanner from ..jwt import validate_bearer router = APIRouter() @@ -12,11 +12,10 @@ router = APIRouter() "/scan", status_code=204, response_description="Scan started.", - response_model=None, ) async def trigger_scan( tasks: BackgroundTasks, - scanner: Annotated[Scanner, Depends(Scanner)], + scanner: Annotated[FsScanner, Depends(create_scanner)], _: Annotated[None, Security(validate_bearer, scopes=["scanner.trigger"])], ): """ diff --git a/scanner/scanner/utils.py b/scanner/scanner/utils.py index 8cf6f9e3..6bf6ae91 100644 --- a/scanner/scanner/utils.py +++ b/scanner/scanner/utils.py @@ -1,4 +1,4 @@ -from abc import ABC, ABCMeta +from abc import ABCMeta from typing import Annotated, Any, Callable, override from langcodes import Language as BaseLanguage