- Rust 100%
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
galeone-sync
Brücke für Musik-Synchronisation über mehrere Jellyfin-Clients desselben Kontos.
Warum
Jellyfins SyncPlay ("Synchronwiedergabe") funktioniert nur in Clients, die das Protokoll sprechen: Jellyfin Web, Jellyfin Android, Jellyfin Media Player. Finamp, Swiftfin, Jellyfin iOS und Findroid können es nicht.
Sie melden dem Server aber PlayState / Play als unterstützte Kommandos — sie lassen
sich also über die Session-API fernsteuern. galeone-sync ist genau diese Fernsteuerung:
ein kleiner Dienst, der die Sitzungen eines Kontos beobachtet und den anderen Geräten
Pause / Seek / PlayNow schickt.
Modi
- handoff (Default) — genau ein Gerät spielt. Startet auf einem Gerät neu die Wiedergabe (Titelwechsel zählt mit), werden alle anderen pausiert. Das ist der Gerätewechsel: das alte Gerät wird still, das neue spielt weiter.
- mirror — alle gerade spielenden Geräte bleiben am selben Titel und an derselben Position wie das zuletzt gestartete. Korrigiert Drift per Seek.
Geräte, die nichts abspielen, werden nie gestartet — es wird nur eingegriffen, wenn
schon Wiedergabe läuft. Video-Sitzungen werden ignoriert (MediaType == Audio).
Build & Installation
cargo build --release
install -m 755 target/release/galeone-sync ~/bin/galeone-sync
Benutzung
galeone-sync --list # Sitzungen + Fernsteuerbarkeit anzeigen
galeone-sync --once --verbose # ein Durchlauf, nichts senden
galeone-sync --apply --mode handoff # dauerhaft (so läuft der Dienst)
galeone-sync --apply --mode mirror --drift 1.5
Optionen: --user, --interval (Sekunden), --drift (Sekunden), --polls n,
--url, --apply, --once, --list, --verbose.
JELLYFIN_URL (Default http://127.0.0.1:8096), JELLYFIN_USER und
JELLYFIN_API_KEY (sonst aus ~/.hermes/profiles/galeone/.env) werden aus der
Umgebung gelesen. Fehlt das Konto (--user bzw. JELLYFIN_USER), bricht das Tool mit
Exit 1 ab.
Tests
cargo test # 6 Unit-Tests + 4 Integrationstests gegen einen TCP-Mock
Die Integrationstests prüfen: Handoff pausiert das vorherige Gerät genau einmal,
ohne --apply wird nichts gesendet, --list sendet auch mit --apply --mode mirror
nichts, und bei nur einem spielenden Gerät passiert nichts.
Grenzen
- Nur ein Konto (
--user), nur Audio. - Die Queue wird nicht übertragen — nur Titel und Position.
- Ob ein Client wirklich pausiert, hängt davon ab, dass er
PlayStateimplementiert. Finamp tut das (laut Session-Capabilities und Maintainer), der Web-Client meldet es nicht — für den ist SyncPlay der richtige Weg. - Kein Ersatz für SyncPlay bei Gleichzeit-Wiedergabe mit Driftkorrektur im Millisekundenbereich; dafür ist Jellyfins eigener Mechanismus zuständig.