add internal/app/transcode.go
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
// ffmpegArgs builds the transcode command line: FLAC -> 128k 44.1kHz stereo
|
||||
// MP3 with ID3v2.3 + ID3v1 tags so even old stereo displays show the title.
|
||||
func ffmpegArgs(src, dst, bitrate, title, album string) []string {
|
||||
return []string{
|
||||
"-y", "-hide_banner", "-loglevel", "error",
|
||||
"-i", src,
|
||||
"-metadata", "title=" + title,
|
||||
"-metadata", "album=" + album,
|
||||
"-codec:a", "libmp3lame",
|
||||
"-b:a", bitrate,
|
||||
"-ar", "44100",
|
||||
"-ac", "2",
|
||||
"-id3v2_version", "3",
|
||||
"-write_id3v1", "1",
|
||||
dst,
|
||||
}
|
||||
}
|
||||
|
||||
// Transcode runs ffmpeg src -> dst. dst is written atomically via a temp file.
|
||||
func Transcode(src, dst, bitrate, title, album string) error {
|
||||
tmp := dst + ".tmp.mp3" // keep .mp3 suffix so ffmpeg can detect the muxer
|
||||
args := ffmpegArgs(src, tmp, bitrate, title, album)
|
||||
cmd := exec.Command("ffmpeg", args...)
|
||||
if out, err := cmd.CombinedOutput(); err != nil {
|
||||
os.Remove(tmp)
|
||||
return fmt.Errorf("ffmpeg %s: %w: %s", src, err, out)
|
||||
}
|
||||
return os.Rename(tmp, dst)
|
||||
}
|
||||
Reference in New Issue
Block a user