Features: - FPS counter in conversion status showing real-time encoding speed - Job queue now displays FPS, encoding speed (e.g., "1.2x"), and ETA for running conversions - Copy Comparison button exports side-by-side metadata comparison report - Auto-compare checkbox in Convert module - automatically loads Compare view after conversion - Convert Now properly adds job to queue and displays in Job Queue with live stats - Module badge colors in job queue now match main menu tile colors - Fixed fullscreen compare window sizing (reduced player dimensions to prevent overflow) Bug Fixes: - Fixed queue state management - only one job runs at a time (prevents multiple jobs showing "running") - Fixed Compare module slot assignment - single video drops now fill empty slot instead of overwriting - Fixed job queue scroll rubber banding (no longer jumps back to top) - Enhanced crop detection validation for WMV/AVI formats with dimension clamping and bounds checking Documentation: - VT_Player integration notes with API requirements for keyframing and trim features - LosslessCut feature analysis for Trim module inspiration - Video metadata guide covering MP4/MKV custom fields and NFO generation - Trim module design specification - Compare fullscreen mode documentation - Updated VIDEO_PLAYER_FORK.md to mark fork as completed Technical Changes: - Added state tracking for FPS, speed, and ETA (main.go:197-199) - Enhanced queue processJobs() to check for running jobs before starting new ones - Improved Compare module drag-and-drop logic with smart slot assignment (both code paths) - Added deferred scroll position restoration to prevent UI jumping - Job queue Config map now carries conversion stats for display 🤖 Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6.3 KiB
6.3 KiB
Trim Module Design
Overview
The Trim module allows users to cut portions of video files using visual keyframe markers. Users can set In/Out points on the timeline and preview the trimmed segment before processing.
Core Features
1. Visual Timeline Editing
- Load video with VT_Player
- Set In Point (start of keep region) - Press
Ior click button - Set Out Point (end of keep region) - Press
Oor click button - Visual markers on timeline showing trim region
- Scrub through video to find exact frames
2. Keyframe Controls
[In Point] ←────────────────→ [Out Point]
0:10 Keep Region 2:45
═══════════════════════════════════════════
3. Frame-Accurate Navigation
←/→- Step backward/forward one frameShift+←/Shift+→- Jump 1 secondI- Set In Point at current positionO- Set Out Point at current positionSpace- Play/PauseC- Clear all keyframes
4. Multiple Trim Modes
Mode 1: Keep Region (Default)
Keep video between In and Out points, discard rest.
Input: [─────IN════════OUT─────]
Output: [════════]
Mode 2: Cut Region
Remove video between In and Out points, keep rest.
Input: [─────IN════════OUT─────]
Output: [─────] [─────]
Mode 3: Multiple Segments (Advanced)
Define multiple keep/cut regions using segment list.
UI Layout
┌─────────────────────────────────────────────┐
│ < TRIM │ ← Cyan header bar
├─────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────┐ │
│ │ Video Player (VT_Player) │ │
│ │ │ │
│ │ [Timeline with In/Out markers] │ │
│ │ ────I═══════════════O──────── │ │
│ │ │ │
│ │ [Play] [Pause] [In] [Out] [Clear] │ │
│ └───────────────────────────────────────┘ │
│ │
│ Trim Mode: ○ Keep Region ○ Cut Region │
│ │
│ In Point: 00:01:23.456 [Set In] [Clear] │
│ Out Point: 00:04:56.789 [Set Out] [Clear] │
│ Duration: 00:03:33.333 │
│ │
│ Output Settings: │
│ ┌─────────────────────────────────────┐ │
│ │ Format: [Same as source ▼] │ │
│ │ Re-encode: [ ] Smart copy (fast) │ │
│ │ Quality: [Source quality] │ │
│ └─────────────────────────────────────┘ │
│ │
│ [Preview Trimmed] [Add to Queue] │
│ │
└─────────────────────────────────────────────┘
← Cyan footer bar
VT_Player API Requirements
Required Methods
// Keyframe management
player.SetInPoint(position time.Duration)
player.SetOutPoint(position time.Duration)
player.GetInPoint() time.Duration
player.GetOutPoint() time.Duration
player.ClearKeyframes()
// Frame-accurate navigation
player.StepForward() // Advance one frame
player.StepBackward() // Go back one frame
player.GetCurrentTime() time.Duration
player.GetFrameRate() float64
// Visual feedback
player.ShowMarkers(in, out time.Duration) // Draw on timeline
Required Events
// Keyboard shortcuts
- OnKeyPress('I') -> Set In Point
- OnKeyPress('O') -> Set Out Point
- OnKeyPress('→') -> Step Forward
- OnKeyPress('←') -> Step Backward
- OnKeyPress('Space') -> Play/Pause
- OnKeyPress('C') -> Clear Keyframes
FFmpeg Integration
Keep Region Mode
ffmpeg -i input.mp4 -ss 00:01:23.456 -to 00:04:56.789 -c copy output.mp4
Cut Region Mode (Complex filter)
ffmpeg -i input.mp4 \
-filter_complex "[0:v]split[v1][v2]; \
[v1]trim=start=0:end=83.456[v1t]; \
[v2]trim=start=296.789[v2t]; \
[v1t][v2t]concat=n=2:v=1:a=0[outv]" \
-map [outv] output.mp4
Smart Copy (Fast)
- Use
-c copywhen no re-encoding needed - Only works at keyframe boundaries
- Show warning if In/Out not at keyframes
Workflow
- Load Video - Drag video onto Trim tile or use Load button
- Navigate - Scrub or use keyboard to find start point
- Set In - Press
Ior click "Set In" button - Find End - Navigate to end of region to keep
- Set Out - Press
Oor click "Set Out" button - Preview - Click "Preview Trimmed" to see result
- Queue - Click "Add to Queue" to process
Technical Notes
Precision Considerations
- Frame-accurate requires seeking to exact frame boundaries
- Display timestamps with millisecond precision (HH:MM:SS.mmm)
- VT_Player must handle fractional frame positions
- Consider GOP (Group of Pictures) boundaries for smart copy
Performance
- Preview shouldn't require full re-encode
- Show preview using VT_Player with constrained timeline
- Cache preview segments for quick playback testing
Future Enhancements
- Multiple trim regions in single operation
- Batch trim multiple files with same In/Out offsets
- Save trim presets (e.g., "Remove first 30s and last 10s")
- Visual waveform for audio-based trimming
- Chapter-aware trimming (trim to chapter boundaries)
Module Color
Cyan - #44DDFF (already defined in modulesList)