Releases: stevezau/media_preview_generator
Media Preview Bridge 10.11.0.3
Jellyfin plugin DLL — install via Jellyfin admin → Plugins → Repositories.
Repository URL (paste this once):
https://stevezau.github.io/media_preview_generator/jellyfin-plugin/manifest.json
Once the repo is added, Media Preview Bridge appears in
the catalogue and updates automatically.
Fix missing live worker status on scheduled scans
Fixes
- Scheduled "recently added" scans no longer spam the log with
dispatch loop iteration failederrors, and now correctly show live per-worker status (progress, speed, current title) in the UI while they run. Preview generation itself was already working — this restores the status display and silences the error noise. (#267)
Search-and-pick Manual Generation
New
- Manual Generation now has a media-search picker (#266) — search your libraries for a show, season, episode, or movie and pick it, instead of typing file paths by hand.
- Target a single episode — drill into a series to generate previews for just one episode.
- Multi-select in both search results and the folder/file browser — queue several items in one go.
- Multi-server media search now runs concurrently, so results come back faster.
Fixes
Clearer auth-token logging & Unraid NVIDIA setup note
Fixes
- The startup log now clearly shows whether your web auth token comes from the
WEB_AUTH_TOKENenvironment variable or fromauth.json, and warns when a saved token is being overridden — no more guessing whether your token was picked up. A stray space or newline inWEB_AUTH_TOKENis now trimmed automatically, so the token no longer appears to be "ignored". (#263)
Setup / Docs
Scheduled-scan priority & per-server fixes
New
- Unraid Community Apps: listing now covers Plex, Emby, and Jellyfin, and adds a CA developer profile for easier discovery.
Fixes
- Scheduled Recently Added scans now run at the priority you set — and changing a schedule's priority after creation now takes effect (previously they always ran at Normal).
- A Recently Added scan pinned to one server now generates previews for that server only. Previously, on setups where multiple servers share the same files (e.g. two Plex servers), it fanned out and published to all of them.
- Unraid template now points at the correct
media_preview_generatorimage.
Multi-path webhook fix & clearer path-mapping UI
Fixes
- Webhooks for a show in a multi-path Plex library now schedule every matching episode, instead of stopping at the first path.
- Renamed the webhook path-mapping column to "Path on Apps (Sonarr, Radarr, Webhooks)" and clarified the "Path the webhook sends" field, with an actionable hint when previews get fast-skipped.
- The job details modal now auto-loads file results when it reopens on the Files tab.
- The fast keyframe preview path now tolerates up to 6% duplicate frames, so eligible files aren't needlessly re-encoded the slow way.
Per-server job breakdown + restart & webhook reliability
New
- Per-server breakdown in jobs — each server now shows what it actually did: Generated (made fresh), Reused (frames copied from another server, no second encode), or Already Existed — updating live as the job runs.
- One unified processing engine for library scans and webhooks (#243) — more consistent, reliable dispatch.
Fixes
- Pause survives a restart — pausing the queue and restarting the container no longer silently resumes processing.
- No more notification storm on large webhook batches — when Sonarr/Radarr report many replaced files, deletions are announced to Emby/Jellyfin once per job instead of once per imported file.
- Fixed a post-upgrade startup crash — jobs saved by an older version now load cleanly instead of failing app boot.
- "Not found" files now appear as a chip inside the per-server breakdown, not stray text at the card bottom.
- Webhook path resolution for media-server namespaces now goes through your path mappings (#254).
Multi-Plex routing fixes & stale-mount diagnostics
New
- Stale or unmounted media mounts are now surfaced as a clear diagnostic, instead of silently reporting files as "missing on disk".
- The webhook Activity Log moved to its own dedicated Tools page.
Fixes
- Multi-Plex installs: scans, jobs, and Plex
library.newwebhooks now route to the correct originating server. The UI sends an explicit server choice, and the backend refuses to guess when multiple Plex servers could match (#244). - Add Server: rejects URLs without a scheme, fixes missing API-Key auth for Emby in the setup wizard and Add modal, adds a Browse button for the Plex config folder, and makes Plex discovery single-select (#247).
- Disabled servers are no longer probed from REST endpoints or the Edit modal; disabled libraries are hidden from the library picker.
- Thumbnails: keyframe spacing is now probed with a post-extract duplicate check for more accurate previews (#238).
- Jobs: reprocess/reruns now complete correctly, the retry reason persists so the banner survives a successful retry, and job logs now show path mappings with cleaner error summaries (#242).
Post v4 Launch Fixes
🐛 Fixes
Settings drift (issue #238)
thumbnail_intervalno longer drifts between Settings, Servers, and per-server overrides. End-to-end fix: schema migration heals existing drift on upgrade, read fallback covers older configs, and Save now
propagates the value to every server entry.- Unified default to 10s across UI, defaults, migrations, and tests.
Job queue & retry chains
- Cascade-delete retry children when a parent job is removed — fixes orphaned retry rows that survived parent cleanup (#239).
- KPI filter now matches the queue so the dashboard count and visible rows agree.
- Per-outcome file-results cap — the filter now sees all failures instead of being silently truncated to a global cap.
- Webhook delay clamped and notify failures swallowed in
_persistso a single notifier hiccup can't kill the persist path. - "Chain exhausted" log now fires on retry exhaustion (was misleadingly logging "completed successfully").
Dashboard
- Per-row webhook countdown with Fire-now / Retry-now icons on each pending row.
- Pending-webhooks banner shrunk to a chip in the Job Queue header.
- 1 Hz ticker kicks in for webhook-only queues so countdowns tick when no jobs are running.
- Restore prior worker count when re-enabling a GPU (was resetting to 1).
- Disabled GPUs are greyed out instead of carrying a confusing badge.
Setup Health
- Silence the header badge + tab glyph when every Recommended check is dismissed.
- Silence non-blocking checks, hide non-video libraries, and end the What's-new loop on dev builds.
health_dismissalspreserved across server Save (#237) — dismissals no longer reappear after editing a server.
Orchestrator / FFmpeg / Plex
- GPU→CPU fallback now honored on full-scan paths, not just per-item.
- Tied MediaParts hash now picked correctly instead of an unrelated head entry.
- FFmpeg progress reader tolerates non-UTF-8 bytes instead of crashing on garbled console output.
- Retry-wait log names actually-pending servers instead of all configured ones.
Path mappings
- Windows backslashes converted in path mappings (#236) so Sonarr/Radarr from Windows hosts route correctly.
Docs
/api/jobs/{id}/retry-nowand/api/jobs/{id}/fire-webhook-nowendpoints documented in reference.md.
Multi-Server Support (Major Release)
🎉 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