"""Connector registry helpers. Lazy factories — importy connectorów wykonują się dopiero w `get_movie_connectors()` żeby uniknąć circular imports (modeles/db). Każdy entry: `(name, class)` w porządku ingestu (primary FIRST, mirrory potem — `resolve_movie` wtedy ma do czego dokleić mirror playback sources). ## Jak dodać nowe movie site 1. Napisz subclass `DooplayConnector` w `app/connectors/dooplay.py` (jeśli site używa dooplay/PsyPlay WP theme) — wystarczy `name` + `base_url`. Jeśli inny theme, napisz osobny connector implementujący `BaseMovieConnector.fetch_movies()`. 2. Dodaj entry do `_MOVIE_CONNECTORS` poniżej. 3. Backend job `_job_movie_ingest` w `app/scheduler/jobs.py` automatycznie weźmie nowy connector przy następnym tick (24h domyślnie). 4. Do ad-hoc backfillu: `python -m app.scheduler.worker --once --strategy=movies --performers=`. ## Czemu paradisehill first Paradisehill jest jedynym sourcem z chapter markerami i pełnym metadata (director, rating, country) → idealnie kanoniczny. Dooplay mirrory rzadko mają chaptery i release_year zwykle pusty. Resolver `resolve_movie` po title-similarity matchuje mirror → primary paradisehill, dodając tylko playback sources (mangoporn:luluvid, :voe, …) które rozpakowują się na bezpośredni stream URL przez `extract_stream_from_hoster`. """ from __future__ import annotations def get_movie_connectors() -> list[tuple[str, type]]: """Zwraca listę (name, ConnectorCls) tuples w kolejności ingestu. Lazy import — uniknięcie circular import bo connectory zaczepiają db/models. """ from app.connectors.dooplay import ( MangopornConnector, PandamoviesConnector, StreampornConnector, ) from app.connectors.paradisehill import ParadisehillConnector return [ ("paradisehill", ParadisehillConnector), ("streamporn", StreampornConnector), ("pandamovies", PandamoviesConnector), ("mangoporn", MangopornConnector), ]