v1.16.1 — mount supervisor + hardening (community testing build)
Pre-releaseCommunity testing build (pre-release). A robustness pass over the v1.16.0 Plex mount: a self-recovering supervisor, mount-server hardening, and collision-proof module names. Please test the Plex mount path and report issues before this is proposed upstream.
This supersedes the churned v1.16.0 testing build — grab this one.
Mount-server hardening
- Fixed a spurious
403that made the mount unusable. The network/auth gates queried the DB without stale-connection hygiene → fail-closed →403on every request (rclone saw I/O errors). The STREAMS policy actually defaults to allow-all; the denials were spurious. Gates now refresh the connection before the ORM call; fail-closed intent is unchanged. - gzip + streamed directory tree. Large
/Movies/Alllistings go out ~10× smaller, compressed incrementally so memory stays bounded; the302playback path is untouched. Rows are batched per flush, rendered listings cached as bytes.access_logno longer growsserver.logunbounded. - Collision-proof module names. Dispatcharr loads every plugin into one shared interpreter, so a generically-named module would clash in
sys.moduleswith another plugin's same-named file and silently load the wrong one. The plugin's modules are now plugin-unique:vod2mlib_control.pyand thevod2mlib_core/package.
Mount supervisor
The mount is a child process, so its lifecycle is now actively managed:
- Identity-safe tracking — tracked by pid +
/procstart-time (recycled-PID proof, zombie-aware); stop verifies identity before signalling and escalates SIGTERM → SIGKILL. - Auto-recovery — a celery-beat healthcheck reconciles the mount on an interval (and on any plugin interaction). After a crash or a container restart it is respawned automatically — verified live: a
docker restartbrings the mount back unattended, typically within ~a minute. - Crash-loop guard — if the child can't start, it stops retrying after a few attempts and
[MOUNT] Statusreports the failure with the last error;[MOUNT] Enableis the explicit retry.
Precondition: auto-recovery (and the mount itself) needs the plugin data dir (/data/plugins/vod2mlib) to be writable by the user Dispatcharr runs as. If it isn't, [MOUNT] Status stays DOWN and the supervisor logs a concise permission warning each tick — see the README troubleshooting note.
About v1.16.0
If you're new here: v1.16.0 added Plex delivery via a live HTTP mount (rclone), built on the same unified core (vod2mlib_core) as the .strm output. ⚠ Breaking for existing .strm libraries — folder names changed to always carry {tmdb-…}/{imdb-…}; run [⚠ DANGER] Clean up then re-generate to migrate. See the v1.16.0 section of the CHANGELOG.
Verified
Live in the integration harness: rclone lists folders and streams real MP4 bytes through the 302→proxy path; a SIGKILL'd child and a full docker restart are both recovered automatically by the supervisor (the respawned child is reparented to the celery worker); Plex scans both Movie and TV sections, tmdb-matched with playable parts and no scanner errors. 188 unit tests pass.
Install (manual)
Download plugin-vod2mlib-v1.16.1.zip below → Dispatcharr → Plugins → Import → upload the zip → enable. Requires Dispatcharr v0.24.0+; for durable playback URLs over days, run Dispatcharr on :dev (see README troubleshooting re: UUID orphaning).
SHA256: ed4151bcc0a97cb798ccf6f2b1ad3fa59311dd9d679ed995f8b005235261db70