No description
Find a file
2026-11-02 10:30:50 +01:00
src initial: galeone-sync, Musik-Handoff zwischen Jellyfin-Geraeten 2026-11-02 09:18:28 +01:00
tests test: neutral fixture name instead of the real account 2026-11-02 10:30:50 +01:00
.gitignore initial: galeone-sync, Musik-Handoff zwischen Jellyfin-Geraeten 2026-11-02 09:18:28 +01:00
Cargo.lock initial: galeone-sync, Musik-Handoff zwischen Jellyfin-Geraeten 2026-11-02 09:18:28 +01:00
Cargo.toml initial: galeone-sync, Musik-Handoff zwischen Jellyfin-Geraeten 2026-11-02 09:18:28 +01:00
README.md initial: galeone-sync, Musik-Handoff zwischen Jellyfin-Geraeten 2026-11-02 09:18:28 +01:00

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 PlayState implementiert. 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.