maubot-media/base-config.yaml
Maddox f8f89b794e v0.6.1: Jellyfin support via emby.type config flag
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.
2026-05-03 15:26:25 -04:00

117 lines
3.8 KiB
YAML

# Media bot configuration
#
# After uploading the plugin, set real values via the maubot UI's
# "instance config" tab. Anything left at the placeholder values below
# disables the related feature.
http_timeout: 15
default_results: 5
# Inline poster art on `!media request` confirmations and `!media random` picks.
posters_enabled: true
# Matrix users allowed to approve/decline Seerr requests via 👍/👎 reactions.
admin_users: []
# Where to post Seerr/Sonarr webhook notifications and the daily digest.
# Must be a room the bot has joined. Leave empty to disable.
notifications_room: ""
# Shared secret Seerr must send as `Authorization: Bearer <secret>` header
# when calling the seerr-webhook endpoint. Generate with `openssl rand -hex 32`.
# Empty = no auth check (NOT recommended).
seerr_webhook_secret: ""
# Sonarr → Matrix subscription notifications.
# Configure Sonarr → Settings → Connect → Webhook with URL
# https://<your-maubot>/_matrix/maubot/plugin/<instance>/sonarr-webhook
# and Headers: `Authorization: Bearer <secret>`. Triggers on Download events.
sonarr_webhook_secret: ""
# Daily digest — fires once a day in `notifications_room`.
digest_enabled: true
digest_hour: 8 # local hour, 0-23
# Optional Sunday recap pulled from an ntfy topic (e.g. an external cleanup job
# posts its summary there). Leave ntfy_url empty to skip.
ntfy_url: ""
emby_cleaner_topic: "emby-cleaner"
# --- Service endpoints ---
#
# Seerr is OPTIONAL. If url/api_key are left as placeholders, `!media search`
# and `!media request` route directly to Sonarr (TV) and Radarr (movies)
# instead. The `!media requests` and `!media trending` commands require Seerr
# and will return a hint when it isn't configured.
seerr:
url: ""
api_key: ""
# Sonarr / Radarr / Lidarr — defaults below auto-pick the first quality
# profile + root folder Lidarr/Sonarr/Radarr report. Override here to pin
# specific ones.
sonarr:
url: http://sonarr:8989
api_key: CHANGEME
quality_profile_id: null # auto-pick first if null
language_profile_id: null # auto-pick first; Sonarr v3 only (v4 ignores)
root_folder_path: null # e.g. "/tv"
monitor: "all" # all|future|missing|existing|firstSeason|latestSeason|none
search_on_add: true
radarr:
url: http://radarr:7878
api_key: CHANGEME
quality_profile_id: null
root_folder_path: null # e.g. "/movies"
monitor: "movieOnly"
minimum_availability: "released" # announced|inCinemas|released
search_on_add: true
# Lidarr — music. API v1 (different from Sonarr/Radarr v3).
lidarr:
url: http://lidarr:8686
api_key: CHANGEME
quality_profile_id: null
metadata_profile_id: null
root_folder_path: null # e.g. "/music"
monitor: "all"
search_on_add: true
emby:
# Set to "jellyfin" for a Jellyfin server. Affects display labels only —
# the API surface used (/Users/{id}/Items, /Sessions, /System/Info/Public,
# etc.) is identical between the two.
type: emby
url: http://emby:8096/emby
api_key: CHANGEME
nzbget:
url: http://nzbget:6789
username: nzbget
password: CHANGEME
qbittorrent:
url: http://qbittorrent:8080
username: admin
password: CHANGEME
# Map Matrix user IDs to per-service user identifiers.
# Senders not in this map get an "unauthorized" reply.
#
# Per-user fields:
# seerr_user_id: int — required for `!media request` when Seerr is enabled
# emby_user_id: str — required for Emby commands (recent/watched/etc)
#
# Optional per-user defaults:
# default_media_type: "movie" | "tv" — used by `!media request <q>` when no
# --tv/--movie flag is given
# result_count: int — overrides default_results above
#
# Example (uncomment and edit):
# user_map:
# "@alice:example.com":
# seerr_user_id: 1
# emby_user_id: "abc123def456"
# default_media_type: "movie"
user_map: {}