Browse Source

重构视频缓存功能

Signed-off-by: allan716 <[email protected]>
allan716 3 years ago
parent
commit
0e8a2d3cb6

+ 2 - 2
internal/backend/controllers/v1/video_list.go

@@ -74,7 +74,7 @@ func (cb *ControllerBase) RefreshVideoListHandler(c *gin.Context) {
 		MovieInfos, SeasonInfos := cb.videoScanAndRefreshHelper.ScrabbleUpVideoList(scanVideoResult, pathUrlMap)
 
 		// 缓存视频列表
-		cb.cronHelper.SetMovieAndSeasonInfo(MovieInfos, SeasonInfos)
+		cb.cronHelper.Downloader.SetMovieAndSeasonInfo(MovieInfos, SeasonInfos)
 	}()
 
 	c.JSON(http.StatusOK, backend.ReplyRefreshVideoList{
@@ -126,7 +126,7 @@ func (cb *ControllerBase) VideoListHandler(c *gin.Context) {
 		cb.ErrorProcess(c, "VideoListHandler", err)
 	}()
 
-	outMovieInfos, outSeasonInfo := cb.cronHelper.GetMovieInfoAndSeasonInfo()
+	outMovieInfos, outSeasonInfo := cb.cronHelper.Downloader.GetMovieInfoAndSeasonInfo()
 
 	c.JSON(http.StatusOK, backend.ReplyVideoList{
 		MovieInfos:  outMovieInfos,

+ 8 - 20
internal/logic/cron_helper/cron_helper.go

@@ -20,7 +20,7 @@ type CronHelper struct {
 	scanPlayedVideoSubInfo        *scan_played_video_subinfo.ScanPlayedVideoSubInfo        // 扫描已经播放过的视频的字幕信息
 	FileDownloader                *file_downloader.FileDownloader                          // 文件下载器
 	DownloadQueue                 *task_queue.TaskQueue                                    // 需要下载的视频的队列
-	downloader                    *downloader.Downloader                                   // 下载者线程
+	Downloader                    *downloader.Downloader                                   // 下载者线程
 	videoScanAndRefreshHelper     *video_scan_and_refresh_helper.VideoScanAndRefreshHelper // 视频扫描和刷新的帮助类
 	cronLock                      sync.Mutex                                               // 锁
 	c                             *cron.Cron                                               // 定时器实例
@@ -30,10 +30,6 @@ type CronHelper struct {
 	entryIDSupplierCheck          cron.EntryID
 	entryIDQueueDownloader        cron.EntryID
 	entryIDScanPlayedVideoSubInfo cron.EntryID
-
-	cacheLocker   sync.Mutex
-	movieInfoMap  map[string]MovieInfo  // 给 Web 界面使用的,Key: VideoFPath
-	seasonInfoMap map[string]SeasonInfo // 给 Web 界面使用的,Key: RootDirPath
 }
 
 func NewCronHelper(fileDownloader *file_downloader.FileDownloader) *CronHelper {
@@ -44,9 +40,6 @@ func NewCronHelper(fileDownloader *file_downloader.FileDownloader) *CronHelper {
 		Settings:       fileDownloader.Settings,
 		// 实例化下载队列
 		DownloadQueue: task_queue.NewTaskQueue(fileDownloader.CacheCenter),
-
-		movieInfoMap:  make(map[string]MovieInfo),
-		seasonInfoMap: make(map[string]SeasonInfo),
 	}
 
 	var err error
@@ -64,15 +57,10 @@ func NewCronHelper(fileDownloader *file_downloader.FileDownloader) *CronHelper {
 
 	// ----------------------------------------------
 	// 初始化下载者,里面的两个 func 需要使用定时器启动 SupplierCheck QueueDownloader
-	ch.downloader = downloader.NewDownloader(
+	ch.Downloader = downloader.NewDownloader(
 		sub_formatter.GetSubFormatter(ch.log, ch.Settings.AdvancedSettings.SubNameFormatter),
 		ch.FileDownloader, ch.DownloadQueue)
 
-	err = ch.loadVideoListCache()
-	if err != nil {
-		fileDownloader.Log.Errorln("loadVideoListCache error:", err)
-	}
-
 	return &ch
 }
 
@@ -113,13 +101,13 @@ func (ch *CronHelper) Start(runImmediately bool) {
 	if err != nil {
 		ch.log.Panicln("CronHelper scanVideoProcessAdd2DownloadQueue, Cron entryID:", ch.entryIDScanVideoProcess, "Error:", err)
 	}
-	// 这个可以由 ch.downloader.Cancel() 取消执行
-	ch.entryIDSupplierCheck, err = ch.c.AddFunc("@every 1h", ch.downloader.SupplierCheck)
+	// 这个可以由 ch.Downloader.Cancel() 取消执行
+	ch.entryIDSupplierCheck, err = ch.c.AddFunc("@every 1h", ch.Downloader.SupplierCheck)
 	if err != nil {
 		ch.log.Panicln("CronHelper SupplierCheck, Cron entryID:", ch.entryIDSupplierCheck, "Error:", err)
 	}
-	// 这个可以由 ch.downloader.Cancel() 取消执行
-	ch.entryIDQueueDownloader, err = ch.c.AddFunc("@every 15s", ch.downloader.QueueDownloader)
+	// 这个可以由 ch.Downloader.Cancel() 取消执行
+	ch.entryIDQueueDownloader, err = ch.c.AddFunc("@every 15s", ch.Downloader.QueueDownloader)
 	if err != nil {
 		ch.log.Panicln("CronHelper QueueDownloader, Cron entryID:", ch.entryIDQueueDownloader, "Error:", err)
 	}
@@ -133,7 +121,7 @@ func (ch *CronHelper) Start(runImmediately bool) {
 	ch.cronLock.Lock()
 	if ch.cronHelperRunning == true && ch.stopping == false {
 		ch.cronLock.Unlock()
-		ch.downloader.SupplierCheck()
+		ch.Downloader.SupplierCheck()
 	} else {
 		ch.cronLock.Unlock()
 	}
@@ -205,7 +193,7 @@ func (ch *CronHelper) Stop() {
 	ch.cronLock.Unlock()
 
 	ch.videoScanAndRefreshHelper.Cancel()
-	ch.downloader.Cancel()
+	ch.Downloader.Cancel()
 	ch.scanPlayedVideoSubInfo.Cancel()
 	// Stop stops the cron scheduler if it is running; otherwise it does nothing.
 	// A context is returned so the caller can wait for running jobs to complete.

+ 20 - 20
internal/logic/cron_helper/cache_info.go → internal/pkg/downloader/cache_info.go

@@ -1,4 +1,4 @@
-package cron_helper
+package downloader
 
 import (
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/my_folder"
@@ -8,21 +8,21 @@ import (
 	"path/filepath"
 )
 
-func (ch *CronHelper) SetMovieAndSeasonInfo(movieInfos []backend.MovieInfo, seasonInfos []backend.SeasonInfo) {
-	ch.cacheLocker.Lock()
-	defer ch.cacheLocker.Unlock()
+func (d *Downloader) SetMovieAndSeasonInfo(movieInfos []backend.MovieInfo, seasonInfos []backend.SeasonInfo) {
+	d.cacheLocker.Lock()
+	defer d.cacheLocker.Unlock()
 
-	ch.setMovieAndSeasonInfo(movieInfos, seasonInfos)
+	d.setMovieAndSeasonInfo(movieInfos, seasonInfos)
 }
 
-func (ch *CronHelper) GetMovieInfoAndSeasonInfo() ([]backend.MovieInfo, []backend.SeasonInfo) {
+func (d *Downloader) GetMovieInfoAndSeasonInfo() ([]backend.MovieInfo, []backend.SeasonInfo) {
 	// 需要把本实例中的缓存 map 转换到 Web 传递的结构体中
-	ch.cacheLocker.Lock()
-	defer ch.cacheLocker.Unlock()
+	d.cacheLocker.Lock()
+	defer d.cacheLocker.Unlock()
 
 	outMovieInfos := make([]backend.MovieInfo, 0)
 	outSeasonInfo := make([]backend.SeasonInfo, 0)
-	for _, movieInfo := range ch.movieInfoMap {
+	for _, movieInfo := range d.movieInfoMap {
 
 		nowMovieInfo := backend.MovieInfo{
 			Name:                     movieInfo.Name,
@@ -36,7 +36,7 @@ func (ch *CronHelper) GetMovieInfoAndSeasonInfo() ([]backend.MovieInfo, []backen
 		outMovieInfos = append(outMovieInfos, nowMovieInfo)
 	}
 
-	for _, seasonInfo := range ch.seasonInfoMap {
+	for _, seasonInfo := range d.seasonInfoMap {
 
 		nowSeasonInfo := backend.SeasonInfo{
 			Name:          seasonInfo.Name,
@@ -67,12 +67,12 @@ func (ch *CronHelper) GetMovieInfoAndSeasonInfo() ([]backend.MovieInfo, []backen
 	return outMovieInfos, outSeasonInfo
 }
 
-func (ch *CronHelper) setMovieAndSeasonInfo(movieInfos []backend.MovieInfo, seasonInfos []backend.SeasonInfo, skip ...bool) {
+func (d *Downloader) setMovieAndSeasonInfo(movieInfos []backend.MovieInfo, seasonInfos []backend.SeasonInfo, skip ...bool) {
 	// 需要把 Web 传递的结构体 转换到 本实例中的缓存 map
 
 	// 清空
-	ch.movieInfoMap = make(map[string]MovieInfo)
-	ch.seasonInfoMap = make(map[string]SeasonInfo)
+	d.movieInfoMap = make(map[string]MovieInfo)
+	d.seasonInfoMap = make(map[string]SeasonInfo)
 
 	for _, movieInfo := range movieInfos {
 
@@ -85,7 +85,7 @@ func (ch *CronHelper) setMovieAndSeasonInfo(movieInfos []backend.MovieInfo, seas
 			SubFPathList:             make([]string, 0),
 		}
 		nowMovieInfo.SubFPathList = append(nowMovieInfo.SubFPathList, movieInfo.SubFPathList...)
-		ch.movieInfoMap[movieInfo.VideoFPath] = nowMovieInfo
+		d.movieInfoMap[movieInfo.VideoFPath] = nowMovieInfo
 	}
 
 	for _, seasonInfo := range seasonInfos {
@@ -113,21 +113,21 @@ func (ch *CronHelper) setMovieAndSeasonInfo(movieInfos []backend.MovieInfo, seas
 			nowSeasonInfo.OneVideoInfoMap[oneVideoInfo.VideoFPath] = nowOneVideoInfo
 		}
 
-		ch.seasonInfoMap[seasonInfo.RootDirPath] = nowSeasonInfo
+		d.seasonInfoMap[seasonInfo.RootDirPath] = nowSeasonInfo
 	}
 
 	if len(skip) > 0 && skip[0] == true {
 
 	} else {
-		err := ch.saveVideoListCache(movieInfos, seasonInfos)
+		err := d.saveVideoListCache(movieInfos, seasonInfos)
 		if err != nil {
-			ch.log.Errorln("saveVideoListCache err:", err)
+			d.log.Errorln("saveVideoListCache err:", err)
 			return
 		}
 	}
 }
 
-func (ch *CronHelper) saveVideoListCache(movieInfos []backend.MovieInfo, seasonInfos []backend.SeasonInfo) error {
+func (d *Downloader) saveVideoListCache(movieInfos []backend.MovieInfo, seasonInfos []backend.SeasonInfo) error {
 
 	// 缓存下来
 	cacheCenterFolder, err := my_folder.GetRootCacheCenterFolder()
@@ -151,7 +151,7 @@ func (ch *CronHelper) saveVideoListCache(movieInfos []backend.MovieInfo, seasonI
 	return nil
 }
 
-func (ch *CronHelper) loadVideoListCache() error {
+func (d *Downloader) loadVideoListCache() error {
 
 	// 缓存下来
 	cacheCenterFolder, err := my_folder.GetRootCacheCenterFolder()
@@ -179,7 +179,7 @@ func (ch *CronHelper) loadVideoListCache() error {
 		}
 	}
 
-	ch.setMovieAndSeasonInfo(movieInfos, seasonInfos, true)
+	d.setMovieAndSeasonInfo(movieInfos, seasonInfos, true)
 
 	return nil
 }

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

@@ -42,6 +42,10 @@ type Downloader struct {
 	downloaderLock           sync.Mutex                                   // 取消执行 task control 的 Lock
 	downloadQueue            *task_queue.TaskQueue                        // 需要下载的视频的队列
 	embyHelper               *embyHelper.EmbyHelper                       // Emby 的实例
+
+	cacheLocker   sync.Mutex
+	movieInfoMap  map[string]MovieInfo  // 给 Web 界面使用的,Key: VideoFPath
+	seasonInfoMap map[string]SeasonInfo // 给 Web 界面使用的,Key: RootDirPath
 }
 
 func NewDownloader(inSubFormatter ifaces.ISubFormatter, fileDownloader *file_downloader.FileDownloader, downloadQueue *task_queue.TaskQueue) *Downloader {
@@ -81,6 +85,14 @@ func NewDownloader(inSubFormatter ifaces.ISubFormatter, fileDownloader *file_dow
 		downloader.embyHelper = embyHelper.NewEmbyHelper(downloader.log, downloader.settings)
 	}
 
+	downloader.movieInfoMap = make(map[string]MovieInfo)
+	downloader.seasonInfoMap = make(map[string]SeasonInfo)
+
+	err := downloader.loadVideoListCache()
+	if err != nil {
+		downloader.log.Errorln("loadVideoListCache error:", err)
+	}
+
 	return &downloader
 }