Compare commits

...

5 Commits

6 changed files with 839 additions and 60 deletions

13
DONE.md
View File

@ -30,7 +30,15 @@ This file tracks completed features, fixes, and milestones.
- **UI Polish**
- "Run Benchmark" button highlighted (HighImportance) on first run
- Returns to normal styling after initial benchmark
- Guides new users to run initial benchmark
- Guides new users to run initial benchmark
- ✅ **AI Upscale Integration (Real-ESRGAN)**
- Added model presets with anime/general variants
- Processing presets (Ultra Fast → Maximum Quality) with tile/TTA tuning
- Upscale factor selection + output adjustment slider
- Tile size, output frame format, GPU and thread controls
- ncnn backend pipeline (extract → AI upscale → reassemble)
- Filters and frame rate conversion applied before AI upscaling
- ✅ **Bitrate Preset Simplification**
- Reduced from 13 confusing options to 6 clear presets
@ -833,6 +841,9 @@ This file tracks completed features, fixes, and milestones.
- ✅ Hide quality presets when bitrate mode is not CRF
- ✅ Snippet UI now shows Convert Snippet + batch + options with context-sensitive controls
- ✅ Reduced module video pane minimum sizes to allow GNOME window snapping
- ✅ Added cache/temp directory setting with SSD recommendation and override
- ✅ Snippet defaults now use conversion settings (not Match Source)
- ✅ Added frame interpolation presets to Filters and wired filter chain to Upscale
- ✅ Stabilized video seeking and embedded rendering
- ✅ Improved player window positioning
- ✅ Fixed clear video functionality

10
TODO.md
View File

@ -66,6 +66,9 @@ This file tracks upcoming features, improvements, and known issues.
- Quality presets hidden when bitrate mode is not CRF
- Snippet UI rearranged into Convert Snippet / Batch / Options with context-sensitive visibility
- Reduce module video pane min sizes to allow GNOME snapping
- Cache/temp directory setting with SSD recommendation
- Frame interpolation presets in Filters with Upscale linkage
- Real-ESRGAN AI upscale controls with ncnn pipeline (models, presets, tiles, TTA)
*Last Updated: 2025-12-20*
@ -109,6 +112,13 @@ This file tracks upcoming features, improvements, and known issues.
- Creative effects (grayscale, vignette)
- Real-time preview system
- [ ] **DVD Authoring module**
- Output VIDEO_TS folder + burn-ready ISO
- Auto-detect NTSC/PAL with manual override
- Preserve all audio tracks
- Subtitle support (start with SRT)
- Chapter sources: existing, manual markers, auto scene length
### Quality & Compression Improvements
- [x] **Automatic black bar detection and cropping** (v0.1.0-dev13 - COMPLETED)
- Implement ffmpeg cropdetect analysis pass

View File

@ -252,7 +252,7 @@ func ProbeVideo(path string) (*VideoSource, error) {
// Extract embedded cover art if present
if coverArtStreamIndex >= 0 {
coverPath := filepath.Join(os.TempDir(), fmt.Sprintf("videotools-embedded-cover-%d.png", time.Now().UnixNano()))
coverPath := filepath.Join(utils.TempDir(), fmt.Sprintf("videotools-embedded-cover-%d.png", time.Now().UnixNano()))
extractCmd := exec.CommandContext(ctx, FFmpegPath,
"-i", path,
"-map", fmt.Sprintf("0:%d", coverArtStreamIndex),

View File

@ -44,6 +44,12 @@ func HandleAudio(files []string) {
fmt.Println("audio", files)
}
// HandleDVDAuthor handles the DVD authoring module (placeholder)
func HandleDVDAuthor(files []string) {
logging.Debug(logging.CatModule, "dvd author handler invoked with %v", files)
fmt.Println("dvd author", files)
}
// HandleSubtitles handles the subtitles module (placeholder)
func HandleSubtitles(files []string) {
logging.Debug(logging.CatModule, "subtitles handler invoked with %v", files)

View File

@ -8,6 +8,7 @@ import (
"path/filepath"
"strconv"
"strings"
"sync/atomic"
"unicode/utf8"
"fyne.io/fyne/v2"
@ -271,3 +272,25 @@ func LoadAppIcon() fyne.Resource {
logging.Debug(logging.CatUI, "no app icon found in search paths")
return nil
}
var tempDirOverride atomic.Value
// SetTempDir overrides the app temp directory (empty string resets to system temp).
func SetTempDir(path string) {
trimmed := strings.TrimSpace(path)
if trimmed == "" {
tempDirOverride.Store("")
return
}
tempDirOverride.Store(trimmed)
}
// TempDir returns the app temp directory, falling back to the system temp dir.
func TempDir() string {
if v := tempDirOverride.Load(); v != nil {
if s, ok := v.(string); ok && s != "" {
return s
}
}
return os.TempDir()
}

845
main.go

File diff suppressed because it is too large Load Diff