This repository has been archived on 2024-10-02. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
ltc/lrctocaptions/ltc.go
2022-03-30 10:41:28 +08:00

122 lines
2.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"bufio"
"flag"
"fmt"
"github.com/Hami-Lemon/ltc"
"io/ioutil"
"os"
"path/filepath"
"strings"
)
const (
// VERSION 当前版本
VERSION = `"0.3.4" (build 2022.03.30)`
VERSION_INFO = "LrcToCaptions(ltc) version: %s\n"
)
func main() {
parseFlag()
//TODO 酷狗的krc精准到字更利于打轴 https://shansing.com/read/392/
//显示版本信息
if version.IsSet() {
fmt.Printf(VERSION_INFO, VERSION)
return
}
//未指定来源
if input == "" {
fmt.Printf("未指定歌词来源\n")
flag.Usage()
os.Exit(0)
}
//获取歌词lyric为原文歌词tranLyric为译文歌词
var lyric, tranLyric string
//从文件中获取
if checkPath(input) {
if !strings.HasSuffix(input, ".lrc") {
fmt.Println("Error: 不支持的格式目前只支持lrc歌词文件。")
panic("")
}
if data, err := ioutil.ReadFile(input); err == nil {
if len(data) == 0 {
fmt.Println("获取歌词失败,文件内容为空。")
panic("")
}
lyric = string(data)
} else {
panic("读取文件失败:" + input + err.Error())
}
} else {
//从网络上获取
if source != "163" {
lyric, tranLyric = ltc.GetQQLyric(input)
} else {
lyric, tranLyric = ltc.Get163Lyric(input)
}
}
//下载歌词
if download.IsSet() {
//对文件名进行处理
o := output
if o == "" {
o = input + ".lrc"
} else if !strings.HasSuffix(o, ".lrc") {
o += ".lrc"
}
writeFile(o, lyric)
if tranLyric != "" {
writeFile("tran_"+o, tranLyric)
}
fmt.Println("下载歌词完成!")
return
}
lrc, lrcT := ltc.ParseLRC(lyric), ltc.ParseLRC(tranLyric)
//先转换成srt
srt, srtT := ltc.LrcToSrt(lrc), ltc.LrcToSrt(lrcT)
if srtT != nil {
//原文和译文合并
srt.Merge(srtT, mode.Mode())
}
switch format.Value() {
case FORMAT_SRT:
if err := srt.WriteFile(output); err != nil {
fmt.Println("出现错误,保存失败")
panic(err.Error())
}
case FORMAT_ASS:
ass := ltc.SrtToAss(srt)
if err := ass.WriteFile(output); err != nil {
fmt.Println("出现错误,保存失败")
panic(err.Error())
}
}
//如果是相对路径,则获取其对应的绝对路径
if !filepath.IsAbs(output) {
//如果是相对路径,父目录即是当前运行路径
dir, er := os.Getwd()
if er == nil {
output = dir + string(os.PathSeparator) + output
}
}
fmt.Printf("保存结果为:%s\n", output)
}
func writeFile(file string, content string) {
f, err := os.Create(file)
if err != nil {
fmt.Printf("创建结果文件失败:%v\n", err)
panic("")
}
defer f.Close()
writer := bufio.NewWriter(f)
_, err = writer.WriteString(content)
err = writer.Flush()
if err != nil {
fmt.Printf("保存文件失败:%v\n", err)
panic("")
}
}