Phase 1 Progress - Convert UI Cleanup (dev23):
Architecture Improvements:
- Add SetSelectedSilent() method to ColoredSelect to prevent callback loops
- Create convertUIState manager with setQuality(), setResolution(), setAspect(), setBitratePreset()
- Eliminate syncingQuality flag (quality widgets use state manager)
- Eliminate syncingAspect flag and syncAspect() function (aspect widgets use state manager)
- Eliminate syncingBitratePreset flag (bitrate preset widgets use state manager)
Impact:
- Sync flags reduced from 5 to 2 (60% reduction)
- Automatic widget synchronization (no manual SetSelected calls)
- Single source of truth for UI state
- Foundation for eliminating remaining sync flags
Remaining: syncingBitrate, syncingTargetSize (text entry debouncing needed)
Files modified:
- internal/ui/components.go (SetSelectedSilent method)
- main.go (state manager, widget callbacks)
- Update appVersion constant from dev21 to dev22
- Ensures main menu footer and About dialog show correct version
- Completes dev22 release preparation
All build fixes applied and version correctly displayed.
Fixed compilation errors in queueview.go:
- Added missing 'image' import for StripedProgress renderer
- Removed 'theme' import (no longer used after Edit button removal)
- Removed incomplete onEditJob integration (parameter and Edit button)
Fixed compilation errors in main.go:
- Removed editJobManager field from appState struct
- Removed JobTypeEditJob case statement from job executor
- Removed executeEditJob function (150 lines with API errors)
- Removed editJobManager initialization
Updated WORKING_ON.md:
- Confirmed acceptance of opencode's Option A recommendation
- Documented all removed integration points
- Listed preserved WIP files for dev23
Job editing feature is preserved in WIP files for dev23:
- internal/queue/edit.go (not committed, ready for dev23)
- internal/ui/command_editor.go (not committed, ready for dev23)
- internal/queue/execute_edit_job.go.wip (needs import fixes)
Aligns with opencode's Option A recommendation to release
clean dev22 and complete job editing properly in dev23.
- Fixed syntax error in main.go formatBackground section
- Added formatContainer widget for format selection in Convert module
- Fixed forward declaration issues for updateDVDOptions and buildCommandPreview
- Added GPUVendor() method to sysinfo.HardwareInfo for GPU detection
- Implemented automatic GPU detection for hardware encoding (auto mode)
- Fixed JobTypeFilters -> JobTypeFilter naming inconsistency in queue.go
- Added proper JobType specifications to all queue constants
- Removed duplicate/conflicting types.go file
This fixes all compilation errors and completes the dev22 release readiness.
Implemented automatic hardware encoder selection when hardware
acceleration is set to 'auto'. The system now detects the GPU
vendor and automatically selects the appropriate encoder:
- NVIDIA GPU → nvenc (h264_nvenc, hevc_nvenc, av1_nvenc)
- AMD GPU → amf (h264_amf, hevc_amf, av1_amf)
- Intel GPU → qsv (h264_qsv, hevc_qsv, av1_qsv)
- No compatible GPU → none (software encoding)
Detection uses the existing sysinfo.Detect() function which
identifies GPUs via nvidia-smi, lspci, wmic, and system_profiler
depending on the platform.
Location: main.go line 5867-5883
🎨 Major Convert Module Redesign:
• Navy blue Format section with 30/70 layout and rounded corners
• Two-tone Simple/Advanced buttons with dynamic colour changes
• Proper color-coded Format dropdown with navy indicators
• Dark background containers with consistent spacing
• Responsive design matching mockup specifications
📊 Technical Implementation:
• Replaced existing Format UI with card-based layout system
• Implemented 30/70 split design for better space utilization
• Added dynamic button colouring based on selection state
• Used container.NewBorder with navy rectangles for rounded corners
• Maintained backward compatibility with existing state management
🎯 Design Philosophy:
• Professional dark theme with navy blue (#1E3A8F) accents
• Clear visual hierarchy with proper sectioning
• Consistent 12pt/16pt text sizing throughout
• Rounded corners and soft edges for modern appearance
• Color-coded visual feedback for better UX
📊 Impact: Enhanced user experience with professional, responsive UI that matches
contemporary video editing application design standards.
Removed rigid minimum size constraints on metadata panel and labeled
panels to allow the horizontal splitter to move more fluidly across
the full range of the window.
Changes:
- Commented out outer.SetMinSize() in buildMetadataPanel (line 9282)
- Commented out rect.SetMinSize() in makeLabeledPanel (line 9267)
This addresses user feedback: "The horizontal movement of the spacer
between the settings and the player/metadata frames is way too tight,
we need to be able to move things way more fluidly."
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added SVT-AV1 preset mapping (0-13) to both snippet encoding paths:
- Snippet generation in standard mode (line ~5035)
- Snippet generation in conversion format mode (line ~5132)
Both now map x264/x265 presets to SVT-AV1 presets:
- ultrafast → 12 (~10-15 hours instead of 80+)
- fast → 8 (default for snippets)
- medium → 6
- veryslow → 3 (~80+ hours)
This ensures AV1 encoding has proper speed presets across all
encoding operations, preventing extremely slow encodes when users
select AV1 codec.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Fixed Windows ffmpeg.exe popups by adding //go:build tags and exporting CreateCommand/CreateCommandRaw properly
- Use utils.GetFFmpegPath(), GetFFprobePath(), GetFFplayPath() instead of hardcoded strings
- Switch AV1 codec to H.264 for better performance (AV1/libsvtav1 is extremely slow)
- Minor UI component refinements (padding, SetMinSize)
- Reverted all non-codec dropdowns to widget.NewSelect (quality presets, bitrate controls, rotation, resolution, aspect, encoder presets, frame rate, pixel format, hardware accel, audio controls, DVD options)
- Kept ColoredSelect ONLY for format and codec selects with semantic colors for navigation
- Fixed Upscale module to work without AI upscaler (removed realesrgan-ncnn-vulkan as required dependency)
- Fixed dvdAspectSelect.Selected() call (should be .Selected field, not method)
When switching between Kbps/Mbps/Gbps in the manual bitrate field,
automatically convert the numeric value to maintain the same bitrate.
Examples:
- 8000 Kbps → 8 Mbps
- 8000 Kbps → 0.008 Gbps
- 8 Mbps → 8000 Kbps
Prevents confusion from having nonsensical values like "8000 Mbps"
when switching units.
- Remove hardcoded minimum sizes from scroll containers and UI elements
for better responsiveness across different screen sizes
- Fix indentation and alignment across multiple modules
- Improve code consistency and readability
🚀 Major Enhancement Features Added:
• Professional AI enhancement module architecture
• Cross-platform ONNX Runtime integration
• Content-aware processing algorithms
• Unified player frame extraction pipeline
• Real-time progress tracking and preview system
• Modular AI model management system
🏗 Technical Implementation:
• EnhancementModule: Complete enhancement workflow framework
• ONNXModel: Cross-platform AI model interface with GPU support
• Content analysis: Anime/film/general detection algorithms
• Frame processing: Tile-based memory-efficient enhancement
• Progress tracking: Real-time enhancement monitoring with callbacks
📦 New Files Created:
• internal/enhancement/enhancement_module.go (main framework)
• internal/enhancement/onnx_model.go (AI model interface)
• Enhanced main.go (UI integration and menu system)
• Updated go.mod (ONNX Runtime dependency)
• Enhanced internal/modules/handlers.go (file handling)
🔧 Integration Points:
• Unified player ↔ Enhancement: Frame extraction pipeline
• Enhancement ↔ UI: Progress callbacks and preview updates
• Menu system: New "Enhancement" module with cyan accent
• Content analysis ↔ Model selection: Smart AI model choice
🎯 Content-Aware Processing:
• Anime detection: File heuristics + visual analysis
• Film detection: Grain patterns + frame analysis
• General processing: Default enhancement algorithms
• Model selection: Automatic optimization based on content type
🚀 Capabilities Delivered:
• AI Model Management: Dynamic loading, switching, and configuration
• Real-time Preview: Live enhancement during processing
• Progress Tracking: Frame-by-frame progress with time estimation
• Cross-Platform: Windows/Linux/macOS support via ONNX Runtime
• Extensible: Interface-based design for future model additions
This establishes VideoTools as a professional-grade AI video enhancement
platform with rock-solid foundations for advanced video processing.
Phase 2.3 (FFmpeg dnn_processing filter) and 2.5 (content-aware processing) are ready for implementation.
This commit extends the refactoring of direct `exec.Command` and `exec.CommandContext`
calls to `audio_module.go`, `author_module.go`, and `platform.go`, using the new
`utils.CreateCommand` and `utils.CreateCommandRaw` functions.
This completes the centralization of command execution logic in the core modules,
ensuring consistent console-hiding behavior on Windows and improving code maintainability.
- Update viewLogBtn importance from Low to Medium for better visibility
- Update loadCfgBtn and saveCfgBtn importance from Low to Medium
- Update analyzeInterlaceBtn importance from Medium to High for prominence
- Update detectCropBtn importance from default to Medium
- Update cacheBrowseBtn importance from default to Medium
- Update resetSettingsBtn importance from Low to Medium
This ensures action buttons use appropriate colors instead of grey,
while dropdown blocks maintain their grey appearance through
NewColorCodedSelectContainer with colored borders.
Addresses UI issue where buttons were incorrectly styled as grey
when they should have proper button colors.
- Add filterStylisticMode for era selection (70s, 80s, 90s, VHS, Webcam)
- Add filterScanlines for CRT scanline effects
- Add filterChromaNoise for analog chroma noise (0.0-1.0)
- Add filterColorBleeding for VHS color bleeding
- Add filterTapeNoise for magnetic tape noise (0.0-1.0)
- Add filterTrackingError for VHS tracking errors (0.0-1.0)
- Add filterDropout for tape dropout effects (0.0-1.0)
- Add filterInterlacing for interlaced/progressive video handling
This provides the foundation for authentic decade-based video effects
in the Filters module, supporting film restoration and period-accurate
video processing workflows.
Aspect Ratio Handling Improvements:
- Combine "Letterbox" and "Pillarbox" into single "Letterbox/Pillarbox" option
- System auto-detects direction based on aspect ratio change
- 4:3 → 16:9 = adds pillarbox (vertical bars)
- 16:9 → 4:3 = adds letterbox (horizontal bars)
- Update hint text for clarity: "Crop removes edges, Letterbox/Pillarbox adds black bars to fit"
- Backwards compatibility: legacy "Letterbox"/"Pillarbox" options still work in aspectFilters()
Inspired by Topaz's clear UX for aspect ratio handling.
Version Updates:
- Bump version to v0.1.0-dev21
- Increment build number to 20
- Updates both main.go and FyneApp.toml
Options now available:
- Auto (crops to fit)
- Crop (explicitly crop to target aspect)
- Letterbox/Pillarbox (adds black bars, auto-detects direction)
- Blur Fill (blurred background with original centered)
- Stretch (distorts to fit)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Major UI improvement: Integrate color indicators directly into dropdown buttons
instead of showing separate badge elements, creating a cleaner, more intuitive
interface where power users can quickly identify format/codec selections by color.
Changes:
- Add NewColorCodedSelectContainer() in internal/ui/components.go
- Creates colored 4px left border on dropdowns
- Returns container and border reference for dynamic color updates
- Update Format Selection:
- Colored border matches container format (MKV=teal, MP4=blue, etc.)
- Dynamic color updates when format changes
- Remove old formatBadgeContainer approach
- Update Video Codec Selection:
- Colored border matches codec (H.264=sky blue, H.265=lime, AV1=emerald, etc.)
- Applied to Advanced tab
- Update Audio Codec Selection:
- Colored border matches codec (AAC=purple, Opus=violet, MP3=rose, etc.)
- Applied to Advanced tab
Color system provides instant visual feedback and helps power users navigate
settings quickly. Each format/codec has a unique color that's consistent
throughout the UI.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Change split ratio from 60/40 to 50/50 for better balance
- Add 15px horizontal spacing between left and right panels
- Settings panel now has more breathing room
- Fixes cramped feeling and allows window snapping
Addresses user feedback about cramped layout and panels touching.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Wrapped the transparent spacer rectangle in a container.NewMax
and explicitly called Resize to ensure the 10px height is respected
by the VBox layout.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changed spacer width from 0 to 1 to ensure VBox respects the
minimum size constraint of 10px height between player and metadata.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added transparent spacer with 10px min height between the video
player panel and metadata panel in the convert module to prevent
them from touching.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implemented two-pass loudnorm normalization and batch processing:
**Two-Pass Loudnorm Normalization:**
- First pass: Analyze audio with FFmpeg loudnorm filter
- Parse JSON output to extract measured values (I, TP, LRA, thresh)
- Second pass: Apply normalization with measured parameters
- EBU R128 standard with configurable target LUFS and true peak
- Progress reporting for both analysis and extraction phases
**Batch Processing:**
- Toggle between single file and batch mode
- Add multiple video files via drop or browse
- Show batch file list with remove buttons
- Extract first audio track from each file in batch
- All files share same output format/quality settings
**Technical Implementation:**
- analyzeLoudnorm() - First pass analysis with JSON parsing
- extractAudioWithNormalization() - Second pass with measured values
- extractAudioSimple() - Single-pass extraction without normalization
- getAudioCodecArgs() - Codec-specific argument building
- runFFmpegExtraction() - Common extraction executor with progress
- addAudioBatchFile() - Add files to batch list
- updateAudioBatchFilesList() - Refresh batch UI
- refreshAudioView() - Switch between single/batch UI modes
**UI Enhancements:**
- Batch file list with remove buttons and total count
- Clear All button for batch mode
- Seamless switching between single and batch modes
- Progress tracking for normalization passes
**Files Modified:**
- audio_module.go - Added 390+ lines for normalization and batch mode
- main.go - Added batch UI container state fields
Phase 1 is now complete! 🎉🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Increased scroll multiplier to 12x for significantly faster navigation
- Reduces mouse wheel rolling needed to navigate long settings panels
- Maintains control while providing much faster scrolling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Added Error() and Fatal() logging functions for non-debug errors
- Added Panic() function to log panics with full stack traces
- Added RecoverPanic() for defer statements to catch crashes
- Added panic recovery to main() function
- Added panic recovery to queue job processing goroutine
- All panics now logged to videotools.log with timestamps and stack traces
- Helps diagnose UI crashes that occur during FFmpeg processing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Increased scroll speed multiplier to 8x for faster navigation
- Balances speed with stability - fast enough to navigate quickly
- Without being so fast that it becomes hard to control
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>