marking_system.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. subParserHub *model.SubParserHub
  14. }
  15. func NewMarkingSystem(subSiteSequence []string) *MarkingSystem {
  16. mk := MarkingSystem{subSiteSequence: subSiteSequence,
  17. log: model.GetLogger(),
  18. subParserHub: model.NewSubParserHub(ass.NewParser(), srt.NewParser())}
  19. return &mk
  20. }
  21. // SelectOneSubFile 选择最优的一个字幕文件
  22. func (m MarkingSystem) SelectOneSubFile(organizeSubFiles []string) *common.SubParserFileInfo {
  23. var finalSubFile common.SubParserFileInfo
  24. // TODO 这里先处理 Top1 的字幕,后续再考虑怎么觉得 Top N 选择哪一个,很可能选择每个网站 Top 1就行了,具体的过滤逻辑在其内部实现
  25. subInfoDict := m.parseSubFileInfo(organizeSubFiles)
  26. // 优先级别暂定 subSiteSequence: zimuku -> subhd -> xunlei -> shooter
  27. for _, subSite := range m.subSiteSequence {
  28. value, ok := subInfoDict[subSite]
  29. if ok == false {
  30. continue
  31. }
  32. info := model.FindChineseBestSubtitle(value)
  33. if info != nil {
  34. finalSubFile = *info
  35. return &finalSubFile
  36. }
  37. }
  38. return nil
  39. }
  40. // SelectEachSiteTop1SubFile 每个网站最优的文件
  41. func (m MarkingSystem) SelectEachSiteTop1SubFile(organizeSubFiles []string) ([]string, []common.SubParserFileInfo) {
  42. // 每个文件都带有出处 [subhd]
  43. var outSiteName = make([]string, 0)
  44. var outSubParserFileInfos = make([]common.SubParserFileInfo, 0)
  45. subInfoDict := m.parseSubFileInfo(organizeSubFiles)
  46. for siteName, infos := range subInfoDict {
  47. // 每个网站保存一个
  48. info := model.FindChineseBestSubtitle(infos)
  49. if info != nil {
  50. outSiteName = append(outSiteName, siteName)
  51. outSubParserFileInfos = append(outSubParserFileInfos, *info)
  52. }
  53. }
  54. return outSiteName, outSubParserFileInfos
  55. }
  56. // parseSubFileInfo 从文件解析字幕信息
  57. func (m MarkingSystem) parseSubFileInfo(organizeSubFiles []string) map[string][]common.SubParserFileInfo {
  58. // 一个网站可能就算取了 Top1 字幕,也可能是返回一个压缩包,然后解压完就是多个字幕,所以
  59. var subInfoDict = make(map[string][]common.SubParserFileInfo)
  60. // 拿到现有的字幕列表,开始抉择
  61. // 先判断当前字幕是什么语言(如果是简体,还需要考虑,判断这个字幕是简体还是繁体)
  62. for _, oneSubFileFullPath := range organizeSubFiles {
  63. subFileInfo, err := m.subParserHub.DetermineFileTypeFromFile(oneSubFileFullPath)
  64. if err != nil {
  65. m.log.Error(err)
  66. continue
  67. }
  68. if subFileInfo == nil {
  69. // 说明这个字幕无法解析
  70. m.log.Warnln(oneSubFileFullPath, "DetermineFileTypeFromFile is nill")
  71. continue
  72. }
  73. _, ok := subInfoDict[subFileInfo.FromWhereSite]
  74. if ok == false {
  75. // 新建
  76. subInfoDict[subFileInfo.FromWhereSite] = make([]common.SubParserFileInfo, 0)
  77. }
  78. // 添加
  79. subInfoDict[subFileInfo.FromWhereSite] = append(subInfoDict[subFileInfo.FromWhereSite], *subFileInfo)
  80. }
  81. return subInfoDict
  82. }