diff options
| author | b5f0d6c3 <[email protected]> | 2022-05-06 01:24:12 +0800 |
|---|---|---|
| committer | b5f0d6c3 <[email protected]> | 2022-05-06 01:24:12 +0800 |
| commit | 8c382de8c87260d68b9c10e2bf687cbd53e3beb8 (patch) | |
| tree | 51d7b3fcb01fd99347e12e3262d42da7b37182ef /mkvlib | |
| parent | 76722d11d3d99c8ea93f6c906e22f697e568b7da (diff) | |
update
Diffstat (limited to 'mkvlib')
| -rw-r--r-- | mkvlib/ass.go | 29 | ||||
| -rw-r--r-- | mkvlib/mkv.go | 56 |
2 files changed, 84 insertions, 1 deletions
diff --git a/mkvlib/ass.go b/mkvlib/ass.go index 40cb54d..4bd8ee8 100644 --- a/mkvlib/ass.go +++ b/mkvlib/ass.go @@ -61,6 +61,33 @@ type assProcessor struct { strict bool } +func (self *assProcessor) getLength(p string) time.Duration { + f, err := openFile(p, true, false) + if err != nil { + return 0 + } + data, err := io.ReadAll(f) + if err != nil { + return 0 + } + str := string(data) + opt := parser.SSAOptions{} + subtitle, err := parser.ReadFromSSAWithOptions(strings.NewReader(str), opt) + if err == nil { + var s, e time.Duration + for _, v := range subtitle.Items { + if v.StartAt < s { + s = v.StartAt + } + if v.EndAt > e { + e = v.EndAt + } + } + return e - s + } + return 0 +} + func (self *assProcessor) parse() bool { ec := 0 self.seps = []string{"-", " "} @@ -70,7 +97,7 @@ func (self *assProcessor) parse() bool { if err != nil { ec++ } else { - data, _ := io.ReadAll(f) + data, err := io.ReadAll(f) str := string(data) if err == nil { self.subtitles[file] = str diff --git a/mkvlib/mkv.go b/mkvlib/mkv.go index 9690d86..73a16fd 100644 --- a/mkvlib/mkv.go +++ b/mkvlib/mkv.go @@ -8,6 +8,7 @@ import ( "path" "regexp" "strings" + "time" ) const ( @@ -394,3 +395,58 @@ func (self *mkvProcessor) Check(check, strict bool) { func (self *mkvProcessor) NRename(nrename bool) { self.nrename = nrename } + +func (self *mkvProcessor) CreateTestVideo(asses []string, fonts, enc, output string, lcb logCallback) bool { + _obj := new(assProcessor) + args := make([]string, 0) + args = append(args, "-hide_banner", "-loglevel", "quiet") + args = append(args, "-y", "-f", "lavfi") + args = append(args, "-i", fmt.Sprintf("color=c=0x000000:s=%s:r=%s", self.pr, self.pf)) + var t time.Duration + _s := len(asses) == 1 + if _s { + t = _obj.getLength(asses[0]) + fonts = strings.ReplaceAll(fonts, `\`, `/`) + fonts = strings.ReplaceAll(fonts, `:`, `\\:`) + asses[0] = strings.ReplaceAll(asses[0], `\`, `/`) + asses[0] = strings.ReplaceAll(asses[0], `:`, `\\:`) + args = append(args, "-vf", fmt.Sprintf("subtitles=%s:fontsdir=%s", asses[0], fonts)) + } else { + for _, v := range asses { + length := _obj.getLength(v) + if length > t { + t = length + } + } + } + if t == 0 { + return false + } + args = append(args, "-t", fmt.Sprintf("%dms", t.Milliseconds())) + args = append(args, "-c:v", enc) + args = append(args, "-c:s", "copy") + d, _, _, ne := splitPath(output) + _output := path.Join(d, fmt.Sprintf("%s.mp4", ne)) + args = append(args, _output) + if p, err := newProcess(nil, os.Stdout, os.Stderr, "", "ffmpeg", args...); err == nil { + s, err := p.Wait() + ok := err == nil && s.ExitCode() == 0 + if ok && !_s { + _fonts := findFonts(fonts) + if len(_fonts) > 0 { + __output := path.Join(d, fmt.Sprintf("%s.mkv", ne)) + ok = self.CreateMKV(_output, asses, _fonts, __output, "", "", false) + } else { + ok = false + } + } + if !ok || !_s { + _ = os.Remove(_output) + } + if !ok { + printLog(lcb, "Failed to create the test video file.") + } + return ok + } + return false +} |
