markingsystem.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package mark_system
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/pkg/logic/sub_parser/ass"
  4. "github.com/allanpk716/ChineseSubFinder/pkg/logic/sub_parser/srt"
  5. "github.com/allanpk716/ChineseSubFinder/pkg/sub_helper"
  6. "github.com/allanpk716/ChineseSubFinder/pkg/sub_parser_hub"
  7. "github.com/allanpk716/ChineseSubFinder/pkg/types/subparser"
  8. "github.com/sirupsen/logrus"
  9. )
  10. // MarkingSystem 评价系统,解决字幕排序优先级问题
  11. type MarkingSystem struct {
  12. log *logrus.Logger
  13. subSiteSequence []string // 网站的优先级,从高到低
  14. SubTypePriority int // 字幕格式的优先级
  15. subParserHub *sub_parser_hub.SubParserHub
  16. }
  17. func NewMarkingSystem(log *logrus.Logger, subSiteSequence []string, subTypePriority int) *MarkingSystem {
  18. mk := MarkingSystem{subSiteSequence: subSiteSequence,
  19. log: log,
  20. SubTypePriority: subTypePriority,
  21. subParserHub: sub_parser_hub.NewSubParserHub(log, ass.NewParser(log), srt.NewParser(log))}
  22. return &mk
  23. }
  24. // SelectOneSubFile 选择最优的一个字幕文件
  25. func (m MarkingSystem) SelectOneSubFile(organizeSubFiles []string) *subparser.FileInfo {
  26. var finalSubFile *subparser.FileInfo
  27. subInfoDict := m.parseSubFileInfo(organizeSubFiles)
  28. // 优先级别暂定 subSiteSequence: zimuku -> subhd -> xunlei -> shooter
  29. // 这里需要循环四轮:
  30. // 第一轮,双语、字幕类型自定义,优先
  31. // 第二轮,单语言(中文)、字幕类型自定义,优先
  32. // 第三轮,双语、字幕类型0,优先
  33. // 第四轮,单语言(中文)、字幕类型0,优先
  34. for i := 0; i < 4; i++ {
  35. for _, subSite := range m.subSiteSequence {
  36. infos, ok := subInfoDict[subSite]
  37. if ok == false {
  38. continue
  39. }
  40. if i == 0 {
  41. finalSubFile = sub_helper.SelectChineseBestBilingualSubtitle(infos, m.SubTypePriority)
  42. } else if i == 1 {
  43. finalSubFile = sub_helper.SelectChineseBestSubtitle(infos, m.SubTypePriority)
  44. } else if i == 2 {
  45. finalSubFile = sub_helper.SelectChineseBestBilingualSubtitle(infos, 0)
  46. } else if i == 3 {
  47. finalSubFile = sub_helper.SelectChineseBestSubtitle(infos, 0)
  48. }
  49. if finalSubFile != nil {
  50. return finalSubFile
  51. }
  52. }
  53. }
  54. return nil
  55. }
  56. // SelectEachSiteTop1SubFile 每个网站最优的文件
  57. func (m MarkingSystem) SelectEachSiteTop1SubFile(organizeSubFiles []string) ([]string, []subparser.FileInfo) {
  58. // 每个文件都带有出处 [subhd]
  59. var finalSubFile *subparser.FileInfo
  60. var outSiteName = make([]string, 0)
  61. var outSubParserFileInfos = make([]subparser.FileInfo, 0)
  62. subInfoDict := m.parseSubFileInfo(organizeSubFiles)
  63. // 这里需要循环四轮:
  64. // 第一轮,双语、字幕类型自定义,优先
  65. // 第二轮,单语言(中文)、字幕类型自定义,优先
  66. // 第三轮,双语、字幕类型0,优先
  67. // 第四轮,单语言(中文)、字幕类型0,优先
  68. for siteName, infos := range subInfoDict {
  69. // 每个网站保存一个
  70. for i := 0; i < 4; i++ {
  71. if i == 0 {
  72. finalSubFile = sub_helper.SelectChineseBestBilingualSubtitle(infos, m.SubTypePriority)
  73. } else if i == 1 {
  74. finalSubFile = sub_helper.SelectChineseBestSubtitle(infos, m.SubTypePriority)
  75. } else if i == 2 {
  76. finalSubFile = sub_helper.SelectChineseBestBilingualSubtitle(infos, 0)
  77. } else if i == 3 {
  78. finalSubFile = sub_helper.SelectChineseBestSubtitle(infos, 0)
  79. }
  80. if finalSubFile != nil {
  81. outSiteName = append(outSiteName, siteName)
  82. outSubParserFileInfos = append(outSubParserFileInfos, *finalSubFile)
  83. break
  84. }
  85. }
  86. }
  87. return outSiteName, outSubParserFileInfos
  88. }
  89. // parseSubFileInfo 从文件解析字幕信息
  90. func (m MarkingSystem) parseSubFileInfo(organizeSubFiles []string) map[string][]subparser.FileInfo {
  91. // 一个网站可能就算取了 Top1 字幕,也可能是返回一个压缩包,然后解压完就是多个字幕,所以
  92. var subInfoDict = make(map[string][]subparser.FileInfo)
  93. // 拿到现有的字幕列表,开始抉择
  94. // 先判断当前字幕是什么语言(如果是简体,还需要考虑,判断这个字幕是简体还是繁体)
  95. for _, oneSubFileFullPath := range organizeSubFiles {
  96. bFind, subFileInfo, err := m.subParserHub.DetermineFileTypeFromFile(oneSubFileFullPath)
  97. if err != nil {
  98. m.log.Errorln("DetermineFileTypeFromFile", oneSubFileFullPath, err)
  99. continue
  100. }
  101. if bFind == false {
  102. m.log.Warnln("DetermineFileTypeFromFile", oneSubFileFullPath, "not support SubType")
  103. continue
  104. }
  105. _, ok := subInfoDict[subFileInfo.FromWhereSite]
  106. if ok == false {
  107. // 新建
  108. subInfoDict[subFileInfo.FromWhereSite] = make([]subparser.FileInfo, 0)
  109. }
  110. // 添加
  111. subInfoDict[subFileInfo.FromWhereSite] = append(subInfoDict[subFileInfo.FromWhereSite], *subFileInfo)
  112. }
  113. return subInfoDict
  114. }