Browse Source

zimuku 支持整季字幕的下载保存,存在类似 S1E0 文件夹中

Signed-off-by: allan716 <[email protected]>
allan716 4 years ago
parent
commit
5ec4c725e3
4 changed files with 44 additions and 3 deletions
  1. 2 1
      common/supplierSubInfo.go
  2. 26 0
      downloader.go
  3. 2 1
      downloader_test.go
  4. 14 1
      sub_supplier/zimuku/zimuku.go

+ 2 - 1
common/supplierSubInfo.go

@@ -12,6 +12,7 @@ type SupplierSubInfo struct {
 	Data      []byte         `json:"data"`       // 字幕文件的二进制数据
 	Season    int			 `json:"season"`     // 第几季,默认-1
 	Episode   int			 `json:"episode"`    // 第几集,默认-1
+	IsFullSeason bool		 `json:"is_full_season"`    // 是否是全季的字幕
 }
 
 func NewSupplierSubInfo(fromWhere string, topN int64, name string, language Language, fileUrl string,
@@ -22,6 +23,6 @@ func NewSupplierSubInfo(fromWhere string, topN int64, name string, language Lang
 
 	s.Season = -1
 	s.Episode = -1
-	
+
 	return &s
 }

+ 26 - 0
downloader.go

@@ -109,10 +109,13 @@ func (d Downloader) DownloadSub4Series(dir string) error {
 			return err
 		}
 
+		// 只针对需要下载字幕的视频进行字幕的选择保存
 		for epsKey, episodeInfo := range seriesInfo.NeedDlEpsKeyList {
 			// 匹配对应的 Eps 去处理
 			d.oneVideoSelectBestSub(episodeInfo.FileFullPath, organizeSubFiles[epsKey])
 		}
+		// 这里会拿到一份季度字幕的列表比如,S1E0 S2E0 S3E0
+		d.saveFullSeasonSub(seriesInfo, organizeSubFiles)
 	}
 	return nil
 }
@@ -163,6 +166,29 @@ func (d Downloader) oneVideoSelectBestSub(oneVideoFullPath string, organizeSubFi
 	}
 }
 
+// saveFullSeasonSub 这里就需要单独存储到连续剧每一季的文件夹的特殊文件夹中
+func (d Downloader) saveFullSeasonSub(seriesInfo *common.SeriesInfo, organizeSubFiles map[string][]string) {
+
+	for _, season := range seriesInfo.SeasonDict {
+		epsKey := model.GetEpisodeKeyName(season, 0)
+		subs, ok := organizeSubFiles[epsKey]
+		if ok == false {
+			continue
+		}
+		for _, sub := range subs {
+			subFileName := filepath.Base(sub)
+			newSeasonSubRootPath := path.Join(seriesInfo.DirPath, epsKey)
+			_ = os.MkdirAll(newSeasonSubRootPath, os.ModePerm)
+			newSubFullPath := path.Join(newSeasonSubRootPath, subFileName)
+			err := os.Rename(sub, newSubFullPath)
+			if err != nil {
+				d.log.Errorln("saveFullSeasonSub", subFileName, err)
+				continue
+			}
+		}
+	}
+}
+
 // 在前面需要进行语言的筛选、排序,这里仅仅是存储
 func (d Downloader) writeSubFile2VideoPath(videoFileFullPath string, finalSubFile common.SubParserFileInfo, extraSubPreName string) error {
 	videoRootPath := filepath.Dir(videoFileFullPath)

+ 2 - 1
downloader_test.go

@@ -26,7 +26,8 @@ func TestDownloader_DownloadSub4Movie(t *testing.T) {
 func TestDownloader_DownloadSub4Series(t *testing.T) {
 	var err error
 	//dirRoot := "X:\\连续剧\\隐秘的角落 (2020)"
-	dirRoot := "X:\\连续剧\\The Bad Batch"
+	//dirRoot := "X:\\连续剧\\The Bad Batch"
+	dirRoot := "X:\\连续剧\\Why Women Kill"
 
 	dl := NewDownloader(common.ReqParam{
 		SaveMultiSub: true,

+ 14 - 1
sub_supplier/zimuku/zimuku.go

@@ -177,21 +177,30 @@ func (s Supplier) whichEpisodeNeedDownloadSub(seriesInfo *common.SeriesInfo, All
 	// 字幕很多,考虑效率,需要做成字典
 	// key SxEx - SubInfos
 	var allSubDict = make(map[string]SubInfos)
+	// 全季的字幕列表
+	var oneSeasonSubDict  = make(map[string]SubInfos)
 	for _, subInfo := range AllSeasonSubResult.SubInfos {
 		_, season, episode, err := model.GetSeasonAndEpisodeFromSubFileName(subInfo.Name)
 		if err != nil {
 			s.log.Errorln("SubInfos GetSubListFromFile4Series.GetVideoInfoFromFileFullPath", subInfo.Name, err)
 			continue
 		}
-		// TODO 这里的 episode 为 0,则是全季
+		subInfo.Season = season
+		subInfo.Episode = episode
 		epsKey := model.GetEpisodeKeyName(season, episode)
 		_, ok := allSubDict[epsKey]
 		if ok == false {
 			// 初始化
 			allSubDict[epsKey] = SubInfos{}
+			if season != 0 && episode == 0 {
+				oneSeasonSubDict[epsKey] = SubInfos{}
+			}
 		}
 		// 添加
 		allSubDict[epsKey] = append(allSubDict[epsKey], subInfo)
+		if season != 0 && episode == 0 {
+			oneSeasonSubDict[epsKey] = append(oneSeasonSubDict[epsKey], subInfo)
+		}
 	}
 	// 本地的视频列表,找到没有字幕的
 	// 需要进行下载字幕的列表
@@ -209,6 +218,10 @@ func (s Supplier) whichEpisodeNeedDownloadSub(seriesInfo *common.SeriesInfo, All
 			s.log.Infoln("Not Find Sub can be download", epsInfo.Title, epsInfo.Season, epsInfo.Episode)
 		}
 	}
+	// 全季的字幕列表,也拼进去,后面进行下载
+	for _, infos := range oneSeasonSubDict {
+		subInfoNeedDownload = append(subInfoNeedDownload, infos[0])
+	}
 
 	// 返回前,需要把每一个 Eps 的 Season Episode 信息填充到每个 SubInfo 中
 	return subInfoNeedDownload