- Python 95.2%
- Shell 2.5%
- Makefile 1.8%
- Dockerfile 0.5%
| .gitignore | ||
| app.py | ||
| CHANGELOG.md | ||
| config.yaml.example | ||
| config.yaml.template | ||
| CONTRIBUTING.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| email_sender.py | ||
| FEATURES.md | ||
| install.sh | ||
| jellyfin_api.py | ||
| LICENSE | ||
| Makefile | ||
| newsletter.py | ||
| PROJECT_OVERVIEW.md | ||
| QUICKSTART.md | ||
| README.md | ||
| requirements.txt | ||
| scheduler.py | ||
| VERSION | ||
📧 Jellyfin Newsletter
Automatisches Newsletter-System für Jellyfin, das regelmäßig über neue Medien in deiner Bibliothek informiert.
✨ Features
Kernfunktionen
- 📚 Bibliotheksauswahl: Wähle welche Bibliotheken überwacht werden
- ⏰ Automatischer Versand: Täglich, wöchentlich oder monatlich
- 👥 Empfängerverwaltung: Mehrere Empfänger mit Opt-in/Opt-out
- 🎨 HTML Templates: Schöne Email-Vorlagen mit Postern und Metadaten
- 🔧 Web-Interface: Einfache Konfiguration über NiceGUI
Erweiterte Features
- Zeitplanung: Flexibler Zeitplan (täglich/wöchentlich/monatlich)
- Zeitfenster: Nur neue Medien der letzten X Tage
- Gruppierung: Nach Bibliothek, Genre oder Datum
- Filter: Ausschluss bestimmter Genres/Tags
- Sortierung: Nach Datum, Rating oder alphabetisch
- Mindestanzahl: Nur versenden wenn X neue Items vorhanden
- Vorschau: Newsletter vor Versand testen
- Deep Links: Direktlinks zu Medien in Jellyfin
🚀 Installation
Voraussetzungen
- Docker & Docker Compose
- Jellyfin Server mit API Zugriff
- SMTP Server (Gmail, SendGrid, etc.)
Docker Compose (empfohlen)
- Repository klonen oder Dateien kopieren
git clone <repo-url> jellyfin-newsletter
cd jellyfin-newsletter
- Konfiguration erstellen
cp config.yaml.example config.yaml
- Container starten
docker-compose up -d
- Web-Interface öffnen
http://localhost:8080
Manuelle Installation
- Dependencies installieren
pip install -r requirements.txt
- Konfiguration erstellen
cp config.yaml.example config.yaml
- Anwendung starten
python app.py
⚙️ Konfiguration
Jellyfin API Key erstellen
- Öffne Jellyfin Dashboard
- Gehe zu Dashboard → API Keys
- Klicke auf + um neuen Key zu erstellen
- Gib einen Namen ein (z.B. "Newsletter")
- Kopiere den API Key
Gmail SMTP Setup
Für Gmail benötigst du ein App-Passwort:
- Gehe zu Google Account Settings
- Sicherheit → 2-Faktor-Authentifizierung aktivieren
- App-Passwörter erstellen
- Wähle "Mail" und "Anderes Gerät"
- Kopiere das generierte Passwort
config.yaml:
smtp:
host: "smtp.gmail.com"
port: 587
username: "deine-email@gmail.com"
password: "xxxx xxxx xxxx xxxx" # App-Passwort
from_email: "deine-email@gmail.com"
from_name: "Jellyfin Newsletter"
Andere SMTP Provider
SendGrid:
smtp:
host: "smtp.sendgrid.net"
port: 587
username: "apikey"
password: "YOUR_SENDGRID_API_KEY"
Mailgun:
smtp:
host: "smtp.mailgun.org"
port: 587
username: "postmaster@your-domain.mailgun.org"
password: "YOUR_MAILGUN_PASSWORD"
Eigener Mailserver:
smtp:
host: "mail.example.com"
port: 587 # oder 465 für SSL
username: "newsletter@example.com"
password: "YOUR_PASSWORD"
📖 Nutzung
Web-Interface
Das Admin-Interface ist unter http://localhost:8080 erreichbar und bietet folgende Tabs:
1. Jellyfin
- Server URL und API Key konfigurieren
- Verbindung testen
- Bibliotheken auswählen
2. Newsletter
- Minimale Anzahl neuer Items
- Tage zurückblicken
- Gruppierung (Bibliothek/Genre/Datum)
- Sortierung (Datum/Rating/Alphabetisch)
- Poster und Metadaten aktivieren
3. SMTP
- SMTP Server Einstellungen
- Absender konfigurieren
4. Empfänger
- Email-Adressen hinzufügen/entfernen
- Empfängerliste verwalten
5. Template
- Header/Footer Text
- Beschreibung aktivieren
- Beschreibungslänge
6. Zeitplan
- Zeitplan wählen (täglich/wöchentlich/monatlich)
- Wochentag/Tag im Monat
- Uhrzeit festlegen
7. Test & Vorschau
- Test-Newsletter an beliebige Email senden
- Vorschau im Browser anzeigen
- Manueller Versand an alle Empfänger
Zeitplan-Beispiele
Jeden Montag um 9:00 Uhr:
schedule: "weekly"
schedule_day: 0 # 0=Montag
schedule_time: "09:00"
Täglich um 18:00 Uhr:
schedule: "daily"
schedule_time: "18:00"
Jeden 1. des Monats um 10:00 Uhr:
schedule: "monthly"
schedule_day: 1
schedule_time: "10:00"
Filter-Beispiele
Dokumentationen ausschließen:
excluded_genres:
- "Documentary"
- "News"
Kinderinhalte ausschließen:
excluded_tags:
- "Kids"
- "Children"
🎨 Template Anpassung
Die HTML-Templates befinden sich in templates/newsletter.html und können vollständig angepasst werden.
Custom Template erstellen
- Erstelle
templates/Ordner falls nicht vorhanden - Kopiere das Default-Template aus
newsletter.py - Passe HTML/CSS nach Belieben an
- Template verwendet Jinja2 Syntax
Verfügbare Template-Variablen:
header_text- Header Textfooter_text- Footer Textgroups- Liste der gruppierten Itemsconfig- Gesamte Konfigurationjellyfin_url- Jellyfin Server URLcurrent_date- Aktuelles Datumtotal_items- Anzahl neuer Items
🔧 Erweiterte Konfiguration
Proxmox Integration
In docker-compose.yml:
services:
jellyfin-newsletter:
# ...
extra_hosts:
- "jellyfin:192.168.1.100" # Jellyfin Server IP
Hinter Reverse Proxy (Pangolin)
services:
jellyfin-newsletter:
# ...
networks:
- proxy
- default
networks:
proxy:
external: true
name: pangolin_default
Umgebungsvariablen
Alternativ zur config.yaml können auch Environment Variables genutzt werden:
environment:
- JELLYFIN_URL=http://jellyfin:8096
- JELLYFIN_API_KEY=your_key
- SMTP_HOST=smtp.gmail.com
- SMTP_PORT=587
- SMTP_USERNAME=your@email.com
- SMTP_PASSWORD=your_password
🐛 Troubleshooting
Newsletter wird nicht versendet
- Logs prüfen:
docker-compose logs -f jellyfin-newsletter
-
Verbindung testen:
- Web-Interface → Jellyfin Tab → "Verbindung testen"
- Prüfe API Key und URL
-
SMTP testen:
- Test & Vorschau Tab → Test Newsletter versenden
- Prüfe SMTP Credentials
Keine neuen Items im Newsletter
- Prüfe
days_lookbackEinstellung - Prüfe ob Bibliotheken korrekt ausgewählt sind
- Prüfe
min_itemsEinstellung - Prüfe Filter (excluded_genres, excluded_tags)
Poster werden nicht angezeigt
- Prüfe ob Jellyfin Server von außen erreichbar ist
- Eventuell Reverse Proxy Konfiguration prüfen
include_posters: falsesetzen wenn Probleme bestehen
SMTP Authentifizierung fehlschlägt
Gmail:
- App-Passwort verwenden (nicht reguläres Passwort)
- 2FA muss aktiviert sein
Andere Provider:
- Prüfe ob Port korrekt ist (587 für TLS, 465 für SSL)
- Prüfe ob less secure apps aktiviert ist (falls erforderlich)
📊 Monitoring
Logs
# Docker Logs live verfolgen
docker-compose logs -f
# Nur Newsletter logs
docker-compose logs -f | grep newsletter
Scheduler Status
Der Scheduler läuft im Hintergrund und loggt:
- Nächster geplanter Versand
- Versanderfolge
- Fehler
🔒 Sicherheit
Best Practices
-
API Key Schutz:
- Nutze Read-Only API Keys wenn möglich
- Sichere config.yaml mit passenden Berechtigungen
-
SMTP Credentials:
- Nutze App-Passwörter statt Hauptpasswort
- Erwäge Secrets Management (Docker Secrets, etc.)
-
Network Security:
- Binde Web-Interface nur an localhost wenn möglich
- Nutze HTTPS über Reverse Proxy
Docker Secrets (optional)
services:
jellyfin-newsletter:
secrets:
- jellyfin_api_key
- smtp_password
secrets:
jellyfin_api_key:
file: ./secrets/jellyfin_api_key.txt
smtp_password:
file: ./secrets/smtp_password.txt
🔄 Updates
Docker
# Container stoppen
docker-compose down
# Neue Version pullen/builden
git pull
docker-compose build
# Container starten
docker-compose up -d
Backup
Sichere diese Dateien:
config.yamldata/(falls vorhanden)
📝 Lizenz
MIT License - nutze und modifiziere nach Belieben!
🤝 Beitragen
Pull Requests sind willkommen! Für größere Änderungen bitte zuerst ein Issue öffnen.
💡 Ideen für Erweiterungen
- Opt-out Links in Emails
- "Auf Watchlist" Button im Newsletter
- Multi-Language Support
- Statistiken Dashboard
- Webhook Support für Discord/Slack
- Custom CSS Upload im Web-Interface
- Email Template Gallery
📞 Support
Bei Fragen oder Problemen:
- Prüfe die Logs
- Schau in die Troubleshooting Sektion
- Erstelle ein GitHub Issue
Viel Spaß mit deinem automatischen Jellyfin Newsletter! 🎬📧