Просмотр исходного кода

修复内置字幕导出,可能遇到字幕残缺的梗

Signed-off-by: 716 <[email protected]>
716 4 лет назад
Родитель
Сommit
30ecfd0c28
1 измененных файлов с 37 добавлено и 12 удалено
  1. 37 12
      internal/logic/emby_helper/embyhelper.go

+ 37 - 12
internal/logic/emby_helper/embyhelper.go

@@ -305,20 +305,18 @@ func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (b
 	// 获取是否有内置的英文字幕,如果没有则无需继续往下
 	/*
 		这里有个梗,读取到的英文内置字幕很可能是残缺的,比如,基地 S01E04 Eng 第一个 Default Forced Sub,就不对,内容的 Dialogue 很少。
-		然后第二个 Eng 字幕才对。那么考虑到兼容性, 可能后续有短视频,也就不能简单的按 Dialogue 的多少去衡量。大概会做一个功能。
-		读取到视频的总长度,然后再分析 Dialogue 的时间出现的部分与整体时间轴的占比,又或者是 Dialogue 之间的连续成都分析,这个有待测试。
+		然后第二个 Eng 字幕才对。那么考虑到兼容性, 可能后续有短视频,也就不能简单的按 Dialogue 的多少去衡量。大概会做一个功能。方案有两个:
+		1. 读取到视频的总长度,然后再分析 Dialogue 的时间出现的部分与整体时间轴的占比,又或者是 Dialogue 之间的连续成都分析,这个有待测试。
+		2. 还有一个更加粗暴的方案,把所有的 Eng 都识别出来,然后找最多的 Dialogue 来做为正确的来使用(够粗暴吧)
 	*/
-	haveInsideEngSub := false
-	InsideEngSubIndex := 0
+	var insideEngSUbIndexList = make([]int, 0)
 	for _, stream := range videoInfo.MediaStreams {
 		if stream.IsExternal == false && stream.Language == "eng" && stream.Codec == "subrip" {
-			haveInsideEngSub = true
-			InsideEngSubIndex = stream.Index
-			break
+			insideEngSUbIndexList = append(insideEngSUbIndexList, stream.Index)
 		}
 	}
 	// 没有找到则跳过
-	if haveInsideEngSub == false {
+	if len(insideEngSUbIndexList) == 0 {
 		return false, nil, nil, nil
 	}
 	// 再内置英文字幕能找到的前提下,就可以先找中文的外置字幕,目前版本只能考虑双语字幕
@@ -351,10 +349,37 @@ func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (b
 	if len(exSubList) == 0 {
 		return false, nil, nil, nil
 	}
-	// 把之前 Internal 英文字幕的 SubInfo 实例的信息补充完整
-	// 但是也不是绝对的,因为后续去 emby 下载字幕的时候,需要与外置字幕的后缀名一致
-	// 这里开始去下载字幕
-	// 先下载内置的文的
+	/*
+		把之前 Internal 英文字幕的 SubInfo 实例的信息补充完整
+		但是也不是绝对的,因为后续去 emby 下载字幕的时候,需要与外置字幕的后缀名一致
+		这里开始去下载字幕
+		先下载内置的文的
+		因为上面下载内置英文字幕的梗,所以,需要预先下载多个内置的英文字幕下来,用体积最大(相同后缀名)的那个来作为最后的输出
+	*/
+	// 那么现在先下载相同格式(.srt)的两个字幕
+	InsideEngSubIndex := 0
+	if len(insideEngSUbIndexList) == 1 {
+		// 如果就找到一个内置字幕,就默认这个
+		InsideEngSubIndex = insideEngSUbIndexList[0]
+	} else {
+		// 如果找到不止一个就需要判断
+		var tmpSubContentLenList = make([]int, 0)
+		for _, index := range insideEngSUbIndexList {
+			subFileData, err := em.embyApi.GetSubFileData(videoId, mediaSourcesId, fmt.Sprintf("%d", index), common.SubExtSRT)
+			if err != nil {
+				return false, nil, nil, err
+			}
+			tmpSubContentLenList = append(tmpSubContentLenList, len(subFileData))
+		}
+		maxContentLen := -1
+		for index, contentLen := range tmpSubContentLenList {
+			if maxContentLen < contentLen {
+				maxContentLen = contentLen
+				InsideEngSubIndex = insideEngSUbIndexList[index]
+			}
+		}
+	}
+	// 这里才是下载最佳的那个字幕
 	for i := 0; i < 2; i++ {
 		tmpExt := common.SubExtSRT
 		if i == 1 {