Per-File Outcomes, Lazy Logs & Worker Stability
New Features
- Per-file results tab — Job Details now has a "Files" tab showing the outcome of every file processed (generated, failed, skipped, not in Plex, etc.) with filterable badges, search, and server-side pagination.
- Interval & cron schedule types — Schedule modal now supports interval mode (e.g. every 2 hours) and raw cron expressions alongside the existing time+days picker. Human-readable labels shown in the schedule list.
- Unresolved webhook files visible — Webhook paths that can't be found in Plex now show in the Files tab with a "Not In Plex" badge and actionable hints, including path mapping suggestions.
- FFmpeg error summaries — When thumbnail generation fails, the specific FFmpeg error is now included in the failure reason instead of just "produced 0 images".
Performance
- Lazy-loaded log viewer — Logs modal loads only the last 500 lines on open instead of the entire log. "Load earlier" and "Load all" buttons for on-demand access. Running-job polling appends new lines incrementally.
- Paginated files tab — File results use server-side filtering and pagination with configurable page size (50/100/250/500).
- Event-based dispatch loop — Workers signal completion via events instead of polling with fixed sleep, eliminating idle gaps between fast tasks.
Bug Fixes
- Fixed duplicate job starts when resume/auto-resume/revive overlap during long library scans.
- Fixed worker pool created with 0 workers due to stale config at startup.
- Fixed GPU reconciliation removing busy workers mid-task, causing jobs to stall permanently.