diff options
| -rw-r--r-- | ass.go | 99 | ||||
| -rw-r--r-- | main.go | 2 | ||||
| -rw-r--r-- | mkv.go | 3 | ||||
| -rw-r--r-- | utils.go | 6 |
4 files changed, 66 insertions, 44 deletions
@@ -80,6 +80,9 @@ func (self *ass) parse() bool { name = arr[1] } } + if strings.HasPrefix(name, "@") && len(name) > 1 { + name = name[1:] + } if m[name] == nil { m[name] = make(map[rune]bool) } @@ -135,7 +138,7 @@ func (self *ass) dumpFont(file string, full bool) bool { ok := false count := 1 _, n, _, _ := splitPath(file) - if strings.HasSuffix(file, ".ttc") && !full { + if strings.HasSuffix(file, ".ttc") { count = self.getTTCCount(file) if count < 1 { log.Printf(`Failed to get the ttc font count: "%s".`, n) @@ -185,37 +188,66 @@ func (self *ass) dumpFonts(files []string, full bool) bool { return ok == l } -func (self *ass) matchFonts() bool { - if !self.dumpFonts(self.fonts, false) { - return false +func (self *ass) getFontName(p string) []string { + f, err := openFile(p, true, false) + if err == nil { + defer func() { _ = f.Close() }() + names := make([]string, 0) + if xml, err := xmlquery.Parse(f); err == nil { + for _, v := range xml.SelectElements(`ttFont/name/namerecord[@platformID=3]`) { + id := v.SelectAttr("nameID") + name := strings.TrimSpace(v.FirstChild.Data) + switch id { + case "1": + names = append(names, name) + break + case "4": + names = append(names, name) + break + } + } + } + return names } + return nil +} + +func (self *ass) getFontsName() map[string][]string { files, _ := findPath(self._fonts, `\.ttx$`) - reg, _ := regexp.Compile(`_(\d+)\.ttx$`) + l := len(files) + wg := new(sync.WaitGroup) + wg.Add(l) + m := new(sync.Mutex) + _m := make(map[string][]string) for _, item := range files { - f, err := openFile(item, true, false) - if err == nil { - defer f.Close() - names := make([]string, 0) - if xml, err := xmlquery.Parse(f); err == nil { - for _, v := range xml.SelectElements(`ttFont/name/namerecord[@platformID=3]`) { - id := v.SelectAttr("nameID") - name := strings.TrimSpace(v.FirstChild.Data) - switch id { - case "1": - names = append(names, name) - break - case "4": - names = append(names, name) - break - } - } + go func(_item string) { + names := self.getFontName(_item) + if len(names) > 0 { + m.Lock() + _m[_item] = names + m.Unlock() } - for k, _ := range self.m { - for _, v := range names { - if v == k { - self.m[k].file = reg.ReplaceAllString(item, "") - self.m[k].ttx = item - self.m[k].index = reg.FindStringSubmatch(item)[1] + wg.Done() + }(item) + } + wg.Wait() + return _m +} + +func (self *ass) matchFonts() bool { + if !self.dumpFonts(self.fonts, false) { + return false + } + m := self.getFontsName() + if len(m) > 0 { + reg, _ := regexp.Compile(`_(\d+)\.ttx$`) + for k, _ := range self.m { + for _k, v := range m { + for _, _v := range v { + if _v == k { + self.m[k].file = reg.ReplaceAllString(_k, "") + self.m[k].ttx = _k + self.m[k].index = reg.FindStringSubmatch(_k)[1] self.m[k].newName = randomStr(8) break } @@ -373,16 +405,13 @@ func (self *ass) replaceFontNameInAss() bool { if m[f] == nil { m[f] = make(map[string]bool) } - n := regEx(v.oldName) - reg, _ := regexp.Compile(fmt.Sprintf(`(Style:[^,\n]+),(@?)%s,`, n)) - s = reg.ReplaceAllString(s, fmt.Sprintf("${1},${2}%s,", v.newName)) - reg, _ = regexp.Compile(fmt.Sprintf(`\\fn(@?)%s`, n)) - s = reg.ReplaceAllString(s, fmt.Sprintf(`\fn${1}%s`, v.newName)) - reg, _ = regexp.Compile(fmt.Sprintf(`(\\fn)?@?%s,?`, n)) + n := regexp.QuoteMeta(v.oldName) + reg, _ := regexp.Compile(fmt.Sprintf(`(Style:[^,\n]+,|\\fn)(@?)%s`, n)) if reg.MatchString(s) { + s = reg.ReplaceAllString(s, "${1}${2}"+v.newName) m[f][v.oldName] = true + self.subtitles[f] = s } - self.subtitles[f] = s } } for f, s := range self.subtitles { @@ -7,7 +7,7 @@ import ( "runtime" ) -const pName = "MKV Tool v3.0.2" +const pName = "MKV Tool v3.0.3" type arrayArg []string @@ -180,8 +180,7 @@ func createMKVs(dir string, slang, stitle string) bool { _ = os.RemoveAll(t) for i, item := range files { _, _, _, _f := splitPath(item) - _tf := reg.ReplaceAllString(_f, `\$0`) - tmp, _ := findPath(s, fmt.Sprintf(`%s\S*\.\S+$`, _tf)) + tmp, _ := findPath(s, fmt.Sprintf(`%s\S*\.\S+$`, regexp.QuoteMeta(_f))) asses := make([]string, 0) subs := make([]string, 0) p := path.Join(t, _f) @@ -209,12 +209,6 @@ func randomNumber(min, max int) int { return min + randomN(sub) } -var reg, _ = regexp.Compile(`[\*\.\?\+\$\^\[\]\(\)\{\}\|\\\/]`) - -func regEx(str string) string { - return reg.ReplaceAllString(str, `\$0`) -} - func findFonts(dir string) []string { list, _ := findPath(dir, `\.((ttf)|(otf)|(ttc)|(fon))$`) return list |
