subParserHub.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package sub_parser_hub
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/internal/common"
  4. "github.com/allanpk716/ChineseSubFinder/internal/ifaces"
  5. "github.com/allanpk716/ChineseSubFinder/internal/pkg/language"
  6. "github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
  7. "github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
  8. "path/filepath"
  9. "regexp"
  10. "strings"
  11. )
  12. type SubParserHub struct {
  13. Parser []ifaces.ISubParser
  14. }
  15. // NewSubParserHub 处理的字幕文件需要符合 [siteName]_ 的前缀描述,是本程序专用的
  16. func NewSubParserHub(parser ifaces.ISubParser, _parser ...ifaces.ISubParser) *SubParserHub {
  17. s := SubParserHub{}
  18. s.Parser = make([]ifaces.ISubParser, 0)
  19. s.Parser = append(s.Parser, parser)
  20. if len(_parser) > 0 {
  21. for _, one := range _parser {
  22. s.Parser = append(s.Parser, one)
  23. }
  24. }
  25. return &s
  26. }
  27. // DetermineFileTypeFromFile 确定字幕文件的类型,是双语字幕或者某一种语言等等信息,如果返回 nil ,那么就说明都没有字幕的格式匹配上
  28. func (p SubParserHub) DetermineFileTypeFromFile(filePath string) (bool, *subparser.FileInfo, error) {
  29. for _, parser := range p.Parser {
  30. bFind, subFileInfo, err := parser.DetermineFileTypeFromFile(filePath)
  31. if err != nil {
  32. return false, nil, err
  33. }
  34. if bFind == false {
  35. continue
  36. }
  37. // 正常至少应该匹配一个吧,不然就是最外层继续返回 nil 出去了
  38. // 简体和繁体字幕的判断,通过文件名来做到的,基本就算个补判而已
  39. //newLang := IsChineseSimpleOrTraditional(filePath, subFileInfo.Lang)
  40. subFileInfo.Name = filepath.Base(filePath)
  41. //subFileInfo.Lang = newLang
  42. subFileInfo.FileFullPath = filePath
  43. subFileInfo.FromWhereSite = p.getFromWhereSite(filePath)
  44. return true, subFileInfo, nil
  45. }
  46. // 如果返回 nil ,那么就说明都没有字幕的格式匹配上
  47. return false, nil, nil
  48. }
  49. // DetermineFileTypeFromBytes 确定字幕文件的类型,是双语字幕或者某一种语言等等信息,如果返回 nil ,那么就说明都没有字幕的格式匹配上
  50. func (p SubParserHub) DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (bool, *subparser.FileInfo, error) {
  51. /*
  52. 会遇到这样的字幕,如下
  53. 2line-The Card Counter (2021) WEBDL-1080p.chinese(inside).ass
  54. 它的对白一句话分了两个 dialogue 去做。这样做后续字幕时间轴校正就会遇到问题,因为只有一半,匹配占比会很低
  55. 那么,就需要额外的逻辑去对 DialoguesEx 进行额外的推断
  56. 暂时考虑的方案是,英文对白每一句的开头应该是英文大写字幕,如果是小写字幕,就应该与上语句合并,且每一句的字符长度有大于一定才触发
  57. */
  58. for _, parser := range p.Parser {
  59. bFind, subFileInfo, err := parser.DetermineFileTypeFromBytes(inBytes, nowExt)
  60. if err != nil {
  61. return false, nil, err
  62. }
  63. if bFind == false {
  64. continue
  65. }
  66. return true, subFileInfo, nil
  67. }
  68. // 如果返回 nil ,那么就说明都没有字幕的格式匹配上
  69. return false, nil, nil
  70. }
  71. // IsSubHasChinese 字幕文件是否包含中文
  72. func (p SubParserHub) IsSubHasChinese(fileFPath string) bool {
  73. // 增加判断已存在的字幕是否有中文
  74. bFind, file, err := p.DetermineFileTypeFromFile(fileFPath)
  75. if err != nil {
  76. log_helper.GetLogger().Errorln("IsSubHasChinese.DetermineFileTypeFromFile", fileFPath, err)
  77. return false
  78. }
  79. if bFind == false {
  80. log_helper.GetLogger().Warnln("IsSubHasChinese.DetermineFileTypeFromFile", fileFPath, "not support SubType")
  81. return false
  82. }
  83. if language.HasChineseLang(file.Lang) == false {
  84. log_helper.GetLogger().Warnln("IsSubHasChinese.HasChineseLang", fileFPath, "not chinese sub, is ", file.Lang.String())
  85. return false
  86. }
  87. return true
  88. }
  89. // getFromWhereSite 从文件名找出是从那个网站下载的。这里的文件名的前缀是下载时候标记好的,比较特殊
  90. func (p SubParserHub) getFromWhereSite(filePath string) string {
  91. fileName := filepath.Base(filePath)
  92. var re = regexp.MustCompile(`^\[(\w+)\]_`)
  93. matched := re.FindStringSubmatch(fileName)
  94. if len(matched) < 1 {
  95. return ""
  96. }
  97. return matched[1]
  98. }
  99. // IsSubTypeWanted 这里匹配的字幕的格式,不包含 Ext 的 . 小数点,注意,仅仅是包含关系
  100. func IsSubTypeWanted(subName string) bool {
  101. nowLowerName := strings.ToLower(subName)
  102. if strings.Contains(nowLowerName, common.SubTypeASS) ||
  103. strings.Contains(nowLowerName, common.SubTypeSSA) ||
  104. strings.Contains(nowLowerName, common.SubTypeSRT) {
  105. return true
  106. }
  107. return false
  108. }
  109. // IsSubExtWanted 输入的字幕文件名,判断后缀名是否符合期望的字幕后缀名列表
  110. func IsSubExtWanted(subName string) bool {
  111. inExt := filepath.Ext(subName)
  112. switch strings.ToLower(inExt) {
  113. case common.SubExtSSA, common.SubExtASS, common.SubExtSRT:
  114. return true
  115. default:
  116. return false
  117. }
  118. }