github JFLXCLOUD/NeXroll v1.12.0-beta.11

pre-release8 hours ago

NeXroll v1.12.0-beta.11 Release Notes

Release Date: April 18, 2026
Type: Pre-release (Beta)

Scheduler sequence validation, NeX-Up trailer sequence reliability, and preview playback stability fixes.


Bug Fixes

Critical: Scheduler Not Applying Correct Schedule

  • Root Cause: Schedules with a sequence field stored as the string "null" in the database were treated as having a valid sequence. This caused the scheduler to attempt _apply_schedule_sequence_to_plex() instead of _apply_category_to_plex(), which would silently fail (JSON parse of "null" yields None, not a list) and never update active_category.
  • Impact: Schedules like "Spring Season" would be correctly identified as the active winner but never actually applied to Plex. The previous schedule's prerolls would remain indefinitely.
  • Fix: Added _has_valid_sequence() helper that properly validates sequence data — rejects None, empty strings, "null", "[]", and any non-list JSON. All 8 sequence checks in the scheduler now use this validated check.

NeX-Up: Sequence Preview Only Playing 1 of 2 Trailers

  • Root Cause: Orphan preroll records in the "NeX-Up Movie Trailers" category referenced video files that no longer existed on disk (e.g. trailers that were previously deleted or expired). When a random block selected from the full pool, it frequently picked a missing-file preroll — the 404 error silently skipped it, so only 1 of the requested 2 trailers would play.
  • Impact: Saved sequences with multiple movie trailer blocks (e.g. "dynamic preroll, movie trailer, movie trailer") would only play 1 trailer in both the preview modal and Plex.
  • Fix: All three sequence resolution paths (API apply endpoint, scheduler saved-sequence apply, scheduler schedule-sequence apply) now filter the random pool to only prerolls whose files exist on disk via os.path.exists() before sampling. The frontend SequencePreviewModal also filters random/sequential blocks to exclude prerolls with missing files.

NeX-Up: Preview Tile/Video Mismatch

  • Root Cause: Same orphan preroll issue — the preview would select e.g. "Hellfire (2026)" (missing file), briefly show its name in "Now Playing", then the video 404 would trigger the error handler which skipped to the next preroll (e.g. "Nirvanna the Band the Show the Movie"). The user saw a Hellfire label but Nirvanna's video.
  • Fix: Covered by the same os.path.exists() filtering above — orphan prerolls are excluded before selection so the displayed name always matches the playing video.

NeX-Up: Orphan Preroll Records Not Cleaned During Sync

  • When the Radarr sync cleaned up orphaned coming_soon_trailers records (file missing on disk) or expired trailers past the grace period, the corresponding prerolls table record was not deleted. This left stale preroll records that would be included in random sequence selection pools.
  • Both the orphan cleanup and expiry cleanup paths now also delete the matching preroll record.

Sequence Preview: Now Playing Label Desyncs from Video

  • Root Cause: The SequencePreviewModal playlist-building useEffect depended on the prerolls prop, which is refreshed by the parent App.js every 30 seconds via fetchData(). Each refresh created a new array reference, re-triggering the effect — which re-shuffled random trailer picks and replaced the playlist mid-playback. The "Now Playing" label would jump to a different trailer while the current video was still playing.
  • Fix: Props are now snapshotted into a ref at modal-open time. The playlist is built once from the snapshot and is immune to background data refreshes. Additionally, source transition guards (isTransitioningRef, onCanPlay) prevent spurious abort errors from advancing the track index, and MEDIA_ERR_ABORTED errors are explicitly ignored.

Stale Category Verification

  • When the verification loop detected that the active_category was no longer backed by an active schedule, it previously only logged "skipping reapply (main loop will transition)" but the main loop couldn't transition due to the sequence bug above.
  • Now clears the stale active_category to None and forces an immediate re-evaluation via _check_and_execute_schedules().

Apply Failure Logging

  • Added explicit warning log when _apply_category_to_plex() or _apply_schedule_sequence_to_plex() fails, making future debugging easier.

Database Path Logging

  • Startup log now shows the actual resolved database path instead of a relative os.path.abspath('nexroll.db') which could point to the wrong location.

Files Changed

  • NeXroll/backend/scheduler.py — Added _has_valid_sequence(), replaced all sequence checks, added os.path.exists() filtering for random pools, failure logging, stale category fix
  • NeXroll/backend/main.py — Fixed DB path logging, imported DB_PATH, added os.path.exists() filtering to API sequence apply, orphan/expiry preroll record cleanup during Radarr sync
  • NeXroll/frontend/src/components/SequencePreviewModal.js — Filter random/sequential blocks to exclude prerolls with missing files; snapshot props at modal-open to prevent playlist rebuilds during playback; source transition guards to prevent label desync

Don't miss a new NeXroll release

NewReleases is sending notifications on new releases.