NeXroll v1.7.7 Release Notes
Release Date: 11-11-2025
Overview
NeXroll v1.7.7 is a significant update featuring UI improvements, installer optimizations, and critical bug fixes:
- New: Schedule playback mode dropdown selector (replaces dual checkboxes)
- Improved: Smaller installer size (44.73 MB, down from ~48 MB)
- Improved: Cleaner installation directory structure
- Fixed: Schedule "Invalid Date" display issue
- Fixed: Schedule time zone shifting (times were shifting 4-5 hours) - Issue #9
- Fixed: Backup/restore database foreign key constraint errors - Issue #10
New Features & Improvements
Community Prerolls - Rename Before Download (#8)
- New rename dialog appears before downloading community prerolls
- Automatically removes bug number prefix from default name (e.g.,
Bug 123 - Holiday Preroll→Holiday Preroll) - Community preroll ID now stored in description field for easy reference
- Press Enter to quickly confirm download with custom name
Schedule Playback Mode Dropdown
Improvement: Replaced dual checkbox system with single dropdown selector for choosing between Random and Sequential playback modes.
Benefits:
- Mutually exclusive selection: Prevents accidentally enabling both Random and Sequential modes simultaneously
- Clearer UI: Single dropdown makes it obvious only one mode can be active at a time
- Better user experience: More intuitive control that matches expected behavior
Location: Schedule creation and editing forms
Installer Optimization
Improvements: Significant reduction in installer size and cleaner installation directory structure.
Changes:
- Smaller installer: Reduced from ~48 MB to 44.73 MB (~3 MB reduction)
- Bundled assets: Frontend files now embedded inside NeXroll.exe instead of separate folder
- Embedded icons: All executable icons embedded directly (no external icon files needed)
- Cleaner directory: Installation folder now contains only executables and batch file
- Automatic cleanup: Installer removes legacy
resources/andfrontend/folders from previous versions during upgrade
Before (v1.7.6 (Unreleased) and earlier):
C:\Program Files\NeXroll\
├── NeXroll.exe
├── NeXrollService.exe
├── NeXrollTray.exe
├── setup_plex_token.exe
├── start_windows.bat
├── uninstall.exe
├── resources\ ← Removed
│ ├── icon_16x16.ico
│ └── icon_32x32.ico
└── frontend\ ← Removed
└── build\
├── index.html
├── static\
└── ...
After (v1.7.7):
C:\Program Files\NeXroll\
├── NeXroll.exe (with bundled frontend)
├── NeXrollService.exe
├── NeXrollTray.exe
├── setup_plex_token.exe
├── start_windows.bat
└── uninstall.exe
Technical Details:
- Frontend assets extracted to temporary
_MEIPASSfolder at runtime - Icons embedded during PyInstaller build process
- No loss of functionality - all features work exactly the same
Fixed Issues
Edit Preroll Modal Rendering
- Fixed modal not appearing when clicking edit button on prerolls from non-Categories tabs
- Edit Preroll modal now renders globally and appears immediately regardless of active tab
- Improved modal architecture for better cross-tab functionality
Improved Error Messages
- Delete category now shows specific error: "Cannot delete category that is in use"
- Delete schedule errors now display detailed backend messages
- Delete preroll errors now show clear explanations
- Update operations display helpful error details instead of generic HTTP status codes
Installer - ProgramData Storage
- Changed default preroll storage from
Documents\NeXroll\Prerollsto%ProgramData%\NeXroll\Prerolls - Prevents creation of unused empty folders in user Documents directory
- Existing installations continue using their configured path from registry
Schedule "Invalid Date" Display
Problem: After creating a schedule, the displayed dates would change to "Invalid Date" after a few seconds when the page auto-refreshes.
Root Cause: The backend API was returning timezone offsets in two different formats:
- POST /schedules returned:
2025-11-11T14:30:00Z(with Z suffix) - GET /schedules returned:
2025-11-11T14:30:00-05:00(with timezone offset)
The frontend's date parser only recognized the Z and positive + timezone indicators, but not negative - offsets. This caused it to incorrectly append a Z to dates with negative offsets, creating invalid date strings like 2025-11-11T14:30:00-05:00Z.
Solution: Updated frontend ensureUtcIso() function to recognize both positive and negative timezone offsets using regex pattern /[+-]\d{2}:\d{2}$/.
Verification: Schedule dates now remain stable and display correctly even after the 30-second auto-refresh polling.
Issue #9 - Schedule Timezone Shifting
Problem: When creating schedules with specific times (e.g., 5:00 AM), the system would display shifted times (e.g., 1:00 AM) due to incorrect timezone handling in the API response.
Root Cause: The API was appending timezone indicators ('Z') to naive datetime objects, which JavaScript's Date parser would interpret as UTC and shift to browser local time. Additionally, times weren't being explicitly converted at API boundaries.
Solution: Implemented comprehensive UTC-based datetime storage with user timezone conversion at all API boundaries:
- On Schedule Create/Update: Frontend sends local time → parse → localize to user's timezone → convert to UTC → store
- On Schedule Get: Retrieve UTC from database → assume naive datetime is UTC → convert to user's timezone → return without 'Z' indicator
- Uses
pytzlibrary for robust timezone handling - Respects user's configured timezone from application settings
Verification: Users can now create schedules and times display exactly as entered without shifting.
Issue #10 - Backup/Restore Foreign Key Error
Problem: Backup and restore operations were failing with foreign key constraint violations when deleting categories: FOREIGN KEY constraint failed.
Root Cause: Incorrect deletion order during restore. Multiple database tables had foreign key references to the categories table:
preroll_categories(junction table)genre_mapsschedules(category_id and fallback_category)holiday_presetsprerollssettings.active_category
Solution:
- Reordered deletion sequence to clear all foreign key references first
- Implemented category ID mapping to handle auto-incremented ID changes during restore
- Proper deletion order:
- Delete
preroll_categoriesjunction table first - Delete
genre_maps - Clear
settings.active_categoryfield - Delete
schedules - Delete
holiday_presets - Delete
prerolls - Finally delete
categories
- Delete
Verification: Users can now successfully backup and restore databases without foreign key errors.
Technical Changes
Frontend Code (NeXroll/frontend/src/App.js)
- Modified: Schedule form - replaced dual checkboxes with
<select>dropdown for playback mode - Modified:
ensureUtcIso()function - added regex to detect negative timezone offsets/[+-]\d{2}:\d{2}$/ - Improved: Playback mode state management - now uses single boolean with mutually exclusive dropdown
Backend Code (NeXroll/backend/main.py)
- Added:
import pytzfor timezone support - Modified:
POST /schedulesendpoint - converts user's local time to UTC before storage - Modified:
GET /schedulesendpoint - converts UTC times back to user's local timezone for display - Modified:
PUT /schedulesendpoint - same timezone conversion logic as create - Modified:
restore_database()function - proper FK deletion order and category ID mapping - Added:
ScheduleResponse.Configclass with JSON encoders for datetime serialization - Added: Debug logging for troubleshooting timezone conversions
PyInstaller Build (*.spec files)
- Modified:
NeXroll.spec- frontend assets bundled viadatasparameter - Modified:
NeXrollService.spec- corrected icon path toNeXroll_ICON\icon_48x48.ico - Modified:
setup_plex_token.spec- corrected icon path toNeXroll_ICON\icon_48x48.ico - Improved: All executables now have proper NeXroll branding icons embedded
Dependencies (requirements.txt)
- Added:
pytz==2024.1for timezone handling
Installation
Windows Users
Download and run the installer:
NeXroll_Installer.exe
Features:
- Installs v1.7.7 executables with all improvements and bug fixes
- Smaller size: 44.73 MB (down from ~48 MB in previous versions)
- Cleaner installation: Only essential executables and batch file
- Automatic cleanup: Removes legacy
resources/andfrontend/folders from older versions - Automatically clears old registry entries (supports upgrades from earlier versions)
- Creates start menu shortcuts
- Configures database and preroll storage directories
- Optional: Install FFmpeg, NeXroll Windows Service, and Plex Token setup
Docker Users
If using Docker, pull the latest image to get v1.7.7:
docker pull ghcr.io/jbrns/nexroll:latestThe Docker image will automatically include the updated backend code and pytz dependency.
Known Limitations
- Timezone conversion assumes user has their system timezone correctly configured in NeXroll settings
- Schedule times are stored as UTC in the database, but displayed in user's configured timezone
- Docker container uses UTC timezone by default; set
TZenvironment variable to use local timezone
Changelog
Added
- Community Prerolls - Rename Before Download (#8)
- Comprehensive UTC-based datetime handling with user timezone conversion
- Timezone-aware schedule creation, update, and retrieval
- Proper foreign key deletion order for backup/restore operations
- Category ID mapping during restore to handle auto-incremented ID changes
- Registry cleanup during installation upgrade
- Debug logging for timezone conversion troubleshooting
Fixed
- #9: Schedule times no longer shift when created or viewed
- #10: Backup/restore no longer fails with foreign key constraint errors
- Installer now correctly updates version registry on upgrade
- System tray application will report correct v1.7.7 version after install
Changed
- API responses no longer include 'Z' timezone indicator on naive datetime objects
- Database schema behavior unchanged; continues using naive datetime storage with UTC assumption
Special Thanks
Thanks to all users who reported issues and helped identify the root causes of these bugs. Your feedback is essential for improving NeXroll!
Support
For issues, questions, or feedback:
- GitHub Issues: https://github.com/JFLXCLOUD/NeXroll/issues
- Documentation: See the README and docs in the repository
Happy prerolling!