Commit Graph

289 Commits

Author SHA1 Message Date
057aa192a5 Add missing dialog/layout imports for FFmpeg command widget 2025-12-17 19:11:34 -05:00
4838b86143 Phase 1: Add FFmpeg command copy infrastructure
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.
2025-12-17 19:09:43 -05:00
2389abffdd Import json/strconv for thumbnail ffprobe parsing 2025-12-17 19:09:43 -05:00
93f4dcea76 Use ffprobe json parsing for thumbnail video info 2025-12-17 19:09:43 -05:00
Jake P
f1c56ba778 Attempted to create GUI
Attempted to create GUIs for both lt-convert and lt-gui
2025-12-17 22:50:59 +00:00
469e332bfd Clamp snippet bitrates and block lossless for short clips 2025-12-17 16:19:24 -05:00
d8511ca673 Clamp snippet conversion bitrate and ensure yuv420p 2025-12-17 16:15:31 -05:00
3f6f2b4784 Update DONE and TODO for UI/progress work 2025-12-17 14:53:46 -05:00
524fd66cb5 Fix fyne hover interface import for status bar 2025-12-17 14:52:27 -05:00
a3a6fbe6d0 Improve snippet progress reporting and speed up striped bars 2025-12-17 14:47:37 -05:00
a4a93a82e8 Make entire status strip clickable 2025-12-17 14:34:13 -05:00
5498d0df63 Restore tap handling on status bar 2025-12-17 14:33:11 -05:00
9aeb82dd2b Fix queue stats to properly distinguish cancelled from failed jobs
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.
2025-12-17 14:25:18 -05:00
3e5911d607 Add mouse back/forward button navigation support
- 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.
2025-12-17 14:09:42 -05:00
2f596bed3a Ensure status bar remains tappable 2025-12-17 14:05:27 -05:00
a255bdb04b Improve progress bar visibility and thickness
- 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.
2025-12-17 13:36:56 -05:00
9230d2836a Fix FrameRate default to always be Source
- 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.
2025-12-17 13:28:26 -05:00
2a879f1435 Add frame rate controls to merge and convert simple mode
- Add mergeFrameRate and mergeMotionInterpolation fields to appState
- Add frame rate dropdown and motion interpolation checkbox to merge UI
- Pass frame rate settings through merge job config
- Implement frame rate conversion in executeMergeJob (for non-DVD formats)
- Add frame rate controls to convert module's simple mode

Frame rate conversion with optional motion interpolation is now available in:
- Convert module (simple and advanced modes)
- Merge module
- Upscale module

All modules support both simple fps conversion (fast) and motion
interpolation (slower, smoother) for professional frame rate standardization.
2025-12-17 13:22:23 -05:00
cd9af90d14 Add frame rate control to upscale module
- 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.
2025-12-17 13:11:34 -05:00
01db489b6b Adjust convert action bar spacing 2025-12-17 06:11:12 -05:00
7ea4694803 Place convert action bar in tinted footer 2025-12-17 06:06:49 -05:00
e36ff7bca1 Return to single dark status strip footer 2025-12-17 05:57:44 -05:00
a63c1154a2 Align convert footer to single tinted bar with actions 2025-12-17 05:55:25 -05:00
851230e1ea Add motion interpolation for frame rate 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.
2025-12-17 05:39:54 -05:00
33b398b956 Refine footer layout to match legacy look 2025-12-17 05:35:03 -05:00
b8bcc06196 Use unified status bar helper across modules 2025-12-17 05:06:25 -05:00
7a1237a264 Make stats bar consistent across modules 2025-12-17 03:12:45 -05:00
e5b3c85998 Replace chapter warning popup with inline label
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."
2025-12-17 03:10:59 -05:00
21978de3a1 Add chapter loss warning when converting to DVD format
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.
2025-12-17 03:05:26 -05:00
f6f110e319 Make stats bar overlay use module tint and lighter text 2025-12-17 03:03:45 -05:00
694b4641c4 Fix duplicate queue button declaration in inspect view 2025-12-17 02:45:39 -05:00
bf1aaef7ab Fix queue progress calc type 2025-12-17 02:38:55 -05:00
5100dc41b3 Add stats bar across modules and fix thumb color 2025-12-17 02:32:06 -05:00
ef7c7c9f6e Animate striped progress bars in queue 2025-12-17 02:25:00 -05:00
2e7b622402 Include upscale output path in queue job 2025-12-17 02:22:33 -05:00
bfb3f58c8d Improve queue progress UI and upscale progress reporting 2025-12-17 02:21:55 -05:00
7df1246b0b Add stats bar to filters and upscale views 2025-12-17 02:17:06 -05:00
b04fa5bd5e Preserve AR and default lossless MKV in upscale 2025-12-17 02:11:49 -05:00
45c7b4f5c1 Enable drag-and-drop loading in filters and upscale 2025-12-17 01:57:51 -05:00
18d81cdbd4 Fix chapter detection in video probing
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.
2025-12-17 01:26:17 -05:00
efdf5d828f Preserve chapters, subtitles, and metadata in convert module
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.
2025-12-17 01:22:33 -05:00
d6ba8cc26c Fix DVD format merges to preserve chapter metadata
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.
2025-12-17 01:18:27 -05:00
4f1cdcd552 Fix 'Clear Completed' to return to previous module when queue is empty
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.
2025-12-17 01:04:22 -05:00
244ea04e5a Fix 'Clear All' queue button to return to previous module
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.
2025-12-17 00:57:01 -05:00
f653b2a4ce Simplify merge format dropdown with user-friendly options
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.
2025-12-17 00:52:26 -05:00
f6fe8bb61b Fix 'Clear Completed' to preserve running jobs
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.
2025-12-17 00:34:20 -05:00
533e779554 Fix WMV snippet encoding and simplify UI labels
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
2025-12-17 00:29:38 -05:00
4d1b853f90 Improve snippet quality and streamline multi-video workflow
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
2025-12-17 00:24:00 -05:00
33f76387e9 Fix snippet duration precision by always re-encoding
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.
2025-12-16 23:54:58 -05:00
b911956602 Fix snippet duration: revert to simple, reliable FFmpeg approach
Reverts the problematic -accurate_seek and -to flags that caused wildly incorrect durations (9:40 instead of 10s). Returns to the standard, reliable FFmpeg pattern for stream copy:

ffmpeg -ss START -i input -t DURATION -c copy output

This places -ss before -i for fast keyframe seeking and uses -t for duration (not -to which is an absolute timestamp causing incorrect extraction). Should now correctly extract the configured snippet length centered on video midpoint.
2025-12-16 23:36:04 -05:00