- Update loadMultipleThumbVideos call to loadMultipleThumbnailVideos in main.go
- Resolves build error: s.loadMultipleThumbVideos undefined
- All Thumb-to-Thumbnail refactoring now complete and functional
- Rename thumb_module.go to thumbnail_module.go and thumb_config.go to thumbnail_config.go
- Update all function names from showThumbView/addThumbSource/etc to showThumbnailView/addThumbnailSource/etc
- Update all struct fields from thumbFile/thumbFiles/etc to thumbnailFile/thumbnailFiles/etc
- Update config struct from thumbConfig to thumbnailConfig
- Update job type from JobTypeThumb to JobTypeThumbnail
- Update module registration from 'thumb' to 'thumbnail' in main.go
- Update UI components to show 'THUMBNAIL' instead of 'THUMB'
- Update handler function from HandleThumb to HandleThumbnail
- Update file naming patterns from 'thumb_*.jpg' to 'thumbnail_*.jpg'
- Update author module references to use Thumbnail naming
- Update documentation in QUEUE_SYSTEM_GUIDE.md
- Maintains all existing functionality while using clearer naming
- Enhanced Windows 11 native installer with GPU detection and DirectX 12 support
- Add cross-platform GUI detection utilities for improved platform handling
- Implement localization infrastructure foundation with i18n support
- Create comprehensive cross-platform deployment guide
- Add Inuktitut and Cree syllabics support framework
- Enhanced Arch Linux installation with desktop environment detection
- Implement Windows 11 DPI awareness and display scaling support
- Add automated cross-platform testing framework
- Prompt to install Go when not detected as required dependency
- Support cross-platform installation via package managers (apt, dnf, pacman, zypper, brew)
- Add Windows manual installation guidance
- Verify successful installation after attempt
- Maintain existing script flow and error handling
- Add base-devel and pkgconf packages for Go CGO compilation
- Add xorriso package for DVD ISO extraction (was missing)
- Add --needed flag to avoid reinstalling existing packages
- Add graphics driver detection with helpful warnings for NVIDIA/AMD GPUs
- Non-invasive: warns about missing drivers but doesn't auto-install them
- Add dual logo support (title logo + studio logo) for DVD menus
- Implement chapters menu with chapter navigation
- Implement extras menu for bonus content
- Add "Mark as Extra" checkbox for clips in UI
- Extras automatically appear in separate menu when marked
- Filter extras from chapters menu in real-time
- Encode extras as separate DVD titles (Title 2, 3, etc.)
- Update menu navigation with proper PGC looping
- Fix text escaping in DVD menus (alphanumeric only)
- Remove "future DVD menus" placeholder text from UI
Menu structure:
- Main menu: Play, Chapters (if >1), Extras (if present)
- Chapters menu: Lists all feature chapters + Back button
- Extras menu: Lists all extras as separate titles + Back button
- All menus loop and return to main menu after playback
Fixed FFmpeg filter parsing error by removing single quotes from font
paths and properly escaping special characters instead.
The Bug:
FFmpeg's drawtext filter was failing because fontfile paths were wrapped
in single quotes, which conflicted with the filter expression parsing:
drawtext=fontfile='/path/to/font.ttf':text='Some Text'
^ ^ ^ ^
These quotes broke FFmpeg's parser!
Error was:
[AVFilterGraph] No option name near ' I Fucked My Best…'
Error parsing filterchain ... around:
The Fix:
Before: fontfile='/home/.../IBMPlexMono-Regular.ttf'
After: fontfile=/home/.../IBMPlexMono-Regular.ttf (with : and ' escaped)
Now we:
1. Escape : as \: (FFmpeg filter requirement)
2. Escape ' as \' (FFmpeg filter requirement)
3. Don't wrap in quotes (FFmpeg doesn't need them)
Same fix applied to font= paths (system fonts).
Fixed FFmpeg filter parsing error by removing unnecessary single quotes
from the scale expression in resolveMenuLogoScaleExpr.
The Bug:
FFmpeg command was failing with "Error parsing filterchain" because
the scale expression had quotes around the min() functions:
scale=w='min(iw*0.50,180)':h='min(ih*0.50,120)'
^^^^^^^^^^^^ ^^^^^^^^^^^^
FFmpeg's filter parser doesn't expect quotes here and treats them as
part of the option value, breaking the parsing.
The Fix:
Before: scale=w='min(iw*%.2f,%.0f)':h='min(ih*%.2f,%.0f)'
After: scale=w=min(iw*%.2f,%.0f):h=min(ih*%.2f,%.0f)
Error was:
[AVFilterGraph] No option name near ' I Fucked My Best…'
[AVFilterGraph] Error parsing filterchain around: ,180)':h='min...
exit status 234
Now the scale expression is parsed correctly and menu generation
should complete successfully.
Fixed menu generation logging by threading logFn parameter through all
menu building functions. Previously, all menu FFmpeg commands were
called with logFn=nil, so errors were never logged.
Functions updated to accept and pass logFn:
- buildMenuBackground
- buildDarkMenuBackground
- buildPosterMenuBackground
- buildMenuOverlays
- buildMenuOverlay (helper)
- buildMenuMPEG
All three menu templates now properly log:
- SimpleMenu.Generate() → buildMenuBackground → runCommandWithLogger
- DarkMenu.Generate() → buildDarkMenuBackground → runCommandWithLogger
- PosterMenu.Generate() → buildPosterMenuBackground → runCommandWithLogger
Before:
- Menu FFmpeg commands run silently (logFn=nil)
- Errors not logged → "ERROR: FFmpeg failed during DVD encoding"
- No way to diagnose what failed
After:
- >> /usr/bin/ffmpeg [full command with args]
- ERROR starting command: [error details]
- ERROR command failed: [error] (exit code: X)
Combined with the previous commit's enhanced runCommandWithLogger,
we now have complete visibility into menu generation failures.
Enhanced runCommandWithLogger to log:
1. The exact command being executed (before execution)
2. Any errors when starting the command
3. Exit codes when commands fail
Before:
- No visibility into what command failed
- Silent failures during menu generation
- Log just showed "ERROR: FFmpeg failed during DVD encoding"
After:
- >> /usr/bin/ffmpeg [args...] (shows exact command)
- ERROR starting command: [error] (if command won't start)
- ERROR command failed: [error] (exit code: X) (if command fails)
This will help diagnose the menu generation failures by showing exactly
what FFmpeg command is failing and why.
Downloaded and bundled IBM Plex Mono Regular font (153KB) to ensure
consistent DVD menu branding across all systems.
Font details:
- Source: IBM Plex (open source, SIL Open Font License)
- File: assets/fonts/IBMPlexMono-Regular.ttf
- Size: 153KB
- Format: TrueType Font
The font is automatically discovered by findMenuFontPath() which searches:
1. assets/fonts/IBMPlexMono-Regular.ttf (working directory)
2. <executable_dir>/assets/fonts/IBMPlexMono-Regular.ttf
The menuFontArg() function now:
1. Checks if FontPath exists → uses bundled IBM Plex Mono ✅
2. Falls back to system fonts if bundled font missing
3. Ultimate fallback: "monospace"
This ensures VideoTools DVD menus always use the perfect VT aesthetic
with IBM Plex Mono, regardless of system-installed fonts.
The menu generation was failing because it tried to use "IBM Plex Mono"
font which isn't universally available. FFmpeg's drawtext filter would
fail silently when the font didn't exist.
Changes:
- Check if FontPath actually exists before using it (os.Stat check)
- Only use FontName if it's a known universally available font
- Whitelist of safe fonts: DejaVu, Liberation, Free fonts
- Ultimate fallback: "monospace" (most universally available)
Before:
- Tried IBM Plex Mono (not installed) → FFmpeg fails → "ERROR: FFmpeg failed during DVD encoding"
After:
- Tries IBM Plex Mono font file → doesn't exist
- Checks if "IBM Plex Mono" is in safe list → not in list
- Falls back to "monospace" → works everywhere
This fixes the cryptic "FFmpeg failed during DVD encoding" error that
actually occurred during menu generation, not encoding.
Changed log filename format from:
ifuckedmybestfriendsgirlfriend-author.videotools.log
To:
20260109_220355-ifuckedmybestfriendsgirlfriend-author.videotools.log
Benefits:
- Chronological sorting: Files sort by creation time in file browsers
- No overwrites: Each authoring job creates a unique log file
- Easy tracking: Timestamp shows exactly when the job was started
- Clean history: Can review logs from multiple runs of the same job
Timestamp format: YYYYMMDD_HHMMSS (e.g., 20260109_220355)
Added explicit sanitization of output paths when creating authoring jobs
to ensure special characters are removed before any filesystem operations.
The sanitization now happens in two places:
1. addAuthorToQueue: Sanitizes the output path for regular authoring jobs
2. addAuthorVideoTSToQueue: Sanitizes the output path for VIDEO_TS->ISO jobs
This ensures that:
- OutputFile field in Job struct never contains special characters
- Log filenames are sanitized (using the OutputFile basename)
- All filesystem operations use clean filenames
Before: /path/ifuckedmybestfriend'sgirlfriend.iso
After: /path/ifuckedmybestfriendsgirlfriend.iso
The display title shown to users still contains the original text,
but all actual file operations use sanitized names.
Applied sanitizeForPath to log filenames in createAuthorLog to ensure
log files don't contain special characters like apostrophes.
Before: ifuckedmybestfriend'sgirlfriend-author.videotools.log
After: ifuckedmybestfriendsgirlfriend-author.videotools.log
This prevents filesystem issues and improves consistency with output
filenames.