package main /* #cgo LDFLAGS: -L${SRCDIR}/build -logg2mp3 -lvorbisfile -lvorbis -logg -lmp3lame -lstdc++ #include #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() }