mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-06-03 21:54:49 -04:00
fastapi's di is utter garbage
This commit is contained in:
parent
9bcca13cbc
commit
8592191808
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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"])],
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user