Browse Source

修复 SubParserHub.DetermineFileTypeFromFile 的逻辑问题 fix #63

Signed-off-by: allan716 <[email protected]>
allan716 4 years ago
parent
commit
8b4b39862a

+ 6 - 10
internal/common/selferr.go

@@ -3,16 +3,12 @@ package common
 import "errors"
 
 var (
-	NoMetadataFile           = errors.New("no metadata file, movie.xml or *.nfo")
-	CanNotFindIMDBID         = errors.New("can not find IMDB Id")
-	CanNotFindEpAiredTime    = errors.New("can not find Ep Aired Time")
-	XunLeiCIdIsEmpty         = errors.New("cid is empty")
-	VideoFileIsTooSmall      = errors.New("video file is too small")
-	ShooterFileHashIsEmpty   = errors.New("filehash is empty")
-	CanNotMatchingAnySubType = errors.New("can not matching any sub type")
-
-	DetermineFileTypeFromFileExtNotFitASSorSSA = errors.New("DetermineFileTypeFromFile Ext Not Fit .ass or .ssa")
-	DetermineFileTypeFromFileExtNotFitSRT      = errors.New("DetermineFileTypeFromFile Ext Not Fit .srt")
+	NoMetadataFile         = errors.New("no metadata file, movie.xml or *.nfo")
+	CanNotFindIMDBID       = errors.New("can not find IMDB Id")
+	CanNotFindEpAiredTime  = errors.New("can not find Ep Aired Time")
+	XunLeiCIdIsEmpty       = errors.New("cid is empty")
+	VideoFileIsTooSmall    = errors.New("video file is too small")
+	ShooterFileHashIsEmpty = errors.New("filehash is empty")
 
 	ZiMuKuSearchKeyWordStep0DetailPageUrlNotFound = errors.New("zimuku search keyword step0 not found, detail page url")
 	ZiMuKuDownloadUrlStep2NotFound                = errors.New("zimuku download url step2 not found")

+ 2 - 2
internal/ifaces/iSubParser.go

@@ -7,7 +7,7 @@ import (
 type ISubParser interface {
 	GetParserName() string
 
-	DetermineFileTypeFromFile(filePath string) (*subparser.FileInfo, error)
+	DetermineFileTypeFromFile(filePath string) (bool, *subparser.FileInfo, error)
 
-	DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (*subparser.FileInfo, error)
+	DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (bool, *subparser.FileInfo, error)
 }

+ 6 - 2
internal/logic/mark_system/markingsystem.go

@@ -101,9 +101,13 @@ func (m MarkingSystem) parseSubFileInfo(organizeSubFiles []string) map[string][]
 	// 拿到现有的字幕列表,开始抉择
 	// 先判断当前字幕是什么语言(如果是简体,还需要考虑,判断这个字幕是简体还是繁体)
 	for _, oneSubFileFullPath := range organizeSubFiles {
-		subFileInfo, err := m.subParserHub.DetermineFileTypeFromFile(oneSubFileFullPath)
+		bFind, subFileInfo, err := m.subParserHub.DetermineFileTypeFromFile(oneSubFileFullPath)
 		if err != nil {
-			m.log.Error("DetermineFileTypeFromFile", oneSubFileFullPath, err)
+			m.log.Errorln("DetermineFileTypeFromFile", oneSubFileFullPath, err)
+			continue
+		}
+		if bFind == false {
+			m.log.Warnln("DetermineFileTypeFromFile", oneSubFileFullPath, "not support SubType")
 			continue
 		}
 		_, ok := subInfoDict[subFileInfo.FromWhereSite]

+ 5 - 1
internal/logic/series_helper/seriesHelper.go

@@ -56,11 +56,15 @@ func ReadSeriesInfoFromDir(seriesDir string, imdbInfo *imdb.Title, forcedScanAnd
 			log_helper.GetLogger().Errorln(err)
 			continue
 		}
-		subParserFileInfo, err := subParserHub.DetermineFileTypeFromFile(subFile)
+		bFind, subParserFileInfo, err := subParserHub.DetermineFileTypeFromFile(subFile)
 		if err != nil {
 			log_helper.GetLogger().Errorln("DetermineFileTypeFromFile", subFile, err)
 			continue
 		}
+		if bFind == false {
+			log_helper.GetLogger().Warnln("DetermineFileTypeFromFile", subFile, "not support SubType")
+			continue
+		}
 		epsKey := pkg.GetEpisodeKeyName(info.Season, info.Episode)
 		oneFileSubInfo := series.SubInfo{
 			Title:        info.Title,

+ 7 - 7
internal/logic/sub_parser/ass/ass.go

@@ -27,24 +27,24 @@ func (p Parser) GetParserName() string {
 	当 error 是 common.DetermineFileTypeFromFileExtNotFitASSorSSA
 	需要额外的处理逻辑,比如不用报错,而是跳过后续的逻辑
 */
-func (p Parser) DetermineFileTypeFromFile(filePath string) (*subparser.FileInfo, error) {
+func (p Parser) DetermineFileTypeFromFile(filePath string) (bool, *subparser.FileInfo, error) {
 	nowExt := filepath.Ext(filePath)
 	if strings.ToLower(nowExt) != common.SubExtASS && strings.ToLower(nowExt) != common.SubExtSSA {
-		return nil, common.DetermineFileTypeFromFileExtNotFitASSorSSA
+		return false, nil, nil
 	}
 	fBytes, err := ioutil.ReadFile(filePath)
 	if err != nil {
-		return nil, err
+		return false, nil, err
 	}
 	inBytes, err := language.ChangeFileCoding2UTF8(fBytes)
 	if err != nil {
-		return nil, err
+		return false, nil, err
 	}
 	return p.DetermineFileTypeFromBytes(inBytes, nowExt)
 }
 
 // DetermineFileTypeFromBytes 确定字幕文件的类型,是双语字幕或者某一种语言等等信息
-func (p Parser) DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (*subparser.FileInfo, error) {
+func (p Parser) DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (bool, *subparser.FileInfo, error) {
 	allString := string(inBytes)
 	// 注意,需要替换掉 \r 不然正则表达式会有问题
 	allString = strings.ReplaceAll(allString, "\r", "")
@@ -52,7 +52,7 @@ func (p Parser) DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (*subp
 	// 找到 start end text
 	matched := re.FindAllStringSubmatch(allString, -1)
 	if len(matched) < 1 {
-		return nil, nil
+		return false, nil, nil
 	}
 	subFileInfo := subparser.FileInfo{}
 	subFileInfo.Ext = nowExt
@@ -131,7 +131,7 @@ func (p Parser) DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (*subp
 	detectLang := language.SubLangStatistics2SubLangType(float32(countLineFeed), float32(usefullDialogueCount), langDict, chLines)
 	subFileInfo.Lang = detectLang
 	subFileInfo.Data = inBytes
-	return &subFileInfo, nil
+	return true, &subFileInfo, nil
 }
 
 const (

+ 7 - 7
internal/logic/sub_parser/srt/srt.go

@@ -26,24 +26,24 @@ func (p Parser) GetParserName() string {
 	当 error 是 common.DetermineFileTypeFromFileExtNotFitSRT
 	需要额外的处理逻辑,比如不用报错,而是跳过后续的逻辑
 */
-func (p Parser) DetermineFileTypeFromFile(filePath string) (*subparser.FileInfo, error) {
+func (p Parser) DetermineFileTypeFromFile(filePath string) (bool, *subparser.FileInfo, error) {
 	nowExt := filepath.Ext(filePath)
 	if strings.ToLower(nowExt) != common.SubExtSRT {
-		return nil, common.DetermineFileTypeFromFileExtNotFitSRT
+		return false, nil, nil
 	}
 	fBytes, err := ioutil.ReadFile(filePath)
 	if err != nil {
-		return nil, err
+		return false, nil, err
 	}
 	inBytes, err := language.ChangeFileCoding2UTF8(fBytes)
 	if err != nil {
-		return nil, err
+		return false, nil, err
 	}
 	return p.DetermineFileTypeFromBytes(inBytes, nowExt)
 }
 
 // DetermineFileTypeFromBytes 确定字幕文件的类型,是双语字幕或者某一种语言等等信息
-func (p Parser) DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (*subparser.FileInfo, error) {
+func (p Parser) DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (bool, *subparser.FileInfo, error) {
 
 	allString := string(inBytes)
 	// 注意,需要替换掉 \r 不然正则表达式会有问题
@@ -52,7 +52,7 @@ func (p Parser) DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (*subp
 	// 找到 start end text
 	matched := re.FindAllStringSubmatch(allString, -1)
 	if len(matched) < 1 {
-		return nil, nil
+		return false, nil, nil
 	}
 	subFileInfo := subparser.FileInfo{}
 	subFileInfo.Ext = nowExt
@@ -91,7 +91,7 @@ func (p Parser) DetermineFileTypeFromBytes(inBytes []byte, nowExt string) (*subp
 	detectLang := language.SubLangStatistics2SubLangType(float32(countLineFeed), float32(len(matched)), langDict, chLines)
 	subFileInfo.Lang = detectLang
 	subFileInfo.Data = inBytes
-	return &subFileInfo, nil
+	return true, &subFileInfo, nil
 }
 
 const regString = `(\d+)\n([\d:,]+)\s+-{2}\>\s+([\d:,]+)\n([\s\S]*?(\n{2}|$))`

+ 2 - 2
internal/pkg/sub_formatter/normal/normal.go

@@ -62,8 +62,8 @@ func (f Formatter) IsMatchThisFormat(subName string) (bool, string, string, type
 	// 这里有一个点,是直接从 zh zho ch 去转换成中文语言就行了,还是要做字幕的语言识别
 	// 目前倾向于这里用后面的逻辑
 	//subLang = language.ChineseISOString2Lang(subLangStr)
-	file, err := f.subParser.DetermineFileTypeFromFile(subName)
-	if err != nil {
+	bFind, file, err := f.subParser.DetermineFileTypeFromFile(subName)
+	if err != nil || bFind == false {
 		return false, "", "", 0, ""
 	}
 	subLang = file.Lang

+ 14 - 11
internal/pkg/sub_parser_hub/subParserHub.go

@@ -29,15 +29,14 @@ func NewSubParserHub(parser ifaces.ISubParser, _parser ...ifaces.ISubParser) *Su
 }
 
 // DetermineFileTypeFromFile 确定字幕文件的类型,是双语字幕或者某一种语言等等信息,如果返回 nil ,那么就说明都没有字幕的格式匹配上
-func (p SubParserHub) DetermineFileTypeFromFile(filePath string) (*subparser.FileInfo, error) {
+func (p SubParserHub) DetermineFileTypeFromFile(filePath string) (bool, *subparser.FileInfo, error) {
 	for _, parser := range p.Parser {
-		subFileInfo, err := parser.DetermineFileTypeFromFile(filePath)
+		bFind, subFileInfo, err := parser.DetermineFileTypeFromFile(filePath)
 		if err != nil {
-			// 有一些错误是无需关注的,仅仅是跳过对应 ass 或者 srt 的字幕检测而已,并非错误
-			if err == common.DetermineFileTypeFromFileExtNotFitSRT || err == common.DetermineFileTypeFromFileExtNotFitASSorSSA {
-				continue
-			}
-			return nil, err
+			return false, nil, err
+		}
+		if bFind == false {
+			continue
 		}
 		// 正常至少应该匹配一个吧,不然就是最外层继续返回 nil 出去了
 		// 简体和繁体字幕的判断,通过文件名来做到的,基本就算个补判而已
@@ -46,19 +45,23 @@ func (p SubParserHub) DetermineFileTypeFromFile(filePath string) (*subparser.Fil
 		//subFileInfo.Lang = newLang
 		subFileInfo.FileFullPath = filePath
 		subFileInfo.FromWhereSite = p.getFromWhereSite(filePath)
-		return subFileInfo, nil
+		return true, subFileInfo, nil
 	}
 	// 如果返回 nil ,那么就说明都没有字幕的格式匹配上
-	return nil, common.CanNotMatchingAnySubType
+	return false, nil, nil
 }
 
 // IsSubHasChinese 字幕文件是否包含中文
 func (p SubParserHub) IsSubHasChinese(fileFPath string) bool {
 
 	// 增加判断已存在的字幕是否有中文
-	file, err := p.DetermineFileTypeFromFile(fileFPath)
+	bFind, file, err := p.DetermineFileTypeFromFile(fileFPath)
 	if err != nil {
-		log_helper.GetLogger().Warnln("IsSubHasChinese.DetermineFileTypeFromFile", fileFPath, err)
+		log_helper.GetLogger().Errorln("IsSubHasChinese.DetermineFileTypeFromFile", fileFPath, err)
+		return false
+	}
+	if bFind == false {
+		log_helper.GetLogger().Warnln("IsSubHasChinese.DetermineFileTypeFromFile", fileFPath, "not support SubType")
 		return false
 	}
 	if language.HasChineseLang(file.Lang) == false {