generated from bing/readnotes
98 lines
3.0 KiB
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()
|
|
}
|