🚀 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>
- Doubled scroll speed multiplier for much faster navigation
- Applied to Convert and Settings modules
- Significantly improves ability to navigate long settings quickly
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Removed outer VScroll that was scrolling entire content including video player
- Added VScroll to Simple tab (Advanced already had it)
- Only settings panel now scrolls, video/metadata stay fixed
- Changed mainContent to use NewPadded for horizontal spacing
- Improves usability and reduces claustrophobic feeling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- DVD title now starts empty each time Author module is opened
- Added DVD Title entry field to Videos tab
- Both Videos and Settings tab title fields update the same state
- Both trigger summary update and config persistence
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changed filename row to use VBox layout instead of HBox to give
it full width. This prevents the filename from wrapping at every
character. Removed wrapping from other metadata fields since
they're short values that don't need it.
Enabled word wrapping for all value labels in the metadata panel
to prevent text cutoff. Long filenames and metadata values will
now wrap to multiple lines instead of being truncated.
Changed from HBox with spacer to GridWithColumns for better
column alignment. This prevents the right column (Video Codec,
etc.) from being pushed too far to the right edge.
When users click on modules with missing dependencies (orange tiles),
show a dialog listing the missing dependencies and their install
commands. This helps users quickly identify what they need to install
to enable the module.
Modules with handlers but missing dependencies now show orange
background with stripes instead of grey. This distinguishes them
from unimplemented modules (grey) and helps users identify what
needs to be installed.
Set Trim, Audio, and Blu-Ray module handlers to nil to mark them
as disabled. These modules show as grey tiles with lock icons and
diagonal stripes until they are implemented.
Settings remains enabled despite nil handler as it has functionality.
Changed module colors to work better with white text:
- Trim: #FFEB3B → #F9A825 (dark yellow/gold)
- Audio: #FFC107 → #FF8F00 (dark amber)
- Subtitles: #8BC34A → #689F38 (dark green)
All modules now use consistent white text for uniform appearance.
Fixed filename overlapping with video codec information:
- Moved filename to its own full-width row at the top
- Two-column grid now starts below filename
- Prevents long filenames from overlapping with right column data
- Improves readability of metadata panel
This addresses the issue where long filenames like "She's So Small 12 Scene 3 Dillion Harper.mp4" would run into "Video Codec: h264" on the same line.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add comprehensive Settings module for managing system dependencies and application preferences:
- Created settings_module.go with dependency checking system
- Maps modules to required dependencies (FFmpeg, DVDAuthor, xorriso, Real-ESRGAN, Whisper)
- Displays dependency status with visual indicators (green/red)
- Shows platform-specific installation commands
- Auto-enables/disables modules based on installed dependencies
- Added Settings tile to main menu (always enabled)
- Integrated module availability checking via isModuleAvailable()
This provides users a centralized location to check and install missing dependencies, addressing the requirement to disable modules when dependencies aren't available.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Removed TextWrapWord setting from metadata value labels that was
causing text to wrap character-by-character in constrained space,
making the filename and other metadata appear vertically.
Text now flows naturally without wrapping, fixing the display issue
shown in the screenshot.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added a "Cancel Job" button to the Author module top bar that:
- Appears only when an Author job is currently running
- Uses DangerImportance styling for clear visual indication
- Cancels the running author job when clicked
- Hides automatically when no author job is running
This addresses the user's request for cancel buttons in every module
where it's relevant. The button provides immediate job cancellation
without needing to navigate to the queue view.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added chapter extraction from VIDEO_TS folders when importing:
- New extractChaptersFromVideoTS() function to parse chapters from VOB files
- Automatically loads chapters when VIDEO_TS folder is dropped
- Displays chapters in Chapters tab with "VIDEO_TS Chapters" source label
- Uses ffprobe to extract chapter info from main title VOB file
Chapters are now fully imported and visible in the UI when loading
VIDEO_TS folders, preserving the original DVD chapter structure.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
**Metadata Panel Fix:**
- Simplified makeRow layout to properly display values
- Changed from complex Border layout to simple HBox
- Metadata values now visible in Convert module
**RIP Module Improvements:**
- Added mount-based ISO extraction for UDF ISOs
- Added 7z extraction fallback
- Prioritizes xorriso > 7z > bsdtar for ISO extraction
- Handles both ISO9660 and UDF format DVDs
**Installation Script:**
- Updated all package managers to install xorriso
- Ensures proper UDF ISO support when disc modules enabled
- apt/dnf/zypper now install xorriso instead of genisoimage
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Output hint now updates immediately when checking/unchecking suffix checkbox
- User can see "video.mp4" vs "video-convert.mp4" change live
- Improves UX by providing instant visual feedback
Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Added AppendSuffix bool field to convertConfig (default: false)
- By default, output filename matches source filename exactly
- Added checkbox "Append \"-convert\" to filename" (unchecked by default)
- Checkbox appears in both Simple and Advanced modes
- Eliminates noise when doing batch conversions
- Auto-naming still works and respects the suffix setting
Before: video.mp4 → video-convert.mp4 (always)
After: video.mp4 → video.mp4 (or video-convert.mp4 if checked)
Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Replaced single-column Form widget with two-column grid layout
- Created makeRow helper for compact key-value pairs
- Left column: File, Format, Resolution, Aspect, Duration, FPS, etc.
- Right column: Codecs, Bitrates, Pixel Format, Channels, etc.
- More efficient use of space, matches modern UI design
- Text truncation prevents overflow
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Removed benchmark status display and apply button from top bar
- Cleaner UI matching mockup design
- Benchmark functionality still accessible via Settings menu
- Reduces visual clutter in Convert module
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Check if user has "slow" or "slower" preset before applying benchmark
- Upgrade benchmark preset to "slow" if user prefers quality
- Prevents benchmark from forcing fast presets on quality-focused users
- Logs quality preference detection for debugging
Fixes issue where benchmark kept switching to fast encoding despite
user preference for higher quality output.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Added ColorRemux (#06B6D4 cyan-glow) to semantic color system
- Remux formats now display with distinct color from regular MKV
- buildFormatBadge checks for "Remux" in label and applies special color
- Differentiates lossless remux from transcoded formats
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Changed badge layout from vertical stacking to horizontal inline display
- Badges now appear next to dropdowns using HBox containers
- Applied to format, video codec, and audio codec selections
- Added assets/mockup/ to .gitignore for design references
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Implemented buildVideoCodecBadge() and buildAudioCodecBadge() functions
- Added badge containers for format, video codec, and audio codec selections
- Badges use semantic color system from ui/colors.go
- Video codecs: AV1 (emerald), H.265 (lime), H.264 (sky blue), etc.
- Audio codecs: Opus (violet), AAC (purple), FLAC (magenta), etc.
- Format badges: MKV (teal), MP4 (blue), MOV (indigo), etc.
- Badges update dynamically when selection changes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implemented semantic color-coded badges for format selection:
- Badge displays next to format dropdown showing container name
- Uses semantic color system (MKV=teal, MP4=blue, MOV=indigo, etc.)
- Updates dynamically when format selection changes
- Appears in both Simple and Advanced modes
Changes:
- Created buildFormatBadge() function to generate colored badges
- Added formatBadgeContainer with updateFormatBadge() callback
- Integrated badge into both Simple and Advanced mode layouts
- Badge provides visual recognition of container type at a glance
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
User feedback: Benchmark indicator should disappear entirely once applied,
not just show "Applied" status.
Changes:
- Modified Apply Benchmark button callback to hide the entire indicator
- Removed code that changed text/color and disabled button
- Cleaner UI - indicator completely disappears after applying settings
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
When benchmark settings are already applied, benchmarkIndicator is nil but was
being added to the container unconditionally, causing a crash during UI layout.
Changes:
- Conditionally build back bar items array
- Only append benchmarkIndicator if it's not nil
- Prevents SIGSEGV when opening Convert module with applied benchmark
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
User feedback: Don't show benchmark status clutter when settings are already applied.
Changes:
- Only show benchmark indicator when settings are NOT applied
- Removes 'Benchmark: Applied' text + button from UI when active
- Cleaner Convert module interface when using benchmark settings
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Investigation revealed:
- Player module is ALREADY fully internal and lightweight
- Uses FFmpeg directly to decode video frames and audio
- Uses Oto library (lightweight Go audio library) for audio output
- No external VLC/MPV/FFplay dependencies
Implementation:
- FFmpeg pipes raw video frames (rgb24) directly to UI
- FFmpeg pipes audio (s16le) to Oto for playback
- Frame-accurate seeking and A/V sync built-in
- Error handling: Falls back to video-only if audio fails
Previous crash was likely from:
- Oto audio initialization failing on your system
- OR unrelated issue (OOM, etc.)
- Code already handles audio failures gracefully
Player module is safe to re-enable - it follows VideoTools' core principles.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>