subParserHub.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package sub_parser
  2. import "github.com/allanpk716/ChineseSubFinder/common"
  3. type SubParserHub struct {
  4. Parser []ISubParser
  5. }
  6. func NewSubParserHub(parser ISubParser, _inparser ... ISubParser) *SubParserHub {
  7. s := SubParserHub{}
  8. s.Parser = make([]ISubParser, 0)
  9. s.Parser = append(s.Parser, parser)
  10. if len(_inparser) > 0 {
  11. for _, one := range _inparser {
  12. s.Parser = append(s.Parser, one)
  13. }
  14. }
  15. return &s
  16. }
  17. // DetermineFileTypeFromFile 确定字幕文件的类型,是双语字幕或者某一种语言等等信息,如果返回 nil ,那么就说明都没有字幕的格式匹配上
  18. func (p SubParserHub) DetermineFileTypeFromFile(filePath string) (*SubFileInfo, error){
  19. for _, parser := range p.Parser {
  20. subFileInfo, err := parser.DetermineFileTypeFromFile(filePath)
  21. if err != nil {
  22. return nil, err
  23. }
  24. // 文件的格式不匹配解析器就是 nil
  25. if subFileInfo == nil {
  26. continue
  27. } else {
  28. // 正常至少应该匹配一个吧,不然就是最外层继续返回 nil 出去了
  29. return subFileInfo, nil
  30. }
  31. }
  32. // 如果返回 nil ,那么就说明都没有字幕的格式匹配上
  33. return nil, nil
  34. }
  35. type SubFileInfo struct {
  36. Name string // 字幕的名称,注意,这里需要额外的赋值,不会自动检测
  37. Ext string // 字幕的后缀名
  38. Lang common.Language // 识别出来的语言
  39. Dialogues []OneDialogue // 整个字幕文件的所有对话
  40. }
  41. // OneDialogue 一句对话
  42. type OneDialogue struct {
  43. StartTime string // 开始时间
  44. EndTime string // 结束时间
  45. Lines []string // 台词
  46. }