Issue #3.
Audit confirmed every Emby endpoint we use (/System/Info/Public,
/Sessions, /Users/{id}/Items[/Latest|/Resume], /Items/{id}/Images/Primary)
is API-compatible with Jellyfin, and the ?api_key= auth scheme works
on both. So 'add Jellyfin support' is really 'document it and fix
display labels' — no client branching needed.
Added a 'type: emby|jellyfin' field inside the emby config block
(defaults to emby for backward compat). New _media_label() helper
sources the label from config and is threaded through:
- !media health server name
- !media nowplaying header + empty-state
- !media help section header + health command summary
- daily digest 'not yet in <server>' line
README updated with a Jellyfin example block and notes that the URL
should NOT include the /emby suffix when pointing at Jellyfin.
Issue #2.
Search/request now work without Seerr — when seerr.url/api_key are left
as placeholders the bot falls back to direct Sonarr/Radarr lookup + add
(mirrors how Lidarr music already works). Numbered selection keeps
working across both sources via a _source discriminator stamped onto
each result. !media requests / !media trending now print a friendly
hint when Seerr is absent.
base-config.yaml no longer ships any homelab-specific URLs, MXIDs, or
Emby UIDs — admin_users defaults to [], user_map to {}, and every
service URL uses a docker-hostname placeholder. New per-service config
keys (quality_profile_id, root_folder_path, monitor, search_on_add,
language_profile_id, minimum_availability) let operators pin Sonarr/
Radarr defaults the same way Lidarr already could; null = auto-pick
the first profile/folder.
README rewritten as a self-contained setup guide: requirements, build,
upload, instance config (Required vs Optional with the Seerr fallback
called out), webhook setup, fork notes.
Maubot plugin: Matrix companion for the homelab media stack.
Services wrapped:
- Seerr: search, request, requests, trending
- Emby: nowplaying, recent, watched
- Sonarr/Radarr: queue, upcoming, missing
- NZBGet/qBittorrent: activity
Each Matrix sender is mapped to per-service user IDs via plugin config;
unmapped senders are rejected. Replies are MXID-prefixed for shared rooms.