diff options
| -rw-r--r-- | mkvlib/ass.go | 29 | ||||
| -rw-r--r-- | mkvlib/mkv.go | 56 | ||||
| -rw-r--r-- | mkvtool/main.go | 45 | ||||
| -rw-r--r-- | mkvtool/utils.go | 78 |
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) +} |
