| id | howto-vodfs-plex-libraries | ||||
|---|---|---|---|---|---|
| type | how-to | ||||
| status | draft | ||||
| tags |
|
Mount IPTV VOD content as a filesystem (Movies/, TV/) and create/reuse Plex libraries:
VOD(TV library) -><mount>/TVVOD-Movies(Movie library) -><mount>/Movies
This is the supported VOD path today. It is separate from Live TV DVR injection.
- Linux host (VODFS is Linux/FUSE only)
iptv-tunerrbinary- catalog JSON with VOD entries (
movies,series) - Plex token and URL (for
plex-vod-register) ffmpeginstalled if you want actual VOD playback from VODFS (-cachemode materializes on demand)
- Mount VODFS
iptv-tunerr mount \
-catalog ./catalog.json \
-mount /srv/iptvtunerr-vodfs \
-cache /srv/iptvtunerr-vodfs-cache- Register Plex libraries
iptv-tunerr plex-vod-register \
-mount /srv/iptvtunerr-vodfs \
-plex-url http://127.0.0.1:32400 \
-token "$PLEX_TOKEN"By default, plex-vod-register now also applies a VOD-safe per-library Plex preset to the created/reused libraries (TV + Movies) to disable expensive analysis jobs that are a poor fit for virtual/catch-up libraries:
- credits detection
- intro detection (TV libraries)
- preview/chapter thumbnails
- ad detection
- voice activity detection
This prevents Plex from getting stuck burning time on background analysis for VODFS items while scans/imports are still in progress. Plex only exposes some of these toggles per library (varies by server version/library type), so the command applies whichever keys are available on that library section.
- Verify in Plex
- Libraries
VODandVOD-Moviesexist - paths point to
/srv/iptvtunerr-vodfs/TVand/srv/iptvtunerr-vodfs/Movies
- No
-cache: VODFS exposes the directory tree, but actual file opens will return "not ready" (stub materializer). - With
-cache: Plex scans the tree and can trigger on-demand materialization/download of VOD files when accessed.
For real testing in Plex, use -cache.
If Plex runs as a different user/process/runtime than the process that mounted VODFS (common in Docker), use:
iptv-tunerr mount ... -allow-otherEquivalent env:
IPTV_TUNERR_VODFS_ALLOW_OTHER=1This usually also requires enabling user_allow_other in /etc/fuse.conf on the mount host:
echo user_allow_other | sudo tee -a /etc/fuse.confWithout this, you may see:
fusermount3: option allow_other only allowed if 'user_allow_other' is set- host / container runtime
stat ... permission deniedon a host backed by a FUSE mount
Recommended pattern for host:
- Mount VODFS on the Plex node host (not in a random helper host)
- Use
-allow-other - Mount that host path into the Plex host with a
hostvolume (for example/media/iptv-vodfs) - Run
plex-vod-registerpointing at the in-host path
FUSE mounts are mount-namespace local. A helper host mount is not automatically visible to the Plex host.
host.type: Directorycan fail after the path becomes a FUSE mount (host type-check mismatch). If needed, omit the stricttype.- If the FUSE mount is not
allow_other, host may fail tostatthe host withpermission denied. - After fixing/remounting the host FUSE mount, restart/recreate the Plex host so host rebinds the corrected view.
On the Plex node host:
iptv-tunerr mount \
-catalog /srv/iptvtunerr-vodfs-run/catalog.json \
-mount /srv/iptvtunerr-vodfs \
-cache /srv/iptvtunerr-vodfs-cache \
-allow-otherPlex Deployment host mount (example):
- host path:
/srv/iptvtunerr-vodfs - in-host path:
/media/iptv-vodfs
Then inside the Plex host (or from a host that can reach PMS and the in-host path is mounted):
iptv-tunerr plex-vod-register \
-mount /media/iptv-vodfs \
-plex-url http://127.0.0.1:32400 \
-token "$PLEX_TOKEN" \
-shows-name VOD \
-movies-name VOD-MoviesOptional:
-vod-safe-preset=falseto leave Plex library analysis settings unchanged (not recommended for VODFS/catch-up libraries)
- Verify the mount root contains
Movies/andTV/ - Verify you passed the mount root, not the
Moviessubdir
- Remount VODFS with
-allow-other - Enable
user_allow_otherin/etc/fuse.conf - Restart the Plex host after remounting
Large catalogs may still show Input/output error during shell ls/readdir while entries are visible and nested paths resolve.
Treat this as a VODFS/FUSE readdir bug to improve separately; Plex may still scan/access content.
Use plex-vod-register (current versions) to create/reuse the libraries; it applies a per-library VOD-safe preset by default that disables these jobs only for the VODFS libraries.
If the libraries already exist and were created before this behavior:
iptv-tunerr plex-vod-register \
-mount /media/iptv-vodfs \
-plex-url http://127.0.0.1:32400 \
-token "$PLEX_TOKEN" \
-shows-name VOD \
-movies-name VOD-Movies \
-refresh=falseIf Plex is already wedged on long-running analysis activities (Detecting Credits, chapter thumbnails), restart Plex once after applying the preset to clear the queue, then rescan the VOD libraries.
With very large catalogs, top-level directory reads can take a long time because VODFS is generating a very large synthetic entry list (Movies and TV can contain hundreds of thousands of entries).
Implications:
- shell probes like
ls /media/iptv-vodfs/Movies | headmay still block before printing anything - this does not necessarily mean the mount is dead
- Plex scanner logs are the better source of truth for progress
Prefer:
- checking nested known paths
- checking Plex scanner logs
- avoiding repeated full top-level
find/lsduring active scans
Once a VOD catalog has been rebuilt/repaired, you can split it into multiple
lane catalogs for separate VODFS mounts/libraries (for example bcastUS,
sports, news, euroUK, mena, movies, tv).
This reduces Plex scan scope and lets you refresh narrower libraries.
Example:
iptv-tunerr vod-split \
-catalog /srv/iptvtunerr-vodfs-run/catalog.json \
-out-dir /srv/iptvtunerr-vodfs-lanesOutput:
- per-lane catalog files (for example
/srv/iptvtunerr-vodfs-lanes/sports.json) - manifest:
/srv/iptvtunerr-vodfs-lanes/manifest.json
Then mount each lane with a separate VODFS instance (same binary, different
-catalog, -mount, and optionally -cache) and register Plex libraries for
that lane mount using plex-vod-register.
Typical naming pattern:
- TV library:
<lane> - Movie library:
<lane>-Movies
Examples:
bcastUS/bcastUS-Moviessports/sports-Moviesnews/news-Movies
Note:
- A lane catalog still contains both
Movies/andTV/; Plex library type remains one section per media type. plex-vod-registercan now create only one side of the lane when desired:-shows-onlyregisters only<mount>/TV-movies-onlyregisters only<mount>/Movies- this is useful for split lanes such as
euroUKMovies(movie-only) andeuroUKTV(TV-only) so Plex does not end up with unwanted empty companion libraries.
Example (movie-only lane):
iptv-tunerr plex-vod-register \
-mount /media/iptv-vodfs-euroUKMovies \
-plex-url http://127.0.0.1:32400 \
-token "$PLEX_TOKEN" \
-movies-only \
-movies-name euroUK-MoviesFor the Xtream get_series_info season/episode backfill workflow, use the
host-side cutover helper after catalog.seriesfixed.json finishes building:
sudo scripts/vod-seriesfixed-cutover.sh --do-retryWhat it does:
- retries failed series IDs from the backfill progress file (optional)
- backs up current
catalog.json - swaps in
catalog.seriesfixed.json - cleanly remounts the main VODFS mount with
-allow-other
After cutover:
- rescan the Plex TV VOD library (or rerun
plex-vod-register -refresh=true) - optionally run
iptv-tunerr vod-spliton the repaired catalog for category lanes