Преглед изворни кода

扫描视频的时候,需要考虑 Emby 已经考过的视频的任务,标记为 Ignore

Signed-off-by: allan716 <[email protected]>
allan716 пре 3 година
родитељ
комит
89efba00e6

+ 30 - 0
internal/logic/emby_helper/embyhelper.go

@@ -168,6 +168,36 @@ func (em *EmbyHelper) GetRecentlyAddVideoList() ([]emby.EmbyMixInfo, []emby.Emby
 	return filterMovieList, filterSeriesList, nil
 	return filterMovieList, filterSeriesList, nil
 }
 }
 
 
+// GetVideoIDPlayedMap 获取已经播放过的视频的ID
+func (em *EmbyHelper) GetVideoIDPlayedMap() map[string]bool {
+
+	videoIDPlayedMap := make(map[string]bool)
+	// 获取有那些用户
+	var userIds emby.EmbyUsers
+	userIds, err := em.embyApi.GetUserIdList()
+	if err != nil {
+		em.log.Errorln("IsVideoIDPlayed - GetUserIdList error:", err)
+		return videoIDPlayedMap
+	}
+	// 所有用户观看过的视频有那些
+	for _, item := range userIds.Items {
+		tmpRecItems, err := em.embyApi.GetRecentItemsByUserID(item.Id)
+		if err != nil {
+			em.log.Errorln("IsVideoIDPlayed - GetRecentItemsByUserID, UserID:", item.Id, "error:", err)
+			return videoIDPlayedMap
+		}
+		// 相同的视频项目,需要判断是否已经看过了
+		// 项目是否相同可以通过 Id 判断
+		for _, recentlyItem := range tmpRecItems.Items {
+			if recentlyItem.UserData.Played == true {
+				videoIDPlayedMap[recentlyItem.Id] = true
+			}
+		}
+	}
+
+	return videoIDPlayedMap
+}
+
 // GetPlayedItemsSubtitle 所有用户标记播放过的视频,返回 电影、连续剧, 视频全路径 -- 对应字幕全路径(经过转换的)
 // GetPlayedItemsSubtitle 所有用户标记播放过的视频,返回 电影、连续剧, 视频全路径 -- 对应字幕全路径(经过转换的)
 func (em *EmbyHelper) GetPlayedItemsSubtitle() (map[string]string, map[string]string, error) {
 func (em *EmbyHelper) GetPlayedItemsSubtitle() (map[string]string, map[string]string, error) {
 
 

+ 44 - 2
internal/pkg/video_scan_and_refresh_helper/video_scan_and_refresh_helper.go

@@ -256,6 +256,10 @@ func (v *VideoScanAndRefreshHelper) FilterMovieAndSeriesNeedDownload(scanVideoRe
 	}
 	}
 
 
 	if scanVideoResult.Emby != nil && v.settings.EmbySettings.Enable == true {
 	if scanVideoResult.Emby != nil && v.settings.EmbySettings.Enable == true {
+
+		// 先获取缓存的 Emby 视频信息,有那些已经在这次扫描的时候播放过了
+
+		// 然后才是过滤有哪些需要下载的
 		err := v.filterMovieAndSeriesNeedDownloadEmby(scanVideoResult.Emby)
 		err := v.filterMovieAndSeriesNeedDownloadEmby(scanVideoResult.Emby)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
@@ -931,6 +935,11 @@ func (v *VideoScanAndRefreshHelper) filterMovieAndSeriesNeedDownloadNormal(norma
 }
 }
 
 
 func (v *VideoScanAndRefreshHelper) filterMovieAndSeriesNeedDownloadEmby(emby *EmbyScanVideoResult) error {
 func (v *VideoScanAndRefreshHelper) filterMovieAndSeriesNeedDownloadEmby(emby *EmbyScanVideoResult) error {
+
+	playedVideoIdMap := make(map[string]bool)
+	if v.settings.EmbySettings.SkipWatched == true {
+		playedVideoIdMap = v.embyHelper.GetVideoIDPlayedMap()
+	}
 	// ----------------------------------------
 	// ----------------------------------------
 	// Emby 过滤,电影
 	// Emby 过滤,电影
 	for _, oneMovieMixInfo := range emby.MovieSubNeedDlEmbyMixInfoList {
 	for _, oneMovieMixInfo := range emby.MovieSubNeedDlEmbyMixInfoList {
@@ -938,16 +947,33 @@ func (v *VideoScanAndRefreshHelper) filterMovieAndSeriesNeedDownloadEmby(emby *E
 		if v.subSupplierHub.MovieNeedDlSub(oneMovieMixInfo.PhysicalVideoFileFullPath, v.NeedForcedScanAndDownSub) == false {
 		if v.subSupplierHub.MovieNeedDlSub(oneMovieMixInfo.PhysicalVideoFileFullPath, v.NeedForcedScanAndDownSub) == false {
 			continue
 			continue
 		}
 		}
-		bok, err := v.downloadQueue.Add(*TTaskqueue.NewOneJob(
+		nowOneJob := TTaskqueue.NewOneJob(
 			common.Movie, oneMovieMixInfo.PhysicalVideoFileFullPath, task_queue.DefaultTaskPriorityLevel,
 			common.Movie, oneMovieMixInfo.PhysicalVideoFileFullPath, task_queue.DefaultTaskPriorityLevel,
 			oneMovieMixInfo.VideoInfo.Id,
 			oneMovieMixInfo.VideoInfo.Id,
-		))
+		)
+		bok, err := v.downloadQueue.Add(*nowOneJob)
 		if err != nil {
 		if err != nil {
 			v.log.Errorln("filterMovieAndSeriesNeedDownloadEmby.Movie.NewOneJob", err)
 			v.log.Errorln("filterMovieAndSeriesNeedDownloadEmby.Movie.NewOneJob", err)
 			continue
 			continue
 		}
 		}
 		if bok == false {
 		if bok == false {
+
 			v.log.Warningln(common.Movie.String(), oneMovieMixInfo.PhysicalVideoFileFullPath, "downloadQueue isExisted")
 			v.log.Warningln(common.Movie.String(), oneMovieMixInfo.PhysicalVideoFileFullPath, "downloadQueue isExisted")
+			// 如果任务存在了,需要判断这个任务的视频已经被看过了,如果是,那么就需要标记 Skip
+			_, bok = playedVideoIdMap[oneMovieMixInfo.VideoInfo.Id]
+			if bok == true {
+				// 找到了,那么就是看过了
+				nowOneJob.JobStatus = TTaskqueue.Ignore
+				bok, err = v.downloadQueue.Update(*nowOneJob)
+				if err != nil {
+					v.log.Errorln("filterMovieAndSeriesNeedDownloadEmby.Movie.Update", err)
+					continue
+				}
+				if bok == false {
+					v.log.Warningln(common.Movie.String(), oneMovieMixInfo.PhysicalVideoFileFullPath, "downloadQueue isExisted")
+					continue
+				}
+			}
 		}
 		}
 	}
 	}
 	// Emby 过滤,连续剧
 	// Emby 过滤,连续剧
@@ -981,7 +1007,23 @@ func (v *VideoScanAndRefreshHelper) filterMovieAndSeriesNeedDownloadEmby(emby *E
 				continue
 				continue
 			}
 			}
 			if bok == false {
 			if bok == false {
+
 				v.log.Warningln(common.Series.String(), mixInfo.PhysicalVideoFileFullPath, "downloadQueue isExisted")
 				v.log.Warningln(common.Series.String(), mixInfo.PhysicalVideoFileFullPath, "downloadQueue isExisted")
+				// 如果任务存在了,需要判断这个任务的视频已经被看过了,如果是,那么就需要标记 Skip
+				_, bok = playedVideoIdMap[mixInfo.VideoInfo.Id]
+				if bok == true {
+					// 找到了,那么就是看过了
+					oneJob.JobStatus = TTaskqueue.Ignore
+					bok, err = v.downloadQueue.Update(*oneJob)
+					if err != nil {
+						v.log.Errorln("filterMovieAndSeriesNeedDownloadEmby.Series.Update", err)
+						continue
+					}
+					if bok == false {
+						v.log.Warningln(common.Series.String(), mixInfo.PhysicalVideoFileFullPath, "downloadQueue isExisted")
+						continue
+					}
+				}
 			}
 			}
 		}
 		}
 	}
 	}