fileinfo.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package subparser
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/internal/common"
  4. "github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
  5. "github.com/allanpk716/ChineseSubFinder/internal/types/language"
  6. "math"
  7. "time"
  8. )
  9. type FileInfo struct {
  10. Content string // 字幕的内容
  11. FromWhereSite string // 从那个网站下载的
  12. Name string // 字幕的名称,注意,这里需要额外的赋值,不会自动检测
  13. Ext string // 字幕的后缀名
  14. Lang language.MyLanguage // 识别出来的语言
  15. FileFullPath string // 字幕文件的全路径
  16. Data []byte // 字幕的二进制文件内容
  17. Dialogues []OneDialogue // 整个字幕文件的所有对话
  18. DialoguesFilter []OneDialogue // 整个字幕文件的所有对话,过滤掉特殊字符的对白
  19. DialoguesFilterEx []OneDialogueEx // 整个字幕文件的所有对话,过滤掉特殊字符的对白,这里会把一句话中支持的 中、英、韩、日 四国语言给分离出来
  20. CHLines []string // 抽取出所有的中文对话
  21. OtherLines []string // 抽取出所有的第二语言对话,可能是英文、韩文、日文
  22. }
  23. // GetTimeFormat 获取时间轴的格式化格式
  24. func (f FileInfo) GetTimeFormat() string {
  25. if f.Ext == common.SubExtASS || f.Ext == common.SubExtSSA {
  26. return common.TimeFormatPoint2
  27. } else {
  28. return common.TimeFormatPoint3
  29. }
  30. }
  31. // GetDialogueExContent 获取当前字幕文件语言对应索引的对白内容
  32. // 凡是带有 Eng 的返回 Eng,其他的就与对应语言相关
  33. func (f FileInfo) GetDialogueExContent(index int) string {
  34. switch f.Lang {
  35. case language.ChineseSimple, language.ChineseTraditional,
  36. language.ChineseSimpleJapanese, language.ChineseSimpleKorean,
  37. language.ChineseTraditionalJapanese, language.ChineseTraditionalKorean:
  38. // 带有中文的,但是又不是中英的
  39. return f.DialoguesFilterEx[index].ChLine
  40. case language.English, language.ChineseSimpleEnglish, language.ChineseTraditionalEnglish:
  41. return f.DialoguesFilterEx[index].EnLine
  42. case language.Japanese:
  43. return f.DialoguesFilterEx[index].JpLine
  44. case language.Korean:
  45. return f.DialoguesFilterEx[index].KrLine
  46. default:
  47. return f.DialoguesFilterEx[index].EnLine
  48. }
  49. }
  50. // ChangeDialoguesFilterExTimeByFramerateRatio 根据帧数比率调整时间轴 对应 ffsubsync -- SubtitleScaler
  51. func (f *FileInfo) ChangeDialoguesFilterExTimeByFramerateRatio(framerateRatio float64) error {
  52. timeFormat := f.GetTimeFormat()
  53. for i := 0; i < len(f.DialoguesFilter); i++ {
  54. oneDialogue := f.DialoguesFilter[i]
  55. timeStart, err := my_util.ParseTime(oneDialogue.StartTime)
  56. if err != nil {
  57. return err
  58. }
  59. timeEnd, err := my_util.ParseTime(oneDialogue.EndTime)
  60. if err != nil {
  61. return err
  62. }
  63. timeStartNumber := my_util.Time2SecondNumber(timeStart)
  64. timeEndNumber := my_util.Time2SecondNumber(timeEnd)
  65. scaleTimeStart := time.Time{}.Add(time.Duration(timeStartNumber * framerateRatio * math.Pow10(9)))
  66. scaleTimeEnd := time.Time{}.Add(time.Duration(timeEndNumber * framerateRatio * math.Pow10(9)))
  67. f.DialoguesFilter[i].StartTime = my_util.Time2SubTimeString(scaleTimeStart, timeFormat)
  68. f.DialoguesFilter[i].EndTime = my_util.Time2SubTimeString(scaleTimeEnd, timeFormat)
  69. }
  70. return nil
  71. }
  72. // OneDialogue 一句对话
  73. type OneDialogue struct {
  74. StartTime string // 开始时间
  75. EndTime string // 结束时间
  76. StyleName string // StyleName
  77. Lines []string // 台词
  78. }
  79. type OneDialogueByStartTime []OneDialogue
  80. func (d OneDialogueByStartTime) Len() int {
  81. return len(d)
  82. }
  83. func (d OneDialogueByStartTime) Swap(i, j int) {
  84. d[i], d[j] = d[j], d[i]
  85. }
  86. func (d OneDialogueByStartTime) Less(i, j int) bool {
  87. subStartTimeI, err := my_util.ParseTime(d[i].StartTime)
  88. if err != nil {
  89. return false
  90. }
  91. subStartTimeJ, err := my_util.ParseTime(d[j].StartTime)
  92. if err != nil {
  93. return false
  94. }
  95. return my_util.Time2SecondNumber(subStartTimeI) < my_util.Time2SecondNumber(subStartTimeJ)
  96. }
  97. // OneDialogueEx 一句对话,这里会把一句话中支持的 中、英、韩、日 四国语言给分离出来
  98. type OneDialogueEx struct {
  99. StartTime string // 开始时间
  100. EndTime string // 结束时间
  101. ChLine string
  102. EnLine string
  103. KrLine string
  104. JpLine string
  105. }
  106. const (
  107. Sub_Ext_Mark_Default = ".default" // 指定这个字幕是默认的
  108. Sub_Ext_Mark_Forced = ".forced" // 指定这个字幕是强制的
  109. )