|
1 | 1 | # Maintainerr-to-Plex Sync 🚀 |
2 | | - |
3 | 2 | [🇩🇪 Deutsch](README_DE.md) | [🇬🇧 English](README.md) |
4 | 3 |
|
5 | 4 | [](https://github.com/00Scooby/maintainerr-plex-sync/actions/workflows/docker-publish.yml) |
|
10 | 9 |
|
11 | 10 | **Maintainerr-to-Plex Sync** ist ein vollautomatisierter Python-Microservice, der die Lücke zwischen den Löschplänen von [Maintainerr](https://github.com/jorenn92/Maintainerr) und deiner Plex-Oberfläche schliesst. |
12 | 11 |
|
13 | | -Anstatt globale Metadaten zu ändern oder manuell zu prüfen, wann Medien ablaufen, berechnet dieses Skript die exakten verbleibenden Tage für jedes Item in deinen Maintainerr-Kollektionen. Anschliessend verbindet es sich mit deinem Plex-Server und aktualisiert nahtlos die **benutzerdefinierte Sortierung** der Kollektion. Items, die kurz vor der Löschung stehen, wandern automatisch nach oben! |
| 12 | +Anstatt globale Metadaten zu ändern, berechnet dieses Skript die exakten verbleibenden Tage für jedes Item in deinen Maintainerr-Kollektionen und aktualisiert nahtlos die **benutzerdefinierte Sortierung** in Plex. Medien, die kurz vor der Löschung stehen, wandern automatisch nach oben! |
14 | 13 |
|
15 | 14 | ## ✨ Features |
16 | | -* **Sicheres Sortieren:** Nutzt die benutzerdefinierte Kollektionssortierung von Plex. Deine globalen `titleSort`-Metadaten der Mediathek bleiben komplett unangetastet. |
17 | | -* **Multi-Collection Support:** Synchronisiere so viele Maintainerr-Kollektionen gleichzeitig, wie du möchtest. |
18 | | -* **Smarte Kometa-Overlays:** Generiert dynamisch bibliotheksspezifische YAML-Dateien für [Kometa](https://kometa.wiki/). Enthält native Unterstützung für Overlays auf Staffel-Ebene und eine intelligente Grammatik-Logik (z. B. "1 Tag" vs. "2 Tage"). |
19 | | -* **Integrierter Scheduler:** Führe das Skript sofort aus (`NOW`) oder richte mehrere tägliche Zeitpläne ein (z. B. `04:30`, `12:00`). Der Container bleibt aktiv und wartet auf seinen Einsatz. |
20 | | -* **Safety First:** Beinhaltet einen `dry_run`-Modus, um deine Konfiguration zu testen, sowie einen `undo`-Modus, um eine Kollektion auf die Standard-Plex-Sortierung zurückzusetzen. |
21 | | -* **Leichtgewicht:** Basiert auf `python:3.9-slim` mit minimalen Abhängigkeiten. |
| 15 | +* **Interaktives Dashboard:** Verwalte alle Einstellungen, gestalte deine Overlays und überwache Logs über eine moderne Web-Oberfläche (Port 8501). |
| 16 | +* **Live WYSIWYG Vorschau:** Echtzeit-Simulation deiner Kometa-Banner. Lade eigene Poster hoch, um das Design vorab zu prüfen. |
| 17 | +* **Sicheres Sortieren:** Nutzt die benutzerdefinierte Kollektionssortierung von Plex. Deine globalen Mediathek-Metadaten bleiben unangetastet. |
| 18 | +* **Smarte Kometa-Overlays:** Generiert dynamisch Dateien für [Kometa](https://kometa.wiki/) mit anpassbaren Farben, Offsets und Radien. |
| 19 | +* **Integrierter Scheduler:** Richte mehrere tägliche Zeitpläne direkt in der UI ein. Der Hintergrund-Thread hält alles synchron. |
| 20 | +* **Leichtgewicht:** Basiert auf `python:3.9-slim` mit minimalem Ressourcenverbrauch. |
22 | 21 |
|
23 | 22 | ## 🚀 Installation (Docker Compose) |
24 | 23 |
|
25 | | -Der einfachste Weg, dieses Tool auszuführen, ist über Docker. |
26 | | - |
27 | | -1. Erstelle ein Verzeichnis für das Projekt und wechsle dorthin. |
28 | | -2. Erstelle eine `docker-compose.yml`-Datei: |
29 | | - |
30 | 24 | ```yaml |
31 | 25 | version: "3.8" |
32 | 26 |
|
33 | 27 | services: |
34 | 28 | maintainerr-plex-sync: |
35 | | - # Du kannst :latest für automatische Updates nutzen oder eine Version pinnen, z.B. :1.1.10 |
36 | 29 | image: ghcr.io/00scooby/maintainerr-plex-sync:latest |
37 | 30 | container_name: maintainerr_sync |
38 | 31 | restart: unless-stopped |
39 | 32 | ports: |
40 | | - - "8501:8501" |
| 33 | + - "8501:8501" # Dashboard-Zugriff |
41 | 34 | environment: |
42 | | - - TZ=Europe/Zurich # Zeitzone anpassen |
43 | | - - PLEX_URL=[http://192.168.1.100:32400](http://192.168.1.100:32400) |
| 35 | + - TZ=Europe/Zurich |
| 36 | + - PLEX_URL=http://[DEINE-IP]:32400 |
44 | 37 | - PLEX_TOKEN=dein_plex_token_hier |
45 | | - - MAINTAINERR_URL=[http://192.168.1.100:6246](http://192.168.1.100:6246) |
| 38 | + - MAINTAINERR_URL=http://[DEINE-IP]:6246 |
46 | 39 | volumes: |
47 | 40 | - ./config.yml:/app/config.yml |
48 | | - # OPTIONAL: Mappe dies, um während eines 'dry_run' auf die exportierten YAML-Dateien zuzugreifen |
49 | | - - ./:/dry_run/ |
50 | 41 | - ./logs:/logs |
51 | | - # OPTIONAL: Mappe dies, wenn du das Kometa-Overlay-Feature nutzen möchtest |
52 | 42 | - ./kometa/config:/app/kometa_export |
53 | 43 | ``` |
54 | | -3. Erstelle deine `config.yml` im selben Verzeichnis (siehe Konfiguration unten). |
55 | | -4. Führe `docker compose up -d` aus. |
56 | | - |
57 | | -## ⚙️ Konfiguration (`config.yml`) |
58 | | -Mappe diese Datei in deinen Container unter `/app/config.yml`. |
59 | | - |
60 | | -```YAML |
61 | | -# ========================================== |
62 | | -# Maintainerr-to-Plex Sync Configuration |
63 | | -# ========================================== |
64 | | -
|
65 | | -settings: |
66 | | - # Modi: "run" (aktiv), "dry_run" (testen), "undo" (Plex-Sortierung zurücksetzen) |
67 | | - run_mode: "run" |
68 | | - |
69 | | - # Log-Level: DEBUG, INFO, WARNING, ERROR |
70 | | - log_level: "INFO" |
71 | | - |
72 | | - # "NOW" für einen sofortigen, einmaligen Start (Container beendet sich danach) |
73 | | - # ODER eine Liste von Uhrzeiten für den Standby-Modus |
74 | | - run_schedules: |
75 | | - - "04:30" |
76 | | - |
77 | | - # Exakte Namen der Maintainerr-Kollektionen, die synchronisiert werden sollen |
78 | | - collection_names: |
79 | | - - "Series unseen for 360 days" |
80 | | - - "Movies unseen for 1 year" |
81 | | -
|
82 | | - # ========================================== |
83 | | - # Kometa Overlay Integration (Optional) |
84 | | - # ========================================== |
85 | | - enable_kometa_overlays: false |
86 | | - |
87 | | - # Generiere Overlays nur für diese Plex-Mediatheken |
88 | | - kometa_allowed_libraries: |
89 | | - - "Filme" |
90 | | - - "Serien" |
91 | | - |
92 | | - # Dynamische Farb-Schwellenwerte |
93 | | - kometa_threshold_days: 10 |
94 | | - kometa_color_urgent: "#E31E24" # Hintergrundfarbe für <= Schwelle (z. B. Rot) |
95 | | - kometa_text_color_urgent: "#FFFFFF" # Textfarbe für <= Schwelle (z. B. Weiss) |
96 | | - kometa_color_warning: "#F1C40F" # Hintergrundfarbe für > Schwelle (z. B. Gelb) |
97 | | - kometa_text_color_warning: "#141414" # Textfarbe für > Schwelle (z. B. Dunkelgrau/Schwarz für Kontrast) |
98 | | -``` |
99 | 44 |
|
100 | | -## 🛠️ Wie es funktioniert |
101 | | -1. Das Skript ruft die angegebenen Kollektionen über deine Maintainerr-API ab. |
102 | | -2. Es berechnet die verbleibenden Tage bis zur Löschung für jedes Item basierend auf `addDate` und `deleteAfterDays`. |
103 | | -3. Es verbindet sich via `plexapi`-Wrapper mit Plex und aktualisiert die benutzerdefinierte Sortierung der Kollektion. |
104 | | -4. Falls aktiviert, generiert es automatisch bibliotheksspezifische YAML-Dateien (z. B. `maintainerr_Filme.yml`, `maintainerr_Serien.yml`), die Kometa lesen kann, um visuelle Ablauf-Banner zu deinen Medien hinzuzufügen. |
105 | | - |
106 | | -## 🎨 Kometa Setup |
107 | | -Um die generierten Overlay-Dateien zu nutzen, füge sie einfach unter den jeweiligen Mediatheken in deine Kometa-Konfiguration ein. Da das Skript die Exporte nach Mediatheken-Namen aufteilt, vermeidest du Soft Fails in deinen Kometa-Logs! |
108 | | - |
109 | | -```YAML |
110 | | -libraries: |
111 | | - Filme: |
112 | | - overlay_path: |
113 | | - - file: config/maintainerr_Filme.yml |
114 | | - Serien: |
115 | | - overlay_path: |
116 | | - - file: config/maintainerr_Serien.yml |
117 | | -``` |
| 45 | +## 🛠️ Funktionsweise |
| 46 | +1. **Dashboard:** Öffne `http://[DEINE-IP]:8501`. |
| 47 | +2. **Konfiguration:** Wähle Mediatheken und Kollektionen bequem über Dropdowns aus. |
| 48 | +3. **Design:** Nutze die Schieberegler für das Banner-Design und kontrolliere das Ergebnis in der Live-Vorschau. |
| 49 | +4. **Automatisierung:** Speichere deine Sync-Uhrzeiten und lass den Hintergrund-Ninja die Arbeit erledigen. |
118 | 50 |
|
119 | 51 | ## 🚑 Troubleshooting |
120 | | - |
121 | | -### ⚠️ Log: "Kollektion '[Name]' in Plex nicht gefunden!" |
122 | | -**Ursache:** Das Skript hat die Kollektion zwar in Maintainerr gefunden, aber in Plex existiert sie unter diesem exakten Namen nicht. |
123 | | -**Lösung:** Prüfe die genaue Schreibweise in Plex und Maintainerr. Sie muss zu 100 % identisch sein (inklusive Leerzeichen und Gross-/Kleinschreibung). |
124 | | - |
125 | | -### ⚠️ Log: "DRY RUN MODUS AKTIV: Plex wird nicht verändert." |
126 | | -**Ursache:** Das Skript liest nur Daten. Es sortiert nichts in Plex um und schreibt die generierten Kometa-Dateien in einen Testordner. |
127 | | -**Lösung:** Ändere in deiner `config.yml` den Wert `run_mode: "dry_run"` zu `run_mode: "run"` und starte den Container neu, um die Änderungen auf Plex anzuwenden. |
128 | | - |
129 | | -### ⚠️ Es werden keine Kometa YAML-Dateien exportiert |
130 | | -**Ursache 1:** Die Kometa-Funktion ist in deiner Konfiguration deaktiviert. |
131 | | -**Lösung 1:** Stelle sicher, dass `enable_kometa_overlays: true` in der `config.yml` gesetzt ist. |
132 | | -**Ursache 2:** Die Mediatheken-Namen stimmen nicht überein. |
133 | | -**Lösung 2:** Prüfe den Block `kometa_allowed_libraries`. Die Namen (z. B. "Filme", "Serien") müssen exakt so heissen wie die Mediatheken auf deinem Plex-Server. |
134 | | - |
135 | | -### ⚠️ Log: "Fehler bei der Verbindung zu Plex / Maintainerr" |
136 | | -**Ursache:** Das Skript kann die jeweiligen APIs nicht erreichen oder die Authentifizierung schlägt fehl. |
137 | | -**Lösung:** Kontrolliere in deiner `docker-compose.yml` (oder `.env` Datei), ob die `PLEX_URL`, der `PLEX_TOKEN` und die `MAINTAINERR_URL` absolut korrekt und aus dem Docker-Container heraus erreichbar sind. |
| 52 | +Nutze den Bereich **Live-Logs** am Ende des Dashboards für Echtzeit-Feedback zu API-Verbindungen und dem Synchronisationsstatus. |
0 commit comments