Files
noah 04a1f33cb1 feat: add CLI with TUI, self-update, install script, and terminal section on landing page
- 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
2026-03-09 22:53:10 +01:00

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
}