summaryrefslogtreecommitdiff
path: root/mkvlib
diff options
context:
space:
mode:
authorb5f0d6c3 <[email protected]>2022-05-06 01:24:12 +0800
committerb5f0d6c3 <[email protected]>2022-05-06 01:24:12 +0800
commit8c382de8c87260d68b9c10e2bf687cbd53e3beb8 (patch)
tree51d7b3fcb01fd99347e12e3262d42da7b37182ef /mkvlib
parent76722d11d3d99c8ea93f6c906e22f697e568b7da (diff)
update
Diffstat (limited to 'mkvlib')
-rw-r--r--mkvlib/ass.go29
-rw-r--r--mkvlib/mkv.go56
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
+}