Browse Source

重构 language 模块部分,修复 #98

Signed-off-by: 716 <[email protected]>
716 4 years ago
parent
commit
5547a4eb3e

+ 15 - 65
internal/logic/emby_helper/embyhelper.go

@@ -5,8 +5,10 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/internal/common"
 	embyHelper "github.com/allanpk716/ChineseSubFinder/internal/pkg/emby_api"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
+	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_parser_hub"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/emby"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/language"
+	"github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
 	"github.com/panjf2000/ants/v2"
 	"golang.org/x/net/context"
 	"path"
@@ -245,7 +247,9 @@ func (em *EmbyHelper) filterNoChineseSubVideoList(videoList []emby.EmbyMixInfo)
 			// 首先找到外置的字幕文件
 			if stream.IsExternal == true && stream.IsTextSubtitleStream == true && stream.SupportsExternalStream == true {
 				// 然后字幕的格式以及语言命名要符合本程序的定义,有字幕
-				if em.subTypeStringOK(stream.Codec) == true && em.langStringOK(stream.Language) == true {
+				if sub_parser_hub.IsEmbySubCodecWanted(stream.Codec) == true &&
+					sub_parser_hub.IsEmbySubChineseLangStringWanted(stream.Language) == true {
+
 					haveExternalChineseSub = true
 					break
 				} else {
@@ -256,7 +260,9 @@ func (em *EmbyHelper) filterNoChineseSubVideoList(videoList []emby.EmbyMixInfo)
 		// 内置中文字幕
 		haveInsideChineseSub := false
 		for _, stream := range info.VideoInfo.MediaStreams {
-			if stream.IsExternal == false && (stream.Language == "chi" || stream.Language == "cht" || stream.Language == "chs") {
+			if stream.IsExternal == false &&
+				sub_parser_hub.IsEmbySubChineseLangStringWanted(stream.Language) {
+
 				haveInsideChineseSub = true
 				break
 			}
@@ -288,7 +294,7 @@ func (em *EmbyHelper) filterNoChineseSubVideoList(videoList []emby.EmbyMixInfo)
 	return noSubVideoList, nil
 }
 
-// GetInternalEngSubAndExChineseEnglishSub 获取对应 videoId 的内置英文字幕,外置中(简体、繁体)字幕
+// GetInternalEngSubAndExChineseEnglishSub 获取对应 videoId 的内置英文字幕,外置中文字幕只要是带有中文的都算,简体、繁体、简英、繁英,需要后续额外的判断)字幕
 func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (bool, []emby.SubInfo, []emby.SubInfo, error) {
 
 	// 先刷新以下这个资源,避免找到的字幕不存在了
@@ -316,7 +322,7 @@ func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (b
 	*/
 	var insideEngSUbIndexList = make([]int, 0)
 	for _, stream := range videoInfo.MediaStreams {
-		if stream.IsExternal == false && stream.Language == "eng" && stream.Codec == "subrip" {
+		if stream.IsExternal == false && stream.Language == language.Emby_English_eng && stream.Codec == streamCodec {
 			insideEngSUbIndexList = append(insideEngSUbIndexList, stream.Index)
 		}
 	}
@@ -334,15 +340,13 @@ func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (b
 		// 首先找到外置的字幕文件
 		if stream.IsExternal == true && stream.IsTextSubtitleStream == true && stream.SupportsExternalStream == true {
 			// 然后字幕的格式以及语言命名要符合本程序的定义,有字幕
-			if em.subTypeStringOK(stream.Codec) == true &&
-				em.langStringOK(stream.Language) == true &&
-				// 只支持 简英、繁英
-				(strings.Contains(stream.Language, language.MatchLangChsEn) == true || strings.Contains(stream.Language, language.MatchLangChtEn) == true) {
+			if sub_parser_hub.IsEmbySubCodecWanted(stream.Codec) == true &&
+				sub_parser_hub.IsEmbySubChineseLangStringWanted(stream.Language) == true {
 
 				tmpFileName := filepath.Base(stream.Path)
 				// 去除 .default 或者 .forced
-				tmpFileName = strings.ReplaceAll(tmpFileName, language.Sub_Ext_Mark_Default, "")
-				tmpFileName = strings.ReplaceAll(tmpFileName, language.Sub_Ext_Mark_Forced, "")
+				tmpFileName = strings.ReplaceAll(tmpFileName, subparser.Sub_Ext_Mark_Default, "")
+				tmpFileName = strings.ReplaceAll(tmpFileName, subparser.Sub_Ext_Mark_Forced, "")
 				tmpFileNameWithOutExt = strings.ReplaceAll(tmpFileName, path.Ext(tmpFileName), "")
 				exSubList = append(exSubList, *emby.NewSubInfo(tmpFileNameWithOutExt+"."+stream.Codec, "."+stream.Codec, stream.Index))
 			} else {
@@ -411,61 +415,6 @@ func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (b
 	return true, inSubList, exSubList, nil
 }
 
-// langStringOK 从 Emby api 拿到字幕的 MyLanguage string是否是符合本程序要求的
-func (em *EmbyHelper) langStringOK(inLang string) bool {
-
-	tmpString := strings.ToLower(inLang)
-	nextString := tmpString
-	// 去除 [xunlie] 类似的标记
-	spStrings := strings.Split(tmpString, "[")
-	if len(spStrings) > 1 {
-		nextString = spStrings[0]
-	} else {
-		spStrings = strings.Split(tmpString, "(")
-		if len(spStrings) > 1 {
-			nextString = spStrings[0]
-		}
-	}
-	switch nextString {
-	// 早期版本支持的语言类型,现在弃用
-	case em.replaceLangString(language.Emby_chi),
-		em.replaceLangString(language.Emby_chn),
-		em.replaceLangString(language.Emby_chs),
-		em.replaceLangString(language.Emby_cht),
-		em.replaceLangString(language.Emby_chs_en),
-		em.replaceLangString(language.Emby_cht_en),
-		em.replaceLangString(language.Emby_chs_jp),
-		em.replaceLangString(language.Emby_cht_jp),
-		em.replaceLangString(language.Emby_chs_kr),
-		em.replaceLangString(language.Emby_cht_kr):
-		return true
-	case em.replaceLangString(language.Emby_chinese):
-		return true
-	default:
-		return false
-	}
-}
-
-// subTypeStringOK 从 Emby api 拿到字幕的 sub 类型 string (Codec) 是否是符合本程序要求的
-func (em *EmbyHelper) subTypeStringOK(inSubType string) bool {
-
-	tmpString := strings.ToLower(inSubType)
-	if tmpString == common.SubTypeSRT ||
-		tmpString == common.SubTypeASS ||
-		tmpString == common.SubTypeSSA {
-		return true
-	}
-
-	return false
-}
-
-func (em *EmbyHelper) replaceLangString(inString string) string {
-	tmpString := strings.ToLower(inString)
-	one := strings.ReplaceAll(tmpString, ".", "")
-	two := strings.ReplaceAll(one, "_", "")
-	return two
-}
-
 type InputData struct {
 	Id string
 	Wg *sync.WaitGroup
@@ -479,4 +428,5 @@ type OutData struct {
 const (
 	videoTypeEpisode = "Episode"
 	videoTypeMovie   = "Movie"
+	streamCodec      = "subrip"
 )

+ 0 - 26
internal/logic/emby_helper/embyhelper_test.go

@@ -42,29 +42,3 @@ func TestEmbyHelper_GetInternalEngSubAndExSub(t *testing.T) {
 
 	println(internalEngSub[0].FileName, exCh_EngSub[0].FileName)
 }
-
-func TestEmbyHelper_langStringOK(t *testing.T) {
-
-	type args struct {
-		inLang string
-	}
-
-	config := config.GetConfig()
-	em := NewEmbyHelper(config.EmbyConfig)
-
-	tests := []struct {
-		name string
-		args args
-		want bool
-	}{
-		{name: "00", args: args{inLang: "chinese(简英,subhd)"}, want: true},
-		{name: "01", args: args{inLang: "chinese(简英,xunlei)"}, want: true},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := em.langStringOK(tt.args.inLang); got != tt.want {
-				t.Errorf("langStringOK() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}

+ 12 - 10
internal/logic/sub_timeline_fixer/sub_timeline_fixer_helper.go

@@ -16,8 +16,8 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_timeline_fixer"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/vad"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/emby"
-	"github.com/allanpk716/ChineseSubFinder/internal/types/language"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/sub_timeline_fiexer"
+	"github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
 	"os"
 	"path"
 	"path/filepath"
@@ -120,7 +120,7 @@ func (s SubTimelineFixerHelper) FixRecentlyItemsSubTimeline(movieRootDir, series
 func (s SubTimelineFixerHelper) fixOneVideoSub(videoId string, videoRootPath string) error {
 	log_helper.GetLogger().Debugln("fixOneVideoSub VideoROotPath:", videoRootPath)
 	// internalEngSub 默认第一个是 srt 然后第二个是 ass,就不要去遍历了
-	found, internalEngSub, exCh_EngSub, err := s.embyHelper.GetInternalEngSubAndExChineseEnglishSub(videoId)
+	found, internalEngSub, containChineseSubFile, err := s.embyHelper.GetInternalEngSubAndExChineseEnglishSub(videoId)
 	if err != nil {
 		return err
 	}
@@ -130,10 +130,10 @@ func (s SubTimelineFixerHelper) fixOneVideoSub(videoId string, videoRootPath str
 		return nil
 	}
 
-	log_helper.GetLogger().Debugln("internalEngSub:", len(internalEngSub), "exCh_EngSub:", len(exCh_EngSub))
+	log_helper.GetLogger().Debugln("internalEngSub:", len(internalEngSub), "containChineseSubFile:", len(containChineseSubFile))
 	// 需要先把原有的外置字幕带有 -fix 的删除,然后再做修正
 	// 不然如果调整了条件,之前修复的本次其实就不修正了,那么就会“残留”下来,误以为是本次配置的信息导致的
-	for _, exSubInfo := range exCh_EngSub {
+	for _, exSubInfo := range containChineseSubFile {
 		// 没有编辑的就跳过
 		if strings.Contains(exSubInfo.FileName, sub_timeline_fixer.FixMask) == false {
 			continue
@@ -154,7 +154,7 @@ func (s SubTimelineFixerHelper) fixOneVideoSub(videoId string, videoRootPath str
 	}
 
 	// 从外置双语(中英)字幕中找对对应的内置 srt 字幕进行匹配比较
-	for _, exSubInfo := range exCh_EngSub {
+	for _, exSubInfo := range containChineseSubFile {
 		inSelectSubIndex := 1
 		if exSubInfo.Ext == common.SubExtSRT {
 			inSelectSubIndex = 0
@@ -192,7 +192,8 @@ func (s SubTimelineFixerHelper) fixOneVideoSub(videoId string, videoRootPath str
 	return nil
 }
 
-func (s SubTimelineFixerHelper) fixSubTimeline(enSubFile emby.SubInfo, ch_enSubFile emby.SubInfo) (bool, []sub_timeline_fixer.SubFixInfo, string, error) {
+// fixSubTimeline 修复时间轴,containChineseSubFile 这里可能是,只要是带有中文的都算,简体、繁体、简英、繁英,需要后续额外的判断
+func (s SubTimelineFixerHelper) fixSubTimeline(enSubFile emby.SubInfo, containChineseSubFile emby.SubInfo) (bool, []sub_timeline_fixer.SubFixInfo, string, error) {
 	fixedSubName := ""
 	log_helper.GetLogger().Debugln("fixSubTimeline - DetermineFileTypeFromBytes", enSubFile.FileName)
 	bFind, infoBase, err := s.subParserHub.DetermineFileTypeFromBytes(enSubFile.Content, enSubFile.Ext)
@@ -209,15 +210,15 @@ func (s SubTimelineFixerHelper) fixSubTimeline(enSubFile emby.SubInfo, ch_enSubF
 	*/
 	sub_helper.MergeMultiDialogue4EngSubtitle(infoBase)
 
-	log_helper.GetLogger().Debugln("fixSubTimeline - DetermineFileTypeFromBytes", ch_enSubFile.FileName)
-	bFind, infoSrc, err := s.subParserHub.DetermineFileTypeFromBytes(ch_enSubFile.Content, ch_enSubFile.Ext)
+	log_helper.GetLogger().Debugln("fixSubTimeline - DetermineFileTypeFromBytes", containChineseSubFile.FileName)
+	bFind, infoSrc, err := s.subParserHub.DetermineFileTypeFromBytes(containChineseSubFile.Content, containChineseSubFile.Ext)
 	if err != nil {
 		return false, nil, fixedSubName, err
 	}
 	if bFind == false {
 		return false, nil, fixedSubName, nil
 	}
-	infoSrc.Name = ch_enSubFile.FileName
+	infoSrc.Name = containChineseSubFile.FileName
 	/*
 		这里发现一个梗,内置的英文字幕导出的时候,有可能需要合并多个 Dialogue,见
 		internal/pkg/sub_helper/sub_helper.go 中 MergeMultiDialogue4EngSubtitle 的实现
@@ -271,11 +272,12 @@ func (s SubTimelineFixerHelper) fixSubTimeline(enSubFile emby.SubInfo, ch_enSubF
 		// 符合已知的字幕命名格式,不符合就跳过,都跳过也行,就不做任何操作而已
 		bMatch, fileNameWithOutExt, subExt, subLang, extraSubName := formatter.IsMatchThisFormat(infoSrc.Name)
 		if bMatch == false {
+			log_helper.GetLogger().Debugln(fmt.Sprintf("%s IsMatchThisFormat == false, Skip, %s", formatter.GetFormatterName(), infoSrc.Name))
 			continue
 		}
 		// 是否包含 default 关键词,暂时无需判断 forced
 		hasDefault := false
-		if strings.Contains(strings.ToLower(infoSrc.Name), language.Sub_Ext_Mark_Default) == true {
+		if strings.Contains(strings.ToLower(infoSrc.Name), subparser.Sub_Ext_Mark_Default) == true {
 			hasDefault = true
 		}
 		// 生成对应字幕命名格式的,字幕命名。这里注意,normal 的时候, extraSubName+"-fix" 是无效的,不会被设置,也就是直接覆盖之前的字幕了。

+ 2 - 1
internal/pkg/emby_api/emby_api_test.go

@@ -56,7 +56,8 @@ func TestEmbyHelper_UpdateVideoSubList(t *testing.T) {
 	// 166840 -- 基地 S01E03
 	// 173354 -- 基地 S01E04
 	// 172412 -- Dan Brown's The Lost Symbol S01E01
-	err := em.UpdateVideoSubList("173354")
+	// 194046 -- 窃贼军团
+	err := em.UpdateVideoSubList("194046")
 	if err != nil {
 		t.Fatal(err)
 	}

+ 138 - 18
internal/pkg/language/ISOLanguage.go

@@ -1,25 +1,32 @@
 package language
 
 import (
+	"fmt"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/language"
 	"strings"
 )
 
-// ChineseISOString2Lang 将 中文描述:zh、zho、chi 转换为 types.MyLanguage
-func ChineseISOString2Lang(chineseStr string) language.MyLanguage {
+// ISOString2SupportLang 从语言缩写字符串转换为内部的 MyLanguage 类型
+// 1. 支持 ISO 639-1、639-2/B、639-2/T、639-3
+// 2. 支持中文的多种变种编码
+// https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+func ISOString2SupportLang(isoString string) language.MyLanguage {
 
-	switch chineseStr {
-	case language.ISO_639_1_Chinese, language.ISO_639_2T_Chinese, language.ISO_639_2B_Chinese:
+	lowerString := strings.ToLower(isoString)
+
+	// 639-1
+	switch lowerString {
+	case language.ISO_639_1_Chinese:
 		return language.ChineseSimple
-	default:
-		return language.Unknown
+	case language.ISO_639_1_English:
+		return language.English
+	case language.ISO_639_1_Korean:
+		return language.Korean
+	case language.ISO_639_1_Japanese:
+		return language.Japanese
 	}
-}
-
-// ISOString2SupportLang 从 639-2/B 的语言缩写字符串转换为内部的 MyLanguage 类型,值支持
-// https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
-func ISOString2SupportLang(isoString string) language.MyLanguage {
-	switch strings.ToLower(isoString) {
+	// 639-2/B
+	switch lowerString {
 	case language.ISO_639_2B_Chinese:
 		return language.ChineseSimple
 	case language.ISO_639_2B_English:
@@ -28,17 +35,130 @@ func ISOString2SupportLang(isoString string) language.MyLanguage {
 		return language.Japanese
 	case language.ISO_639_2B_Korean:
 		return language.Korean
-	default:
-		return language.Unknown
 	}
+	// 639-2/T
+	switch lowerString {
+	case language.ISO_639_2T_Chinese:
+		return language.ChineseSimple
+	case language.ISO_639_2T_English:
+		return language.English
+	case language.ISO_639_2T_Japanese:
+		return language.Japanese
+	case language.ISO_639_2T_Korean:
+		return language.Korean
+	}
+	// 639-3
+	switch lowerString {
+	case language.ISO_639_3_Chinese:
+		return language.ChineseSimple
+	case language.ISO_639_3_English:
+		return language.English
+	case language.ISO_639_3_Korean:
+		return language.Korean
+	case language.ISO_639_3_Japanese:
+		return language.Japanese
+	}
+	// 中文编码变种
+	switch lowerString {
+	case language.ChineseISO_Hans:
+		return language.ChineseSimple
+	case language.ChineseISO_Hant:
+		return language.ChineseTraditional
+	case language.ChineseISO_CN:
+		return language.ChineseSimple
+	case language.ChineseISO_TW:
+		return language.ChineseTraditional
+	case language.ChineseISO_SG,
+		language.ChineseISO_MY:
+		return language.ChineseSimple
+	case language.ChineseISO_HK,
+		language.ChineseISO_MO:
+		return language.ChineseTraditional
+	}
+
+	return language.Unknown
 }
 
-// IsSupportISOString 是否是受支持的  639-2/B 语言,中、英、日、韩
+// IsSupportISOString 是否是受支持的语言,中、英、日、韩
+// 1. 支持 ISO 639-1、639-2/B、639-2/T、639-3
+// 2. 支持中文的多种变种编码
 func IsSupportISOString(isoString string) bool {
-	switch strings.ToLower(isoString) {
+
+	lowerString := strings.ToLower(isoString)
+
+	switch lowerString {
+	case language.ISO_639_1_Chinese, language.ISO_639_1_English, language.ISO_639_1_Korean, language.ISO_639_1_Japanese:
+		// 639-1
+		return true
+	}
+	switch lowerString {
 	case language.ISO_639_2B_Chinese, language.ISO_639_2B_English, language.ISO_639_2B_Japanese, language.ISO_639_2B_Korean:
+		// 639-2/B
 		return true
-	default:
-		return false
 	}
+	switch lowerString {
+	case language.ISO_639_2T_Chinese, language.ISO_639_2T_English, language.ISO_639_2T_Japanese, language.ISO_639_2T_Korean:
+		// 639-2/T
+		return true
+	}
+	switch lowerString {
+	case language.ISO_639_3_Chinese, language.ISO_639_3_English, language.ISO_639_3_Korean, language.ISO_639_3_Japanese:
+		// 639-3
+		return true
+	}
+	switch lowerString {
+	case language.ChineseISO_Hans,
+		language.ChineseISO_Hant,
+		language.ChineseISO_CN,
+		language.ChineseISO_TW,
+		language.ChineseISO_SG,
+		language.ChineseISO_MY,
+		language.ChineseISO_HK,
+		language.ChineseISO_MO:
+		// 中文编码变种
+		return true
+	}
+
+	return false
 }
+
+// ISOSupportRegexRule 获取 ISO 匹配的 regex 表达式
+func ISOSupportRegexRule() string {
+
+	if isoISORegString != "" {
+		return isoISORegString
+	}
+
+	isoISORegString = language.RegISORuleFront
+
+	isoISORegString += addISORegSubLangString(language.ChineseISO_Hans)
+	isoISORegString += addISORegSubLangString(language.ChineseISO_Hant)
+	isoISORegString += addISORegSubLangString(language.ChineseISO_CN)
+	isoISORegString += addISORegSubLangString(language.ChineseISO_TW)
+	isoISORegString += addISORegSubLangString(language.ChineseISO_SG)
+	isoISORegString += addISORegSubLangString(language.ChineseISO_MY)
+	isoISORegString += addISORegSubLangString(language.ChineseISO_HK)
+	isoISORegString += addISORegSubLangString(language.ChineseISO_MO)
+
+	isoISORegString += addISORegSubLangString(language.ISO_639_1_Chinese)
+	isoISORegString += addISORegSubLangString(language.ISO_639_1_English)
+	isoISORegString += addISORegSubLangString(language.ISO_639_1_Korean)
+	isoISORegString += addISORegSubLangString(language.ISO_639_1_Japanese)
+
+	isoISORegString += addISORegSubLangString(language.ISO_639_2T_Chinese)
+	isoISORegString += addISORegSubLangString(language.ISO_639_2T_English)
+	isoISORegString += addISORegSubLangString(language.ISO_639_2T_Korean)
+	isoISORegString += addISORegSubLangString(language.ISO_639_2T_Japanese)
+
+	isoISORegString += addISORegSubLangString(language.ISO_639_2B_Chinese)
+
+	isoISORegString += language.RegISORuleEnd
+
+	return isoISORegString
+}
+
+func addISORegSubLangString(inLang string) string {
+	return fmt.Sprintf(`\b%s\b|`, inLang)
+}
+
+var isoISORegString = ""

+ 5 - 4
internal/pkg/sub_formatter/emby/emby.go

@@ -4,6 +4,7 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/language"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_formatter/common"
 	language2 "github.com/allanpk716/ChineseSubFinder/internal/types/language"
+	"github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
 	"path/filepath"
 	"regexp"
 	"strings"
@@ -74,8 +75,8 @@ func (f Formatter) GenerateMixSubName(videoFileName, subExt string, subLang lang
 
 func (f Formatter) GenerateMixSubNameBase(fileNameWithOutExt, subExt string, subLang language2.MyLanguage, extraSubPreName string) (string, string, string) {
 	// 这里传入字幕后缀名的时候,可能会带有 default 或者 forced 字段,需要剔除
-	nowSubExt := strings.ReplaceAll(subExt, language2.Sub_Ext_Mark_Default, "")
-	nowSubExt = strings.ReplaceAll(subExt, language2.Sub_Ext_Mark_Forced, "")
+	nowSubExt := strings.ReplaceAll(subExt, subparser.Sub_Ext_Mark_Default, "")
+	nowSubExt = strings.ReplaceAll(subExt, subparser.Sub_Ext_Mark_Forced, "")
 	note := ""
 	// extraSubPreName 那个字幕网站下载的
 	if extraSubPreName != "" {
@@ -83,8 +84,8 @@ func (f Formatter) GenerateMixSubNameBase(fileNameWithOutExt, subExt string, sub
 	}
 
 	subNewName := fileNameWithOutExt + language2.Emby_chinese + "(" + language.Lang2ChineseString(subLang) + note + ")" + nowSubExt
-	subNewNameWithDefault := fileNameWithOutExt + language2.Emby_chinese + "(" + language.Lang2ChineseString(subLang) + note + ")" + language2.Sub_Ext_Mark_Default + nowSubExt
-	subNewNameWithForced := fileNameWithOutExt + language2.Emby_chinese + "(" + language.Lang2ChineseString(subLang) + note + ")" + language2.Sub_Ext_Mark_Forced + nowSubExt
+	subNewNameWithDefault := fileNameWithOutExt + language2.Emby_chinese + "(" + language.Lang2ChineseString(subLang) + note + ")" + subparser.Sub_Ext_Mark_Default + nowSubExt
+	subNewNameWithForced := fileNameWithOutExt + language2.Emby_chinese + "(" + language.Lang2ChineseString(subLang) + note + ")" + subparser.Sub_Ext_Mark_Forced + nowSubExt
 
 	return subNewName, subNewNameWithDefault, subNewNameWithForced
 }

+ 23 - 19
internal/pkg/sub_formatter/normal/normal.go

@@ -3,9 +3,11 @@ package normal
 import (
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/sub_parser/ass"
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/sub_parser/srt"
+	"github.com/allanpk716/ChineseSubFinder/internal/pkg/language"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_formatter/common"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_parser_hub"
-	"github.com/allanpk716/ChineseSubFinder/internal/types/language"
+	languageConst "github.com/allanpk716/ChineseSubFinder/internal/types/language"
+	"github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
 	"path/filepath"
 	"regexp"
 	"strings"
@@ -29,13 +31,20 @@ func (f Formatter) GetFormatterFormatterName() int {
 }
 
 // IsMatchThisFormat 是否满足当前实现接口的字幕命名格式 - 是否符合规则、fileNameWithOutExt string, subExt string, subLang types.MyLanguage, extraSubPreName string
-func (f Formatter) IsMatchThisFormat(subName string) (bool, string, string, language.MyLanguage, string) {
+func (f Formatter) IsMatchThisFormat(subName string) (bool, string, string, languageConst.MyLanguage, string) {
 	/*
 		Emby 的命名规则比较特殊,而且本程序就是做中文字幕下载的,所以,下面的正则表达式比较特殊
+		见本程序内 internal/types/language/ISOLanguage.go 这里的支持 ISO 规范和中文编码变种
+		见文档、讨论:
+		https://emby.media/community/index.php?/topic/94504-current-chinese-subtitle-filter-not-so-accurate-and-hope-improve-like-this/
+		https://en.wikipedia.org/wiki/Chinese_Wikipedia#Automatic_conversion_between_traditional_and_simplified_Chinese_characters
+		https://stackoverflow.com/questions/18902072/what-standard-do-language-codes-of-the-form-zh-hans-belong-to
 	*/
-	var re = regexp.MustCompile(`(?m)\.(\bzh\b|\bzho\b|\bchi\b)(\.\S+)`)
+	//subName = strings.ToLower(subName)
+	var re = regexp.MustCompile(language.ISOSupportRegexRule())
 	matched := re.FindAllStringSubmatch(subName, -1)
 	/*
+		详细看测试用例
 		The Boss Baby Family Business (2021) WEBDL-1080p.zh.ass
 		The Boss Baby Family Business (2021) WEBDL-1080p.zh.default.ass
 		The Boss Baby Family Business (2021) WEBDL-1080p.zh.forced.ass
@@ -51,27 +60,22 @@ func (f Formatter) IsMatchThisFormat(subName string) (bool, string, string, lang
 		[0][2]	.ass
 	*/
 	if matched == nil || len(matched) < 1 || len(matched[0]) < 3 {
-		return false, "", "", language.Unknown, ""
+		return false, "", "", languageConst.Unknown, ""
 	}
-	var subLang language.MyLanguage
+	var subLang languageConst.MyLanguage
 	var extraSubPreName string
 	fileNameWithOutExt := strings.ReplaceAll(subName, matched[0][0], "")
 	subExt := matched[0][2]
-	//var subLangStr = matched[0][1]
+	var subLangStr = matched[0][1]
 	extraSubPreName = ""
 	// 这里有一个点,是直接从 zh zho ch 去转换成中文语言就行了,还是要做字幕的语言识别
 	// 目前倾向于这里用后面的逻辑
-	//subLang = language.ChineseISOString2Lang(subLangStr)
-	bFind, file, err := f.subParser.DetermineFileTypeFromFile(subName)
-	if err != nil || bFind == false {
-		return false, "", "", 0, ""
-	}
-	subLang = file.Lang
+	subLang = language.ISOString2SupportLang(subLangStr)
 	return true, fileNameWithOutExt, subExt, subLang, extraSubPreName
 }
 
 // GenerateMixSubName 通过视频和字幕信息,生成当前实现接口的字幕命名格式。extraSubPreName 一般是填写字幕网站,不填写则留空 - 新名称、新名称带有 default 标记,新名称带有 forced 标记
-func (f Formatter) GenerateMixSubName(videoFileName, subExt string, subLang language.MyLanguage, extraSubPreName string) (string, string, string) {
+func (f Formatter) GenerateMixSubName(videoFileName, subExt string, subLang languageConst.MyLanguage, extraSubPreName string) (string, string, string) {
 	/*
 		这里会生成类似的文件名 xxxx.zh
 	*/
@@ -80,14 +84,14 @@ func (f Formatter) GenerateMixSubName(videoFileName, subExt string, subLang lang
 	return f.GenerateMixSubNameBase(videoFileNameWithOutExt, subExt, subLang, extraSubPreName)
 }
 
-func (f Formatter) GenerateMixSubNameBase(fileNameWithOutExt, subExt string, subLang language.MyLanguage, extraSubPreName string) (string, string, string) {
+func (f Formatter) GenerateMixSubNameBase(fileNameWithOutExt, subExt string, subLang languageConst.MyLanguage, extraSubPreName string) (string, string, string) {
 	// 这里传入字幕后缀名的时候,可能会带有 default 或者 forced 字段,需要剔除
-	nowSubExt := strings.ReplaceAll(subExt, language.Sub_Ext_Mark_Default, "")
-	nowSubExt = strings.ReplaceAll(subExt, language.Sub_Ext_Mark_Forced, "")
+	nowSubExt := strings.ReplaceAll(subExt, subparser.Sub_Ext_Mark_Default, "")
+	nowSubExt = strings.ReplaceAll(subExt, subparser.Sub_Ext_Mark_Forced, "")
 
-	subNewName := fileNameWithOutExt + "." + language.ISO_639_1_Chinese + nowSubExt
-	subNewNameWithDefault := fileNameWithOutExt + "." + language.ISO_639_1_Chinese + language.Sub_Ext_Mark_Default + nowSubExt
-	subNewNameWithForced := fileNameWithOutExt + "." + language.ISO_639_1_Chinese + language.Sub_Ext_Mark_Forced + nowSubExt
+	subNewName := fileNameWithOutExt + "." + languageConst.ISO_639_1_Chinese + nowSubExt
+	subNewNameWithDefault := fileNameWithOutExt + "." + languageConst.ISO_639_1_Chinese + subparser.Sub_Ext_Mark_Default + nowSubExt
+	subNewNameWithForced := fileNameWithOutExt + "." + languageConst.ISO_639_1_Chinese + subparser.Sub_Ext_Mark_Forced + nowSubExt
 
 	return subNewName, subNewNameWithDefault, subNewNameWithForced
 }

+ 49 - 0
internal/pkg/sub_formatter/normal/normal_test.go

@@ -36,6 +36,19 @@ func TestFormatter_IsMatchThisFormat(t *testing.T) {
 			want2: ".ass",
 			want3: language.ChineseSimple,
 			want4: ""},
+		{name: "00-1", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.zho.ass"},
+			want:  true,
+			want1: fileWithOutExt,
+			want2: ".ass",
+			want3: language.ChineseSimple,
+			want4: ""},
+		{name: "00-2", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.chi.ass"},
+			want:  true,
+			want1: fileWithOutExt,
+			want2: ".ass",
+			want3: language.ChineseSimple,
+			want4: ""},
+
 		{name: "01", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.zh.default.ass"},
 			want:  true,
 			want1: fileWithOutExt,
@@ -48,12 +61,48 @@ func TestFormatter_IsMatchThisFormat(t *testing.T) {
 			want2: ".forced.ass",
 			want3: language.ChineseSimple,
 			want4: ""},
+		{name: "02-1", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.zh-CN.forced.ass"},
+			want:  true,
+			want1: fileWithOutExt,
+			want2: ".forced.ass",
+			want3: language.ChineseSimple,
+			want4: ""},
+		{name: "02-2", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.zh-Hans.forced.ass"},
+			want:  true,
+			want1: fileWithOutExt,
+			want2: ".forced.ass",
+			want3: language.ChineseSimple,
+			want4: ""},
+		{name: "02-3", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.zh-Hant.forced.ass"},
+			want:  true,
+			want1: fileWithOutExt,
+			want2: ".forced.ass",
+			want3: language.ChineseTraditional,
+			want4: ""},
+		{name: "02-4", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.zh-CN.forced.ass"},
+			want:  true,
+			want1: fileWithOutExt,
+			want2: ".forced.ass",
+			want3: language.ChineseSimple,
+			want4: ""},
+		{name: "02-5", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.zh-TW.forced.ass"},
+			want:  true,
+			want1: fileWithOutExt,
+			want2: ".forced.ass",
+			want3: language.ChineseTraditional,
+			want4: ""},
 		{name: "03", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.cn.ass"},
 			want:  false,
 			want1: "",
 			want2: "",
 			want3: language.Unknown,
 			want4: ""},
+		{name: "03-1", args: args{subName: "The Boss Baby Family Business (2021) WEBDL-1080p.zh-t.ass"},
+			want:  false,
+			want1: "",
+			want2: "",
+			want3: language.Unknown,
+			want4: ""},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {

+ 2 - 1
internal/pkg/sub_formatter/old/old.go

@@ -3,6 +3,7 @@ package old
 import (
 	"github.com/allanpk716/ChineseSubFinder/internal/common"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/language"
+	"github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
 	"path/filepath"
 	"strings"
 )
@@ -115,7 +116,7 @@ func makeMixSubExtString(orgFileNameWithOutExt, lang string, ext, site string, b
 
 	tmpDefault := ""
 	if beDefault == true {
-		tmpDefault = language.Emby_default
+		tmpDefault = subparser.Sub_Ext_Mark_Default
 	}
 
 	if site == "" {

+ 5 - 5
internal/pkg/sub_formatter/sub_format_changer.go

@@ -14,7 +14,7 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_formatter/emby"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_formatter/normal"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_helper"
-	"github.com/allanpk716/ChineseSubFinder/internal/types/language"
+	"github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
 	"os"
 	"strings"
 )
@@ -109,12 +109,12 @@ func (s SubFormatChanger) autoDetectAndChange(outStruct *RenameResults, fitSubNa
 		// 转换格式后,需要保留之前的 default 或者 forced
 		findDefault := false
 		findForce := false
-		if strings.Contains(subExt, language.Sub_Ext_Mark_Default) == true {
-			subExt = strings.Replace(subExt, language.Sub_Ext_Mark_Default, "", -1)
+		if strings.Contains(subExt, subparser.Sub_Ext_Mark_Default) == true {
+			subExt = strings.Replace(subExt, subparser.Sub_Ext_Mark_Default, "", -1)
 			findDefault = true
 		}
-		if strings.Contains(subExt, language.Sub_Ext_Mark_Forced) == true {
-			subExt = strings.Replace(subExt, language.Sub_Ext_Mark_Forced, "", -1)
+		if strings.Contains(subExt, subparser.Sub_Ext_Mark_Forced) == true {
+			subExt = strings.Replace(subExt, subparser.Sub_Ext_Mark_Forced, "", -1)
 			findForce = true
 		}
 		// 通过传入的目标格式化 formatter 的名称去调用

+ 4 - 5
internal/pkg/sub_helper/sub_helper.go

@@ -8,7 +8,6 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/language"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_parser_hub"
-	language2 "github.com/allanpk716/ChineseSubFinder/internal/types/language"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/supplier"
 	"github.com/go-rod/rod/lib/utils"
@@ -301,17 +300,17 @@ func SearchVideoMatchSubFileAndRemoveExtMark(oneVideoFullPath string) error {
 				continue
 			}
 			// 得包含 .default. 找个关键词
-			if strings.Contains(nowFileName, language2.Sub_Ext_Mark_Default+".") == true {
+			if strings.Contains(nowFileName, subparser.Sub_Ext_Mark_Default+".") == true {
 				oldPath := dir + pathSep + curFile.Name()
-				newPath := dir + pathSep + strings.ReplaceAll(curFile.Name(), language2.Sub_Ext_Mark_Default+".", ".")
+				newPath := dir + pathSep + strings.ReplaceAll(curFile.Name(), subparser.Sub_Ext_Mark_Default+".", ".")
 				err = os.Rename(oldPath, newPath)
 				if err != nil {
 					return err
 				}
-			} else if strings.Contains(nowFileName, language2.Sub_Ext_Mark_Forced+".") == true {
+			} else if strings.Contains(nowFileName, subparser.Sub_Ext_Mark_Forced+".") == true {
 				// 得包含 .forced. 找个关键词
 				oldPath := dir + pathSep + curFile.Name()
-				newPath := dir + pathSep + strings.ReplaceAll(curFile.Name(), language2.Sub_Ext_Mark_Forced+".", ".")
+				newPath := dir + pathSep + strings.ReplaceAll(curFile.Name(), subparser.Sub_Ext_Mark_Forced+".", ".")
 				err = os.Rename(oldPath, newPath)
 				if err != nil {
 					return err

+ 57 - 0
internal/pkg/sub_parser_hub/subParserHub.go

@@ -5,6 +5,7 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/internal/ifaces"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/language"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
+	languageConst "github.com/allanpk716/ChineseSubFinder/internal/types/language"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
 	"path/filepath"
 	"regexp"
@@ -123,3 +124,59 @@ func IsSubExtWanted(subName string) bool {
 		return false
 	}
 }
+
+// IsEmbySubCodecWanted 从 Emby api 拿到字幕的 sub 类型 string (Codec) 是否是符合本程序要求的
+func IsEmbySubCodecWanted(inSubCodec string) bool {
+
+	tmpString := strings.ToLower(inSubCodec)
+	if tmpString == common.SubTypeSRT ||
+		tmpString == common.SubTypeASS ||
+		tmpString == common.SubTypeSSA {
+		return true
+	}
+
+	return false
+}
+
+// IsEmbySubChineseLangStringWanted 是否是 Emby 自己解析出来的中文语言类型
+func IsEmbySubChineseLangStringWanted(inLangString string) bool {
+
+	tmpString := strings.ToLower(inLangString)
+	nextString := tmpString
+	spStrings := strings.Split(tmpString, "[")
+	if len(spStrings) > 1 {
+		// 去除 chi[xunlie] 类似的标记
+		nextString = spStrings[0]
+	} else {
+		// 去除 chinese(简英,zimuku)
+		spStrings = strings.Split(tmpString, "(")
+		if len(spStrings) > 1 {
+			nextString = spStrings[0]
+		}
+	}
+
+	// 先判断 ISO 标准的和变种的支持列表
+	if language.IsSupportISOString(nextString) == true {
+		return true
+	}
+	// 再判断之前支持的列表
+	switch nextString {
+	case languageConst.Emby_chinese_chs,
+		languageConst.Emby_chinese_cht,
+		languageConst.Emby_chinese_chi:
+		// chi chs cht
+		return true
+	case replaceLangString(languageConst.Emby_chinese):
+		// chinese,这个比较特殊,是本程序定义的 chinese 的字段,再 Emby API 下特殊的字幕命名字段
+		return true
+	default:
+		return false
+	}
+}
+
+func replaceLangString(inString string) string {
+	tmpString := strings.ToLower(inString)
+	one := strings.ReplaceAll(tmpString, ".", "")
+	two := strings.ReplaceAll(one, "_", "")
+	return two
+}

+ 49 - 1
internal/pkg/sub_parser_hub/subParserHub_test.go

@@ -4,7 +4,7 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/sub_parser/ass"
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/sub_parser/srt"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg"
-	"path"
+	"path/filepath"
 	"testing"
 )
 
@@ -44,3 +44,51 @@ func TestSubParserHub_IsSubHasChinese(t *testing.T) {
 		})
 	}
 }
+
+func TestIsEmbySubChineseLangStringWanted(t *testing.T) {
+	type args struct {
+		inLangString string
+	}
+	tests := []struct {
+		name string
+		args args
+		want bool
+	}{
+		{name: "00", args: args{inLangString: "chinese(简英,subhd)"}, want: true},
+		{name: "01", args: args{inLangString: "chinese(简英,xunlei)"}, want: true},
+		{name: "02", args: args{inLangString: "chi"}, want: true},
+		{name: "03", args: args{inLangString: "chs"}, want: true},
+		{name: "04", args: args{inLangString: "cht"}, want: true},
+
+		{name: "05", args: args{inLangString: "zh-hans"}, want: true},
+		{name: "06", args: args{inLangString: "zh-hant"}, want: true},
+		{name: "07", args: args{inLangString: "zh-CN"}, want: true},
+		{name: "08", args: args{inLangString: "zh-TW"}, want: true},
+		{name: "09", args: args{inLangString: "zh-sg"}, want: true},
+		{name: "10", args: args{inLangString: "zh-my"}, want: true},
+		{name: "11", args: args{inLangString: "zh-hk"}, want: true},
+		{name: "12", args: args{inLangString: "zh-mo"}, want: true},
+
+		{name: "13", args: args{inLangString: "zh"}, want: true},
+		{name: "14", args: args{inLangString: "en"}, want: true},
+		{name: "15", args: args{inLangString: "ko"}, want: true},
+		{name: "16", args: args{inLangString: "ja"}, want: true},
+
+		{name: "17", args: args{inLangString: "zho"}, want: true},
+		{name: "18", args: args{inLangString: "eng"}, want: true},
+		{name: "19", args: args{inLangString: "kor"}, want: true},
+		{name: "20", args: args{inLangString: "jpn"}, want: true},
+
+		{name: "21", args: args{inLangString: "chi"}, want: true},
+		{name: "22", args: args{inLangString: "eng"}, want: true},
+		{name: "23", args: args{inLangString: "kor"}, want: true},
+		{name: "24", args: args{inLangString: "jpn"}, want: true},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := IsEmbySubChineseLangStringWanted(tt.args.inLangString); got != tt.want {
+				t.Errorf("IsEmbySubChineseLangStringWanted() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}

+ 1 - 0
internal/pkg/util.go

@@ -47,6 +47,7 @@ func NewHttpClient(_reqParam ...types.ReqParam) *resty.Client {
 
 	httpClient := resty.New()
 	httpClient.SetTimeout(common.HTMLTimeOut)
+	httpClient.SetRetryCount(2)
 	if HttpProxy != "" {
 		httpClient.SetProxy(HttpProxy)
 	} else {

+ 14 - 9
internal/types/language/ISOLanguage.go

@@ -1,16 +1,16 @@
 package language
 
-// 中文语言描述
+// 中文语言编码变种
 // 参考 https://en.wikipedia.org/wiki/Chinese_Wikipedia#Automatic_conversion_between_traditional_and_simplified_Chinese_characters
 const (
-	ChineseISO_Hans = "zh-Hans" // 简体
-	ChineseISO_Hant = "zh-Hant" // 繁體
-	ChineseISO_CN   = "zh-CN"   // 大陆简体
-	ChineseISO_TW   = "zh-TW"   // 臺灣正體
-	ChineseISO_SG   = "zh-SG"   // 新加坡简体/马新简体
-	ChineseISO_MY   = "zh-MY"   // 大马简体
-	ChineseISO_HK   = "zh-HK"   // 香港繁體
-	ChineseISO_MO   = "zh-MO"   // 澳門繁體
+	ChineseISO_Hans = "zh-hans" // 简体
+	ChineseISO_Hant = "zh-hant" // 繁體
+	ChineseISO_CN   = "zh-cn"   // 大陆简体
+	ChineseISO_TW   = "zh-tw"   // 臺灣正體
+	ChineseISO_SG   = "zh-sg"   // 新加坡简体/马新简体
+	ChineseISO_MY   = "zh-my"   // 大马简体
+	ChineseISO_HK   = "zh-hk"   // 香港繁體
+	ChineseISO_MO   = "zh-mo"   // 澳門繁體
 )
 
 // 参考 https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes 标准
@@ -41,3 +41,8 @@ const (
 	ISO_639_3_Korean   = "kor"
 	ISO_639_3_Japanese = "jpn"
 )
+
+const (
+	RegISORuleFront = `(?mi)\.(`
+	RegISORuleEnd   = `)(\.\S+)`
+)

+ 6 - 21
internal/types/language/language.go

@@ -1,26 +1,11 @@
 package language
 
-const (
-	Sub_Ext_Mark_Default = ".default" // 指定这个字幕是默认的
-	Sub_Ext_Mark_Forced  = ".forced"  // 指定这个字幕是强制的
-)
-
 // 需要符合 emby_helper 的格式要求,在后缀名前面
 const (
-	Emby_default = ".default" // 指定这个字幕是默认的
-	Emby_unknow  = ".unknow"  // 未知语言
-	Emby_chinese = ".chinese" // 中文
-	Emby_chi     = ".chi"     // 简体
-	Emby_chn     = ".chn"     // 中国国家代码
-	Emby_chs     = ".chs"     // 简体
-	Emby_cht     = ".cht"     // 繁体
-	Emby_chs_en  = ".chs_en"  // 简英双语字幕
-	Emby_cht_en  = ".cht_en"  // 繁英双语字幕
-	Emby_en      = ".en"      // 英文
-	Emby_jp      = ".jp"      // 日语
-	Emby_chs_jp  = ".chs_jp"  // 简日双语字幕
-	Emby_cht_jp  = ".cht_jp"  // 繁日双语字幕
-	Emby_kr      = ".kr"      // 韩语
-	Emby_chs_kr  = ".chs_kr"  // 简韩双语字幕
-	Emby_cht_kr  = ".cht_kr"  // 繁韩双语字幕
+	Emby_English_eng = "eng"
+
+	Emby_chinese     = ".chinese" // 中文
+	Emby_chinese_chs = "chs"      // Emby 解析出来的 LanguageString chs
+	Emby_chinese_cht = "cht"      // Emby 解析出来的 LanguageString cht
+	Emby_chinese_chi = "chi"      // Emby 解析出来的 LanguageString chi
 )

+ 15 - 0
internal/types/language/old.go

@@ -0,0 +1,15 @@
+package language
+
+/*
+	最开始版本使用的名称,现在已经弃用
+*/
+const (
+	Emby_chs    = ".chs"    // 简体
+	Emby_cht    = ".cht"    // 繁体
+	Emby_chs_en = ".chs_en" // 简英双语字幕
+	Emby_cht_en = ".cht_en" // 繁英双语字幕
+	Emby_chs_jp = ".chs_jp" // 简日双语字幕
+	Emby_cht_jp = ".cht_jp" // 繁日双语字幕
+	Emby_chs_kr = ".chs_kr" // 简韩双语字幕
+	Emby_cht_kr = ".cht_kr" // 繁韩双语字幕
+)

+ 5 - 0
internal/types/subparser/fileinfo.go

@@ -35,3 +35,8 @@ type OneDialogueEx struct {
 	KrLine    string
 	JpLine    string
 }
+
+const (
+	Sub_Ext_Mark_Default = ".default" // 指定这个字幕是默认的
+	Sub_Ext_Mark_Forced  = ".forced"  // 指定这个字幕是强制的
+)