Integrated the FFmpegCommandWidget into the Convert module:
1. Added command preview section in buildConvertView():
- Creates FFmpegCommandWidget displaying current settings as FFmpeg command
- Uses INPUT/OUTPUT placeholders for portability
- Positioned above action bar, after snippet section
- Only shows when video is loaded
2. Command building logic:
- Builds config map from current convertConfig state
- Passes to buildFFmpegCommandFromJob() for command generation
- Updates preview dynamically (foundation for real-time updates)
- Includes all conversion settings (codecs, filters, quality, audio)
3. UI layout improvements:
- Added labeled "FFmpeg Command Preview:" header
- Scrollable monospace command display (80px min height)
- Copy button with clipboard integration
- Clean separation from other sections
Users can now see and copy the exact FFmpeg command that will be used
for their conversion before starting it. This makes it easy to reproduce
VideoTools' output in external tools or verify settings.
Next: Add Copy Command button to queue view for active/pending jobs.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implemented the foundation for FFmpeg command copy functionality:
1. Created FFmpegCommandWidget (components.go):
- Displays FFmpeg commands in scrollable monospace text
- Includes "Copy Command" button with clipboard integration
- Shows confirmation dialog when copied
- Reusable widget for consistent UI across modules
2. Created buildFFmpegCommandFromJob() function (main.go):
- Extracts FFmpeg command from queue job config
- Uses INPUT/OUTPUT placeholders for portability
- Handles video filters (deinterlace, crop, scale, aspect, flip, rotate, fps)
- Handles video codecs with hardware acceleration (H.264, H.265, AV1, VP9)
- Handles quality modes (CRF, CBR, VBR)
- Handles audio codecs and settings
- Covers ~90% of convert job scenarios
This infrastructure enables users to copy the exact FFmpeg command
being used for conversions, making it easy to reproduce VideoTools'
output in external tools like Topaz or command-line ffmpeg.
Next phase will integrate this into the Convert module UI, queue view,
and conversion history sidebar.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The queue Stats() method was grouping cancelled and failed jobs together,
causing cancelled jobs to be displayed as "failed" in the status bar.
Updated Stats() to return a separate cancelled count and modified all
callers (updateStatsBar, queueProgressCounts, showMainMenu) to handle
the new return value. Also updated ConversionStatsBar to display
cancelled jobs separately in the status bar.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add navigationHistory and navigationHistoryPosition to appState
- Add navigationHistorySuppress flag to prevent recursive history tracking
- Implement pushNavigationHistory to track module navigation
- Implement navigateBack and navigateForward for mouse button navigation
- Create mouseButtonHandler widget to capture mouse button events
- Wrap all content with mouseButtonHandler in setContent
- Track history in showModule and showMainMenu
- Handle mouse button 4 (back) and mouse button 5 (forward)
- Maintain history of up to 50 module navigations
Mouse back/forward buttons now work like a web browser - press the back button
to return to previous modules, press forward to go back to where you were.
History is maintained across all module transitions for seamless navigation.
- Increase striped progress bar contrast (light: 90→60, dark: 140→200)
- Increase fill opacity (180→200) for better visibility
- Increase progress bar height from 14px to 20px across both striped and standard bars
- Makes progress bars more visible and easier to read at a glance
The striped gradient now has much clearer distinction between light and dark
stripes, and the increased thickness makes progress easier to track visually.
- Add check in loadPersistedConvertConfig to default FrameRate to "Source" if empty
- Add check after loading persisted config to ensure FrameRate is "Source" if not set
- Prevents unwanted frame rate conversions from persisted config overriding safe defaults
This ensures that frame rate always defaults to "Source" and users won't
accidentally convert all their videos to 23.976fps or another frame rate
if they had previously saved a config with a specific frame rate set.
- Add upscaleFrameRate and upscaleMotionInterpolation fields to appState
- Add Frame Rate section to upscale UI with dropdown and motion interpolation checkbox
- Pass frame rate settings through upscale job config
- Implement frame rate conversion in executeUpscaleJob using minterpolate or fps filter
- Frame rate section appears after resolution selection in upscale settings
Frame rate control is now available in both convert and upscale modules,
allowing users to standardize content from different regions with optional
motion interpolation for smooth conversion.
- Add UseMotionInterpolation field to convertConfig struct
- Implement minterpolate filter for smooth frame rate changes when enabled
- Add UI checkbox in advanced settings for motion interpolation option
- Use minterpolate with high-quality settings (mci mode, aobmc, bidir ME, vsbmc)
- Falls back to simple fps filter when motion interpolation is disabled
- Fix pre-existing statusBar function calls (renamed to moduleFooter)
Motion interpolation provides smooth frame rate conversion (e.g., 24fps→60fps)
using motion-compensated interpolation instead of simple frame duplication.
This is useful for standardizing content from different regions.
Removed confirmation dialog popups when converting files with
chapters to DVD format. Instead, show a non-intrusive inline
warning label that appears/disappears based on format selection.
Warning label:
- Shows only when file has chapters AND DVD format is selected
- Displays inline below format selector in both simple and advanced modes
- No user action required - just informational
- Text: "Chapters will be lost - DVD format doesn't support embedded chapters. Use MKV/MP4 to preserve chapters."
When converting a file with chapters to DVD/MPEG format, show
a confirmation dialog warning the user that chapters will be lost.
MPEG format does not support embedded chapters - they require
full DVD authoring with IFO files. Users are warned and given
the option to cancel or continue.
Warning appears for both 'Convert Now' and 'Add to Queue' buttons.
Added -show_chapters flag to ffprobe command to retrieve chapter
information. Parse chapters from JSON output and set HasChapters
field when chapters are present.
Files with chapters will now correctly show 'Chapters: Yes' in
the file information display.
Added explicit stream mapping to preserve all streams:
- Map video, audio, and subtitle streams (subtitles optional)
- Added -map_chapters to preserve chapter information
- Added -map_metadata to preserve all file metadata
- Copy subtitle streams without re-encoding
Applies to both conversions with and without cover art.
Works for all output formats that support these features.
Removed -target ntsc-dvd and -target pal-dvd preset flags which
strip metadata including chapters. Instead, manually specify all
DVD parameters (bitrate, maxrate, bufsize, format) to maintain
full control and preserve chapter metadata.
Chapters now retained in both new 'dvd' format and legacy DVD formats.
When 'Clear Completed' empties the queue, return to the previous
module instead of staying in an empty queue view. If jobs remain
after clearing, stay in queue view and refresh.
Changed 'Clear All' behavior to return to the last active module
instead of always going to main menu. Falls back to main menu
if no previous module is tracked or if coming from queue itself.
Added clearer format descriptions:
- "Fast Merge (No Re-encoding)" instead of "MKV (Copy streams)"
- "Lossless MKV (Best Quality)" - new option with slow preset, CRF 18, FLAC audio
- "High Quality MP4 (H.264/H.265)" instead of technical codec names
- "DVD Format" with conditional region/aspect selectors
- "Blu-ray Format" instead of "Blu-ray (H.264)"
DVD Format improvements:
- When "DVD Format" is selected, shows Region (NTSC/PAL) and Aspect (16:9/4:3) options
- Options hidden for other formats
- Stored in state and passed to merge job config
- Updated execution to use DVD region/aspect settings
Maintains backward compatibility with legacy DVD format codes.
Removed cancelRunningLocked() call from Clear() method.
Now 'Clear Completed' only removes completed/failed/cancelled jobs
and preserves pending/running/paused jobs.
Previously it was cancelling active jobs before filtering, causing
running jobs (like merges) to be removed from the queue.
WMV Encoder Fix:
- WMV files now use wmv2 encoder (ffmpeg compatible) instead of wmv3
- Audio uses wmav2 for WMV files
- High quality bitrate (2000k) for WMV video
- Fallback handling for unsupported source codecs
UI Simplification:
- Changed "High Quality (source format/codecs)" to "Match Source Format"
- Simplified hint text to just "Unchecked = Use Conversion Settings"
- More concise and less confusing labels
Snippet Quality Improvements:
- High Quality mode now detects and uses source codecs (WMV stays WMV)
- Uses conversion panel's encoder preset (e.g., 'slow') instead of hardcoded 'ultrafast'
- Uses conversion panel's CRF setting for quality control
- Outputs to source file extension in High Quality mode
- Updated UI label to "High Quality (source format/codecs)"
Workflow Streamlining:
- Removed popup dialog when loading multiple videos
- Showing convert view is sufficient feedback
- Failed files logged instead of shown in dialog
UI Fixes:
- Status label no longer wraps to new line on action bar
- Set text truncation to keep status on single line
Changed snippet "Default Format" mode from stream copy to re-encoding with
high quality settings (libx264, CRF 17, ultrafast preset). Stream copy
cannot provide precise durations as it can only cut at keyframe boundaries.
Both snippet modes now output MP4 and re-encode. The difference is quality:
- High Quality mode: CRF 17, ultrafast preset
- Conversion Settings mode: Uses configured output settings
Updated UI labels to reflect "Snippet Quality" instead of output format.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>