支持ass转换
This commit is contained in:
parent
a29d2c057e
commit
eba676b8de
6 changed files with 406 additions and 105 deletions
125
ass.go
Normal file
125
ass.go
Normal file
|
@ -0,0 +1,125 @@
|
|||
package ltc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/Hami-Lemon/ltc/glist"
|
||||
)
|
||||
|
||||
type ASSNode struct {
|
||||
Start int //开始时间
|
||||
End int //结束时间
|
||||
Dialogue string //内容
|
||||
}
|
||||
|
||||
func (a *ASSNode) String() string {
|
||||
builder := strings.Builder{}
|
||||
sh, sm, ss, sms := millisecond2Time(a.Start)
|
||||
eh, em, es, ems := millisecond2Time(a.End)
|
||||
builder.WriteString("Dialogue: 0,")
|
||||
sms /= 10
|
||||
ems /= 10
|
||||
builder.WriteString(fmt.Sprintf("%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,Default,,",
|
||||
sh, sm, ss, sms, eh, em, es, ems))
|
||||
builder.WriteString("0000,0000,0000,,")
|
||||
builder.WriteString(a.Dialogue)
|
||||
return builder.String()
|
||||
}
|
||||
|
||||
type ASS struct {
|
||||
Content glist.Queue[*ASSNode]
|
||||
}
|
||||
|
||||
func LrcToAss(lrc *LRC) *ASS {
|
||||
return SrtToAss(LrcToSrt(lrc))
|
||||
}
|
||||
|
||||
func SrtToAss(srt *SRT) *ASS {
|
||||
if srt == nil {
|
||||
return nil
|
||||
}
|
||||
ass := &ASS{
|
||||
Content: glist.NewLinkedList[*ASSNode](),
|
||||
}
|
||||
for it := srt.Content.Iterator(); it.Has(); {
|
||||
s := it.Next()
|
||||
node := &ASSNode{
|
||||
Start: s.Start,
|
||||
End: s.End,
|
||||
Dialogue: s.Text,
|
||||
}
|
||||
ass.Content.PushBack(node)
|
||||
}
|
||||
return ass
|
||||
}
|
||||
|
||||
func (a *ASS) WriteFile(path string) error {
|
||||
f, err := os.Create(path)
|
||||
if err != nil {
|
||||
//不存在对应文件夹
|
||||
if os.IsNotExist(err) {
|
||||
panic("文件夹不存在:" + filepath.Dir(path))
|
||||
}
|
||||
return err
|
||||
}
|
||||
err = a.Write(f)
|
||||
err = f.Close()
|
||||
return err
|
||||
}
|
||||
|
||||
func (a *ASS) Write(dst io.Writer) error {
|
||||
if err := writeScriptInfo(dst); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := writeStyles(dst); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := writeEventHeader(dst); err != nil {
|
||||
return err
|
||||
}
|
||||
for it := a.Content.Iterator(); it.Has(); {
|
||||
temp := it.Next()
|
||||
r := temp.String()
|
||||
_, err := fmt.Fprintf(dst, "%s\n", r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func writeScriptInfo(dst io.Writer) error {
|
||||
text := `[Script Info]
|
||||
Title: LRC ASS file
|
||||
ScriptType: v4.00+
|
||||
PlayResX: 1920
|
||||
PlayResY: 1080
|
||||
Collisions: Reverse
|
||||
WrapStyle: 2
|
||||
|
||||
`
|
||||
_, err := dst.Write([]byte(text))
|
||||
return err
|
||||
}
|
||||
|
||||
func writeStyles(dst io.Writer) error {
|
||||
text := `[V4+ Styles]
|
||||
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
|
||||
Style: Default,黑体,36,&H00FFFFFF,&H00FFFFFF,&H00000000,&00FFFFFF,-1,0,0,0,100,100,0,0,1,0,1,2,0,0,0,1
|
||||
|
||||
`
|
||||
_, err := dst.Write([]byte(text))
|
||||
return err
|
||||
}
|
||||
|
||||
func writeEventHeader(dst io.Writer) error {
|
||||
text := `[Events]
|
||||
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
|
||||
`
|
||||
_, err := dst.Write([]byte(text))
|
||||
return err
|
||||
}
|
Reference in a new issue