blog/go/ogg2mp3/main.go

98 lines
3.0 KiB
Go

package main
/*
#cgo LDFLAGS: -L${SRCDIR}/build -logg2mp3 -lvorbisfile -lvorbis -logg -lmp3lame -lstdc++
#include <stdlib.h>
#include "ogg2mp3.h"
*/
import "C"
import (
"log"
"os"
"path/filepath"
"strings"
"unsafe"
_ "github.com/ianlancetaylor/cgosymbolizer" // cgo 错误跟踪
"github.com/spf13/cobra"
)
func convertOggToMp3(src string, dst string) C.int {
input := C.CString(src)
defer C.free(unsafe.Pointer(input))
output := C.CString(dst)
defer C.free(unsafe.Pointer(output))
return C.convertOggToMp3(input, output)
}
// listOggFiles 遍历指定文件夹,返回所有 OGG 文件的路径列表
func listOggFiles(dir string) ([]string, error) {
var oggFiles []string
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() && strings.HasSuffix(strings.ToLower(info.Name()), ".ogg") {
oggFiles= append(oggFiles, path)
}
return nil
})
return oggFiles, err
}
// convertOggFilesToMp3 将指定文件夹下的所有 OGG 文件转换为 MP3
func convertOggFilesToMp3(files []string, outputDir string) {
for _, file := range files {
outputFile := filepath.Join(outputDir, strings.TrimSuffix(filepath.Base(file), ".ogg")+".mp3")
if n := convertOggToMp3(file, outputFile); n != 0 {
log.Printf("Error converting %s to %s: %d", file, outputFile, n)
} else {
log.Printf("Successfully converted %s to %s", file, outputFile)
}
}
}
func main() {
var rootCmd = &cobra.Command{Use: "main"}
var convertCmd = &cobra.Command{
Use: "file [input.ogg] [output.mp3]",
Short: "Convert OGG to MP3",
Args: cobra.ExactArgs(2),
Run: func(cmd *cobra.Command, args []string) {
input := C.CString(args[0])
defer C.free(unsafe.Pointer(input))
output := C.CString(args[1])
defer C.free(unsafe.Pointer(output))
if n := C.convertOggToMp3(input, output); n != 0 {
log.Fatalf("Error converting OGG to MP3: %d", n)
}
},
}
var convertDirCmd = &cobra.Command{
Use: "dir [inputDir] [outputDir]",
Short: "Convert all OGG files in a directory to MP3",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
inputDir := args[0]
outputDir := inputDir + "_mp3"
if len(args) == 2 {
outputDir = args[1]
}
if _, err := os.Stat(outputDir); os.IsNotExist(err) {
if err := os.MkdirAll(outputDir, 0755); err != nil {
log.Fatalf("Error creating output directory: %v", err)
}
}
oggFiles, err := listOggFiles(inputDir)
if err != nil {
log.Fatalf("Error listing OGG files: %v", err)
}
convertOggFilesToMp3(oggFiles, outputDir)
},
}
rootCmd.AddCommand(convertCmd, convertDirCmd)
rootCmd.Execute()
}