subParserHub.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package ChineseSubFinder
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/common"
  4. "github.com/allanpk716/ChineseSubFinder/sub_parser"
  5. "path/filepath"
  6. "regexp"
  7. )
  8. type SubParserHub struct {
  9. Parser []sub_parser.ISubParser
  10. }
  11. // NewSubParserHub 处理的字幕文件需要符合 [siteName]_ 的前缀描述,是本程序专用的
  12. func NewSubParserHub(parser sub_parser.ISubParser, _parser ...sub_parser.ISubParser) *SubParserHub {
  13. s := SubParserHub{}
  14. s.Parser = make([]sub_parser.ISubParser, 0)
  15. s.Parser = append(s.Parser, parser)
  16. if len(_parser) > 0 {
  17. for _, one := range _parser {
  18. s.Parser = append(s.Parser, one)
  19. }
  20. }
  21. return &s
  22. }
  23. // DetermineFileTypeFromFile 确定字幕文件的类型,是双语字幕或者某一种语言等等信息,如果返回 nil ,那么就说明都没有字幕的格式匹配上
  24. func (p SubParserHub) DetermineFileTypeFromFile(filePath string) (*sub_parser.SubFileInfo, error){
  25. for _, parser := range p.Parser {
  26. subFileInfo, err := parser.DetermineFileTypeFromFile(filePath)
  27. if err != nil {
  28. return nil, err
  29. }
  30. // 文件的格式不匹配解析器就是 nil
  31. if subFileInfo == nil {
  32. continue
  33. } else {
  34. // 正常至少应该匹配一个吧,不然就是最外层继续返回 nil 出去了
  35. // 简体和繁体字幕的判断,通过文件名来做到的,基本就算个补判而已
  36. newLang := common.IsChineseSimpleOrTraditional(filePath, subFileInfo.Lang)
  37. subFileInfo.Name = filepath.Base(filePath)
  38. subFileInfo.Lang = newLang
  39. subFileInfo.FileFullPath = filePath
  40. subFileInfo.FromWhereSite = p.getFromWhereSite(filePath)
  41. return subFileInfo, nil
  42. }
  43. }
  44. // 如果返回 nil ,那么就说明都没有字幕的格式匹配上
  45. return nil, nil
  46. }
  47. // getFromWhereSite 从文件名找出是从那个网站下载的。这里的文件名的前缀是下载时候标记好的,比较特殊
  48. func (p SubParserHub) getFromWhereSite(filePath string) string {
  49. fileName := filepath.Base(filePath)
  50. var re = regexp.MustCompile(`^\[(\w+)\]_`)
  51. matched := re.FindStringSubmatch(fileName)
  52. if len(matched) < 1 {
  53. return ""
  54. }
  55. return matched[1]
  56. }