Pārlūkot izejas kodu

单个任务在下载队列中更新的时候,会随带更新视频列表的缓存

Signed-off-by: allan716 <[email protected]>
allan716 3 gadi atpakaļ
vecāks
revīzija
731c439568

+ 111 - 44
internal/pkg/downloader/cache_info.go

@@ -4,7 +4,10 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/my_folder"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/strcut_json"
+	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_helper"
 	"github.com/allanpk716/ChineseSubFinder/internal/types/backend"
+	"github.com/allanpk716/ChineseSubFinder/internal/types/common"
+	"github.com/allanpk716/ChineseSubFinder/internal/types/task_queue"
 	"path/filepath"
 )
 
@@ -19,52 +22,56 @@ func (d *Downloader) GetMovieInfoAndSeasonInfo() ([]backend.MovieInfo, []backend
 	// 需要把本实例中的缓存 map 转换到 Web 传递的结构体中
 	d.cacheLocker.Lock()
 	defer d.cacheLocker.Unlock()
+	// 全部都获取
+	return d.getMovieInfoAndSeasonInfo(0)
+}
 
-	outMovieInfos := make([]backend.MovieInfo, 0)
-	outSeasonInfo := make([]backend.SeasonInfo, 0)
-	for _, movieInfo := range d.movieInfoMap {
+func (d *Downloader) UpdateInfo(job task_queue.OneJob) {
+	d.cacheLocker.Lock()
+	defer d.cacheLocker.Unlock()
 
-		nowMovieInfo := backend.MovieInfo{
-			Name:                     movieInfo.Name,
-			DirRootUrl:               movieInfo.DirRootUrl,
-			VideoFPath:               movieInfo.VideoFPath,
-			VideoUrl:                 movieInfo.VideoUrl,
-			MediaServerInsideVideoID: movieInfo.MediaServerInsideVideoID,
-			SubFPathList:             make([]string, 0),
-		}
-		nowMovieInfo.SubFPathList = append(nowMovieInfo.SubFPathList, movieInfo.SubFPathList...)
-		outMovieInfos = append(outMovieInfos, nowMovieInfo)
+	// 搜索字幕
+	matchedSubFileByOneVideo, err := sub_helper.SearchMatchedSubFileByOneVideo(d.log, job.VideoFPath)
+	if err != nil {
+		d.log.Errorln("SearchMatchedSubFileByOneVideo", err)
+		return
 	}
 
-	for _, seasonInfo := range d.seasonInfoMap {
-
-		nowSeasonInfo := backend.SeasonInfo{
-			Name:          seasonInfo.Name,
-			RootDirPath:   seasonInfo.RootDirPath,
-			DirRootUrl:    seasonInfo.DirRootUrl,
-			OneVideoInfos: make([]backend.OneVideoInfo, 0),
+	if job.VideoType == common.Movie {
+		// 更新 movieInfo
+		// 更新缓存, 存在,更新, 不存在,跳过
+		if oneMovieInfo, ok := d.movieInfoMap[job.VideoFPath]; ok == true {
+
+			oneMovieInfo.MediaServerInsideVideoID = job.MediaServerInsideVideoID
+			oneMovieInfo.SubFPathList = matchedSubFileByOneVideo
+			d.movieInfoMap[job.VideoFPath] = oneMovieInfo
+			// 写入本地缓存
+			backendMovieInfo, _ := d.getMovieInfoAndSeasonInfo(1)
+			err = d.saveVideoListCache(backendMovieInfo, nil)
+			if err != nil {
+				d.log.Errorln("saveVideoListCache", job.VideoFPath, err)
+				return
+			}
 		}
-
-		for _, oneVideoInfo := range seasonInfo.OneVideoInfoMap {
-
-			nowOneVideoInfo := backend.OneVideoInfo{
-
-				Name:                     oneVideoInfo.Name,
-				VideoFPath:               oneVideoInfo.VideoFPath,
-				VideoUrl:                 oneVideoInfo.VideoUrl,
-				Season:                   oneVideoInfo.Season,
-				Episode:                  oneVideoInfo.Episode,
-				MediaServerInsideVideoID: oneVideoInfo.MediaServerInsideVideoID,
-				SubFPathList:             make([]string, 0),
+	} else if job.VideoType == common.Series {
+		// 更新 seasonInfo
+		// 更新缓存, 存在,更新, 不存在,跳过
+		if oneSeasonInfo, ok := d.seasonInfoMap[job.SeriesRootDirPath]; ok == true {
+
+			if nowOneVideoInfo, ok := oneSeasonInfo.OneVideoInfoMap[job.VideoFPath]; ok == true {
+				nowOneVideoInfo.MediaServerInsideVideoID = job.MediaServerInsideVideoID
+				nowOneVideoInfo.SubFPathList = matchedSubFileByOneVideo
+				d.seasonInfoMap[job.SeriesRootDirPath].OneVideoInfoMap[job.VideoFPath] = nowOneVideoInfo
+				// 写入本地缓存
+				_, backendSeasonInfo := d.getMovieInfoAndSeasonInfo(2)
+				err = d.saveVideoListCache(nil, backendSeasonInfo)
+				if err != nil {
+					d.log.Errorln("saveVideoListCache", job.VideoFPath, err)
+					return
+				}
 			}
-			nowOneVideoInfo.SubFPathList = append(nowOneVideoInfo.SubFPathList, oneVideoInfo.SubFPathList...)
-			nowSeasonInfo.OneVideoInfos = append(nowSeasonInfo.OneVideoInfos, nowOneVideoInfo)
 		}
-
-		outSeasonInfo = append(outSeasonInfo, nowSeasonInfo)
 	}
-
-	return outMovieInfos, outSeasonInfo
 }
 
 func (d *Downloader) setMovieAndSeasonInfo(movieInfos []backend.MovieInfo, seasonInfos []backend.SeasonInfo, skip ...bool) {
@@ -127,6 +134,62 @@ func (d *Downloader) setMovieAndSeasonInfo(movieInfos []backend.MovieInfo, seaso
 	}
 }
 
+func (d *Downloader) getMovieInfoAndSeasonInfo(AllorFrontorEnd int) ([]backend.MovieInfo, []backend.SeasonInfo) {
+
+	outMovieInfos := make([]backend.MovieInfo, 0)
+	outSeasonInfo := make([]backend.SeasonInfo, 0)
+	// AllorFrontorEnd == 0, 全部, AllorFrontorEnd == 1, MovieInfo, AllorFrontorEnd == 2, SeasonInfo
+	if AllorFrontorEnd == 0 || AllorFrontorEnd == 1 {
+
+		for _, movieInfo := range d.movieInfoMap {
+
+			nowMovieInfo := backend.MovieInfo{
+				Name:                     movieInfo.Name,
+				DirRootUrl:               movieInfo.DirRootUrl,
+				VideoFPath:               movieInfo.VideoFPath,
+				VideoUrl:                 movieInfo.VideoUrl,
+				MediaServerInsideVideoID: movieInfo.MediaServerInsideVideoID,
+				SubFPathList:             make([]string, 0),
+			}
+			nowMovieInfo.SubFPathList = append(nowMovieInfo.SubFPathList, movieInfo.SubFPathList...)
+			outMovieInfos = append(outMovieInfos, nowMovieInfo)
+		}
+	}
+
+	if AllorFrontorEnd == 0 || AllorFrontorEnd == 2 {
+
+		for _, seasonInfo := range d.seasonInfoMap {
+
+			nowSeasonInfo := backend.SeasonInfo{
+				Name:          seasonInfo.Name,
+				RootDirPath:   seasonInfo.RootDirPath,
+				DirRootUrl:    seasonInfo.DirRootUrl,
+				OneVideoInfos: make([]backend.OneVideoInfo, 0),
+			}
+
+			for _, oneVideoInfo := range seasonInfo.OneVideoInfoMap {
+
+				nowOneVideoInfo := backend.OneVideoInfo{
+
+					Name:                     oneVideoInfo.Name,
+					VideoFPath:               oneVideoInfo.VideoFPath,
+					VideoUrl:                 oneVideoInfo.VideoUrl,
+					Season:                   oneVideoInfo.Season,
+					Episode:                  oneVideoInfo.Episode,
+					MediaServerInsideVideoID: oneVideoInfo.MediaServerInsideVideoID,
+					SubFPathList:             make([]string, 0),
+				}
+				nowOneVideoInfo.SubFPathList = append(nowOneVideoInfo.SubFPathList, oneVideoInfo.SubFPathList...)
+				nowSeasonInfo.OneVideoInfos = append(nowSeasonInfo.OneVideoInfos, nowOneVideoInfo)
+			}
+
+			outSeasonInfo = append(outSeasonInfo, nowSeasonInfo)
+		}
+	}
+
+	return outMovieInfos, outSeasonInfo
+}
+
 func (d *Downloader) saveVideoListCache(movieInfos []backend.MovieInfo, seasonInfos []backend.SeasonInfo) error {
 
 	// 缓存下来
@@ -138,14 +201,18 @@ func (d *Downloader) saveVideoListCache(movieInfos []backend.MovieInfo, seasonIn
 	movieInfosFileName := filepath.Join(cacheCenterFolder, "movie_infos.json")
 	seasonInfosFileName := filepath.Join(cacheCenterFolder, "season_infos.json")
 
-	err = strcut_json.ToFile(movieInfosFileName, movieInfos)
-	if err != nil {
-		return err
+	if movieInfos != nil && len(movieInfos) > 0 {
+		err = strcut_json.ToFile(movieInfosFileName, movieInfos)
+		if err != nil {
+			return err
+		}
 	}
 
-	err = strcut_json.ToFile(seasonInfosFileName, seasonInfos)
-	if err != nil {
-		return err
+	if seasonInfos != nil && len(seasonInfos) > 0 {
+		err = strcut_json.ToFile(seasonInfosFileName, seasonInfos)
+		if err != nil {
+			return err
+		}
 	}
 
 	return nil

+ 3 - 0
internal/pkg/downloader/downloader.go

@@ -281,6 +281,9 @@ func (d *Downloader) QueueDownloader() {
 		if err != nil {
 			d.log.Errorln(err)
 		}
+		// 刷新视频的缓存结构
+		d.UpdateInfo(oneJob)
+		
 		break
 	case p := <-panicChan:
 		// 遇到内部的 panic,向外抛出