Browse Source

普通扫描的时候,电影以 ModTime 来递减排序输出

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

+ 5 - 1
internal/logic/task_queue/task_queue.go

@@ -258,6 +258,9 @@ func (t *TaskQueue) GetOneWaitingJob() (bool, task_queue.OneJob, error) {
 			// 默认是 12h, A.After(B) : A > B == true
 			// 见《任务队列设计》--以优先级顺序取出描述
 			if tOneJob.JobStatus == task_queue.Waiting && (tOneJob.DownloadTimes == 0 ||
+				// 优先级 <= 3 也可以提前取出
+				TaskPriority <= HightTaskPriorityLevel ||
+				// 默认是 12h, A.After(B) : A > B == true
 				tOneJob.UpdateTime.AddDate(0, 0, t.settings.AdvancedSettings.TaskQueue.OneSubDownloadInterval).After(time.Now()) == false && tOneJob.DownloadTimes > 0) {
 				// 找到就返回
 				found = true
@@ -296,7 +299,7 @@ func (t *TaskQueue) GetOneDoneJob() (bool, task_queue.OneJob, error) {
 			// 见《任务队列设计》--以优先级顺序取出描述
 			if tOneJob.JobStatus == task_queue.Done &&
 				// 要在 三个月内
-				tOneJob.CreateTime.AddDate(0, 0, t.settings.AdvancedSettings.TaskQueue.ExpirationTime).After(time.Now()) == true &&
+				tOneJob.CreatedTime.AddDate(0, 0, t.settings.AdvancedSettings.TaskQueue.ExpirationTime).After(time.Now()) == true &&
 				// 已经下载过的视频,要间隔 12 小时再次下载
 				tOneJob.UpdateTime.AddDate(0, 0, t.settings.AdvancedSettings.TaskQueue.OneSubDownloadInterval).After(time.Now()) == false {
 				// 找到就返回
@@ -485,6 +488,7 @@ func (t *TaskQueue) isEmpty() bool {
 
 const (
 	taskPriorityCount           = 10
+	HightTaskPriorityLevel      = 3
 	DefaultTaskPriorityLevel    = 5
 	FirstRetryTaskPriorityLevel = 6
 )

+ 56 - 0
internal/pkg/my_util/util.go

@@ -30,6 +30,7 @@ import (
 	"path/filepath"
 	"regexp"
 	"runtime"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -310,6 +311,7 @@ func SearchMatchedVideoFile(l *logrus.Logger, dir string) ([]string, error) {
 					l.Debugln("SearchMatchedVideoFile, file.Info:", fullPath, err)
 					continue
 				}
+
 				if fi.Size() == 4096 && strings.HasPrefix(curFile.Name(), "._") == true {
 					l.Debugln("SearchMatchedVideoFile file.Size() == 4096 && Prefix Name == ._*", fullPath)
 					continue
@@ -321,6 +323,60 @@ func SearchMatchedVideoFile(l *logrus.Logger, dir string) ([]string, error) {
 	return fileFullPathList, nil
 }
 
+func GetFileModTime(fileFPath string) time.Time {
+
+	if IsFile(fileFPath) == true {
+		// 存在
+		fi, err := os.Stat(fileFPath)
+		if err != nil {
+			return time.Time{}
+		}
+
+		return fi.ModTime()
+	} else {
+		// 不存在才需要考虑蓝光情况
+		bok, idBDMVFPath, _ := decode.IsFakeBDMVWorked(fileFPath)
+		if bok == false {
+			// 也不是蓝光
+			return time.Time{}
+		}
+		// 获取这个蓝光 ID BDMV 文件的时间
+		fInfo, err := os.Stat(idBDMVFPath)
+		if err != nil {
+			return time.Time{}
+		}
+		return fInfo.ModTime()
+	}
+}
+
+// SortByModTime 根据文件的 Mod Time 进行排序,递减
+func SortByModTime(fileList []string) []string {
+
+	byModTime := make(ByModTime, 0)
+	byModTime = append(byModTime, fileList...)
+	sort.Sort(sort.Reverse(byModTime))
+
+	return byModTime
+}
+
+type ByModTime []string
+
+func (fis ByModTime) Len() int {
+	return len(fis)
+}
+
+func (fis ByModTime) Swap(i, j int) {
+	fis[i], fis[j] = fis[j], fis[i]
+}
+
+func (fis ByModTime) Less(i, j int) bool {
+
+	aModTime := GetFileModTime(fis[i])
+	bModTime := GetFileModTime(fis[j])
+
+	return aModTime.Before(bModTime)
+}
+
 // FileNameIsBDMV 是否是 BDMV 蓝光目录,符合返回 true,以及 fakseVideoFPath
 func FileNameIsBDMV(id_bdmv_fileFPath string) (bool, string) {
 	/*

+ 27 - 0
internal/pkg/my_util/util_test.go

@@ -41,3 +41,30 @@ func TestGetPublicIP(t *testing.T) {
 			true, "127.0.0.1:10808"))
 	println("UseProxy", got)
 }
+
+func TestSortByModTime(t *testing.T) {
+	//type args struct {
+	//	fileList []string
+	//}
+	//tests := []struct {
+	//	name string
+	//	args args
+	//	want []string
+	//}{
+	//	{name: "001", args: args{fileList: []string{
+	//		"X:\\电影\\21座桥 (2019)\\21座桥 (2019) 720p AAC.mp4",
+	//		"X:\\电影\\Texas Chainsaw Massacre (2022)\\Texas Chainsaw Massacre (2022) WEBDL-1080p.mkv",
+	//		"X:\\电影\\76 Days (2020)\\76 Days (2020) WEBDL-1080p.mkv"}},
+	//		want: []string{
+	//			"a",
+	//			"b",
+	//			"c"}},
+	//}
+	//for _, tt := range tests {
+	//	t.Run(tt.name, func(t *testing.T) {
+	//		if got := SortByModTime(tt.args.fileList); !reflect.DeepEqual(got, tt.want) {
+	//			t.Errorf("SortByModTime() = %v, want %v", got, tt.want)
+	//		}
+	//	})
+	//}
+}

+ 1 - 0
internal/pkg/settings/emby_settings.go

@@ -12,6 +12,7 @@ type EmbySettings struct {
 	SkipWatched           bool              `json:"skip_watched"`             // 是否跳过已经观看的
 	MoviePathsMapping     map[string]string `json:"movie_paths_mapping"`      // 电影目录的映射,一旦 common setting 的目录修改,需要提示用户确认映射
 	SeriesPathsMapping    map[string]string `json:"series_paths_mapping"`     // 连续剧目录的映射,一旦 common setting 的目录修改,需要提示用户确认映射
+	AutoOrManual          bool              `json:"auto_or_manual"`           // 自动或手动模式,自动 IMDB ID 匹配,还是使用手动目录
 }
 
 func NewEmbySettings() *EmbySettings {

+ 1 - 1
internal/pkg/settings/task_queue.go

@@ -4,7 +4,7 @@ type TaskQueue struct {
 	MaxRetryTimes           int    `json:"max_retry_times" default:"3"`            // 单个任务失败后,最大重试次数,超过后会降一级
 	OneJobTimeOut           int    `json:"one_job_time_out" default:"300"`         // 单个任务的超时时间 5 * 60 s
 	Interval                int    `json:"interval" default:"10"`                  // 任务的间隔,单位 s,这里会有一个限制,不允许太快,然后会做一定的随机时间范围,当前值 x ~ 2*x 之内随机
-	ExpirationTime          int    `json:"expiration_time"  default:"90"`          // 单位天。1. 一个视频的 CreateTime 在这个时间范围内,都会被下载字幕(除非已经观看跳过启用了)。2. 如果下载失败的任务,AddTime 超过了这个时间,那么就标记为 Failed
+	ExpirationTime          int    `json:"expiration_time"  default:"90"`          // 单位天。1. 一个视频的 CreatedTime 在这个时间范围内,都会被下载字幕(除非已经观看跳过启用了)。2. 如果下载失败的任务,AddTime 超过了这个时间,那么就标记为 Failed
 	DownloadSubDuringXDays  int    `json:"download_sub_during_x_days" default:"7"` // 如果创建了 x 天,且有内置的中文字幕,那么也不进行下载了
 	OneSubDownloadInterval  int    `json:"one_sub_download_interval" default:"12"` // 一个字幕下载的间隔(单位 h),不然老是一个循环。对比的基准是 OneJob 的 UpdateTime
 	CheckPublicIPTargetSite string `json:"check_pulic_ip_target_site" default:""`  // 检测本机外网 IP 的目标地址,必须是返回直接的 IP 字符串,不需要解析。; 分割

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

@@ -91,6 +91,9 @@ func (v *VideoScanAndRefreshHelper) ScanMovieAndSeriesWait2DownloadSub() (*ScanV
 	if err != nil {
 		return nil, err
 	}
+	// 排序,从最新的到最早的
+	my_util.SortByModTime(normalScanResult.MovieFileFullPathList)
+
 	// --------------------------------------------------
 	// 连续剧
 	// 遍历连续剧总目录下的第一层目录

+ 3 - 3
internal/types/task_queue/task_queue.go

@@ -23,7 +23,7 @@ type OneJob struct {
 	JobStatus                JobStatus        `json:"job_status"`                   // 任务的状态
 	TaskPriority             int              `json:"task_priority" default:"5"`    // 任务的优先级,0 - 10 个级别,0 是最高,10 是最低
 	RetryTimes               int              `json:"retry_times"`                  // 重试了多少次
-	CreateTime               time.Time        `json:"create_time"`                  // 视频的发布时间或者是文件的创建时间
+	CreatedTime              time.Time        `json:"created_time"`                 // 视频的发布时间或者是文件的创建时间
 	AddedTime                time.Time        `json:"added_time"`                   // 任务添加的时间
 	UpdateTime               time.Time        `json:"update_time"`                  // 任务更新的时间
 	MediaServerInsideVideoID string           `json:"media_server_inside_video_id"` // 媒体服务器中,这个视频的 ID,如果是 Emby 就对应它内部这个视频的 ID,后续用于指定刷新视频信息
@@ -64,12 +64,12 @@ func NewOneJob(videoType common.VideoType, videoFPath string, taskPriority int,
 
 		imdbInfo4Movie, err := decode.GetImdbInfo4Movie(videoFPath)
 		if err == nil {
-			ob.CreateTime, err = dateparse.ParseAny(imdbInfo4Movie.ReleaseDate)
+			ob.CreatedTime, err = dateparse.ParseAny(imdbInfo4Movie.ReleaseDate)
 		}
 	} else if ob.VideoType == common.Series {
 		imdbInfo4Eps, err := decode.GetImdbInfo4OneSeriesEpisode(videoFPath)
 		if err == nil {
-			ob.CreateTime, err = dateparse.ParseAny(imdbInfo4Eps.ReleaseDate)
+			ob.CreatedTime, err = dateparse.ParseAny(imdbInfo4Eps.ReleaseDate)
 		}
 	}