Combined release covering everything since v1.26.1600157.
✨ Features
- Timezone sourced from Dispatcharr. The plugin's own 🌍 Timezone dropdown has been removed. Scheduled-run times and guide-display times now follow Dispatcharr → General Settings → Time Zone (falls back to UTC when unset). Set your zone there to control ECM.
- SE (Swedish) channel-name format for managed dummy EPG, alongside the existing US format (#20).
- Auto-rescan after M3U refresh (opt-in, default off): run a visibility scan automatically after each M3U refresh.
🐛 Fixes
- Self-healing scan lock. A leaked/orphaned cross-worker lock could wedge every scan with "Another scan is already running…" until a container restart. ECM now detects a stale lock (file older than 15 min) and safely breaks + re-acquires it. flock remains the final arbiter, so no double-scan.
- Correct timezone model. Reads
core.models.CoreSettings(system_settings.time_zone) via the official accessor — the previously-targeteddashboard.Settingstable is empty in real installs and always fell back to UTC.
🧹 Changes
- Removed the redundant "Rescan Now" button from the M3U-refresh trigger (it duplicated Run Now). The
m3u_refreshauto-rescan event subscription is unchanged. - CSV settings snapshot now labels the zone as
timezone (from Dispatcharr)so exports are self-describing.
🧰 Internal
- Django-free
ecm_parsingmodule with unit tests (coerce_timezone,lock_is_stale), pytest suite + GitHub Actions CI, and a contributor DEV_WORKFLOW guide.
Upgrade note: if your schedules previously assumed a plugin-set zone, confirm Dispatcharr → General Settings → Time Zone is set to your local zone.