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
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user