128 lines
2.8 KiB
Go
128 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
func convert(args []string) {
|
|
if len(args) < 2 {
|
|
fmt.Println(CONVERT_USAGE)
|
|
return
|
|
}
|
|
|
|
sourceFile := args[0]
|
|
targetFile := args[1]
|
|
|
|
sourceFmt := strings.TrimPrefix(filepath.Ext(sourceFile), ".")
|
|
targetFmt := strings.TrimPrefix(filepath.Ext(targetFile), ".")
|
|
|
|
switch sourceFmt {
|
|
case "lrc":
|
|
convertLyrics(sourceFile, targetFile, targetFmt)
|
|
case "srt":
|
|
convertSRT(sourceFile, targetFile, targetFmt)
|
|
default:
|
|
fmt.Printf("unsupported source file format: %s\n", sourceFmt)
|
|
}
|
|
}
|
|
|
|
func lrcToTxt(sourceFile, targetFile string) {
|
|
sourceLyrics, err := parseLyrics(sourceFile)
|
|
if err != nil {
|
|
fmt.Println("Error parsing source lyrics file:", err)
|
|
return
|
|
}
|
|
|
|
file, err := os.Create(targetFile)
|
|
if err != nil {
|
|
fmt.Println("Error creating target file:", err)
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
for _, content := range sourceLyrics.Content {
|
|
fmt.Fprintln(file, content)
|
|
}
|
|
}
|
|
|
|
func lrcToSrt(sourceFile, targetFile string) {
|
|
sourceLyrics, err := parseLyrics(sourceFile)
|
|
if err != nil {
|
|
fmt.Println("Error parsing source lyrics file:", err)
|
|
return
|
|
}
|
|
|
|
file, err := os.Create(targetFile)
|
|
if err != nil {
|
|
fmt.Println("Error creating target file:", err)
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
for i, content := range sourceLyrics.Content {
|
|
startTime := sourceLyrics.Timeline[i]
|
|
var endTime Timestamp
|
|
if i < len(sourceLyrics.Timeline)-1 {
|
|
endTime = sourceLyrics.Timeline[i+1]
|
|
} else {
|
|
endTime = addSeconds(startTime, 3)
|
|
}
|
|
|
|
fmt.Fprintf(file, "%d\n", i+1)
|
|
fmt.Fprintf(file, "%s --> %s\n", formatSRTTimestamp(startTime), formatSRTTimestamp(endTime))
|
|
fmt.Fprintf(file, "%s\n\n", content)
|
|
}
|
|
}
|
|
|
|
func srtToLrc(sourceFile, targetFile string) {
|
|
srtEntries, err := parseSRT(sourceFile)
|
|
if err != nil {
|
|
fmt.Println("Error parsing source SRT file:", err)
|
|
return
|
|
}
|
|
|
|
lyrics := Lyrics{
|
|
Metadata: make(map[string]string),
|
|
Timeline: make([]Timestamp, len(srtEntries)),
|
|
Content: make([]string, len(srtEntries)),
|
|
}
|
|
|
|
// Add default metadata
|
|
title := strings.TrimSuffix(filepath.Base(targetFile), filepath.Ext(targetFile))
|
|
lyrics.Metadata["ti"] = title
|
|
lyrics.Metadata["ar"] = ""
|
|
lyrics.Metadata["al"] = ""
|
|
|
|
for i, entry := range srtEntries {
|
|
lyrics.Timeline[i] = entry.StartTime
|
|
lyrics.Content[i] = entry.Content
|
|
}
|
|
|
|
err = saveLyrics(targetFile, lyrics)
|
|
if err != nil {
|
|
fmt.Println("Error saving LRC file:", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
func srtToTxt(sourceFile, targetFile string) {
|
|
srtEntries, err := parseSRT(sourceFile)
|
|
if err != nil {
|
|
fmt.Println("Error parsing source SRT file:", err)
|
|
return
|
|
}
|
|
|
|
file, err := os.Create(targetFile)
|
|
if err != nil {
|
|
fmt.Println("Error creating target file:", err)
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
for _, entry := range srtEntries {
|
|
fmt.Fprintln(file, entry.Content)
|
|
}
|
|
}
|