marking_system.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package mark_system
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/common"
  4. "github.com/allanpk716/ChineseSubFinder/model"
  5. "github.com/allanpk716/ChineseSubFinder/sub_parser/ass"
  6. "github.com/allanpk716/ChineseSubFinder/sub_parser/srt"
  7. "github.com/sirupsen/logrus"
  8. )
  9. // MarkingSystem 评价系统,解决字幕排序优先级问题
  10. type MarkingSystem struct {
  11. log *logrus.Logger
  12. subSiteSequence []string // 网站的优先级,从高到低
  13. }
  14. func NewMarkingSystem(subSiteSequence []string) *MarkingSystem {
  15. mk := MarkingSystem{subSiteSequence: subSiteSequence,
  16. log: model.GetLogger()}
  17. return &mk
  18. }
  19. func (m MarkingSystem) SelectOneSubFile(organizeSubFiles []string) *common.SubParserFileInfo {
  20. var finalSubFile common.SubParserFileInfo
  21. // TODO 这里先处理 Top1 的字幕,后续再考虑怎么觉得 Top N 选择哪一个,很可能选择每个网站 Top 1就行了,具体的过滤逻辑在其内部实现
  22. // 一个网站可能就算取了 Top1 字幕,也可能是返回一个压缩包,然后解压完就是多个字幕,所以
  23. var subInfoDict = make(map[string][]common.SubParserFileInfo)
  24. // 拿到现有的字幕列表,开始抉择
  25. // 先判断当前字幕是什么语言(如果是简体,还需要考虑,判断这个字幕是简体还是繁体)
  26. subParserHub := model.NewSubParserHub(ass.NewParser(), srt.NewParser())
  27. for _, oneSubFileFullPath := range organizeSubFiles {
  28. subFileInfo, err := subParserHub.DetermineFileTypeFromFile(oneSubFileFullPath)
  29. if err != nil {
  30. m.log.Error(err)
  31. continue
  32. }
  33. if subFileInfo == nil {
  34. // 说明这个字幕无法解析
  35. m.log.Warning(oneSubFileFullPath, "DetermineFileTypeFromFile is nill")
  36. continue
  37. }
  38. _, ok := subInfoDict[subFileInfo.FromWhereSite]
  39. if ok == false {
  40. // 新建
  41. subInfoDict[subFileInfo.FromWhereSite] = make([]common.SubParserFileInfo, 0)
  42. }
  43. // 添加
  44. subInfoDict[subFileInfo.FromWhereSite] = append(subInfoDict[subFileInfo.FromWhereSite], *subFileInfo)
  45. }
  46. // 优先级别暂定 subSiteSequence: zimuku -> subhd -> xunlei -> shooter
  47. for _, subSite := range m.subSiteSequence {
  48. value, ok := subInfoDict[subSite]
  49. if ok == true {
  50. for _, info := range value {
  51. // 找到了中文字幕
  52. if model.HasChineseLang(info.Lang) == true {
  53. finalSubFile = info
  54. return &finalSubFile
  55. }
  56. }
  57. }
  58. }
  59. return nil
  60. }