Browse Source

重构保存进度

Signed-off-by: allan716 <[email protected]>
allan716 4 years ago
parent
commit
f9570d95a5
7 changed files with 134 additions and 57 deletions
  1. 1 0
      .gitignore
  2. 22 4
      common/lang.go
  3. 16 1
      downloader.go
  4. 58 0
      subParserHub.go
  5. 19 0
      subParserHub_test.go
  6. 18 0
      sub_parser/SubFileInfo.go
  7. 0 52
      sub_parser/subParserHub.go

+ 1 - 0
.gitignore

@@ -4,3 +4,4 @@
 /result.png
 /Logs
 /debugThings
+/tmpthings

+ 22 - 4
common/lang.go

@@ -196,14 +196,32 @@ func SubLangStatistics2SubLangType(countLineFeed, AllLines float32, langDict map
 }
 
 // IsChineseSimpleOrTraditional 从字幕的文件名称中尝试确认是简体还是繁体,不需要判断双语问题,有额外的解析器完成。只可能出现 ChineseSimple ChineseTraditional Unknow 三种情况
-func IsChineseSimpleOrTraditional(inputFileName string) Language {
+func IsChineseSimpleOrTraditional(inputFileName string, orgLang Language) Language {
 
 	if strings.Contains(inputFileName, SubNameKeywordChineseSimple) || strings.Contains(inputFileName, MatchLangChs) {
-		return ChineseSimple
+		// 简体中文关键词的匹配
+		return orgLang
 	} else if strings.Contains(inputFileName, SubNameKeywordTraditional) || strings.Contains(inputFileName, MatchLangCht) {
-		return ChineseTraditional
+		// 繁体中文关键词的匹配
+		if orgLang == ChineseSimple {
+			// 简体 -> 繁体
+			return ChineseTraditional
+		} else if orgLang == ChineseSimpleEnglish {
+			// 简体英文 -> 繁体英文
+			return ChineseTraditionalEnglish
+		} else if orgLang == ChineseSimpleJapanese {
+			// 简体日文 -> 繁体日文
+			return ChineseTraditionalJapanese
+		} else if orgLang == ChineseSimpleKorean {
+			// 简体韩文 -> 繁体韩文
+			return ChineseTraditionalKorean
+		}
+		// 进来了都不是,那么就返回原来的语言
+		return orgLang
+	} else {
+		// 都没有匹配上,返回原来识别出来的类型即可
+		return orgLang
 	}
-	return Unknow
 }
 
 const (

+ 16 - 1
downloader.go

@@ -98,9 +98,11 @@ func (d Downloader) DownloadSub(dir string) error {
 		}
 		// -------------------------------------------------
 		// TODO 这里先处理 Top1 的字幕,后续再考虑怎么觉得 Top N 选择哪一个,很可能选择每个网站 Top 1就行了,具体的过滤逻辑在其内部实现
+		// 一个网站可能就算取了 Top1 字幕,也可能是返回一个压缩包,然后解压完就是多个字幕,所以
+		var subInfoDict = make(map[string][]sub_parser.SubFileInfo)
 		// 拿到现有的字幕列表,开始抉择
 		// 先判断当前字幕是什么语言(如果是简体,还需要考虑,判断这个字幕是简体还是繁体)
-		subParserHub := sub_parser.NewSubParserHub(ass.NewParser(), srt.NewParser())
+		subParserHub := NewSubParserHub(ass.NewParser(), srt.NewParser())
 		for _, oneSubFileFullPath := range organizeSubFiles {
 			subFileInfo, err := subParserHub.DetermineFileTypeFromFile(oneSubFileFullPath)
 			if err != nil {
@@ -112,7 +114,20 @@ func (d Downloader) DownloadSub(dir string) error {
 				d.log.Warning(oneSubFileFullPath, "DetermineFileTypeFromFile is nill")
 				continue
 			}
+
+			value, ok := subInfoDict[subFileInfo.FromWhereSite]
+			if ok == true {
+				// 添加
+				subInfoDict[subFileInfo.FromWhereSite] = append(subInfoDict[subFileInfo.FromWhereSite], *subFileInfo)
+			} else {
+				// 新建
+				subInfoDict[subFileInfo.FromWhereSite] = make([]sub_parser.SubFileInfo, 0)
+				subInfoDict[subFileInfo.FromWhereSite] = append(subInfoDict[subFileInfo.FromWhereSite], *subFileInfo)
+			}
 		}
+		// 优先级别暂定 zimuku -> subhd -> xunlei -> shooter
+		if
+
 		println(videoRootPath)
 		// 抉择完毕,需要清理缓存目录
 		err = common.ClearTmpFolder()

+ 58 - 0
subParserHub.go

@@ -0,0 +1,58 @@
+package ChineseSubFinder
+
+import (
+	"github.com/allanpk716/ChineseSubFinder/common"
+	"github.com/allanpk716/ChineseSubFinder/sub_parser"
+	"path/filepath"
+	"regexp"
+)
+
+type SubParserHub struct {
+	Parser []sub_parser.ISubParser
+}
+
+func NewSubParserHub(parser sub_parser.ISubParser, _inparser ...sub_parser.ISubParser) *SubParserHub {
+	s := SubParserHub{}
+	s.Parser = make([]sub_parser.ISubParser, 0)
+	s.Parser = append(s.Parser, parser)
+	if len(_inparser) > 0 {
+		for _, one := range _inparser {
+			s.Parser = append(s.Parser, one)
+		}
+	}
+	return &s
+}
+
+// DetermineFileTypeFromFile 确定字幕文件的类型,是双语字幕或者某一种语言等等信息,如果返回 nil ,那么就说明都没有字幕的格式匹配上
+func (p SubParserHub) DetermineFileTypeFromFile(filePath string) (*sub_parser.SubFileInfo, error){
+	for _, parser := range p.Parser {
+		subFileInfo, err := parser.DetermineFileTypeFromFile(filePath)
+		if err != nil {
+			return nil, err
+		}
+		// 文件的格式不匹配解析器就是 nil
+		if subFileInfo == nil {
+			continue
+		} else {
+			// 正常至少应该匹配一个吧,不然就是最外层继续返回 nil 出去了
+			// 简体和繁体字幕的判断,通过文件名来做到的,基本就算个补判而已
+			newLang := common.IsChineseSimpleOrTraditional(filePath, subFileInfo.Lang)
+			subFileInfo.Name = filepath.Base(filePath)
+			subFileInfo.Lang = newLang
+			subFileInfo.FromWhereSite = p.getFromWhereSite(filePath)
+			return subFileInfo, nil
+		}
+	}
+	// 如果返回 nil ,那么就说明都没有字幕的格式匹配上
+	return nil, nil
+}
+// getFromWhereSite 从文件名找出是从那个网站下载的。这里的文件名的前缀是下载时候标记好的,比较特殊
+func (p SubParserHub) getFromWhereSite(filePath string) string {
+	fileName := filepath.Base(filePath)
+	var re = regexp.MustCompile(`^\[(\w+)\]_`)
+	matched := re.FindStringSubmatch(fileName)
+	if len(matched) < 1 {
+		return ""
+	}
+	return matched[1]
+}

+ 19 - 0
subParserHub_test.go

@@ -0,0 +1,19 @@
+package ChineseSubFinder
+
+import (
+	"github.com/allanpk716/ChineseSubFinder/sub_parser/ass"
+	"github.com/allanpk716/ChineseSubFinder/sub_parser/srt"
+	"testing"
+)
+
+func TestSubParserHub_DetermineFileTypeFromFile(t *testing.T) {
+
+	//filePath := "C:\\tmp\\[zimuku]_0_Spiral.From.the.Book.of.Saw.2021.1080p.WEBRip.x264-RARBG.eng.srt"
+	filePath := "C:\\tmp\\[zimuku]_0_Spiral.From.the.Book.of.Saw.2021.1080p.WEBRip.x264-RARBG.chi.srt"
+	p := NewSubParserHub(ass.NewParser(), srt.NewParser())
+	subFileInfo, err := p.DetermineFileTypeFromFile(filePath)
+	if err != nil {
+		t.Fatal(err)
+	}
+	println(subFileInfo.Name, subFileInfo.FromWhereSite, subFileInfo.Lang.String(), subFileInfo.Ext)
+}

+ 18 - 0
sub_parser/SubFileInfo.go

@@ -0,0 +1,18 @@
+package sub_parser
+
+import "github.com/allanpk716/ChineseSubFinder/common"
+
+type SubFileInfo struct {
+	FromWhereSite string	// 从那个网站下载的
+	Name	string			// 字幕的名称,注意,这里需要额外的赋值,不会自动检测
+	Ext		string			// 字幕的后缀名
+	Lang common.Language	// 识别出来的语言
+	Dialogues []OneDialogue	// 整个字幕文件的所有对话
+}
+
+// OneDialogue 一句对话
+type OneDialogue struct {
+	StartTime string		// 开始时间
+	EndTime string			// 结束时间
+	Lines	[]string		// 台词
+}

+ 0 - 52
sub_parser/subParserHub.go

@@ -1,52 +0,0 @@
-package sub_parser
-
-import "github.com/allanpk716/ChineseSubFinder/common"
-
-type SubParserHub struct {
-	Parser []ISubParser
-}
-
-func NewSubParserHub(parser ISubParser, _inparser ... ISubParser) *SubParserHub {
-	s := SubParserHub{}
-	s.Parser = make([]ISubParser, 0)
-	s.Parser = append(s.Parser, parser)
-	if len(_inparser) > 0 {
-		for _, one := range _inparser {
-			s.Parser = append(s.Parser, one)
-		}
-	}
-	return &s
-}
-
-// DetermineFileTypeFromFile 确定字幕文件的类型,是双语字幕或者某一种语言等等信息,如果返回 nil ,那么就说明都没有字幕的格式匹配上
-func (p SubParserHub) DetermineFileTypeFromFile(filePath string) (*SubFileInfo, error){
-	for _, parser := range p.Parser {
-		subFileInfo, err := parser.DetermineFileTypeFromFile(filePath)
-		if err != nil {
-			return nil, err
-		}
-		// 文件的格式不匹配解析器就是 nil
-		if subFileInfo == nil {
-			continue
-		} else {
-			// 正常至少应该匹配一个吧,不然就是最外层继续返回 nil 出去了
-			return subFileInfo, nil
-		}
-	}
-	// 如果返回 nil ,那么就说明都没有字幕的格式匹配上
-	return nil, nil
-}
-
-type SubFileInfo struct {
-	Name	string			// 字幕的名称,注意,这里需要额外的赋值,不会自动检测
-	Ext		string			// 字幕的后缀名
-	Lang common.Language	// 识别出来的语言
-	Dialogues []OneDialogue	// 整个字幕文件的所有对话
-}
-
-// OneDialogue 一句对话
-type OneDialogue struct {
-	StartTime string		// 开始时间
-	EndTime string			// 结束时间
-	Lines	[]string		// 台词
-}