emby.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package emby
  2. import (
  3. "path/filepath"
  4. "regexp"
  5. "strings"
  6. language3 "github.com/allanpk716/ChineseSubFinder/pkg/types/language"
  7. "github.com/allanpk716/ChineseSubFinder/pkg/types/subparser"
  8. "github.com/allanpk716/ChineseSubFinder/pkg/language"
  9. "github.com/allanpk716/ChineseSubFinder/pkg/sub_formatter/common"
  10. )
  11. type Formatter struct {
  12. }
  13. func NewFormatter() *Formatter {
  14. return &Formatter{}
  15. }
  16. // GetFormatterName 当前的 Formatter 是那个
  17. func (f Formatter) GetFormatterName() string {
  18. return common.FormatterNameString_Emby
  19. }
  20. func (f Formatter) GetFormatterFormatterName() int {
  21. return int(common.Emby)
  22. }
  23. // IsMatchThisFormat 是否满足当前实现接口的字幕命名格式 - 是否符合规则、fileNameWithOutExt string, subExt string, subLang types.MyLanguage, extraSubPreName string
  24. func (f Formatter) IsMatchThisFormat(subName string) (bool, string, string, language3.MyLanguage, string) {
  25. /*
  26. Emby 的命名规则比较特殊,而且本程序就是做中文字幕下载的,所以,下面的正则表达式比较特殊
  27. */
  28. var re = regexp.MustCompile(`(?m).chinese\((\S+)\)(\.\S+)`)
  29. matched := re.FindAllStringSubmatch(subName, -1)
  30. /*
  31. [0][0] .chinese(简英,subhd).ass
  32. [0][1] 简英,subhd or 简英
  33. [0][2] .ass
  34. */
  35. if matched == nil || len(matched) < 1 || len(matched[0]) < 3 {
  36. return false, "", "", language3.Unknown, ""
  37. }
  38. var subLang language3.MyLanguage
  39. var subLangStr string
  40. var extraSubPreName string
  41. fileNameWithOutExt := strings.ReplaceAll(subName, matched[0][0], "")
  42. subExt := matched[0][2]
  43. midString := matched[0][1]
  44. if strings.Contains(midString, ",") == true {
  45. tmps := strings.Split(midString, ",")
  46. if len(tmps) < 2 {
  47. return false, "", "", language3.Unknown, ""
  48. }
  49. subLangStr = tmps[0]
  50. extraSubPreName = tmps[1]
  51. } else {
  52. subLangStr = midString
  53. extraSubPreName = ""
  54. }
  55. subLang = language.ChineseString2Lang(subLangStr)
  56. return true, fileNameWithOutExt, subExt, subLang, extraSubPreName
  57. }
  58. // GenerateMixSubName 通过视频和字幕信息,生成当前实现接口的字幕命名格式。extraSubPreName 一般是填写字幕网站,不填写则留空 - 新名称、新名称带有 default 标记,新名称带有 forced 标记
  59. func (f Formatter) GenerateMixSubName(videoFileName, subExt string, subLang language3.MyLanguage, extraSubPreName string) (string, string, string) {
  60. /*
  61. 这里会生成类似的文件名 xxxx.chinese(中英,shooter)
  62. */
  63. videoFileNameWithOutExt := strings.ReplaceAll(filepath.Base(videoFileName),
  64. filepath.Ext(videoFileName), "")
  65. return f.GenerateMixSubNameBase(videoFileNameWithOutExt, subExt, subLang, extraSubPreName)
  66. }
  67. func (f Formatter) GenerateMixSubNameBase(fileNameWithOutExt, subExt string, subLang language3.MyLanguage, extraSubPreName string) (string, string, string) {
  68. // 这里传入字幕后缀名的时候,可能会带有 default 或者 forced 字段,需要剔除
  69. nowSubExt := strings.ReplaceAll(subExt, subparser.Sub_Ext_Mark_Default, "")
  70. nowSubExt = strings.ReplaceAll(nowSubExt, subparser.Sub_Ext_Mark_Forced, "")
  71. note := ""
  72. // extraSubPreName 那个字幕网站下载的
  73. if extraSubPreName != "" {
  74. note = "," + extraSubPreName
  75. }
  76. subNewName := fileNameWithOutExt + language3.Emby_chinese + "(" + language.Lang2ChineseString(subLang) + note + ")" + nowSubExt
  77. subNewNameWithDefault := fileNameWithOutExt + language3.Emby_chinese + "(" + language.Lang2ChineseString(subLang) + note + ")" + subparser.Sub_Ext_Mark_Default + nowSubExt
  78. subNewNameWithForced := fileNameWithOutExt + language3.Emby_chinese + "(" + language.Lang2ChineseString(subLang) + note + ")" + subparser.Sub_Ext_Mark_Forced + nowSubExt
  79. return subNewName, subNewNameWithDefault, subNewNameWithForced
  80. }