fastapi's di is utter garbage

This commit is contained in:
Zoe Roux 2025-05-13 21:53:22 +02:00
parent 9bcca13cbc
commit 8592191808
No known key found for this signature in database
7 changed files with 24 additions and 37 deletions

View File

@ -5,7 +5,7 @@ from contextlib import asynccontextmanager
from fastapi import FastAPI from fastapi import FastAPI
from scanner.client import KyooClient from scanner.client import KyooClient
from scanner.fsscan import Scanner from scanner.fsscan import FsScanner
from scanner.providers.composite import CompositeProvider from scanner.providers.composite import CompositeProvider
from scanner.providers.themoviedatabase import TheMovieDatabase from scanner.providers.themoviedatabase import TheMovieDatabase
from scanner.requests import RequestCreator, RequestProcessor from scanner.requests import RequestCreator, RequestProcessor
@ -25,13 +25,11 @@ 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, CompositeProvider(tmdb)) as processor RequestProcessor(db, client, CompositeProvider(tmdb)) as processor,
): ):
# creating the processor makes it listen to requests event in pg # creating the processor makes it listen to requests event in pg
async with ( async with get_db() as db:
get_db() as db, scanner = FsScanner(client, RequestCreator(db))
):
scanner = Scanner(client, RequestCreator(db))
# 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:

View File

@ -3,12 +3,11 @@ import re
from logging import getLogger from logging import getLogger
from mimetypes import guess_file_type from mimetypes import guess_file_type
from os.path import dirname, exists, isdir, join from os.path import dirname, exists, isdir, join
from typing import Annotated
from fastapi import Depends
from watchfiles import Change, awatch from watchfiles import Change, awatch
from .client import KyooClient from .client import KyooClient
from .database import get_db
from .identifiers.identify import identify from .identifiers.identify import identify
from .models.metadataid import EpisodeId, MetadataId from .models.metadataid import EpisodeId, MetadataId
from .models.videos import For, Video, VideoInfo from .models.videos import For, Video, VideoInfo
@ -17,12 +16,13 @@ from .requests import Request, RequestCreator
logger = getLogger(__name__) logger = getLogger(__name__)
class Scanner: async def create_scanner():
def __init__( async with get_db() as db:
self, yield FsScanner(KyooClient(), RequestCreator(db))
client: Annotated[KyooClient, Depends(KyooClient)],
requests: Annotated[RequestCreator, Depends(RequestCreator)],
): class FsScanner:
def __init__(self, client: KyooClient, requests: RequestCreator):
self._client = client self._client = client
self._requests = requests self._requests = requests
self._info: VideoInfo = None # type: ignore self._info: VideoInfo = None # type: ignore

View File

@ -1,19 +1,14 @@
from typing import Annotated, override from typing import override
from fastapi import Depends
from langcodes import Language from langcodes import Language
from ..models.movie import Movie, SearchMovie from ..models.movie import Movie, SearchMovie
from ..models.serie import SearchSerie, Serie from ..models.serie import SearchSerie, Serie
from .provider import Provider from .provider import Provider
from .themoviedatabase import TheMovieDatabase
class CompositeProvider(Provider): class CompositeProvider(Provider):
def __init__( def __init__(self, themoviedb: Provider):
self,
themoviedb: Annotated[TheMovieDatabase, Depends],
):
self._tvdb: Provider = None # type: ignore self._tvdb: Provider = None # type: ignore
self._themoviedb = themoviedb self._themoviedb = themoviedb

View File

@ -19,13 +19,13 @@ from ..models.season import Season, SeasonTranslation
from ..models.serie import SearchSerie, Serie, SerieStatus, SerieTranslation from ..models.serie import SearchSerie, Serie, SerieStatus, SerieTranslation
from ..models.staff import Character, Person, Role, Staff from ..models.staff import Character, Person, Role, Staff
from ..models.studio import Studio, StudioTranslation from ..models.studio import Studio, StudioTranslation
from ..utils import Singleton, clean, to_slug from ..utils import clean, to_slug
from .provider import Provider, ProviderError from .provider import Provider, ProviderError
logger = getLogger(__name__) logger = getLogger(__name__)
class TheMovieDatabase(Provider, metaclass=Singleton): class TheMovieDatabase(Provider):
THEMOVIEDB_API_ACCESS_TOKEN = "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJjOWYzMjhhMDEwMTFiMjhmMjI0ODM3MTczOTVmYzNmYSIsIm5iZiI6MTU4MTYzMTExOS44NjgsInN1YiI6IjVlNDVjNjhmODNlZTY3MDAxMTFmMmU5NiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.CeXrQwgB3roCAVs-Z2ayLRx99VIJbym7XSpcRjGzyLA" THEMOVIEDB_API_ACCESS_TOKEN = "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJjOWYzMjhhMDEwMTFiMjhmMjI0ODM3MTczOTVmYzNmYSIsIm5iZiI6MTU4MTYzMTExOS44NjgsInN1YiI6IjVlNDVjNjhmODNlZTY3MDAxMTFmMmU5NiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.CeXrQwgB3roCAVs-Z2ayLRx99VIJbym7XSpcRjGzyLA"
def __init__(self) -> None: def __init__(self) -> None:

View File

@ -2,14 +2,12 @@ from __future__ import annotations
from logging import getLogger from logging import getLogger
from types import TracebackType from types import TracebackType
from typing import Annotated, Literal from typing import Literal
from asyncpg import Connection from asyncpg import Connection
from fastapi import Depends
from pydantic import Field, TypeAdapter from pydantic import Field, TypeAdapter
from .client import KyooClient from .client import KyooClient
from .database import get_db
from .models.videos import Guess, Resource from .models.videos import Guess, Resource
from .providers.composite import CompositeProvider from .providers.composite import CompositeProvider
from .utils import Model from .utils import Model
@ -31,10 +29,7 @@ class Request(Model, extra="allow"):
class RequestCreator: class RequestCreator:
def __init__( def __init__(self, database: Connection):
self,
database: Annotated[Connection, Depends(get_db)],
):
self._database = database self._database = database
async def enqueue(self, requests: list[Request]): async def enqueue(self, requests: list[Request]):
@ -54,9 +49,9 @@ class RequestCreator:
class RequestProcessor: class RequestProcessor:
def __init__( def __init__(
self, self,
database: Annotated[Connection, Depends(get_db)], database: Connection,
client: Annotated[KyooClient, Depends], client: KyooClient,
providers: Annotated[CompositeProvider, Depends], providers: CompositeProvider,
): ):
self._database = database self._database = database
self._client = client self._client = client

View File

@ -2,7 +2,7 @@ from typing import Annotated
from fastapi import APIRouter, BackgroundTasks, Depends, Security from fastapi import APIRouter, BackgroundTasks, Depends, Security
from ..fsscan import Scanner from ..fsscan import FsScanner, create_scanner
from ..jwt import validate_bearer from ..jwt import validate_bearer
router = APIRouter() router = APIRouter()
@ -12,11 +12,10 @@ router = APIRouter()
"/scan", "/scan",
status_code=204, status_code=204,
response_description="Scan started.", response_description="Scan started.",
response_model=None,
) )
async def trigger_scan( async def trigger_scan(
tasks: BackgroundTasks, tasks: BackgroundTasks,
scanner: Annotated[Scanner, Depends(Scanner)], scanner: Annotated[FsScanner, Depends(create_scanner)],
_: Annotated[None, Security(validate_bearer, scopes=["scanner.trigger"])], _: Annotated[None, Security(validate_bearer, scopes=["scanner.trigger"])],
): ):
""" """

View File

@ -1,4 +1,4 @@
from abc import ABC, ABCMeta from abc import ABCMeta
from typing import Annotated, Any, Callable, override from typing import Annotated, Any, Callable, override
from langcodes import Language as BaseLanguage from langcodes import Language as BaseLanguage