فهرست منبع

调整从具体一个 eps 的全路径解析出对应的 season 和 eps 信息的逻辑,优先从 nfo 解析,然后才是文件名

Signed-off-by: allan716 <[email protected]>
allan716 2 سال پیش
والد
کامیت
94e28688e2

+ 1 - 11
internal/backend/controllers/v1/video_list_v2.go

@@ -3,11 +3,8 @@ package v1
 import (
 	"fmt"
 	"net/http"
-	"path/filepath"
 	"time"
 
-	PTN "github.com/middelink/go-parse-torrent-name"
-
 	"github.com/ChineseSubFinder/ChineseSubFinder/internal/models"
 
 	"github.com/ChineseSubFinder/ChineseSubFinder/pkg/search"
@@ -297,14 +294,7 @@ func (cb *ControllerBase) ScanSkipInfo(c *gin.Context) {
 					skipInfo = models.NewSkipScanInfoByMovie(videoSkipInfo.PhysicalVideoFileFullPath, videoSkipInfo.IsSkip)
 				} else {
 					// 电视剧
-					var parse *PTN.TorrentInfo
-					parse, err = PTN.Parse(videoSkipInfo.PhysicalVideoFileFullPath)
-					if err != nil {
-						cb.log.Errorln("SetScanSkipInfo.PTN.Parse", err)
-						return
-					}
-					dirFPath := filepath.Dir(filepath.Dir(videoSkipInfo.PhysicalVideoFileFullPath))
-					skipInfo = models.NewSkipScanInfoBySeries(dirFPath, parse.Season, parse.Episode, videoSkipInfo.IsSkip)
+					skipInfo = models.NewSkipScanInfoBySeriesEx(videoSkipInfo.PhysicalVideoFileFullPath, videoSkipInfo.IsSkip)
 				}
 
 				cb.cronHelper.Downloader.ScanLogic.Set(skipInfo)

+ 46 - 2
internal/models/skip_scan_info.go

@@ -3,6 +3,9 @@ package models
 import (
 	"crypto/sha256"
 	"fmt"
+	"github.com/ChineseSubFinder/ChineseSubFinder/pkg/decode"
+	"github.com/WQGroup/logger"
+	PTN "github.com/middelink/go-parse-torrent-name"
 	"path/filepath"
 )
 
@@ -13,8 +16,18 @@ type SkipScanInfo struct {
 		2. 连续剧,由连续剧的文件夹路径计算 sha256 得到,只能具体到一集(S01E01 这里是拼接出来的不是真正的文件名)
 			X:\连续剧\绝命毒师S01E01
 	*/
-	UID  string `gorm:"type:varchar(64);primarykey"`
-	Skip bool   `gorm:"type:bool;default:false"`
+	UID    string `gorm:"type:varchar(64);primarykey"`
+	Skip   bool   `gorm:"type:bool;default:false"`
+	season int    `gorm:"-"`
+	eps    int    `gorm:"-"`
+}
+
+func (s *SkipScanInfo) Season() int {
+	return s.season
+}
+
+func (s *SkipScanInfo) Eps() int {
+	return s.eps
 }
 
 func NewSkipScanInfoByUID(uid string, skip bool) *SkipScanInfo {
@@ -53,6 +66,37 @@ func NewSkipScanInfoBySeries(seriesDirFPath string, season, eps int, skip bool)
 	var skipScanInfo SkipScanInfo
 	skipScanInfo.UID = GenerateUID4Series(seriesDirFPath, season, eps)
 	skipScanInfo.Skip = skip
+	skipScanInfo.season = season
+	skipScanInfo.eps = eps
+
+	return &skipScanInfo
+}
+
+func NewSkipScanInfoBySeriesEx(oneEpsFPath string, skip bool) *SkipScanInfo {
+
+	seriesDirFPath := filepath.Dir(filepath.Dir(oneEpsFPath))
+	var season, eps int
+	oneSeriesEpisode, err := decode.GetVideoNfoInfo4OneSeriesEpisode(oneEpsFPath)
+	if err != nil {
+		// 换一种方式获取 Season 和 Eps 信息
+		var parse *PTN.TorrentInfo
+		parse, err = PTN.Parse(oneEpsFPath)
+		if err != nil {
+			season = -1
+			eps = -1
+			logger.GetLogger().Errorln("NewSkipScanInfoBySeriesEx Parse Error: ", err)
+		}
+		season = parse.Season
+		eps = parse.Episode
+	} else {
+		season = oneSeriesEpisode.Season
+		eps = oneSeriesEpisode.Episode
+	}
+	var skipScanInfo SkipScanInfo
+	skipScanInfo.UID = GenerateUID4Series(seriesDirFPath, season, eps)
+	skipScanInfo.Skip = skip
+	skipScanInfo.season = season
+	skipScanInfo.eps = eps
 
 	return &skipScanInfo
 }

+ 1 - 11
pkg/manual_upload_sub_2_local/processor.go

@@ -1,13 +1,10 @@
 package manual_upload_sub_2_local
 
 import (
-	"path/filepath"
 	"sync"
 
 	"github.com/ChineseSubFinder/ChineseSubFinder/internal/models"
 	"github.com/ChineseSubFinder/ChineseSubFinder/pkg/scan_logic"
-	PTN "github.com/middelink/go-parse-torrent-name"
-
 	"github.com/pkg/errors"
 
 	"github.com/ChineseSubFinder/ChineseSubFinder/pkg/save_sub_helper"
@@ -220,14 +217,7 @@ func (m *ManualUploadSub2Local) processSub(job *Job) error {
 			return err
 		}
 		// 默认设置这个视频“跳过”(跳过扫描和下载字幕)属性
-		var parse *PTN.TorrentInfo
-		parse, err = PTN.Parse(job.VideoFPath)
-		if err != nil {
-			err = errors.New("processSub.PTN.Parse:" + err.Error())
-			return err
-		}
-		dirFPath := filepath.Dir(filepath.Dir(job.VideoFPath))
-		skipInfo = models.NewSkipScanInfoBySeries(dirFPath, parse.Season, parse.Episode, true)
+		skipInfo = models.NewSkipScanInfoBySeriesEx(job.VideoFPath, true)
 	}
 
 	m.scanLogic.Set(skipInfo)

+ 2 - 10
pkg/scan_logic/scan_logic.go

@@ -1,10 +1,8 @@
 package scan_logic
 
 import (
-	"path/filepath"
 	"sync"
 
-	PTN "github.com/middelink/go-parse-torrent-name"
 	"github.com/sirupsen/logrus"
 
 	"github.com/ChineseSubFinder/ChineseSubFinder/internal/dao"
@@ -47,14 +45,8 @@ func (s *ScanLogic) Get(videoType int, videoPath string) bool {
 		uid = models.GenerateUID4Movie(videoPath)
 	} else {
 		// 电视剧
-		var parse *PTN.TorrentInfo
-		parse, err := PTN.Parse(videoPath)
-		if err != nil {
-			s.l.Errorln("scan_logic.Get.PTN.Parse", err)
-			return true
-		}
-		dirFPath := filepath.Dir(filepath.Dir(videoPath))
-		uid = models.GenerateUID4Series(dirFPath, parse.Season, parse.Episode)
+		skipInfo := models.NewSkipScanInfoBySeriesEx(videoPath, true)
+		uid = skipInfo.UID
 	}
 
 	value, found := s.scanLogicMap.Load(uid)

+ 10 - 7
pkg/search/search.go

@@ -1,6 +1,7 @@
 package search
 
 import (
+	"github.com/ChineseSubFinder/ChineseSubFinder/internal/models"
 	"io/fs"
 	"os"
 	"path/filepath"
@@ -11,8 +12,6 @@ import (
 
 	"github.com/ChineseSubFinder/ChineseSubFinder/pkg/types/backend"
 
-	PTN "github.com/middelink/go-parse-torrent-name"
-
 	"github.com/ChineseSubFinder/ChineseSubFinder/pkg/sub_parser_hub"
 
 	"github.com/ChineseSubFinder/ChineseSubFinder/pkg/decode"
@@ -219,16 +218,20 @@ func SeriesAllEpsAndSubtitles(l *logrus.Logger, dir string) (*backend.SeasonInfo
 		for _, oneVideo := range videos {
 
 			videoName := strings.ReplaceAll(filepath.Base(oneVideo), filepath.Ext(oneVideo), "")
-			parse, err := PTN.Parse(oneVideo)
-			if err != nil {
-				l.Errorln("SeriesAllEpsAndSubtitles.PTN.Parse", err)
+
+			skipInfo := models.NewSkipScanInfoBySeriesEx(oneVideo, true)
+
+			if skipInfo.Season() == -1 || skipInfo.Eps() == -1 {
+				// 无法解析的视频,跳过
+				l.Errorln("SeriesAllEpsAndSubtitles, Skip UnParse Video:", oneVideo)
 				continue
 			}
+
 			nowOneVideoInfo := backend.OneVideoInfo{
 				Name:         filepath.Base(oneVideo),
 				VideoFPath:   oneVideo,
-				Season:       parse.Season,
-				Episode:      parse.Episode,
+				Season:       skipInfo.Season(),
+				Episode:      skipInfo.Eps(),
 				SubFPathList: make([]string, 0),
 				SubUrlList:   make([]string, 0),
 			}