🎉 4.0.0 — Multi-Server Support (Major Release)
This is the biggest release in the project's history. Plex Generate Vid Previews now supports Plex, Emby, and Jellyfin side-by-side — generate trickplay/BIF previews from one app across every server you run, with a redesigned UI, unified jobs/retry experience, and an official Jellyfin plugin.
402 commits since 3.7.5. The headline is multi-server, but every page in the app has been touched — design refresh, mobile-responsive layouts, plain-English copy, ⓘ tooltips everywhere, smarter retry chains, scheduler upgrades, and a 190× speedup on Emby/Jellyfin reverse-path lookups.
⚠️ Breaking changes — read before upgrading
- Server IDs renamed. Your existing
plex-defaultserver gets a new UUID automatically when you upgrade (schema migration v12 runs once on first start; coverssettings.json,jobs.db,schedules.json,webhook_history.json, and the bundle cache file). The migration is not roll-back-safe — back up yoursettings.jsonbefore upgrading if you want a clean downgrade path. - Plex webhook URL changes. After upgrade, click Re-register on your Plex server card so plex.tv gets the new UUID-based webhook URL. Your old URL still works (legacy fallback in place), but new events will only fire reliably once re-registered.
- Three API endpoints removed. The internal
/api/settings/{plex,emby,jellyfin}_webhook/testendpoints are gone — the loopback "test webhook" buttons they powered have been retired (they gave misleading "reachable" signals from inside Docker). If you're scripting against these, switch to the per-server webhook URL surfaced in the UI.
🚀 What's new
Multi-server foundation
- Add Plex, Emby, and Jellyfin servers from the new
/serverspage. Per-server config, per-server libraries, per-server path mappings. - Per-server health checks — connection status pill, plugin detection, EnableChapterImageExtraction guard, trickplay scheduled-task check.
- Per-server enable/disable toggle + one-click "Stop server generating previews" for emergencies.
- Recently Added Scanner for Emby and Jellyfin, alongside the existing Plex one.
- Cross-server BIF reuse — if two servers point at the same file, FFmpeg only runs once.
Official Jellyfin plugin: Media Preview Bridge
- One-click install from your Jellyfin → Plugins → Repositories → add our repo.
- Registers externally-published trickplay so Jellyfin treats our output as native.
- Status badge on the server card tells you if the plugin is installed + active.
- Auto-published from this repo's CI on every release.
Scheduler upgrades
- Quiet Hours — global pause/resume schedule with multi-window support and per-window day-of-week filters. Sleep your previews overnight or during peak streaming hours.
- Per-schedule stop-time — schedules can now stop themselves at a set time without manual cancellation.
- Concurrent-job gate with priority awareness so urgent webhook jobs don't get stuck behind nightly scans.
Setup Health & Readiness (new top-level tab)
- Proactive checks for every server — flags misconfigurations before they cause failed runs.
- Per-check toggles + plain-English explanations of what each check does and why it matters.
- One-click fix-all with preview modal — see exactly what's about to change before you apply.
- Bucket display — Must-fix / Recommended / All-good — so you know what's urgent.
Webhooks
- Unified webhook handling across Plex, Emby, and Jellyfin through the Job manager.
- Vendor-aware retry policies with chain-blocker surfacing in the modal.
- Clean Sonarr-style titles for vendor-triggered jobs.
- "Fire now" button to skip the debounce window when you want immediate processing.
- Webhook events for disabled servers are now rejected at every entry point (not just the front door).
UI / UX overhaul
- Comprehensive design refresh — panels, KPI tiles, status dots, brand-orange accents.
- Mobile-responsive everything — jobs, schedules, trigger log, and worker cards all stack into card layouts on phones with native iOS-style offcanvas drawer for nav.
- Plain-English copy + ⓘ tooltips on every non-obvious control. Many tooltips open rich modal explanations with examples.
- In-app Bootstrap confirm modals replace native browser confirm() popups everywhere.
- Setup Wizard — vendor parity across all three servers, tooltips, advanced-settings collapsibles.
- Unified page-header treatment across Servers / Automation / Settings / BIF Viewer.
- Login screen redesigned as panel card on soft gradient.
- Notification dropdown + unified nav icon controls.
🐛 Polish & fixes
Too many to list individually (~180 fixes since 3.7.5). Highlights:
- Workers panel never goes blank — synthesises idle workers from config during library enumeration.
- Library enumeration retries transient
/Itemsfailures and surfaces real errors as warnings instead of swallowing them. - Job-card mobile layout fixes + path-mapping table responsiveness.
- Job Details modal log viewer now uses a proper dark terminal aesthetic.
- Webhook source forwarding fixed so retry-chain rows render correctly.
- Preview Inspector search rewritten to actually work across Plex, Emby, and Jellyfin.
- Jellyfin plugin publishes MD5 checksums (Jellyfin rejects SHA-256).
- Plus dozens of fixes for vendor-specific edge cases — episode title fallbacks, item-id lookups, header-precedence, ownership routing.
📝 Upgrade steps
- Back up your config dir — at minimum
settings.jsonandjobs.db. - Pull the new image (
docker pull ghcr.io/stevezau/media_preview_generator:4.0.0or:latest). - Start the container — the v12 migration runs automatically; watch the logs for the "Renamed N entries" lines.
- Click Re-register on your Plex server card so plex.tv gets the new UUID-based webhook URL.
- If you use Emby or Jellyfin, head to the new
/serverspage to add them. The Setup Health tab will walk you through any missing configuration (trickplay scheduled task on Jellyfin, EnableChapterImageExtraction on Emby).
Full diff: 3.7.5...dev