Kino-Projekt
Interne WebUI zum Prüfen und Importieren von Inhalten aus legalen Quellen in Jellyfin.
Sicherheitsgrenzen
Dieses Projekt implementiert bewusst keine Scraper für Piracy-Seiten, keine DRM-/Paywall-/Login-Umgehung und keinen Cookie-Import. Unterstützt werden YouTube-Metadaten via yt-dlp, öffentliche Internet-Archive-Items sowie konservativ geprüfte öffentliche Medien-/Mediathek-URLs.
Entwicklung
cd backend
python -m venv .venv
. .venv/bin/activate
pip install -e '.[test]'
pytest -q
uvicorn app.main:app --host 0.0.0.0 --port 8080
Healthcheck: curl http://localhost:8080/health
API-MVP
POST /api/probeprüft eine URL und liefert Metadaten, ohne einen Download zu starten.POST /api/importslegt Source + Import-Job in SQLite an und startet den Import im Hintergrund.GET /api/importsundGET /api/imports/{id}zeigen Status/Fortschritt/Fehler an.GET /api/sourceslistet bekannte Quellen.
Zielprofile
Die WebUI bietet drei Jellyfin-Zielprofile an:
film→/jellyfin/Filme/<Titel> (<Jahr>)/serie→/jellyfin/Serien/<Serientitel>/Staffel<N>/<SxxExx - Episodentitel>/clip→/jellyfin/YouTube-Mediathek/<Kanal oder Quelle>/<Titel> [<id>]/
Optionale Titel-/Jahr-/Serienfelder dienen nur zur Zielpfad-Korrektur; Pfade werden serverseitig normalisiert und bleiben unter KINOPROJEKT_MEDIA_ROOT.
App-Login
Wenn KINOPROJEKT_ADMIN_PASSWORD_HASH und KINOPROJEKT_SESSION_SECRET gesetzt sind, schützt ein lokaler App-Login die API. Das Passwort wird nur als Argon2-Hash gespeichert; die Session liegt in einem HttpOnly, Secure, SameSite=Lax Cookie.
Hash/Secret für die geschützte Zielhost-.env erzeugen:
cd backend
python -c "from app.services.auth import hash_password; import getpass; print(hash_password(getpass.getpass()))"
python -c "import secrets; print(secrets.token_urlsafe(48))"
Jellyfin wird nur aktualisiert, wenn JELLYFIN_API_KEY in einer geschützten Zielhost-Umgebung gesetzt ist; Secrets gehören nicht in Nextcloud.