subParserHub.go 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package model
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/common"
  4. "github.com/allanpk716/ChineseSubFinder/interface"
  5. "path/filepath"
  6. "regexp"
  7. "strings"
  8. )
  9. type SubParserHub struct {
  10. Parser []_interface.ISubParser
  11. }
  12. // NewSubParserHub 处理的字幕文件需要符合 [siteName]_ 的前缀描述,是本程序专用的
  13. func NewSubParserHub(parser _interface.ISubParser, _parser ..._interface.ISubParser) *SubParserHub {
  14. s := SubParserHub{}
  15. s.Parser = make([]_interface.ISubParser, 0)
  16. s.Parser = append(s.Parser, parser)
  17. if len(_parser) > 0 {
  18. for _, one := range _parser {
  19. s.Parser = append(s.Parser, one)
  20. }
  21. }
  22. return &s
  23. }
  24. // DetermineFileTypeFromFile 确定字幕文件的类型,是双语字幕或者某一种语言等等信息,如果返回 nil ,那么就说明都没有字幕的格式匹配上
  25. func (p SubParserHub) DetermineFileTypeFromFile(filePath string) (*common.SubParserFileInfo, error){
  26. for _, parser := range p.Parser {
  27. subFileInfo, err := parser.DetermineFileTypeFromFile(filePath)
  28. if err != nil {
  29. return nil, err
  30. }
  31. // 文件的格式不匹配解析器就是 nil
  32. if subFileInfo == nil {
  33. continue
  34. } else {
  35. // 正常至少应该匹配一个吧,不然就是最外层继续返回 nil 出去了
  36. // 简体和繁体字幕的判断,通过文件名来做到的,基本就算个补判而已
  37. newLang := IsChineseSimpleOrTraditional(filePath, subFileInfo.Lang)
  38. subFileInfo.Name = filepath.Base(filePath)
  39. subFileInfo.Lang = newLang
  40. subFileInfo.FileFullPath = filePath
  41. subFileInfo.FromWhereSite = p.getFromWhereSite(filePath)
  42. return subFileInfo, nil
  43. }
  44. }
  45. // 如果返回 nil ,那么就说明都没有字幕的格式匹配上
  46. return nil, nil
  47. }
  48. // getFromWhereSite 从文件名找出是从那个网站下载的。这里的文件名的前缀是下载时候标记好的,比较特殊
  49. func (p SubParserHub) getFromWhereSite(filePath string) string {
  50. fileName := filepath.Base(filePath)
  51. var re = regexp.MustCompile(`^\[(\w+)\]_`)
  52. matched := re.FindStringSubmatch(fileName)
  53. if len(matched) < 1 {
  54. return ""
  55. }
  56. return matched[1]
  57. }
  58. // IsSubTypeWanted 这里匹配的字幕的格式,不包含 Ext 的 . 小数点,注意,仅仅是包含关系
  59. func IsSubTypeWanted(subName string) bool {
  60. nowLowerName := strings.ToLower(subName)
  61. if strings.Contains(nowLowerName, common.SubTypeASS) ||
  62. strings.Contains(nowLowerName, common.SubTypeSSA) ||
  63. strings.Contains(nowLowerName, common.SubTypeSRT) {
  64. return true
  65. }
  66. return false
  67. }
  68. // IsSubExtWanted 输入的字幕文件名,判断后缀名是否符合期望的字幕后缀名列表
  69. func IsSubExtWanted(subName string) bool {
  70. inExt := filepath.Ext(subName)
  71. switch strings.ToLower(inExt) {
  72. case common.SubExtSSA,common.SubExtASS,common.SubExtSRT:
  73. return true
  74. default:
  75. return false
  76. }
  77. }