Commit Graph

375 Commits

Author SHA1 Message Date
b67e635f97 Fix button styling in convert module to use proper colors
- 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.
2026-01-01 20:46:37 -05:00
c063b3f8f5 feat: Add stylistic filter state variables to appState
- 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.
2026-01-01 20:39:35 -05:00
e93353fea3 feat(ui): Combine Letterbox/Pillarbox into single smart option + bump to dev21
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)
2026-01-01 19:51:24 -05:00
c68dfd0e2c feat(ui): Redesign Convert module with color-coded dropdown buttons
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.
2026-01-01 19:45:27 -05:00
ed48c0bc0d fix(ui): Improve Convert module layout spacing and proportions
- 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.
2026-01-01 19:21:45 -05:00
993333dbea fix(ui): Wrap spacer in container for better size control
Wrapped the transparent spacer rectangle in a container.NewMax
and explicitly called Resize to ensure the 10px height is respected
by the VBox layout.
2026-01-01 12:34:49 -05:00
55ddbc9b5d fix(ui): Use 1px width spacer for 10px vertical spacing
Changed spacer width from 0 to 1 to ensure VBox respects the
minimum size constraint of 10px height between player and metadata.
2026-01-01 12:33:57 -05:00
59fca9490b fix(ui): Add 10px spacing between player and metadata panels
Added transparent spacer with 10px min height between the video
player panel and metadata panel in the convert module to prevent
them from touching.
2026-01-01 12:22:03 -05:00
d533245378 feat(audio): Complete Phase 1 - Add normalization and batch processing
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! 🎉
2026-01-01 12:20:19 -05:00
831f3e7321 feat(audio): Implement audio extraction module (Phase 1 complete)
Added comprehensive audio extraction module with the following features:

**Core Functionality:**
- Audio track detection via ffprobe with JSON parsing
- Multi-track selection with checkboxes
- Format conversion: MP3, AAC, FLAC, WAV
- Quality presets and custom bitrate settings
- Queue integration for batch processing
- Config persistence (saves user preferences)

**UI Components:**
- Left panel: Video drop zone, file info, track list
- Right panel: Format/quality settings, normalization options, output directory
- Status bar with progress indication
- Extract Now and Add to Queue buttons

**Technical Implementation:**
- Created audio_module.go with all UI and logic
- Implemented executeAudioJob() for FFmpeg extraction
- Added audioTrackInfo struct for track metadata
- Config persistence using JSON (~/config/VideoTools/audio.json)
- Proper error handling and logging

**Files Modified:**
- audio_module.go (NEW) - Complete audio module
- main.go - Audio state fields, module registration, navigation
- internal/queue/queue.go - JobTypeAudio already existed

**Remaining Phase 1 Tasks:**
- Two-pass loudnorm normalization
- Batch mode for multiple videos
2025-12-31 21:12:26 -05:00
0c344f7fca perf(ui): Increase scroll speed from 8x to 12x
- 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
2025-12-31 19:32:23 -05:00
21119e1d5a feat(logging): Add panic recovery and error logging for UI crashes
- 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
2025-12-31 18:00:34 -05:00
9c63ce03a3 perf(ui): Increase scroll speed from 5x to 8x
- 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
2025-12-31 16:49:34 -05:00
2a295cc39b perf(ui): Increase scroll speed from 2.5x to 5x
- Doubled scroll speed multiplier for much faster navigation
- Applied to Convert and Settings modules
- Significantly improves ability to navigate long settings quickly
2025-12-31 16:38:10 -05:00
1a38c1a718 feat(ui): Add fast scroll with 2.5x speed multiplier
- Created NewFastVScroll widget with customizable scroll speed
- Intercepts scroll events and multiplies delta by 2.5x
- Applied to Convert module (Simple and Advanced tabs)
- Applied to Settings module
- Significantly improves scrolling responsiveness
2025-12-31 16:06:10 -05:00
af433413b7 fix(convert): Fix scrolling and add horizontal padding
- 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
2025-12-31 15:48:29 -05:00
cb754a186e feat(author): Clear DVD title on module open and sync between tabs
- 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
2025-12-31 15:12:24 -05:00
30d5dff491 fix(ui): Fix vertical text in metadata filename display
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.
2025-12-31 15:06:34 -05:00
9c7ba646ca fix(ui): Enable text wrapping in metadata panel
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.
2025-12-31 14:09:29 -05:00
71c9f4130f fix(ui): Improve metadata panel column spacing
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.
2025-12-31 13:50:29 -05:00
1c402a0be7 feat(ui): Add dialog for installing missing dependencies
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.
2025-12-31 13:25:59 -05:00
0a687a6ad7 feat(ui): Add orange background for modules missing dependencies
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.
2025-12-31 13:24:12 -05:00
d40e5f07cf feat(ui): Mark unimplemented modules as disabled
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.
2025-12-31 13:16:10 -05:00
8e0e88f2d7 fix(ui): Darken bright module colors for white text readability
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.
2025-12-31 12:59:40 -05:00
f89c3b50cb fix(ui): Move filename to separate row in metadata panel
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.
2025-12-31 12:13:58 -05:00
344057b72d feat(settings): Add Settings module with dependency management
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.
2025-12-31 08:43:30 -05:00
52e11da6ea fix(ui): Fix vertical text in metadata panel
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.
2025-12-30 22:15:17 -05:00
d29f485106 feat(author): Add Cancel Job button to Author module
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.
2025-12-30 22:09:25 -05:00
02091aeea4 feat(author): Extract and display chapters from VIDEO_TS folders
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.
2025-12-30 22:09:25 -05:00
290d042ea2 Fix metadata display and improve ISO extraction support
**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
2025-12-30 21:07:50 -05:00
4ba53ae512 Remove cover art box and add spacing between metadata columns 2025-12-30 17:05:16 -05:00
1044b2a13b Fix suffix checkbox to regenerate name from source instead of keeping existing value 2025-12-30 16:40:44 -05:00
1379390ca9 Fix output name field not updating when toggling suffix checkbox 2025-12-30 16:20:20 -05:00
0d65a383b2 Update output filename preview in real-time when toggling suffix
- 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
2025-12-30 16:06:10 -05:00
0f9b628219 Make "-convert" suffix optional with checkbox (off by default)
- 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)
2025-12-30 13:03:54 -05:00
95d8541866 Add clear completed button to all module top bars
- Added clearCompletedJobs() method to appState in main.go
- Clears only completed and failed jobs, keeps pending/running/paused
- Added small ⌫ (backspace) icon button next to View Queue in all modules
- Button has LowImportance styling to keep it subtle
- Implements Jake's suggestion for quick queue cleanup

Modules updated:
- Convert (main.go)
- Author (author_module.go)
- Subtitles (subtitles_module.go)
- Rip (rip_module.go)
- Filters (filters_module.go)
- Thumbnails (thumb_module.go)
- Inspect (inspect_module.go)
2025-12-29 22:02:35 -05:00
93c9cb153d refactor(ui): Reorganize metadata into compact two-column layout
- 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
2025-12-29 12:19:15 -05:00
10097e1bf1 refactor(ui): Remove benchmark indicator from Convert module top bar
- 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
2025-12-29 12:15:27 -05:00
f7e2b1a29e feat(benchmark): Respect user quality preference when applying recommendations
- 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.
2025-12-29 02:34:22 -05:00
78fd3d52cb feat(ui): Add distinct color for Remux format
- 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
2025-12-29 02:29:54 -05:00
693c86490c feat(ui): Display codec badges inline with dropdowns
- 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
2025-12-29 02:27:44 -05:00
23ef278ded feat(ui): Add color-coded badges for format and codec dropdowns
- 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
2025-12-29 02:14:49 -05:00
f445ab0d2f Add color-coded format badges to Convert module
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
2025-12-29 01:45:11 -05:00
6f6daa9b9b Hide benchmark indicator when user clicks Apply Benchmark
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
2025-12-29 01:30:33 -05:00
ea1832aece Fix nil pointer crash in Convert module benchmark indicator
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
2025-12-29 00:13:24 -05:00
aee8093688 Hide benchmark indicator in Convert module when already applied
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
2025-12-28 22:21:09 -05:00
59e006d611 Re-enable Player module - already uses internal FFmpeg (no external deps)
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.
2025-12-28 20:36:40 -05:00
07d00789e7 Disable Player module to prevent crashes (external dependency violation)
Issue:
- Player module was crashing when accessed
- Uses external tools (MPV, VLC, FFplay) which violates VideoTools' core principle
- Everything should be internal and lightweight, no external dependencies

Fix:
- Disabled Player module in main menu
- Module still exists in code but is not accessible to users
- Prevents crash by preventing access to broken functionality

Future work needed:
- Implement pure-Go internal player using FFmpeg libraries
- OR implement simple preview-only playback using existing preview system
- Must be self-contained and lightweight
2025-12-28 20:33:07 -05:00
3d9626b605 Add benchmark result caching to avoid redundant benchmarks
Changes:
- Check for existing benchmark results when opening benchmark module
- If recent results exist for same hardware, show cached results instead of auto-running
- Display timestamp of cached results (e.g., "Showing cached results from December 28, 2025 at 2:45 PM")
- Add "Run New Benchmark" button at bottom of cached results view
- Only auto-run benchmark if no previous results exist or hardware has changed

Benefits:
- No more redundant benchmarks every time you open the module
- Results persist across app restarts (saved to ~/.config/VideoTools/benchmark.json)
- Clear indication when viewing cached vs fresh results
- Easy option to re-run if desired

Hardware detection:
- Compares GPU model to detect hardware changes
- If GPU changes, automatically runs new benchmark
- Keeps last 10 benchmark runs in history
2025-12-28 20:24:11 -05:00
12b08a063c Implement queue priority for Convert Now and auto-cleanup for failed conversions
Queue Priority Changes:
- Added AddNext() method to queue package that inserts jobs after running jobs
- "Convert Now" now adds to top of queue when conversions are already running
- "Add to Queue" continues to add to end of queue
- User feedback message indicates when job was added to top vs started fresh

Auto-Cleanup for Failed Files:
- Convert jobs now automatically delete incomplete/broken output files on failure
- Prevents accumulation of partial files from failed conversions
- Success tracking ensures complete files are never removed

Benefits:
- Better workflow when adding files during active conversions
- "Convert Now" truly prioritizes the current file
- No more broken partial files cluttering output directories
- Cleaner error handling and disk space management
2025-12-28 20:14:21 -05:00