No description
  • Go 96.1%
  • Makefile 3.1%
  • Dockerfile 0.8%
Find a file
zemdregon b7ee619369
Some checks are pending
CI / lint (push) Waiting to run
CI / test (push) Waiting to run
CI / build (push) Waiting to run
CI / docker (push) Blocked by required conditions
chore(deps): bump actions/setup-go to v7 (#17)
* chore(deps): bump actions/setup-go to v7

Self-hosted CI workflows.

* ci: setup-go v7 + cache false
2026-08-12 09:48:13 -05:00
.github chore(deps): bump actions/setup-go to v7 (#17) 2026-08-12 09:48:13 -05:00
cmd/module Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
deploy Align systemd data path with JELLYFIN_DATA_DIR default. 2026-07-22 19:52:44 -05:00
internal Sync module version metadata to 0.2.4. (#13) 2026-08-10 00:27:18 -05:00
proto/jellyfinv1 Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
.dockerignore Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
.env.example Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
.gitignore Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
.golangci.yml Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
CHANGELOG.md Sync module version metadata to 0.2.4. (#13) 2026-08-10 00:27:18 -05:00
COMPATIBILITY.md Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
CONTRIBUTING.md Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
Dockerfile Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
go.mod refactor: wire settings via sdk RegisterSettings (#12) 2026-08-09 23:21:28 -05:00
go.sum refactor: wire settings via sdk RegisterSettings (#12) 2026-08-09 23:21:28 -05:00
LICENSE Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
Makefile Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
muxcore.json Sync module version metadata to 0.2.4. (#13) 2026-08-10 00:27:18 -05:00
README.md Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
ROADMAP.md Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00
SECURITY.md Release jellyfin connector v0.2.0. 2026-07-22 19:52:27 -05:00

Jellyfin Playback Bridge

MuxCore playback module that talks to an external Jellyfin server.

Module ID: jellyfin · version 0.2.0 · minCoreVersion 0.4.0

Capabilities

  • playback.jellyfin / playback
  • settingsbase_url, api_key, webhook_secret, conflict_mode, sessions_poll_seconds

RPCs (JellyfinBridge)

  • RefreshLibrary — POST /Library/Refresh (or POST /Items/{id}/Refresh?Recursive=true when item_id set)
  • PlayURL{base}/web/index.html#!/details?id={item_id} deep-link
  • Status — configured flag, base URL, conflict mode, link count, sessions-poll flag
  • ListItemLinks / UpsertItemLink / DeleteItemLink — durable MuxCore ↔ Jellyfin ID map
  • MatchItem — match by provider IDs then path; upserts link when found
  • SyncLibrary — pull/push reconcile (direction: jellyfin | muxcore | both)

HTTP

  • POST /webhook — Jellyfin webhook → event bus + typed playback events
  • GET /healthz

When webhook_secret / JELLYFIN_WEBHOOK_SECRET is set, requests must send X-Jellyfin-Webhook-Secret: <secret> or Authorization: Bearer <secret>.

Playback events

Jellyfin notification MuxCore event
PlaybackStart playback.started
PlaybackProgress playback.progress
PlaybackStop playback.stopped

Payload JSON fields:

Field Notes
item_id / jellyfin_item_id Jellyfin item GUID
muxcore_id Resolved from item-link store when known
user_id / user_name Jellyfin user
session_id Session id when present
position_ticks / duration_ticks Jellyfin ticks
position_seconds / duration_seconds Derived (ticks / 1e7)
media_path / title Optional
is_paused Set by /Sessions poll
notification_type Raw webhook type

Raw webhook payloads are also published as jellyfin.<notificationtype> (lowercased), or jellyfin.library.changed when the type is missing.

Optional: set sessions_poll_seconds > 0 to poll /Sessions when webhooks are incomplete.

Library sync

Durable links live in {JELLYFIN_DATA_DIR}/settings.json.

Match order: existing link with Jellyfin ID → provider IDs → filesystem path.

Conflict mode (conflict_mode):

Mode Behavior
jellyfin (default) Jellyfin path/title/provider IDs win on conflict
muxcore Keep MuxCore metadata when both sides differ
manual Do not overwrite non-empty MuxCore fields from Jellyfin

On download.completed / media.imported / media.file.imported, triggers a full library refresh and attempts to match the imported item into the link store.

Env

Var Default Notes
JELLYFIN_BASE_URL Jellyfin server URL
JELLYFIN_API_KEY API key
JELLYFIN_WEBHOOK_SECRET Shared secret for /webhook
JELLYFIN_GRPC_ADDR :9475 gRPC listen
JELLYFIN_HTTP_ADDR :8475 HTTP listen (webhook / healthz)
JELLYFIN_DATA_DIR /var/lib/muxcore-jellyfin Durable settings + links
JELLYFIN_CONFLICT_MODE jellyfin Sync conflict policy
JELLYFIN_SESSIONS_POLL_SECONDS 0 /Sessions poll; 0 = off
MUXCORE_GRPC_ADDR Core mesh (webhook publish + import refresh)
MUXCORE_INSECURE_DISABLE_TLS false Disable TLS to core (dev)

Health

Module Health probes Jellyfin GET /System/Info when configured. Docker HEALTHCHECK runs /module --health-check against local /healthz.