38 lines
1022 B
Go
38 lines
1022 B
Go
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)
|
|
}
|