04a1f33cb1
- Full-screen Bubble Tea TUI with cream background fill using PadLine/FillBlankLines - Self-update command (--update) pulling from GitHub releases - install.sh for curl one-liner installation - Terminal Lovers section on web landing page with install command and CLI features - All 7 format categories, glob/directory batch support, auto-download ffmpeg
65 lines
2.0 KiB
Go
65 lines
2.0 KiB
Go
package converter
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/noauf/transmute-cli/internal/ffmpeg"
|
|
)
|
|
|
|
func convertMedia(inputPath, outputPath, targetFormat string) error {
|
|
args := buildFFmpegArgs(inputPath, outputPath, targetFormat)
|
|
return mediaConvert(inputPath, outputPath, targetFormat, args)
|
|
}
|
|
|
|
func mediaConvert(inputPath, outputPath, targetFormat string, args []string) error {
|
|
if !ffmpeg.IsAvailable() {
|
|
return fmt.Errorf("ffmpeg is required for %s conversion — run `transmute --install-ffmpeg` to install it", targetFormat)
|
|
}
|
|
return ffmpeg.Run(args...)
|
|
}
|
|
|
|
func buildFFmpegArgs(inputPath, outputPath, targetFormat string) []string {
|
|
args := []string{"-y", "-i", inputPath}
|
|
|
|
switch targetFormat {
|
|
// Audio
|
|
case "mp3":
|
|
args = append(args, "-codec:a", "libmp3lame", "-q:a", "2", outputPath)
|
|
case "wav":
|
|
args = append(args, "-codec:a", "pcm_s16le", outputPath)
|
|
case "flac":
|
|
args = append(args, "-codec:a", "flac", outputPath)
|
|
case "ogg":
|
|
args = append(args, "-codec:a", "libvorbis", "-q:a", "6", outputPath)
|
|
case "aac":
|
|
args = append(args, "-codec:a", "aac", "-b:a", "192k", outputPath)
|
|
case "m4a":
|
|
args = append(args, "-codec:a", "aac", "-b:a", "192k", outputPath)
|
|
case "opus":
|
|
args = append(args, "-codec:a", "libopus", "-b:a", "128k", outputPath)
|
|
|
|
// Video
|
|
case "mp4":
|
|
args = append(args, "-codec:v", "libx264", "-preset", "medium", "-crf", "23",
|
|
"-codec:a", "aac", "-b:a", "192k", outputPath)
|
|
case "webm":
|
|
args = append(args, "-codec:v", "libvpx-vp9", "-crf", "30", "-b:v", "0",
|
|
"-codec:a", "libvorbis", outputPath)
|
|
case "avi":
|
|
args = append(args, "-codec:v", "mpeg4", "-q:v", "5",
|
|
"-codec:a", "libmp3lame", "-q:a", "4", outputPath)
|
|
case "mov":
|
|
args = append(args, "-codec:v", "libx264", "-preset", "medium", "-crf", "23",
|
|
"-codec:a", "aac", "-b:a", "192k", outputPath)
|
|
case "mkv":
|
|
args = append(args, "-codec:v", "libx264", "-preset", "medium", "-crf", "23",
|
|
"-codec:a", "aac", "-b:a", "192k", outputPath)
|
|
|
|
default:
|
|
// Generic: let ffmpeg figure it out from the extension
|
|
args = append(args, outputPath)
|
|
}
|
|
|
|
return args
|
|
}
|