github mescon/Healarr v1.3.3

22 hours ago

Added

  • Thorough health checks are now tunable for slow codecs (AV1) and large files. Three new env vars:
    • HEALARR_HEALTH_CHECK_THOROUGH_TIMEOUT (default 10m) - raise this if scans repeatedly time out and end up parked in the rescan queue.
    • HEALARR_HEALTH_CHECK_THOROUGH_DURATION (default 0, no limit) - when set (e.g. 60s), the thorough decode walks only the first N seconds via ffmpeg -t. Catches header errors, codec-init errors, decode errors at the start, and files that will not open at all; trades completeness for speed.
    • HEALARR_HEALTH_CHECK_HWACCEL (default auto) - opportunistic ffmpeg hardware acceleration. Probes ffmpeg -hwaccels once and adds -hwaccel auto if any accelerator is reported; falls back silently to software on hosts without one. off to disable, <name> (e.g. cuda, vaapi, videotoolbox) to force a specific one.

Fixed

  • Cancelling a scan now actually cancels it. Previously CancelScan only signaled the in-memory ctx.cancel() and never persisted the new status, so /scans and Dashboard kept showing the row as "running" on reload (and the "Scan cancelled" toast was misleading). For stale "running" rows left over from a previous hard restart - where there is nothing to signal in memory - the cancel button did literally nothing (a 404 from the handler). Cancel now always writes status='cancelled' with completed_at to the DB, so both live cancels and stale-row cleanups work. The "AND completed_at IS NULL" guard prevents a benign cancel-vs-completion race from clobbering a real completion.
  • Stale "running" scan rows from a previous hard restart are no longer shown forever. On startup the scanner now reconciles: any row left in an active status (running/enumerating/scanning) that this process did not start was orphaned by a SIGKILL/OOM/crash that prevented the normal MarkInterrupted shutdown path from running. Those rows are now marked cancelled at startup with error_message='abandoned on Healarr restart'. paused and interrupted are left alone (legitimate resumable states).
  • /corruptions with the "All" filter no longer crashes with a database scan error. The notifier was publishing every NotificationSent/NotificationFailed with a hardcoded aggregate_type="corruption", so notifications fired for non-corruption events (e.g. a Pushover alert for SystemHealthDegraded) leaked into corruption_summary as stray rows with NULL file_path. Loading the corruptions page with no filter included them and tripped a converting NULL to string scan error. The notifier now propagates the source event's aggregate type, defaults defensively to "notification" if missing (never "corruption"), and a migration cleans up any rows already polluted while tightening the corruption_status view as belt-and-braces.

Full Changelog: v1.3.2...v1.3.3

Don't miss a new Healarr release

NewReleases is sending notifications on new releases.