Make snippet conversion mode use actual conversion settings

Updates snippet conversion mode to use configured video/audio codecs, presets, CRF, and bitrates from the Convert tab instead of hardcoded h264/AAC. Output extension now matches selected format (e.g., .mkv, .webm, .mp4). This allows true comparison between source format snippets and conversion preview snippets using user's exact conversion settings.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Stu Leak 2025-12-16 22:58:56 -05:00
parent e5d1ecfc06
commit 610e75df33

109
main.go
View File

@ -3378,7 +3378,10 @@ func (s *appState) executeSnippetJob(ctx context.Context, job *queue.Job, progre
outputPath,
}
} else {
// Conversion format mode: Re-encode for precise duration and format conversion
// Conversion format mode: Use configured conversion settings
// This allows previewing what the final converted output will look like
conv := s.convert
args = []string{
"-y",
"-hide_banner",
@ -3386,14 +3389,90 @@ func (s *appState) executeSnippetJob(ctx context.Context, job *queue.Job, progre
"-ss", start,
"-i", inputPath,
"-t", fmt.Sprintf("%d", snippetLength),
"-c:v", "libx264", // Re-encode video to h264
"-preset", "ultrafast", // Fast encoding
"-crf", "18", // High quality
"-c:a", "aac", // Re-encode audio to AAC
"-b:a", "192k", // Audio bitrate
"-map", "0", // Include all streams
outputPath,
}
// Apply video codec settings
videoCodec := strings.ToLower(conv.VideoCodec)
switch videoCodec {
case "h.264", "":
args = append(args, "-c:v", "libx264")
if conv.EncoderPreset != "" {
args = append(args, "-preset", conv.EncoderPreset)
} else {
args = append(args, "-preset", "medium")
}
if conv.CRF != "" {
args = append(args, "-crf", conv.CRF)
} else {
args = append(args, "-crf", "23")
}
case "h.265":
args = append(args, "-c:v", "libx265")
if conv.EncoderPreset != "" {
args = append(args, "-preset", conv.EncoderPreset)
} else {
args = append(args, "-preset", "medium")
}
if conv.CRF != "" {
args = append(args, "-crf", conv.CRF)
} else {
args = append(args, "-crf", "28")
}
case "vp9":
args = append(args, "-c:v", "libvpx-vp9")
if conv.CRF != "" {
args = append(args, "-crf", conv.CRF)
} else {
args = append(args, "-crf", "31")
}
case "av1":
args = append(args, "-c:v", "libsvtav1")
if conv.CRF != "" {
args = append(args, "-crf", conv.CRF)
} else {
args = append(args, "-crf", "35")
}
case "copy":
args = append(args, "-c:v", "copy")
default:
// Fallback to h264
args = append(args, "-c:v", "libx264", "-preset", "medium", "-crf", "23")
}
// Apply audio codec settings
audioCodec := strings.ToLower(conv.AudioCodec)
switch audioCodec {
case "aac", "":
args = append(args, "-c:a", "aac")
if conv.AudioBitrate != "" {
args = append(args, "-b:a", conv.AudioBitrate)
} else {
args = append(args, "-b:a", "192k")
}
case "opus":
args = append(args, "-c:a", "libopus")
if conv.AudioBitrate != "" {
args = append(args, "-b:a", conv.AudioBitrate)
} else {
args = append(args, "-b:a", "128k")
}
case "mp3":
args = append(args, "-c:a", "libmp3lame")
if conv.AudioBitrate != "" {
args = append(args, "-b:a", conv.AudioBitrate)
} else {
args = append(args, "-b:a", "192k")
}
case "flac":
args = append(args, "-c:a", "flac")
case "copy":
args = append(args, "-c:a", "copy")
default:
// Fallback to AAC
args = append(args, "-c:a", "aac", "-b:a", "192k")
}
args = append(args, outputPath)
}
logFile, logPath, _ := createConversionLog(inputPath, outputPath, args)
@ -5264,8 +5343,11 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
ext = ".mp4"
}
} else {
// Conversion format: always use .mp4
ext = ".mp4"
// Conversion format: use configured output format
ext = state.convert.SelectedFormat.Ext
if ext == "" {
ext = ".mp4"
}
}
outName := fmt.Sprintf("%s-snippet-%d%s", strings.TrimSuffix(src.DisplayName, filepath.Ext(src.DisplayName)), time.Now().Unix(), ext)
@ -5331,8 +5413,11 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
ext = ".mp4"
}
} else {
// Conversion format: always use .mp4
ext = ".mp4"
// Conversion format: use configured output format
ext = state.convert.SelectedFormat.Ext
if ext == "" {
ext = ".mp4"
}
}
outName := fmt.Sprintf("%s-snippet-%d%s", strings.TrimSuffix(src.DisplayName, filepath.Ext(src.DisplayName)), timestamp, ext)