Semantische Filmsuche für deine Jellyfin-Sammlung. Durchsuche deine Filme mit natürlicher Sprache – „ein netter Familienfilm mit Pferden" – und erhalte passende Ergebnisse mit direktem Jellyfin-Link.
| app | ||
| .env.example | ||
| .gitignore | ||
| copy_random.sh | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
| requirements.txt | ||
🎬 Filmsuche
Semantische Filmsuche für deine Jellyfin-Sammlung. Durchsuche deine Filme mit natürlicher Sprache – „ein netter Familienfilm mit Pferden" – und erhalte passende Ergebnisse mit direktem Jellyfin-Link.
Features
- Natürlichsprachliche Suche – beschreibe was du sehen willst
- Stimmungs-Filter – optional die gewünschte Stimmung angeben
- Benutzerprofile mit FSK – Kinder sehen nur altersgerechte Filme
- PIN-Schutz – für Profile mit höherer Altersfreigabe
- Ähnliche Filme – klicke einen Film an für Empfehlungen
- Jellyfin-Integration – direkter "In Jellyfin öffnen"-Link
- Dark Mode – schickes dunkles Design
- Responsive – funktioniert auf Handy, Tablet & Desktop
Architektur
ollama-net db-net
├── ollama-server:11434 ←→ ├── chromadb:8000
│ (LLM + Embeddings) │ (Vektordatenbank)
│ │
└── filmsuche:42000 ─────────────┘
(Python/FastAPI)
├── liest /media/filme/*.nfo
└── verlinkt auf Jellyfin (HTTPS)
Voraussetzungen
- Ollama läuft im Docker-Netzwerk
ollama-net - ChromaDB läuft im Docker-Netzwerk
db-net - Jellyfin ist via HTTPS erreichbar
- Embedding-Modell in Ollama geladen:
docker exec ollama-server ollama pull nomic-embed-text
ChromaDB (falls noch nicht vorhanden)
# chromadb/docker-compose.yml
version: "3.8"
services:
chromadb:
image: chromadb/chroma
container_name: chromadb
restart: unless-stopped
ports:
- "42010:8000"
volumes:
- CHANGE_TO_COMPOSE_DATA_PATH/42_chromadb/data:/chroma/chroma
networks:
- db-net
networks:
db-net:
external: true
Setup
1. docker-compose.yml anpassen
Drei Stellen in docker-compose.yml müssen angepasst werden:
volumes:
- CHANGE_TO_COMPOSE_DATA_PATH/42_filmsuche/data:/app/data
- /pfad/zu/jellyfin/filme:/media/filme:ro # ← Pfad zu deinen NFO-Dateien
environment:
- JELLYFIN_URL=https://dein-jellyfin.example.com # ← Deine Jellyfin-URL
- JELLYFIN_API_KEY=DEIN_API_KEY_HIER # ← Dein API-Key
2. Jellyfin API-Key erstellen
- Jellyfin → Dashboard → API-Schlüssel
- Neuen Schlüssel erstellen (Name: "Filmsuche")
- Den Key in
docker-compose.ymleintragen
3. Netzwerke erstellen (falls noch nicht vorhanden)
docker network create ollama-net
docker network create db-net
4. Starten
cd filmsuche
docker compose up -d --build
5. Filme indexieren
- Öffne
http://dein-server:42000 - Klicke unten auf ⚙️ Verwaltung
- Prüfe ob Ollama (🟢) und ChromaDB (🟢) verbunden sind
- Klicke 🔄 Filme neu indexieren
- Warte bis alle Filme verarbeitet sind (~2-5 Min. für 1500 Filme)
6. Suchen!
Wähle ein Profil, optional eine Stimmung, und beschreibe deinen Wunschfilm.
Umgebungsvariablen
| Variable | Standard | Beschreibung |
|---|---|---|
OLLAMA_URL |
http://ollama-server:11434 |
Ollama API |
CHROMA_URL |
http://chromadb:8000 |
ChromaDB API |
JELLYFIN_URL |
http://localhost:8096 |
Jellyfin URL (wie du sie im Browser öffnest) |
JELLYFIN_API_KEY |
– | Jellyfin API-Schlüssel |
COLLECTION_NAME |
filmsuche |
ChromaDB Collection-Name |
EMBEDDING_MODEL |
nomic-embed-text |
Ollama Embedding-Modell |
NFO_PATH |
/media/filme |
Pfad zu den NFO-Dateien im Container |
Profile
Beim ersten Start werden drei Standard-Profile erstellt:
| Profil | FSK | PIN |
|---|---|---|
| 👨👩👧👦 Familie | 6 | – |
| 🎓 Jugendliche | 12 | – |
| 🎬 Erwachsene | 18 | 1234 |
Profile können über die Verwaltung angepasst werden. Die Standard-PIN für "Erwachsene" sollte geändert werden.
Tipps
- Suchanfragen funktionieren am besten auf Deutsch (weil die NFO-Plots oft deutsch sind)
- Ähnliche Filme: Klicke auf eine Filmkarte, um ähnliche Filme zu finden
- Neu-Indexierung bei neuen Filmen – die alten bleiben erhalten (Upsert)
- Die ChromaDB-Collection
filmsuchekann unabhängig von anderen Projekten genutzt werden