Queries containing apostrophes/parens/etc were 400ing on Seerr's strict
ajv validator. The SeerrClient _qs() helper percent-encodes the value
correctly, but aiohttp parses the URL string through yarl.URL(), which
normalizes %27 (and other sub-delims) back to the literal character in
the query component. The literal ' then trips Seerr's "must be url
encoded" check.
Fix: pass yarl.URL(url, encoded=True) to bypass yarl's re-normalization
so the RFC 3986 form built by _qs reaches Seerr unchanged.
Reproduced + verified against deployed Seerr v3.2.0 with queries
including "rocky's revenge", "what's up, doc?", "8 1/2".
Closes#4
- Admins can react 👍/✅ or 👎/❌ on a !media request to approve/decline
- Posters auto-attach to request confirmations and !media random picks
(TMDB for Seerr items, Emby /Items/{id}/Images/Primary for library items)
- New @web.post(/seerr-webhook) handler — Seerr → Matrix room directly,
replaces the Telegram bridge path
- New config: posters_enabled, admin_users, notifications_room,
seerr_webhook_secret
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.