Browse Source

完成修改字幕命名规则。fix #13

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

+ 15 - 11
internal/downloader.go

@@ -362,6 +362,12 @@ func (d Downloader) DownloadSub4Series(dir string) error {
 
 // oneVideoSelectBestSub 一个视频,选择最佳的一个字幕(也可以保存所有网站第一个最佳字幕)
 func (d Downloader) oneVideoSelectBestSub(oneVideoFullPath string, organizeSubFiles []string) {
+
+	// 如果没有则直接跳过
+	if organizeSubFiles == nil || len(organizeSubFiles) < 1 {
+		return
+	}
+
 	var err error
 	// 得到目标视频文件的根目录
 	videoRootPath := filepath.Dir(oneVideoFullPath)
@@ -465,20 +471,18 @@ func (d Downloader) saveFullSeasonSub(seriesInfo *series.SeriesInfo, organizeSub
 
 // 在前面需要进行语言的筛选、排序,这里仅仅是存储, extraSubPreName 这里传递是字幕的网站,有就认为是多字幕的存储。空就是单字幕,单字幕就可以setDefault
 func (d Downloader) writeSubFile2VideoPath(videoFileFullPath string, finalSubFile subparser.FileInfo, extraSubPreName string, setDefault bool) error {
-	videoRootPath := filepath.Dir(videoFileFullPath)
 
-	subNewName := sub_helper.GenerateMixSubName(videoFileFullPath, finalSubFile.Ext, finalSubFile.Lang, extraSubPreName, setDefault, false)
-
-	//embyLanExtName := language.Lang2EmbyNameOld(finalSubFile.Lang)
-	//// 构建视频文件加 emby_helper 的字幕预研要求名称
-	//videoFileNameWithOutExt := strings.ReplaceAll(filepath.Base(videoFileFullPath),
-	//	filepath.Ext(videoFileFullPath), "")
-	//if extraSubPreName != "" {
-	//	extraSubPreName = "[" + extraSubPreName + "]"
-	//}
-	//subNewName := videoFileNameWithOutExt + embyLanExtName + extraSubPreName + finalSubFile.Ext
+	videoRootPath := filepath.Dir(videoFileFullPath)
+	subNewName, subNewNameWithDefault, _ := sub_helper.GenerateMixSubName(videoFileFullPath, finalSubFile.Ext, finalSubFile.Lang, extraSubPreName)
 
 	desSubFullPath := path.Join(videoRootPath, subNewName)
+	if setDefault == true {
+		// 先判断没有 default 的字幕是否存在了,在的话,先删除,然后再写入
+		if pkg.IsFile(desSubFullPath) == true {
+			_ = os.Remove(desSubFullPath)
+		}
+		desSubFullPath = path.Join(videoRootPath, subNewNameWithDefault)
+	}
 	// 最后写入字幕
 	err := utils.OutputFile(desSubFullPath, finalSubFile.Data)
 	if err != nil {

+ 4 - 3
internal/logic/mark_system/markingsystem.go

@@ -70,9 +70,9 @@ func (m MarkingSystem) SelectEachSiteTop1SubFile(organizeSubFiles []string) ([]s
 	// 第二轮,单语言(中文)、字幕类型自定义,优先
 	// 第三轮,双语、字幕类型0,优先
 	// 第四轮,单语言(中文)、字幕类型0,优先
-	for i := 0; i < 4; i++ {
-		for siteName, infos := range subInfoDict {
-			// 每个网站保存一个
+	for siteName, infos := range subInfoDict {
+		// 每个网站保存一个
+		for i := 0; i < 4; i++ {
 			if i == 0 {
 				finalSubFile = sub_helper.SelectChineseBestBilingualSubtitle(infos, m.SubTypePriority)
 			} else if i == 1 {
@@ -85,6 +85,7 @@ func (m MarkingSystem) SelectEachSiteTop1SubFile(organizeSubFiles []string) ([]s
 			if finalSubFile != nil {
 				outSiteName = append(outSiteName, siteName)
 				outSubParserFileInfos = append(outSubParserFileInfos, *finalSubFile)
+				break
 			}
 		}
 	}

+ 54 - 22
internal/logic/sub_supplier/subhd/subhd.go

@@ -67,12 +67,6 @@ func (s Supplier) GetSubListFromFile4Movie(filePath string) ([]supplier.SubInfo,
 
 func (s Supplier) GetSubListFromFile4Series(seriesInfo *series.SeriesInfo) ([]supplier.SubInfo, error) {
 
-	browser, err := rod_helper.NewBrowser(s.reqParam.HttpProxy)
-	if err != nil {
-		return nil, err
-	}
-	defer browser.Close()
-
 	var subInfos = make([]supplier.SubInfo, 0)
 	var subList = make([]HdListItem, 0)
 	for value := range seriesInfo.NeedDlSeasonDict {
@@ -111,6 +105,13 @@ func (s Supplier) GetSubListFromFile4Series(seriesInfo *series.SeriesInfo) ([]su
 	// 找到那些 Eps 需要下载字幕的
 	subInfoNeedDownload := s.whichEpisodeNeedDownloadSub(seriesInfo, subList)
 	// 下载字幕
+	var browser *rod.Browser
+	// 是用本地的 Browser 还是远程的,推荐是远程的
+	browser, err := rod_helper.NewBrowser(s.reqParam.HttpProxy)
+	if err != nil {
+		return nil, err
+	}
+	defer browser.Close()
 	for i, item := range subInfoNeedDownload {
 		hdContent, err := s.step2Ex(browser, item.Url)
 		if err != nil {
@@ -132,12 +133,6 @@ func (s Supplier) GetSubListFromFile4Anime(seriesInfo *series.SeriesInfo) ([]sup
 }
 
 func (s Supplier) getSubListFromFile4Movie(filePath string) ([]supplier.SubInfo, error) {
-
-	browser, err := rod_helper.NewBrowser(s.reqParam.HttpProxy)
-	if err != nil {
-		return nil, err
-	}
-	defer browser.Close()
 	/*
 		虽然是传入视频文件路径,但是其实需要读取对应的视频文件目录下的
 		movie.xml 以及 *.nfo,找到 IMDB id
@@ -161,7 +156,7 @@ func (s Supplier) getSubListFromFile4Movie(filePath string) ([]supplier.SubInfo,
 
 	if imdbInfo.ImdbId != "" {
 		// 先用 imdb id 找
-		subInfoList, err = s.getSubListFromKeyword4Movie(browser, imdbInfo.ImdbId)
+		subInfoList, err = s.getSubListFromKeyword4Movie(imdbInfo.ImdbId)
 		if err != nil {
 			// 允许的错误,跳过,继续进行文件名的搜索
 			s.log.Errorln(s.GetSupplierName(), "keyword:", imdbInfo.ImdbId)
@@ -174,7 +169,7 @@ func (s Supplier) getSubListFromFile4Movie(filePath string) ([]supplier.SubInfo,
 	}
 	// 如果没有,那么就用文件名查找
 	searchKeyword := pkg.VideoNameSearchKeywordMaker(info.Title, imdbInfo.Year)
-	subInfoList, err = s.getSubListFromKeyword4Movie(browser, searchKeyword)
+	subInfoList, err = s.getSubListFromKeyword4Movie(searchKeyword)
 	if err != nil {
 		s.log.Errorln(s.GetSupplierName(), "keyword:", searchKeyword)
 		return nil, err
@@ -183,7 +178,7 @@ func (s Supplier) getSubListFromFile4Movie(filePath string) ([]supplier.SubInfo,
 	return subInfoList, nil
 }
 
-func (s Supplier) getSubListFromKeyword4Movie(browser *rod.Browser, keyword string) ([]supplier.SubInfo, error) {
+func (s Supplier) getSubListFromKeyword4Movie(keyword string) ([]supplier.SubInfo, error) {
 
 	var subInfos []supplier.SubInfo
 	detailPageUrl, err := s.step0(keyword)
@@ -199,6 +194,14 @@ func (s Supplier) getSubListFromKeyword4Movie(browser *rod.Browser, keyword stri
 		return nil, err
 	}
 
+	var browser *rod.Browser
+	// 是用本地的 Browser 还是远程的,推荐是远程的
+	browser, err = rod_helper.NewBrowser(s.reqParam.HttpProxy)
+	if err != nil {
+		return nil, err
+	}
+	defer browser.Close()
+
 	for i, item := range subList {
 		hdContent, err := s.step2Ex(browser, item.Url)
 		time.Sleep(time.Second)
@@ -422,7 +425,7 @@ func (s Supplier) step2Ex(browser *rod.Browser, subDownloadPageUrl string) (*HdC
 		}
 	}()
 	subDownloadPageUrl = pkg.AddBaseUrl(common.SubSubHDRootUrl, subDownloadPageUrl)
-	// 默认超时是 120s,如果是调试模式则是 20 min
+	// 默认超时是 60s,如果是调试模式则是 5 min
 	tt := common.HTMLTimeOut
 	if s.reqParam.DebugMode == true {
 		tt = common.OneVideoProcessTimeOut
@@ -431,6 +434,7 @@ func (s Supplier) step2Ex(browser *rod.Browser, subDownloadPageUrl string) (*HdC
 	if err != nil {
 		return nil, err
 	}
+	defer page.Close()
 	page.MustSetUserAgent(&proto.NetworkSetUserAgentOverride{
 		UserAgent: pkg.RandomUserAgent(true),
 	})
@@ -626,21 +630,49 @@ search:
 	}
 }
 
-func (s Supplier) httpGet(url string) (string, error) {
-	s.reqParam.Referer = url
+func (s Supplier) httpGet(inputUrl string) (string, error) {
+	s.reqParam.Referer = inputUrl
+	// TODO subhd 搜索限制太大,更换方式也差不多
+	// 是用本地的 Browser 还是远程的,推荐是远程的
+	//browser, err := rod_helper.NewBrowser(s.reqParam.HttpProxy)
+	//if err != nil {
+	//	return "", err
+	//}
+	//defer browser.Close()
+	//// 默认超时是 60s,如果是调试模式则是 5 min
+	//tt := common.HTMLTimeOut
+	//if s.reqParam.DebugMode == true {
+	//	tt = common.OneVideoProcessTimeOut
+	//}
+	//page, err := rod_helper.NewPageNavigate(browser, inputUrl, tt, 5)
+	//if err != nil {
+	//	return "", err
+	//}
+	//defer page.Close()
+	//page.MustSetUserAgent(&proto.NetworkSetUserAgentOverride{
+	//	UserAgent: pkg.RandomUserAgent(true),
+	//})
+	//err = page.WaitLoad()
+	//if err != nil {
+	//	return "", err
+	//}
+	//recvText, err := page.HTML()
+	//if err != nil {
+	//	return "", err
+	//}
 	httpClient := pkg.NewHttpClient(s.reqParam)
-	resp, err := httpClient.R().Get(url)
+	resp, err := httpClient.R().Get(inputUrl)
 	if err != nil {
 		return "", err
 	}
 	recvText := resp.String()
 	//搜索验证 点击继续搜索
 	if strings.Contains(recvText, "搜索验证") || strings.Contains(recvText, "搜索频率") {
-		s.log.Debugln("搜索验证 or 搜索频率 reload", url)
+		s.log.Debugln("搜索验证 or 搜索频率 reload", inputUrl)
 		time.Sleep(pkg.RandomSecondDuration(5, 10))
-		return s.httpGet(url)
+		return s.httpGet(inputUrl)
 	}
-	return resp.String(), nil
+	return recvText, nil
 }
 
 type HdListItem struct {

+ 1 - 1
internal/pkg/decode/decode.go

@@ -343,7 +343,7 @@ const (
 	// 去除特殊字符,仅仅之有中文
 	regFixTitle = "[^\u4e00-\u9fa5a-zA-Z0-9\\s]"
 	// 去除特殊字符,把特殊字符都写进去
-	regFixTitle2 = "[`~!@#$%^&*()+-=|{}';'\\[\\].<>/?~!@#¥%……&*()——+|{}【】';”“’。、?]"
+	regFixTitle2 = "[~!@#$%^&*()\\+\\-=|{}';'\\[\\].<>/?~!@#¥%……&*()——+|{}【】';”“’。、?]"
 	// 获取数字
 	regGetNumber = "(?:\\-)?\\d{1,}(?:\\.\\d{1,})?"
 )

+ 4 - 4
internal/pkg/emby_helper/emby.go

@@ -106,7 +106,7 @@ func (em EmbyApi) GetRecentlyItems() (emby.EmbyRecentlyItems, error) {
 			"SortBy":           "DateCreated",
 		}).
 		SetResult(&recItems).
-		Get(em.embyConfig.Url + "/emby_helper/Items")
+		Get(em.embyConfig.Url + "/emby/Items")
 	if err != nil {
 		return emby.EmbyRecentlyItems{}, err
 	}
@@ -124,7 +124,7 @@ func (em EmbyApi) GetItemAncestors(id string) ([]emby.EmbyItemsAncestors, error)
 			"api_key": em.embyConfig.ApiKey,
 		}).
 		SetResult(&recItems).
-		Get(em.embyConfig.Url + "/emby_helper/Items/" + id + "/Ancestors")
+		Get(em.embyConfig.Url + "/emby/Items/" + id + "/Ancestors")
 	if err != nil {
 		return nil, err
 	}
@@ -142,7 +142,7 @@ func (em EmbyApi) GetItemVideoInfo(id string) (emby.EmbyVideoInfo, error) {
 			"api_key": em.embyConfig.ApiKey,
 		}).
 		SetResult(&recItem).
-		Get(em.embyConfig.Url + "/emby_helper/LiveTv/Programs/" + id)
+		Get(em.embyConfig.Url + "/emby/LiveTv/Programs/" + id)
 	if err != nil {
 		return emby.EmbyVideoInfo{}, err
 	}
@@ -157,7 +157,7 @@ func (em EmbyApi) UpdateVideoSubList(id string) error {
 		SetQueryParams(map[string]string{
 			"api_key": em.embyConfig.ApiKey,
 		}).
-		Post(em.embyConfig.Url + "/emby_helper/Items/" + id + "/Refresh")
+		Post(em.embyConfig.Url + "/emby/Items/" + id + "/Refresh")
 	if err != nil {
 		return err
 	}

+ 13 - 16
internal/pkg/sub_helper/sub_helper.go

@@ -233,7 +233,7 @@ func SearchMatchedSubFile(dir string) ([]string, error) {
 // SearchVideoMatchSubFileAndRemoveDefaultMark 找到找个视频目录下相匹配的字幕,同时去除这些字幕中 .default 的标记
 func SearchVideoMatchSubFileAndRemoveDefaultMark(oneVideoFullPath string) error {
 
-	dir := path.Dir(oneVideoFullPath)
+	dir := filepath.Dir(oneVideoFullPath)
 	fileName := filepath.Base(oneVideoFullPath)
 	fileName = strings.ToLower(fileName)
 	fileName = strings.ReplaceAll(fileName, filepath.Ext(fileName), "")
@@ -250,16 +250,18 @@ func SearchVideoMatchSubFileAndRemoveDefaultMark(oneVideoFullPath string) error
 			if curFile.Size() < 1000 {
 				continue
 			}
+			// 判断的时候用小写的,后续重命名的时候用原有的名称
+			nowFileName := strings.ToLower(curFile.Name())
 			// 后缀名得对
-			if IsSubExtWanted(filepath.Ext(curFile.Name())) == false {
+			if IsSubExtWanted(filepath.Ext(nowFileName)) == false {
 				continue
 			}
 			// 字幕文件名应该包含 视频文件名(无后缀)
-			if strings.Contains(curFile.Name(), fileName) == false {
+			if strings.Contains(nowFileName, fileName) == false {
 				continue
 			}
 			// 得包含 .default. 找个关键词
-			if strings.Contains(curFile.Name(), types.Emby_default+".") == false {
+			if strings.Contains(nowFileName, types.Emby_default+".") == false {
 				continue
 			}
 			oldPath := dir + pathSep + curFile.Name()
@@ -368,27 +370,22 @@ func IsOldVersionSubPrefixName(subFileName string) (bool, string, string) {
 }
 
 // GenerateMixSubName 这里会生成类似的文件名 xxxx.chinese(中英,shooter)
-func GenerateMixSubName(videoFileName, subExt string, subLan types.Language, extraSubPreName string, setDefault, setForced bool) string {
+func GenerateMixSubName(videoFileName, subExt string, subLan types.Language, extraSubPreName string) (string, string, string) {
 
 	videoFileNameWithOutExt := strings.ReplaceAll(filepath.Base(videoFileName),
 		filepath.Ext(videoFileName), "")
-
 	note := ""
 	if extraSubPreName != "" {
 		note = "," + extraSubPreName
 	}
+	defaultString := ".default"
+	forcedString := ".forced"
 
-	appendString := ""
-	if setDefault == true {
-		appendString = ".default"
-	}
-	if setForced == true {
-		appendString = ".forced"
-	}
-
-	subNewName := videoFileNameWithOutExt + "(" + language.Lang2ChineseString(subLan) + note + ")" + appendString + subExt
+	subNewName := videoFileNameWithOutExt + ".chinese" + "(" + language.Lang2ChineseString(subLan) + note + ")" + subExt
+	subNewNameWithDefault := videoFileNameWithOutExt + ".chinese" + "(" + language.Lang2ChineseString(subLan) + note + ")" + defaultString + subExt
+	subNewNameWithForced := videoFileNameWithOutExt + ".chinese" + "(" + language.Lang2ChineseString(subLan) + note + ")" + forcedString + subExt
 
-	return subNewName
+	return subNewName, subNewNameWithDefault, subNewNameWithForced
 }
 
 func makeMixSubExtString(orgFileNameWithOutExt, lang string, ext, site string, beDefault bool) string {