Browse Source

对接 tmdb 转换 imdb 的接口

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

+ 1 - 0
pkg/downloader/download_processer.go

@@ -84,6 +84,7 @@ func (d *Downloader) seriesDlFunc(ctx context.Context, job taskQueue2.OneJob, do
 		d.settings.AdvancedSettings.TaskQueue.ExpirationTime,
 		false,
 		false,
+		d.settings.AdvancedSettings.ProxySettings,
 		epsMap)
 	if err != nil {
 		err = errors.New(fmt.Sprintf("seriesDlFunc.ReadSeriesInfoFromDir, Error: %v", err))

+ 125 - 69
pkg/imdb_helper/imdb.go

@@ -2,53 +2,70 @@ package imdb_helper
 
 import (
 	"errors"
-	"fmt"
+	"github.com/allanpk716/ChineseSubFinder/pkg/decode"
 	"strconv"
 	"strings"
+	"sync"
 
-	"github.com/allanpk716/ChineseSubFinder/pkg/types"
-	"github.com/allanpk716/ChineseSubFinder/pkg/types/common"
+	"github.com/allanpk716/ChineseSubFinder/pkg/subtitle_best_api"
+
+	"github.com/allanpk716/ChineseSubFinder/pkg/global_value"
+	"github.com/allanpk716/ChineseSubFinder/pkg/random_auth_key"
 
 	"github.com/StalkR/imdb"
 	"github.com/allanpk716/ChineseSubFinder/internal/dao"
 	"github.com/allanpk716/ChineseSubFinder/internal/models"
-	"github.com/allanpk716/ChineseSubFinder/pkg/decode"
 	"github.com/allanpk716/ChineseSubFinder/pkg/my_util"
 	"github.com/allanpk716/ChineseSubFinder/pkg/notify_center"
 	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
+	"github.com/allanpk716/ChineseSubFinder/pkg/types"
 	"github.com/sirupsen/logrus"
 )
 
-// GetVideoInfoFromIMDBWeb 从 IMDB 网站 ID 查询影片的信息
-func GetVideoInfoFromIMDBWeb(imdbInfo types.VideoNfoInfo, _proxySettings ...*settings.ProxySettings) (*imdb.Title, error) {
+// GetIMDBInfoFromVideoFile 先从本地拿缓存,如果没有就从 Web 获取
+func GetIMDBInfoFromVideoFile(log *logrus.Logger, videoFPath string, isMovie bool, _proxySettings *settings.ProxySettings) (*models.IMDBInfo, error) {
 
-	client, err := my_util.NewHttpClient(_proxySettings...)
+	getReady(log, _proxySettings)
+
+	var err error
+	var imdbInfo4Video types.VideoNfoInfo
+	if isMovie == true {
+		imdbInfo4Video, err = decode.GetVideoNfoInfo4Movie(videoFPath)
+	} else {
+		imdbInfo4Video, err = decode.GetSeriesSeasonVideoNfoInfoFromEpisode(videoFPath)
+	}
 	if err != nil {
+		// 如果找不到当前电影的 IMDB Info 本地文件,那么就跳过
+		log.Warningln("getSubListFromFile", videoFPath, err)
 		return nil, err
 	}
-
-	t, err := imdb.NewTitle(client.GetClient(), imdbInfo.ImdbId)
+	imdbInfo, err := GetIMDBInfoFromVideoNfoInfo(log, imdbInfo4Video, _proxySettings)
 	if err != nil {
-		notify_center.Notify.Add("imdb model - imdb.NewTitle :", err.Error())
+		log.Warningln("GetIMDBInfoFromVideoNfoInfo", videoFPath, err)
 		return nil, err
 	}
-	if t.Year == 0 {
-		// IMDB 信息获取的库(1.0.7),目前有bug,比如,tt6856242 年份为 0
-		if imdbInfo.Year != "" {
-			year, err := strconv.Atoi(imdbInfo.Year)
-			if err != nil {
-				return nil, err
-			}
-			t.Year = year
+	if len(imdbInfo.Description) <= 0 {
+		// 需要去外网获去补全信息,然后更新本地的信息
+		t, err := GetVideoInfoFromIMDBWeb(imdbInfo4Video, _proxySettings)
+		if err != nil {
+			log.Errorln("GetVideoInfoFromIMDBWeb,", imdbInfo4Video.Title, err)
+			return nil, err
 		}
+		imdbInfo.Year = t.Year
+		imdbInfo.AKA = t.AKA
+		imdbInfo.Description = t.Description
+		imdbInfo.Languages = t.Languages
+
+		dao.GetDb().Save(imdbInfo)
 	}
 
-	return t, nil
+	return imdbInfo, nil
 }
 
-// GetVideoIMDBInfoFromLocal 从本地获取 IMDB 信息,注意,如果需要跳过,那么返回 Error == common.SkipCreateInDB
-func GetVideoIMDBInfoFromLocal(log *logrus.Logger, imdbInfo types.VideoNfoInfo, skipCreate ...bool) (*models.IMDBInfo, error) {
+// GetIMDBInfoFromVideoNfoInfo 从本地获取 IMDB 信息,注意,如果需要跳过,那么返回 Error == common.SkipCreateInDB
+func GetIMDBInfoFromVideoNfoInfo(log *logrus.Logger, imdbInfo types.VideoNfoInfo, _proxySettings *settings.ProxySettings) (*models.IMDBInfo, error) {
 
+	getReady(log, _proxySettings)
 	/*
 		这里需要注意一个细节,之前理想情况下是从 Web 获取完整的 IMDB Info 回来,放入本地存储
 		获取的时候如果本地有就拿本地的,没有则从 Web 获取,然后写入本地存储
@@ -59,8 +76,8 @@ func GetVideoIMDBInfoFromLocal(log *logrus.Logger, imdbInfo types.VideoNfoInfo,
 		3. 因为现在默认是不跳过中文视频扫描的,所以如果开启后,则会再判断的时候访问外网获取,然后写入本地,过程会比较慢
 		4. 同时,再发送字幕和 IMDB Info 到服务器的时候,也需要判断是否 IMDB Info 信息是否齐全,否则就需要从外网获取齐全后再上传
 	*/
-	log.Debugln("GetVideoIMDBInfoFromLocal", "IMDBID:", imdbInfo.ImdbId, "TMDBID:", imdbInfo.TmdbId, imdbInfo.Title, imdbInfo.Season, imdbInfo.Episode)
-	log.Debugln("GetVideoIMDBInfoFromLocal", 0)
+	log.Debugln("GetIMDBInfoFromVideoNfoInfo", "IMDBID:", imdbInfo.ImdbId, "TMDBID:", imdbInfo.TmdbId, imdbInfo.Title, imdbInfo.Season, imdbInfo.Episode)
+	log.Debugln("GetIMDBInfoFromVideoNfoInfo", 0)
 
 	if imdbInfo.ImdbId != "" {
 		// 优先从 IMDB ID 去查找本地的信息
@@ -71,49 +88,107 @@ func GetVideoIMDBInfoFromLocal(log *logrus.Logger, imdbInfo types.VideoNfoInfo,
 			Preload("VideoSubInfos").
 			Limit(1).Where(&models.IMDBInfo{IMDBID: imdbInfo.ImdbId}).Find(&imdbInfos)
 
-		log.Debugln("GetVideoIMDBInfoFromLocal", 1)
+		log.Debugln("GetIMDBInfoFromVideoNfoInfo", 1)
 
 		if len(imdbInfos) <= 0 {
-
-			if len(skipCreate) > 0 && skipCreate[0] == true {
-				log.Debugln(fmt.Sprintf("skip insert, imdbInfo.ImdbId = %v", imdbInfo.ImdbId))
-				return nil, common.SkipCreateInDB
-			}
-
 			// 没有找到,新增,存储本地,但是信息肯定是不完整的,需要在判断是否是中文的时候再次去外网获取补全信息
-			log.Debugln("GetVideoIMDBInfoFromLocal", 2)
+			log.Debugln("GetIMDBInfoFromVideoNfoInfo", 2)
 			// 存入数据库
 			nowIMDBInfo := models.NewIMDBInfo(imdbInfo.ImdbId, "", 0, "", []string{}, []string{})
 			dao.GetDb().Create(nowIMDBInfo)
 
-			log.Debugln("GetVideoIMDBInfoFromLocal", 3)
+			log.Debugln("GetIMDBInfoFromVideoNfoInfo", 3)
 
 			return nowIMDBInfo, nil
 		} else {
 
-			log.Debugln("GetVideoIMDBInfoFromLocal", 4)
+			log.Debugln("GetIMDBInfoFromVideoNfoInfo", 4)
 			// 找到
 			return &imdbInfos[0], nil
 		}
 	} else if imdbInfo.TmdbId != "" {
 		// 如果 IMDB ID 在本地没有获取到,但是 TMDB ID 获取到了,那么就从 Web 去查询 IMDB ID 出来
+		var imdbInfos []models.IMDBInfo
+		// 把嵌套关联的 has many 的信息都查询出来
+		dao.GetDb().
+			Preload("VideoSubInfos").
+			Limit(1).Where(&models.IMDBInfo{TmdbId: imdbInfo.TmdbId}).Find(&imdbInfos)
+
+		log.Debugln("GetIMDBInfoFromVideoNfoInfo", 1)
+
+		if len(imdbInfos) <= 0 {
+			// 没有找到那么就从 Web 端获取 imdb id 信息
+		} else if len(imdbInfos) > 1 {
+			// 如果找到多个,那么就应该删除这些,因为这些都是重复的,然后再次从 Web 去获取 imdb id 信息
+			dao.GetDb().Where(&models.IMDBInfo{TmdbId: imdbInfo.TmdbId}).Delete(&models.IMDBInfo{})
+		} else {
+			log.Debugln("GetIMDBInfoFromVideoNfoInfo", 4)
+			// 找到
+			return &imdbInfos[0], nil
+		}
+		// 确定需要从 Web 端获取 imdb id 信息
+		log.Debugln("GetIMDBInfoFromVideoNfoInfo", 2)
+		videoType := ""
+		if imdbInfo.IsMovie == true {
+			videoType = "movie"
+		} else {
+			videoType = "series"
+		}
+		// 联网查询
+		idConvertReply, err := subtitleBestApi.ConvertId(imdbInfo.TmdbId, "tmdb", videoType)
+		if err != nil {
+			return nil, err
+		}
+		log.Debugln("GetIMDBInfoFromVideoNfoInfo", 3)
+		// 存入数据库
+		nowIMDBInfo := models.NewIMDBInfo(idConvertReply.IMDBId, "", 0, "", []string{}, []string{})
+		dao.GetDb().Create(nowIMDBInfo)
+		log.Debugln("GetIMDBInfoFromVideoNfoInfo", 4)
+		return nowIMDBInfo, nil
 
 	} else {
 		// 都没有,那么就报错
-		log.Debugln("GetVideoIMDBInfoFromLocal IMDB TMDB ID is empty")
+		log.Debugln("GetIMDBInfoFromVideoNfoInfo IMDB TMDB ID is empty")
 		return nil, errors.New("IMDB TMDB ID is empty")
 	}
 }
 
+// GetVideoInfoFromIMDBWeb 从 IMDB 网站 ID 查询影片的信息
+func GetVideoInfoFromIMDBWeb(imdbInfo types.VideoNfoInfo, _proxySettings ...*settings.ProxySettings) (*imdb.Title, error) {
+
+	client, err := my_util.NewHttpClient(_proxySettings...)
+	if err != nil {
+		return nil, err
+	}
+
+	t, err := imdb.NewTitle(client.GetClient(), imdbInfo.ImdbId)
+	if err != nil {
+		notify_center.Notify.Add("imdb model - imdb.NewTitle :", err.Error())
+		return nil, err
+	}
+	if t.Year == 0 {
+		// IMDB 信息获取的库(1.0.7),目前有bug,比如,tt6856242 年份为 0
+		if imdbInfo.Year != "" {
+			year, err := strconv.Atoi(imdbInfo.Year)
+			if err != nil {
+				return nil, err
+			}
+			t.Year = year
+		}
+	}
+
+	return t, nil
+}
+
 // IsChineseVideo 从 imdbID 去查询判断是否是中文视频
-func IsChineseVideo(log *logrus.Logger, imdbInfo types.VideoNfoInfo, _proxySettings ...*settings.ProxySettings) (bool, *models.IMDBInfo, error) {
+func IsChineseVideo(log *logrus.Logger, imdbInfo types.VideoNfoInfo, _proxySettings *settings.ProxySettings) (bool, *models.IMDBInfo, error) {
 
 	const chName0 = "chinese"
 	const chName1 = "mandarin"
 
 	log.Debugln("IsChineseVideo", 0)
 
-	localIMDBInfo, err := GetVideoIMDBInfoFromLocal(log, imdbInfo)
+	localIMDBInfo, err := GetIMDBInfoFromVideoNfoInfo(log, imdbInfo, _proxySettings)
 	if err != nil {
 		return false, nil, err
 	}
@@ -121,7 +196,7 @@ func IsChineseVideo(log *logrus.Logger, imdbInfo types.VideoNfoInfo, _proxySetti
 		// 需要去外网获去补全信息,然后更新本地的信息
 		log.Debugln("IsChineseVideo", 1)
 
-		t, err := GetVideoInfoFromIMDBWeb(imdbInfo, _proxySettings...)
+		t, err := GetVideoInfoFromIMDBWeb(imdbInfo, _proxySettings)
 		if err != nil {
 			log.Errorln("IsChineseVideo.getVideoInfoFromIMDBWeb,", imdbInfo.Title, err)
 			return false, nil, err
@@ -159,40 +234,21 @@ func IsChineseVideo(log *logrus.Logger, imdbInfo types.VideoNfoInfo, _proxySetti
 	}
 }
 
-// GetIMDBInfo 先从本地拿缓存,如果没有就从 Web 获取
-func GetIMDBInfo(log *logrus.Logger, videoFPath string, isMovie bool, _proxySettings ...*settings.ProxySettings) (*models.IMDBInfo, error) {
+func getReady(log *logrus.Logger, proxySettings *settings.ProxySettings) {
 
-	var err error
-	var imdbInfo4Video types.VideoNfoInfo
-	if isMovie == true {
-		imdbInfo4Video, err = decode.GetVideoNfoInfo4Movie(videoFPath)
-	} else {
-		imdbInfo4Video, err = decode.GetSeriesSeasonVideoNfoInfoFromEpisode(videoFPath)
-	}
-	if err != nil {
-		// 如果找不到当前电影的 IMDB Info 本地文件,那么就跳过
-		log.Warningln("getSubListFromFile", videoFPath, err)
-		return nil, err
-	}
-	imdbInfo, err := GetVideoIMDBInfoFromLocal(log, imdbInfo4Video)
-	if err != nil {
-		log.Warningln("GetVideoIMDBInfoFromLocal", videoFPath, err)
-		return nil, err
-	}
-	if len(imdbInfo.Description) <= 0 {
-		// 需要去外网获去补全信息,然后更新本地的信息
-		t, err := GetVideoInfoFromIMDBWeb(imdbInfo4Video, _proxySettings...)
-		if err != nil {
-			log.Errorln("GetVideoInfoFromIMDBWeb,", imdbInfo4Video.Title, err)
-			return nil, err
+	locker.Lock()
+	if randomAuthKey == nil {
+		randomAuthKey = &random_auth_key.AuthKey{
+			BaseKey:  global_value.BaseKey(),
+			AESKey16: global_value.AESKey16(),
+			AESIv16:  global_value.AESIv16(),
 		}
-		imdbInfo.Year = t.Year
-		imdbInfo.AKA = t.AKA
-		imdbInfo.Description = t.Description
-		imdbInfo.Languages = t.Languages
 
-		dao.GetDb().Save(imdbInfo)
+		subtitleBestApi = subtitle_best_api.NewSubtitleBestApi(log, *randomAuthKey, proxySettings)
 	}
-
-	return imdbInfo, nil
+	locker.Unlock()
 }
+
+var locker sync.Mutex
+var randomAuthKey *random_auth_key.AuthKey
+var subtitleBestApi *subtitle_best_api.SubtitleBestApi

+ 3 - 9
pkg/logic/emby_helper/embyhelper.go

@@ -1,7 +1,6 @@
 package emby_helper
 
 import (
-	"errors"
 	"fmt"
 	"path"
 	"path/filepath"
@@ -492,21 +491,16 @@ func (em *EmbyHelper) autoFindMappingPathWithMixInfoByIMDBId(mixInfo *emby2.Emby
 	}
 
 	// 获取 IMDB 信息
-	localIMDBInfo, err := imdb_helper.GetVideoIMDBInfoFromLocal(
+	localIMDBInfo, err := imdb_helper.GetIMDBInfoFromVideoNfoInfo(
 		em.log,
 		types.VideoNfoInfo{
 			ImdbId: mixInfo.IMDBId,
 			TmdbId: mixInfo.TMDBId,
 		},
-		true)
+		em.settings.AdvancedSettings.ProxySettings)
 	if err != nil {
 
-		if errors.Is(err, common.SkipCreateInDB) == true {
-			em.log.Debugln("autoFindMappingPathWithMixInfoByIMDBId.GetVideoIMDBInfoFromLocal", err)
-			return false
-		}
-
-		em.log.Errorln("autoFindMappingPathWithMixInfoByIMDBId.GetVideoIMDBInfoFromLocal", err)
+		em.log.Errorln("autoFindMappingPathWithMixInfoByIMDBId.GetIMDBInfoFromVideoNfoInfo", err)
 		return false
 	}
 

+ 2 - 2
pkg/logic/movie_helper/moviehelper.go

@@ -122,13 +122,13 @@ func MovieHasChineseSub(log *logrus.Logger, videoFilePath string) (bool, []strin
 }
 
 // SkipChineseMovie 跳过中文的电影
-func SkipChineseMovie(log *logrus.Logger, videoFullPath string, _proxySettings ...*settings.ProxySettings) (bool, error) {
+func SkipChineseMovie(log *logrus.Logger, videoFullPath string, _proxySettings *settings.ProxySettings) (bool, error) {
 
 	imdbInfo, err := decode.GetVideoNfoInfo4Movie(videoFullPath)
 	if err != nil {
 		return false, err
 	}
-	isChineseVideo, _, err := imdb_helper.IsChineseVideo(log, imdbInfo, _proxySettings...)
+	isChineseVideo, _, err := imdb_helper.IsChineseVideo(log, imdbInfo, _proxySettings)
 	if err != nil {
 		return false, err
 	}

+ 8 - 37
pkg/logic/scan_played_video_subinfo/scan_played_video_subinfo.go

@@ -9,7 +9,6 @@ import (
 	"sync"
 
 	"github.com/allanpk716/ChineseSubFinder/pkg/ifaces"
-	"github.com/allanpk716/ChineseSubFinder/pkg/types"
 	common2 "github.com/allanpk716/ChineseSubFinder/pkg/types/common"
 
 	embyHelper "github.com/allanpk716/ChineseSubFinder/pkg/logic/emby_helper"
@@ -360,16 +359,9 @@ func (s *ScanPlayedVideoSubInfo) dealOneVideo(index int, videoFPath, orgSubFPath
 
 	// 通过视频的绝对路径,从本地的视频文件对应的 nfo 获取到这个视频的 IMDB ID,
 	var err error
-	var imdbInfo4Video types.VideoNfoInfo
-
-	if isMovie == true {
-		imdbInfo4Video, err = decode.GetVideoNfoInfo4Movie(videoFPath)
-	} else {
-		imdbInfo4Video, err = decode.GetSeriesSeasonVideoNfoInfoFromEpisode(videoFPath)
-	}
+	imdbInfoFromVideoFile, err := imdb_helper.GetIMDBInfoFromVideoFile(s.log, videoFPath, isMovie, s.settings.AdvancedSettings.ProxySettings)
 	if err != nil {
-		// 如果找不到当前电影的 IMDB Info 本地文件,那么就跳过
-		s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".GetImdbInfo", videoFPath, err)
+		s.log.Errorln("GetIMDBInfoFromVideoFile", err)
 		return
 	}
 
@@ -387,32 +379,11 @@ func (s *ScanPlayedVideoSubInfo) dealOneVideo(index int, videoFPath, orgSubFPath
 	var ok bool
 	// 先把 IMDB 信息查询查来,不管是从数据库还是网络(查询出来也得写入到数据库)
 	s.cacheImdbInfoCacheLocker.Lock()
-	imdbInfo, ok = imdbInfoCache[imdbInfo4Video.ImdbId]
+	imdbInfo, ok = imdbInfoCache[imdbInfoFromVideoFile.IMDBID]
 	s.cacheImdbInfoCacheLocker.Unlock()
 	if ok == false {
-		// 不存在,那么就去查询和新建缓存
-		imdbInfo, err = imdb_helper.GetVideoIMDBInfoFromLocal(s.log, imdbInfo4Video)
-		if err != nil {
-			s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".GetVideoIMDBInfoFromLocal", videoFPath, err)
-			return
-		}
-		if len(imdbInfo.Description) <= 0 {
-			// 需要去外网获去补全信息,然后更新本地的信息
-			t, err := imdb_helper.GetVideoInfoFromIMDBWeb(imdbInfo4Video, s.settings.AdvancedSettings.ProxySettings)
-			if err != nil {
-				s.log.Errorln("dealOneVideo.GetVideoInfoFromIMDBWeb,", imdbInfo4Video.Title, err)
-				return
-			}
-			imdbInfo.Year = t.Year
-			imdbInfo.AKA = t.AKA
-			imdbInfo.Description = t.Description
-			imdbInfo.Languages = t.Languages
-
-			dao.GetDb().Save(imdbInfo)
-		}
-
 		s.cacheImdbInfoCacheLocker.Lock()
-		imdbInfoCache[imdbInfo4Video.ImdbId] = imdbInfo
+		imdbInfoCache[imdbInfoFromVideoFile.IMDBID] = imdbInfo
 		s.cacheImdbInfoCacheLocker.Unlock()
 	}
 	s.log.Debugln(3)
@@ -471,11 +442,11 @@ func (s *ScanPlayedVideoSubInfo) dealOneVideo(index int, videoFPath, orgSubFPath
 	// 不存在,插入,建立关系
 	bok, fileInfo, err := s.fileDownloader.SubParserHub.DetermineFileTypeFromFile(subCacheFPath)
 	if err != nil {
-		s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".DetermineFileTypeFromFile", imdbInfo4Video.ImdbId, err)
+		s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".DetermineFileTypeFromFile", imdbInfo.IMDBID, err)
 		return
 	}
 	if bok == false {
-		s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".DetermineFileTypeFromFile == false", imdbInfo4Video.ImdbId)
+		s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".DetermineFileTypeFromFile == false", imdbInfo.IMDBID)
 		return
 	}
 
@@ -486,7 +457,7 @@ func (s *ScanPlayedVideoSubInfo) dealOneVideo(index int, videoFPath, orgSubFPath
 	// 转相对路径存储
 	subRelPath, err := filepath.Rel(shareRootDir, subCacheFPath)
 	if err != nil {
-		s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".Rel", imdbInfo4Video.ImdbId, err)
+		s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".Rel", imdbInfo.IMDBID, err)
 		return
 	}
 
@@ -528,7 +499,7 @@ func (s *ScanPlayedVideoSubInfo) dealOneVideo(index int, videoFPath, orgSubFPath
 		// 连续剧的时候,如果可能应该获取是 第几季  第几集
 		epsVideoNfoInfo, err := decode.GetVideoNfoInfo4OneSeriesEpisode(videoFPath)
 		if err != nil {
-			s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".GetVideoNfoInfo4OneSeriesEpisode", imdbInfo4Video.Title, err)
+			s.log.Warningln("ScanPlayedVideoSubInfo.Scan", videoTypes, ".GetVideoNfoInfo4OneSeriesEpisode", imdbInfo.Name, err)
 			return
 		}
 		oneVideoSubInfo.Season = epsVideoNfoInfo.Season

+ 10 - 9
pkg/logic/series_helper/seriesHelper.go

@@ -26,9 +26,9 @@ import (
 	"github.com/sirupsen/logrus"
 )
 
-func readSeriesInfo(log *logrus.Logger, seriesDir string, need2AnalyzeSub bool) (*series.SeriesInfo, map[string][]series.SubInfo, error) {
+func readSeriesInfo(log *logrus.Logger, seriesDir string, need2AnalyzeSub bool, _proxySettings *settings.ProxySettings) (*series.SeriesInfo, map[string][]series.SubInfo, error) {
 
-	seriesInfo, err := GetSeriesInfoFromDir(log, seriesDir)
+	seriesInfo, err := GetSeriesInfoFromDir(log, seriesDir, _proxySettings)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -103,9 +103,10 @@ func ReadSeriesInfoFromDir(log *logrus.Logger,
 	ExpirationTime int,
 	forcedScanAndDownloadSub bool,
 	need2AnalyzeSub bool,
+	_proxySettings *settings.ProxySettings,
 	epsMap ...map[int][]int) (*series.SeriesInfo, error) {
 
-	seriesInfo, SubDict, err := readSeriesInfo(log, seriesDir, need2AnalyzeSub)
+	seriesInfo, SubDict, err := readSeriesInfo(log, seriesDir, need2AnalyzeSub, _proxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -131,9 +132,9 @@ func ReadSeriesInfoFromDir(log *logrus.Logger,
 }
 
 // ReadSeriesInfoFromEmby 将 Emby API 读取到的数据进行转换到通用的结构中,需要填充那些剧集需要下载,这样要的是一个连续剧的,不是所有的传入(只有那些 Eps 需要下载字幕的 NeedDlEpsKeyList)
-func ReadSeriesInfoFromEmby(log *logrus.Logger, seriesDir string, seriesVideoList []emby.EmbyMixInfo, ExpirationTime int, forcedScanAndDownloadSub bool, need2AnalyzeSub bool) (*series.SeriesInfo, error) {
+func ReadSeriesInfoFromEmby(log *logrus.Logger, seriesDir string, seriesVideoList []emby.EmbyMixInfo, ExpirationTime int, forcedScanAndDownloadSub bool, need2AnalyzeSub bool, _proxySettings *settings.ProxySettings) (*series.SeriesInfo, error) {
 
-	seriesInfo, SubDict, err := readSeriesInfo(log, seriesDir, need2AnalyzeSub)
+	seriesInfo, SubDict, err := readSeriesInfo(log, seriesDir, need2AnalyzeSub, _proxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -154,14 +155,14 @@ func ReadSeriesInfoFromEmby(log *logrus.Logger, seriesDir string, seriesVideoLis
 }
 
 // SkipChineseSeries 跳过中文连续剧
-func SkipChineseSeries(log *logrus.Logger, seriesRootPath string, _proxySettings ...*settings.ProxySettings) (bool, *models.IMDBInfo, error) {
+func SkipChineseSeries(log *logrus.Logger, seriesRootPath string, _proxySettings *settings.ProxySettings) (bool, *models.IMDBInfo, error) {
 
 	imdbInfo, err := decode.GetVideoNfoInfo4SeriesDir(seriesRootPath)
 	if err != nil {
 		return false, nil, err
 	}
 
-	isChineseVideo, t, err := imdb_helper.IsChineseVideo(log, imdbInfo, _proxySettings...)
+	isChineseVideo, t, err := imdb_helper.IsChineseVideo(log, imdbInfo, _proxySettings)
 	if err != nil {
 		return false, nil, err
 	}
@@ -322,7 +323,7 @@ func whichSeasonEpsNeedDownloadSub(log *logrus.Logger, seriesInfo *series.Series
 	return needDlSubEpsList, needDlSeasonList
 }
 
-func GetSeriesInfoFromDir(log *logrus.Logger, seriesDir string) (*series.SeriesInfo, error) {
+func GetSeriesInfoFromDir(log *logrus.Logger, seriesDir string, _proxySettings *settings.ProxySettings) (*series.SeriesInfo, error) {
 	seriesInfo := series.SeriesInfo{}
 	// 只考虑 IMDB 去查询,文件名目前发现可能会跟电影重复,导致很麻烦,本来也有前置要求要削刮器处理的
 	videoInfo, err := decode.GetVideoNfoInfo4SeriesDir(seriesDir)
@@ -330,7 +331,7 @@ func GetSeriesInfoFromDir(log *logrus.Logger, seriesDir string) (*series.SeriesI
 		return nil, err
 	}
 
-	imdbInfoFromLocal, err := imdb_helper.GetVideoIMDBInfoFromLocal(log, videoInfo)
+	imdbInfoFromLocal, err := imdb_helper.GetIMDBInfoFromVideoNfoInfo(log, videoInfo, _proxySettings)
 	if err != nil {
 		return nil, err
 	}

+ 3 - 2
pkg/logic/sub_supplier/subSupplierHub.go

@@ -110,7 +110,8 @@ func (d *SubSupplierHub) SeriesNeedDlSub(seriesRootPath string, forcedScanAndDow
 	seriesInfo, err := seriesHelper.ReadSeriesInfoFromDir(d.log, seriesRootPath,
 		d.settings.AdvancedSettings.TaskQueue.ExpirationTime,
 		forcedScanAndDownloadSub,
-		need2AnalyzeSub)
+		need2AnalyzeSub,
+		d.settings.AdvancedSettings.ProxySettings)
 	if err != nil {
 		return false, nil, errors.Newf("ReadSeriesInfoFromDir %v %v", seriesRootPath, err)
 	}
@@ -134,7 +135,7 @@ func (d *SubSupplierHub) SeriesNeedDlSubFromEmby(seriesRootPath string, seriesVi
 		}
 	}
 	// 读取本地的视频和字幕信息
-	seriesInfo, err := seriesHelper.ReadSeriesInfoFromEmby(d.log, seriesRootPath, seriesVideoList, ExpirationTime, forcedScanAndDownloadSub, false)
+	seriesInfo, err := seriesHelper.ReadSeriesInfoFromEmby(d.log, seriesRootPath, seriesVideoList, ExpirationTime, forcedScanAndDownloadSub, false, d.settings.AdvancedSettings.ProxySettings)
 	if err != nil {
 		return false, nil, errors.Newf("ReadSeriesInfoFromDir %v %v", seriesRootPath, err)
 	}

+ 2 - 2
pkg/mix_media_info/mix_media_info.go

@@ -20,9 +20,9 @@ import (
 
 func GetMixMediaInfo(log *logrus.Logger,
 	SubtitleBestApi *subtitle_best_api.SubtitleBestApi,
-	videoFPath string, isMovie bool, _proxySettings ...*settings.ProxySettings) (*models.MediaInfo, error) {
+	videoFPath string, isMovie bool, _proxySettings *settings.ProxySettings) (*models.MediaInfo, error) {
 
-	imdbInfo, err := imdb_helper.GetIMDBInfo(log, videoFPath, isMovie, _proxySettings...)
+	imdbInfo, err := imdb_helper.GetIMDBInfoFromVideoFile(log, videoFPath, isMovie, _proxySettings)
 	if err != nil {
 		return nil, err
 	}

+ 1 - 0
pkg/types/video_nfo_info.go

@@ -13,6 +13,7 @@ type VideoNfoInfo struct {
 	Title         string
 	OriginalTitle string
 	ReleaseDate   string
+	IsMovie       bool
 }
 
 func (v *VideoNfoInfo) GetYear() int {

+ 5 - 5
pkg/video_scan_and_refresh_helper/video_scan_and_refresh_helper.go

@@ -394,7 +394,7 @@ func (v *VideoScanAndRefreshHelper) scanLowVideoSubInfo(scanVideoResult *ScanVid
 		seriesDirRootFPathLisst := seriesFPath.([]string)
 		for seriesDirIndex, seriesDirRootFPath := range seriesDirRootFPathLisst {
 
-			seriesInfo, err := seriesHelper.ReadSeriesInfoFromDir(v.log, seriesDirRootFPath, 90, true, true)
+			seriesInfo, err := seriesHelper.ReadSeriesInfoFromDir(v.log, seriesDirRootFPath, 90, true, true, v.settings.AdvancedSettings.ProxySettings)
 			if err != nil {
 				v.log.Warningln("scanLowVideoSubInfo.ReadSeriesInfoFromDir", seriesDirRootFPath, err)
 				return false
@@ -987,9 +987,9 @@ func (v *VideoScanAndRefreshHelper) updateLocalVideoCacheInfo(scanVideoResult *S
 			return err
 		}
 		// 获取 IMDB 信息
-		localIMDBInfo, err := imdb_helper.GetVideoIMDBInfoFromLocal(v.log, videoImdbInfo)
+		localIMDBInfo, err := imdb_helper.GetIMDBInfoFromVideoNfoInfo(v.log, videoImdbInfo, v.settings.AdvancedSettings.ProxySettings)
 		if err != nil {
-			v.log.Warningln("GetVideoIMDBInfoFromLocal,IMDB:", videoImdbInfo.ImdbId, movieInputData.InputPath, err)
+			v.log.Warningln("GetIMDBInfoFromVideoNfoInfo,IMDB:", videoImdbInfo.ImdbId, movieInputData.InputPath, err)
 			return err
 		}
 
@@ -1041,9 +1041,9 @@ func (v *VideoScanAndRefreshHelper) updateLocalVideoCacheInfo(scanVideoResult *S
 		}
 
 		// 获取 IMDB 信息
-		localIMDBInfo, err := imdb_helper.GetVideoIMDBInfoFromLocal(v.log, videoInfo)
+		localIMDBInfo, err := imdb_helper.GetIMDBInfoFromVideoNfoInfo(v.log, videoInfo, v.settings.AdvancedSettings.ProxySettings)
 		if err != nil {
-			v.log.Warningln("GetVideoIMDBInfoFromLocal,IMDB:", videoInfo.ImdbId, seriesInputData.InputPath, err)
+			v.log.Warningln("GetIMDBInfoFromVideoNfoInfo,IMDB:", videoInfo.ImdbId, seriesInputData.InputPath, err)
 			return err
 		}
 		if (seriesInputData.InputPath != "" && localIMDBInfo.RootDirPath != seriesInputData.InputPath) || localIMDBInfo.IsMovie != false {