summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mkvlib/ass.go29
-rw-r--r--mkvlib/mkv.go56
-rw-r--r--mkvtool/main.go45
-rw-r--r--mkvtool/utils.go78
4 files changed, 174 insertions, 34 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
+}
diff --git a/mkvtool/main.go b/mkvtool/main.go
index eb13eec..5ce6de8 100644
--- a/mkvtool/main.go
+++ b/mkvtool/main.go
@@ -1,7 +1,6 @@
package main
import (
- "errors"
"flag"
"fmt"
"github.com/KurenaiRyu/MkvAutoSubset/mkvlib"
@@ -12,7 +11,6 @@ import (
"net/http"
"os"
"path"
- "path/filepath"
"regexp"
"runtime"
"strings"
@@ -66,6 +64,7 @@ func main() {
mks := false
ck := false
cks := false
+ t := false
sl, st := "", ""
af, ao := "", ""
flog := ""
@@ -191,6 +190,17 @@ func main() {
if len(*asses) > 0 {
if !processer.ASSFontSubset(*asses, af, ao, !ans, nil) {
ec++
+ } else if t {
+ d, _, _, _ := splitPath((*asses)[0])
+ if ao == "" {
+ ao = path.Join(d, "subsetted")
+ }
+ _asses, _ := findPath(ao, `\.ass$`)
+ if len(_asses) > 0 {
+ p := fmt.Sprintf("test-%s.a", randomStr(8))
+ p = path.Join(d, p)
+ processer.CreateTestVideo(_asses, ao, "nvenc_h264", p, nil)
+ }
}
return
}
@@ -272,34 +282,3 @@ func getLatestTag() {
}
}
}
-
-func findPath(path, expr string) (list []string, err error) {
- list = make([]string, 0)
- reg, e := regexp.Compile(expr)
- if e != nil {
- err = e
- return
- }
- err = queryPath(path, func(path string) bool {
- if expr == "" || reg.MatchString(path) {
- list = append(list, path)
- }
- return true
- })
- return
-}
-
-func queryPath(path string, cb func(string) bool) error {
- return filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
- if f == nil {
- return err
- }
- if f.IsDir() {
- return nil
- }
- if cb(path) {
- return nil
- }
- return errors.New("call cb return false")
- })
-}
diff --git a/mkvtool/utils.go b/mkvtool/utils.go
new file mode 100644
index 0000000..95bdbfb
--- /dev/null
+++ b/mkvtool/utils.go
@@ -0,0 +1,78 @@
+package main
+
+import (
+ "errors"
+ "math/rand"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strings"
+ "time"
+)
+
+func queryPath(path string, cb func(string) bool) error {
+ return filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
+ if f == nil {
+ return err
+ }
+ if f.IsDir() {
+ return nil
+ }
+ if cb(path) {
+ return nil
+ }
+ return errors.New("call cb return false")
+ })
+}
+
+func findPath(path, expr string) (list []string, err error) {
+ list = make([]string, 0)
+ reg, e := regexp.Compile(expr)
+ if e != nil {
+ err = e
+ return
+ }
+ err = queryPath(path, func(path string) bool {
+ if expr == "" || reg.MatchString(path) {
+ list = append(list, path)
+ }
+ return true
+ })
+ return
+}
+
+func splitPath(p string) (dir, name, ext, namewithoutext string) {
+ dir, name = filepath.Split(p)
+ ext = filepath.Ext(name)
+ n := strings.LastIndex(name, ".")
+ if n > 0 {
+ namewithoutext = name[:n]
+ }
+ return
+}
+
+var r = rand.New(rand.NewSource(time.Now().UnixNano()))
+
+func randomN(n int) int {
+ return r.Intn(n)
+}
+
+func randomNumber(min, max int) int {
+ sub := max - min + 1
+ if sub <= 1 {
+ return min
+ }
+ return min + randomN(sub)
+}
+
+func randomStr(l int) string {
+ str := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ bytes := []byte(str)
+ var result []byte
+ lstr := len(str) - 1
+ for i := 0; i < l; i++ {
+ n := randomNumber(0, lstr)
+ result = append(result, bytes[n])
+ }
+ return string(result)
+}