Browse Source

支持用户使用自己的 tmdb api key,如果设置了却访问不了,则会崩溃

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

+ 1 - 1
internal/backend/backend.go

@@ -51,7 +51,7 @@ func (b *BackEnd) start() {
 	engine := gin.Default()
 	// 默认所有都通过
 	engine.Use(cors.Default())
-	cbBase, v1Router := InitRouter(b.logger, b.settings, engine, b.cronHelper, b.restartSignal)
+	cbBase, v1Router := InitRouter(b.settings, engine, b.cronHelper, b.restartSignal)
 
 	engine.GET("/", func(c *gin.Context) {
 		c.Header("content-type", "text/html;charset=utf-8")

+ 21 - 5
internal/backend/base_router.go

@@ -4,9 +4,9 @@ import (
 	"fmt"
 	"net/http"
 
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
+	"github.com/allanpk716/ChineseSubFinder/pkg/tmdb_api"
 
-	"github.com/sirupsen/logrus"
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 
 	"github.com/allanpk716/ChineseSubFinder/internal/backend/controllers/base"
 	v1 "github.com/allanpk716/ChineseSubFinder/internal/backend/controllers/v1"
@@ -16,15 +16,31 @@ import (
 )
 
 func InitRouter(
-	log *logrus.Logger,
 	settings *settings.Settings, // 设置实例
 	router *gin.Engine,
 	cronHelper *cron_helper.CronHelper,
 	restartSignal chan interface{},
 ) (*base.ControllerBase, *v1.ControllerBase) {
 
-	cbBase := base.NewControllerBase(log, restartSignal)
-	cbV1 := v1.NewControllerBase(log, cronHelper, restartSignal)
+	// ----------------------------------------------
+	// 设置 TMDB API 的本地 Client,用户自己的 API Key
+	var err error
+	var tmdbApi *tmdb_api.TmdbApi
+	if settings.AdvancedSettings.TmdbApiSettings.Enable == true && settings.AdvancedSettings.TmdbApiSettings.ApiKey != "" {
+		tmdbApi, err = tmdb_api.NewTmdbHelper(cronHelper.Logger, settings.AdvancedSettings.TmdbApiSettings.ApiKey, settings.AdvancedSettings.ProxySettings)
+		if err != nil {
+			cronHelper.Logger.Panicln("NewTmdbHelper", err)
+		}
+		if tmdbApi.Alive() == false {
+			// 如果 tmdbApi 不可用,那么就不使用
+			cronHelper.Logger.Errorln("tmdbApi.Alive() == false")
+			tmdbApi = nil
+		}
+	}
+	cronHelper.FileDownloader.MediaInfoDealers.SetTmdbHelperInstance(tmdbApi)
+	// ----------------------------------------------
+	cbBase := base.NewControllerBase(cronHelper.FileDownloader, restartSignal)
+	cbV1 := v1.NewControllerBase(cronHelper, restartSignal)
 	// --------------------------------------------------
 	// 静态文件服务器
 	// 添加电影的

+ 1 - 1
internal/backend/controllers/base/change_pwd.go

@@ -10,7 +10,7 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-func (cb ControllerBase) ChangePwdHandler(c *gin.Context) {
+func (cb *ControllerBase) ChangePwdHandler(c *gin.Context) {
 
 	var err error
 	defer func() {

+ 1 - 1
internal/backend/controllers/base/check_cron.go

@@ -8,7 +8,7 @@ import (
 	"github.com/robfig/cron/v3"
 )
 
-func (cb ControllerBase) CheckCronHandler(c *gin.Context) {
+func (cb *ControllerBase) CheckCronHandler(c *gin.Context) {
 	var err error
 	defer func() {
 		// 统一的异常处理

+ 1 - 1
internal/backend/controllers/base/check_emby_settings.go

@@ -9,7 +9,7 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-func (cb ControllerBase) CheckEmbySettingsHandler(c *gin.Context) {
+func (cb *ControllerBase) CheckEmbySettingsHandler(c *gin.Context) {
 	var err error
 	defer func() {
 		// 统一的异常处理

+ 2 - 15
internal/backend/controllers/base/controller_base.go

@@ -3,15 +3,8 @@ package base
 import (
 	"net/http"
 
-	"github.com/allanpk716/ChineseSubFinder/pkg"
-
 	"github.com/allanpk716/ChineseSubFinder/pkg/lock"
 
-	"github.com/allanpk716/ChineseSubFinder/pkg/cache_center"
-	"github.com/allanpk716/ChineseSubFinder/pkg/random_auth_key"
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
-	"github.com/sirupsen/logrus"
-
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/backend"
 
 	"github.com/allanpk716/ChineseSubFinder/pkg/logic/file_downloader"
@@ -24,15 +17,9 @@ type ControllerBase struct {
 	restartSignal    chan interface{}
 }
 
-func NewControllerBase(loggerBase *logrus.Logger, restartSignal chan interface{}) *ControllerBase {
+func NewControllerBase(fileDownloader *file_downloader.FileDownloader, restartSignal chan interface{}) *ControllerBase {
 	return &ControllerBase{
-		fileDownloader: file_downloader.NewFileDownloader(
-			cache_center.NewCacheCenter("local_task_queue", settings.GetSettings(), loggerBase),
-			random_auth_key.AuthKey{
-				BaseKey:  pkg.BaseKey(),
-				AESKey16: pkg.AESKey16(),
-				AESIv16:  pkg.AESIv16(),
-			}),
+		fileDownloader:   fileDownloader,
 		proxyCheckLocker: lock.NewLock(),
 		restartSignal:    restartSignal,
 	}

+ 1 - 1
internal/backend/controllers/base/def_settings.go

@@ -9,7 +9,7 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-func (cb ControllerBase) DefSettingsHandler(c *gin.Context) {
+func (cb *ControllerBase) DefSettingsHandler(c *gin.Context) {
 	var err error
 	defer func() {
 		// 统一的异常处理

+ 1 - 1
internal/backend/controllers/base/login.go

@@ -12,7 +12,7 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-func (cb ControllerBase) LoginHandler(c *gin.Context) {
+func (cb *ControllerBase) LoginHandler(c *gin.Context) {
 
 	var err error
 	defer func() {

+ 3 - 2
internal/backend/controllers/base/logout.go

@@ -1,14 +1,15 @@
 package base
 
 import (
-	"github.com/allanpk716/ChineseSubFinder/pkg/types/backend"
 	"net/http"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/types/backend"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/common"
 	"github.com/gin-gonic/gin"
 )
 
-func (cb ControllerBase) LogoutHandler(c *gin.Context) {
+func (cb *ControllerBase) LogoutHandler(c *gin.Context) {
 
 	// 注销
 	common.SetAccessToken("")

+ 1 - 1
internal/backend/controllers/base/setup.go

@@ -9,7 +9,7 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-func (cb ControllerBase) SetupHandler(c *gin.Context) {
+func (cb *ControllerBase) SetupHandler(c *gin.Context) {
 	var err error
 	defer func() {
 		// 统一的异常处理

+ 4 - 4
internal/backend/controllers/v1/controller_base.go

@@ -27,16 +27,16 @@ type ControllerBase struct {
 	restartSignal                       chan interface{}
 }
 
-func NewControllerBase(log *logrus.Logger, cronHelper *cron_helper.CronHelper, restartSignal chan interface{}) *ControllerBase {
+func NewControllerBase(cronHelper *cron_helper.CronHelper, restartSignal chan interface{}) *ControllerBase {
 	cb := &ControllerBase{
-		log:        log,
+		log:        cronHelper.Logger,
 		cronHelper: cronHelper,
 		pathUrlMap: make(map[string]string),
 		// 这里因为不进行任务的添加,仅仅是扫描,所以 downloadQueue 可以为 nil
 		videoScanAndRefreshHelper: video_scan_and_refresh_helper.NewVideoScanAndRefreshHelper(
-			sub_formatter.GetSubFormatter(log, cronHelper.Settings.AdvancedSettings.SubNameFormatter),
+			sub_formatter.GetSubFormatter(cronHelper.Logger, cronHelper.Settings.AdvancedSettings.SubNameFormatter),
 			cronHelper.FileDownloader, nil),
-		videoListHelper:                 video_list_helper.NewVideoListHelper(log, cronHelper.Settings),
+		videoListHelper:                 video_list_helper.NewVideoListHelper(cronHelper.Logger, cronHelper.Settings),
 		videoScanAndRefreshHelperLocker: lock.NewLock(),
 		restartSignal:                   restartSignal,
 	}

+ 36 - 36
pkg/logic/cron_helper/cron_helper.go

@@ -30,7 +30,7 @@ type CronHelper struct {
 	cronLock                      sync.Mutex                                               // 锁
 	c                             *cron.Cron                                               // 定时器实例
 	Settings                      *settings.Settings                                       // 设置实例
-	log                           *logrus.Logger                                           // 日志实例
+	Logger                        *logrus.Logger                                           // 日志实例
 	entryIDScanVideoProcess       cron.EntryID
 	entryIDSupplierCheck          cron.EntryID
 	entryIDQueueDownloader        cron.EntryID
@@ -42,7 +42,7 @@ func NewCronHelper(fileDownloader *file_downloader.FileDownloader) *CronHelper {
 
 	ch := CronHelper{
 		FileDownloader: fileDownloader,
-		log:            fileDownloader.Log,
+		Logger:         fileDownloader.Log,
 		Settings:       fileDownloader.Settings,
 		// 实例化下载队列
 		DownloadQueue: task_queue.NewTaskQueue(fileDownloader.CacheCenter),
@@ -51,21 +51,21 @@ func NewCronHelper(fileDownloader *file_downloader.FileDownloader) *CronHelper {
 	var err error
 	// ----------------------------------------------
 	// 扫描已播放
-	ch.scanPlayedVideoSubInfo, err = scan_played_video_subinfo.NewScanPlayedVideoSubInfo(ch.log, ch.Settings, fileDownloader)
+	ch.scanPlayedVideoSubInfo, err = scan_played_video_subinfo.NewScanPlayedVideoSubInfo(ch.Logger, ch.Settings, fileDownloader)
 	if err != nil {
-		ch.log.Panicln(err)
+		ch.Logger.Panicln(err)
 	}
 	// ----------------------------------------------
 	// 字幕扫描器
 	ch.videoScanAndRefreshHelper = video_scan_and_refresh_helper.NewVideoScanAndRefreshHelper(
-		sub_formatter.GetSubFormatter(ch.log, ch.Settings.AdvancedSettings.SubNameFormatter),
+		sub_formatter.GetSubFormatter(ch.Logger, ch.Settings.AdvancedSettings.SubNameFormatter),
 		ch.FileDownloader,
 		ch.DownloadQueue)
 
 	// ----------------------------------------------
 	// 初始化下载者,里面的两个 func 需要使用定时器启动 SupplierCheck QueueDownloader
 	ch.Downloader = downloader.NewDownloader(
-		sub_formatter.GetSubFormatter(ch.log, ch.Settings.AdvancedSettings.SubNameFormatter),
+		sub_formatter.GetSubFormatter(ch.Logger, ch.Settings.AdvancedSettings.SubNameFormatter),
 		ch.FileDownloader, ch.DownloadQueue)
 
 	// 强制进行一次字幕源有效性检查
@@ -93,13 +93,13 @@ func (ch *CronHelper) Start(runImmediately bool) {
 	// 判断扫描任务的时间间隔是否符合要求,不符合则重写默认值
 	_, err := cron.ParseStandard(ch.Settings.CommonSettings.ScanInterval)
 	if err != nil {
-		ch.log.Warningln("CommonSettings.ScanInterval format error, after v0.25.x , need reset this at WebUI")
+		ch.Logger.Warningln("CommonSettings.ScanInterval format error, after v0.25.x , need reset this at WebUI")
 		// 如果解析错误了,就需要重新赋值默认值过来,然后保存
 		nowSettings := ch.Settings
 		nowSettings.CommonSettings.ScanInterval = settings.NewCommonSettings().ScanInterval
 		err = settings.SetFullNewSettings(nowSettings)
 		if err != nil {
-			ch.log.Panicln("CronHelper.SetFullNewSettings:", err)
+			ch.Logger.Panicln("CronHelper.SetFullNewSettings:", err)
 			return
 		}
 	}
@@ -109,10 +109,10 @@ func (ch *CronHelper) Start(runImmediately bool) {
 		// 测试部分定时器代码,提前运行
 		if ch.Settings.SpeedDevMode == true {
 
-			//pj := pre_job.NewPreJob(ch.Settings, ch.log)
+			//pj := pre_job.NewPreJob(ch.Settings, ch.Logger)
 			//err = pj.HotFix().Wait()
 			//if err != nil {
-			//	ch.log.Errorln(err)
+			//	ch.Logger.Errorln(err)
 			//}
 
 			//ch.scanVideoProcessAdd2DownloadQueue()
@@ -127,22 +127,22 @@ func (ch *CronHelper) Start(runImmediately bool) {
 	// 这个暂时无法被取消执行
 	ch.entryIDScanVideoProcess, err = ch.c.AddFunc(ch.Settings.CommonSettings.ScanInterval, ch.scanVideoProcessAdd2DownloadQueue)
 	if err != nil {
-		ch.log.Panicln("CronHelper scanVideoProcessAdd2DownloadQueue, scanVideoProcessAdd2DownloadQueue Cron entryID:", ch.entryIDScanVideoProcess, "Error:", err)
+		ch.Logger.Panicln("CronHelper scanVideoProcessAdd2DownloadQueue, scanVideoProcessAdd2DownloadQueue Cron entryID:", ch.entryIDScanVideoProcess, "Error:", err)
 	}
 	// 这个可以由 ch.Downloader.Cancel() 取消执行
 	ch.entryIDSupplierCheck, err = ch.c.AddFunc("@every 1h", ch.Downloader.SupplierCheck)
 	if err != nil {
-		ch.log.Panicln("CronHelper SupplierCheck, SupplierCheck Cron entryID:", ch.entryIDSupplierCheck, "Error:", err)
+		ch.Logger.Panicln("CronHelper SupplierCheck, SupplierCheck Cron entryID:", ch.entryIDSupplierCheck, "Error:", err)
 	}
 	// 这个可以由 ch.Downloader.Cancel() 取消执行
 	ch.entryIDQueueDownloader, err = ch.c.AddFunc("@every 15s", ch.Downloader.QueueDownloader)
 	if err != nil {
-		ch.log.Panicln("CronHelper QueueDownloader, QueueDownloader Cron entryID:", ch.entryIDQueueDownloader, "Error:", err)
+		ch.Logger.Panicln("CronHelper QueueDownloader, QueueDownloader Cron entryID:", ch.entryIDQueueDownloader, "Error:", err)
 	}
 	// 这个可以由 ch.scanPlayedVideoSubInfo.Cancel() 取消执行
 	ch.entryIDScanPlayedVideoSubInfo, err = ch.c.AddFunc("@every 24h", ch.scanPlayedVideoSub)
 	if err != nil {
-		ch.log.Panicln("CronHelper QueueDownloader, scanPlayedVideoSub Cron entryID:", ch.entryIDScanPlayedVideoSubInfo, "Error:", err)
+		ch.Logger.Panicln("CronHelper QueueDownloader, scanPlayedVideoSub Cron entryID:", ch.entryIDScanPlayedVideoSubInfo, "Error:", err)
 	}
 	// 字幕的上传逻辑
 	if ch.Settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
@@ -153,7 +153,7 @@ func (ch *CronHelper) Start(runImmediately bool) {
 		}
 		ch.entryIDUploadPlayedVideoSub, err = ch.c.AddFunc(intervalNowTask, ch.uploadVideoSub)
 		if err != nil {
-			ch.log.Panicln("CronHelper QueueDownloader, uploadVideoSub Cron entryID:", ch.entryIDUploadPlayedVideoSub, "Error:", err)
+			ch.Logger.Panicln("CronHelper QueueDownloader, uploadVideoSub Cron entryID:", ch.entryIDUploadPlayedVideoSub, "Error:", err)
 		}
 	}
 
@@ -165,19 +165,19 @@ func (ch *CronHelper) Start(runImmediately bool) {
 			ch.cronLock.Unlock()
 			//----------------------------------------------
 			// 没有停止,那么继续扫描
-			ch.log.Infoln("First Time scanVideoProcessAdd2DownloadQueue Start")
+			ch.Logger.Infoln("First Time scanVideoProcessAdd2DownloadQueue Start")
 			if ch.Settings.SpeedDevMode == false {
 				ch.scanVideoProcessAdd2DownloadQueue()
 			}
-			ch.log.Infoln("First Time scanVideoProcessAdd2DownloadQueue End")
+			ch.Logger.Infoln("First Time scanVideoProcessAdd2DownloadQueue End")
 			//----------------------------------------------
 		} else {
 			ch.cronLock.Unlock()
-			ch.log.Infoln("CronHelper is stopping, not start scanVideoProcessAdd2DownloadQueue")
+			ch.Logger.Infoln("CronHelper is stopping, not start scanVideoProcessAdd2DownloadQueue")
 			return
 		}
 	} else {
-		ch.log.Infoln("RunAtStartup: false, so will not Run At Startup")
+		ch.Logger.Infoln("RunAtStartup: false, so will not Run At Startup")
 	}
 	// ----------------------------------------------
 	// 如果不是立即执行,那么就等待定时器开启
@@ -185,21 +185,21 @@ func (ch *CronHelper) Start(runImmediately bool) {
 	if ch.cronHelperRunning == true && ch.stopping == false {
 		ch.cronLock.Unlock()
 		//----------------------------------------------
-		ch.log.Infoln("CronHelper Start...")
+		ch.Logger.Infoln("CronHelper Start...")
 		ch.c.Start()
 		//----------------------------------------------
 		// 只有定时任务 start 之后才能拿到信息
 		if len(ch.c.Entries()) > 0 {
 			// 不会马上启动扫描,那么就需要设置当前的时间,且为 waiting
 			tttt := ch.c.Entry(ch.entryIDScanVideoProcess).Next.Format("2006-01-02 15:04:05")
-			ch.log.Infoln("Next Sub Scan Will Process At:", tttt)
+			ch.Logger.Infoln("Next Sub Scan Will Process At:", tttt)
 		} else {
-			ch.log.Errorln("Can't get cron jobs, will not send SubScanJobStatus")
+			ch.Logger.Errorln("Can't get cron jobs, will not send SubScanJobStatus")
 		}
 		//----------------------------------------------
 	} else {
 		ch.cronLock.Unlock()
-		ch.log.Infoln("CronHelper is stopping, not start CronHelper")
+		ch.Logger.Infoln("CronHelper is stopping, not start CronHelper")
 	}
 	//----------------------------------------------
 
@@ -233,9 +233,9 @@ func (ch *CronHelper) Stop() {
 	nowContext := ch.c.Stop()
 	select {
 	case <-time.After(5 * time.Minute):
-		ch.log.Warningln("Wait over 5 min, CronHelper is timeout")
+		ch.Logger.Warningln("Wait over 5 min, CronHelper is timeout")
 	case <-nowContext.Done():
-		ch.log.Infoln("CronHelper.Stop() context<-Done.")
+		ch.Logger.Infoln("CronHelper.Stop() context<-Done.")
 	}
 
 	ch.cronLock.Lock()
@@ -243,38 +243,38 @@ func (ch *CronHelper) Stop() {
 	ch.stopping = false
 	ch.cronLock.Unlock()
 
-	ch.log.Infoln("CronHelper.Stop() Done.")
+	ch.Logger.Infoln("CronHelper.Stop() Done.")
 }
 
 func (ch *CronHelper) scanPlayedVideoSub() {
 
-	ch.log.Infoln("Update Info...")
+	ch.Logger.Infoln("Update Info...")
 	nowInfo := dao.UpdateInfo(pkg.AppVersion(), ch.Settings)
 	_, err := ch.FileDownloader.MediaInfoDealers.SubtitleBestApi.FeedBack(
 		nowInfo.Id,
 		nowInfo.Version, nowInfo.MediaServer,
 		nowInfo.EnableShare, nowInfo.EnableApiKey)
 	if err != nil {
-		ch.log.Errorln("FeedBack Error:", err)
+		ch.Logger.Errorln("FeedBack Error:", err)
 		return
 	}
 
-	ch.log.Infoln("------------------------------------------------------")
-	ch.log.Infoln("scanPlayedVideoSub Start")
+	ch.Logger.Infoln("------------------------------------------------------")
+	ch.Logger.Infoln("scanPlayedVideoSub Start")
 	startT := time.Now()
 	defer func() {
-		ch.log.Infoln("scanPlayedVideoSub End, Cost:", time.Since(startT).Minutes(), "min")
-		ch.log.Infoln("------------------------------------------------------")
+		ch.Logger.Infoln("scanPlayedVideoSub End, Cost:", time.Since(startT).Minutes(), "min")
+		ch.Logger.Infoln("------------------------------------------------------")
 	}()
 	bok, err := ch.scanPlayedVideoSubInfo.GetPlayedItemsSubtitle()
 	if err != nil {
-		ch.log.Errorln(err)
+		ch.Logger.Errorln(err)
 	}
 	if bok == true {
 		ch.scanPlayedVideoSubInfo.Clear()
 		err = ch.scanPlayedVideoSubInfo.Scan()
 		if err != nil {
-			ch.log.Errorln(err)
+			ch.Logger.Errorln(err)
 		}
 	}
 }
@@ -313,13 +313,13 @@ func (ch *CronHelper) CronRunningStatusString() string {
 func (ch *CronHelper) scanVideoProcessAdd2DownloadQueue() {
 
 	// 扫描字幕任务开始,先是扫描阶段,那么是拿不到有多少视频需要扫描的数量的
-	ch.log.Infoln("scanVideoProcessAdd2DownloadQueue Start:", time.Now().Format("2006-01-02 15:04:05"))
+	ch.Logger.Infoln("scanVideoProcessAdd2DownloadQueue Start:", time.Now().Format("2006-01-02 15:04:05"))
 	// ----------------------------------------------------------------------------------------
 	// ----------------------------------------------------------------------------------------
 	// 扫描有那些视频需要下载字幕,放入队列中,然后会有下载者去这个队列取出来进行下载
 	err := ch.videoScanAndRefreshHelper.Start(ch.Downloader.ScanLogic)
 	if err != nil {
-		ch.log.Errorln(err)
+		ch.Logger.Errorln(err)
 		return
 	}
 }

+ 51 - 51
pkg/logic/cron_helper/upload_played_video_sub.go

@@ -33,7 +33,7 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 	dao.GetDb().Where("is_send = ?", false).Limit(1).Find(&notUploadedVideoSubInfos)
 
 	if len(notUploadedVideoSubInfos) < 1 {
-		ch.log.Debugln("No notUploadedVideoSubInfos")
+		ch.Logger.Debugln("No notUploadedVideoSubInfos")
 		return
 	}
 
@@ -41,7 +41,7 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 	dao.GetDb().Where("imdb_id = ?", notUploadedVideoSubInfos[0].IMDBInfoID).Find(&imdbInfos)
 	if len(imdbInfos) < 1 {
 		// 如果没有找到,那么就没有办法推断出 IMDB ID 的相关信息和 TMDB ID 信息,要来何用,删除即可
-		ch.log.Infoln("No imdbInfos, will delete this VideoSubInfo,", notUploadedVideoSubInfos[0].SubName)
+		ch.Logger.Infoln("No imdbInfos, will delete this VideoSubInfo,", notUploadedVideoSubInfos[0].SubName)
 		dao.GetDb().Delete(&notUploadedVideoSubInfos[0])
 		return
 	}
@@ -58,7 +58,7 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 		// 需要先对这个字幕的 IMDB ID 转 TMDB ID 信息进行查询,得到 TMDB ID 和 Year (2019 2022)
 		finalQueryIMDBInfo, err = mix_media_info.GetMediaInfoAndSave(ch.FileDownloader.MediaInfoDealers, &imdbInfos[0], imdbInfos[0].IMDBID, "imdb", videoType)
 		if err != nil {
-			ch.log.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
+			ch.Logger.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
 			return
 		}
 	} else {
@@ -68,7 +68,7 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 		if len(mediaInfos) < 1 {
 			finalQueryIMDBInfo, err = mix_media_info.GetMediaInfoAndSave(ch.FileDownloader.MediaInfoDealers, &imdbInfos[0], imdbInfos[0].IMDBID, "imdb", videoType)
 			if err != nil {
-				ch.log.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
+				ch.Logger.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
 				return
 			}
 		} else {
@@ -79,24 +79,24 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 	// 如果解析这个字幕是错误的,那么也可以标记完成
 	shareRootDir, err := pkg.GetShareSubRootFolder()
 	if err != nil {
-		ch.log.Errorln("GetShareSubRootFolder error:", err.Error())
+		ch.Logger.Errorln("GetShareSubRootFolder error:", err.Error())
 		return
 	}
 	bok, _, err := ch.FileDownloader.SubParserHub.DetermineFileTypeFromFile(filepath.Join(shareRootDir, notUploadedVideoSubInfos[0].StoreRPath))
 	if err != nil {
 		notUploadedVideoSubInfos[0].IsSend = true
 		dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-		ch.log.Errorln("DetermineFileTypeFromFile upload sub error, mark is send,", err.Error())
+		ch.Logger.Errorln("DetermineFileTypeFromFile upload sub error, mark is send,", err.Error())
 		return
 	}
 	if bok == false {
 		notUploadedVideoSubInfos[0].IsSend = true
 		dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-		ch.log.Errorln("DetermineFileTypeFromFile upload sub == false, not match any SubType, mark is send")
+		ch.Logger.Errorln("DetermineFileTypeFromFile upload sub == false, not match any SubType, mark is send")
 		return
 	}
 
-	ch.log.Infoln("AskFroUpload", notUploadedVideoSubInfos[0].SubName)
+	ch.Logger.Infoln("AskFroUpload", notUploadedVideoSubInfos[0].SubName)
 	// 问询这个字幕是否上传过了,如果没有就需要进入上传的队列
 	askForUploadReply, err := ch.FileDownloader.MediaInfoDealers.SubtitleBestApi.AskFroUpload(
 		notUploadedVideoSubInfos[0].SHA256,
@@ -109,22 +109,22 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 		notUploadedVideoSubInfos[0].Feature,
 	)
 	if err != nil {
-		ch.log.Errorln(fmt.Errorf("AskFroUpload err: %v", err))
+		ch.Logger.Errorln(fmt.Errorf("AskFroUpload err: %v", err))
 		return
 	}
 	if askForUploadReply.Status == 3 {
 		// 上传过了,直接标记本地的 is_send 字段为 true
 		notUploadedVideoSubInfos[0].IsSend = true
 		dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-		ch.log.Infoln("Subtitle has been uploaded, so will not upload again")
+		ch.Logger.Infoln("Subtitle has been uploaded, so will not upload again")
 		return
 	} else if askForUploadReply.Status == 4 {
 		// 上传队列满了,等待下次定时器触发
-		ch.log.Infoln("Subtitle upload queue is full, will try ask upload again")
+		ch.Logger.Infoln("Subtitle upload queue is full, will try ask upload again")
 		return
 	} else if askForUploadReply.Status == 2 {
 		// 这个上传任务已经在队列中了,也许有其他人也需要上传这个字幕,或者本机排队的时候故障了,重启也可能遇到这个故障
-		ch.log.Infoln("Subtitle is int the queue")
+		ch.Logger.Infoln("Subtitle is int the queue")
 		return
 	} else if askForUploadReply.Status == 1 {
 		// 正确放入了队列,然后需要按规划的时间进行上传操作
@@ -136,7 +136,7 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 		if waitTime <= 0 {
 			waitTime = 5
 		}
-		ch.log.Infoln("will wait", waitTime, "s 2 upload sub 2 server")
+		ch.Logger.Infoln("will wait", waitTime, "s 2 upload sub 2 server")
 		var sleepCounter int64
 		sleepCounter = 0
 		normalStatus := false
@@ -146,33 +146,33 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 				break
 			}
 			if sleepCounter%30 == 0 {
-				ch.log.Infoln("wait 2 upload sub")
+				ch.Logger.Infoln("wait 2 upload sub")
 			}
 			time.Sleep(1 * time.Second)
 			sleepCounter++
 		}
 		if normalStatus == false || ch.cronHelperRunning == false {
 			// 说明不是正常跳出来的,是结束定时器来执行的
-			ch.log.Infoln("uploadVideoSub early termination")
+			ch.Logger.Infoln("uploadVideoSub early termination")
 			return
 		}
 		// 发送字幕
 
 		releaseTime, err := now.Parse(finalQueryIMDBInfo.Year)
 		if err != nil {
-			ch.log.Errorln("now.Parse error:", err.Error())
+			ch.Logger.Errorln("now.Parse error:", err.Error())
 			return
 		}
-		ch.log.Infoln("UploadSub", notUploadedVideoSubInfos[0].SubName)
+		ch.Logger.Infoln("UploadSub", notUploadedVideoSubInfos[0].SubName)
 		uploadSubReply, err := ch.FileDownloader.MediaInfoDealers.SubtitleBestApi.UploadSub(&notUploadedVideoSubInfos[0], shareRootDir, finalQueryIMDBInfo.TmdbId, strconv.Itoa(releaseTime.Year()))
 		if err != nil {
-			ch.log.Errorln("UploadSub error:", err.Error())
+			ch.Logger.Errorln("UploadSub error:", err.Error())
 
 			if errors.Is(err, common.ErrorUpload413) == true {
 				// 文件发送大小超限
 				notUploadedVideoSubInfos[0].IsSend = true
 				dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-				ch.log.Infoln("subtitle upload file over size limit, will not upload again")
+				ch.Logger.Infoln("subtitle upload file over size limit, will not upload again")
 				return
 			}
 
@@ -182,7 +182,7 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 			// 成功,其他情况就等待 Ask for Upload
 			notUploadedVideoSubInfos[0].IsSend = true
 			dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-			ch.log.Infoln("subtitle is uploaded")
+			ch.Logger.Infoln("subtitle is uploaded")
 			return
 		} else if uploadSubReply.Status == 0 {
 
@@ -193,20 +193,20 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 				strings.Contains(uploadSubReply.Message, "sub file has no chinese") == true {
 				notUploadedVideoSubInfos[0].IsSend = true
 				dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-				ch.log.Infoln("subtitle upload error, uploadSubReply.Status == 0, ", uploadSubReply.Message, "will not upload again")
+				ch.Logger.Infoln("subtitle upload error, uploadSubReply.Status == 0, ", uploadSubReply.Message, "will not upload again")
 				return
 			} else {
-				ch.log.Errorln("subtitle upload error, uploadSubReply.Status == 0, not support error:", uploadSubReply.Message)
+				ch.Logger.Errorln("subtitle upload error, uploadSubReply.Status == 0, not support error:", uploadSubReply.Message)
 				return
 			}
 		} else {
-			ch.log.Warningln("UploadSub Message:", uploadSubReply.Message)
+			ch.Logger.Warningln("UploadSub Message:", uploadSubReply.Message)
 			return
 		}
 
 	} else {
 		// 不是预期的返回值,需要报警
-		ch.log.Errorln(fmt.Errorf("AskFroUpload Not the expected return value, Status: %d, Message: %v", askForUploadReply.Status, askForUploadReply.Message))
+		ch.Logger.Errorln(fmt.Errorf("AskFroUpload Not the expected return value, Status: %d, Message: %v", askForUploadReply.Status, askForUploadReply.Message))
 		return
 	}
 }
@@ -218,7 +218,7 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 	dao.GetDb().Where("is_send = ?", false).Limit(1).Find(&notUploadedVideoSubInfos)
 
 	if len(notUploadedVideoSubInfos) < 1 {
-		ch.log.Debugln("No notUploadedVideoSubInfos")
+		ch.Logger.Debugln("No notUploadedVideoSubInfos")
 		return
 	}
 
@@ -226,7 +226,7 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 	dao.GetDb().Where("imdb_id = ?", notUploadedVideoSubInfos[0].IMDBID).Find(&imdbInfos)
 	if len(imdbInfos) < 1 {
 		// 如果没有找到,那么就没有办法推断出 IMDB ID 的相关信息和 TMDB ID 信息,要来何用,删除即可
-		ch.log.Infoln("No imdbInfos, will delete this VideoSubInfo,", notUploadedVideoSubInfos[0].SubName)
+		ch.Logger.Infoln("No imdbInfos, will delete this VideoSubInfo,", notUploadedVideoSubInfos[0].SubName)
 		dao.GetDb().Delete(&notUploadedVideoSubInfos[0])
 		return
 	}
@@ -235,12 +235,12 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 	if notUploadedVideoSubInfos[0].Season == 0 && notUploadedVideoSubInfos[0].Episode == 0 {
 		videoType = "movie"
 	} else if (notUploadedVideoSubInfos[0].Season == 0 && notUploadedVideoSubInfos[0].Episode != 0) || (notUploadedVideoSubInfos[0].Season != 0 && notUploadedVideoSubInfos[0].Episode == 0) {
-		ch.log.Errorln(notUploadedVideoSubInfos[0].SubName, "has Season or Episode error")
-		ch.log.Errorln("season - episode", notUploadedVideoSubInfos[0].Season, notUploadedVideoSubInfos[0].Episode)
+		ch.Logger.Errorln(notUploadedVideoSubInfos[0].SubName, "has Season or Episode error")
+		ch.Logger.Errorln("season - episode", notUploadedVideoSubInfos[0].Season, notUploadedVideoSubInfos[0].Episode)
 		// 成功,其他情况就等待 Ask for Upload
 		notUploadedVideoSubInfos[0].IsSend = true
 		dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-		ch.log.Infoln("subtitle will skip upload")
+		ch.Logger.Infoln("subtitle will skip upload")
 		return
 	} else {
 		videoType = "series"
@@ -253,7 +253,7 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 		// 需要先对这个字幕的 IMDB ID 转 TMDB ID 信息进行查询,得到 TMDB ID 和 Year (2019 2022)
 		finalQueryIMDBInfo, err = mix_media_info.GetMediaInfoAndSave(ch.FileDownloader.MediaInfoDealers, &imdbInfos[0], imdbInfos[0].IMDBID, "imdb", videoType)
 		if err != nil {
-			ch.log.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
+			ch.Logger.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
 			return
 		}
 	} else {
@@ -263,7 +263,7 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 		if len(mediaInfos) < 1 {
 			finalQueryIMDBInfo, err = mix_media_info.GetMediaInfoAndSave(ch.FileDownloader.MediaInfoDealers, &imdbInfos[0], imdbInfos[0].IMDBID, "imdb", videoType)
 			if err != nil {
-				ch.log.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
+				ch.Logger.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
 				return
 			}
 		} else {
@@ -274,24 +274,24 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 	// 如果解析这个字幕是错误的,那么也可以标记完成
 	shareRootDir, err := pkg.GetShareSubRootFolder()
 	if err != nil {
-		ch.log.Errorln("GetShareSubRootFolder error:", err.Error())
+		ch.Logger.Errorln("GetShareSubRootFolder error:", err.Error())
 		return
 	}
 	bok, _, err := ch.FileDownloader.SubParserHub.DetermineFileTypeFromFile(filepath.Join(shareRootDir, notUploadedVideoSubInfos[0].StoreRPath))
 	if err != nil {
 		notUploadedVideoSubInfos[0].IsSend = true
 		dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-		ch.log.Errorln("DetermineFileTypeFromFile upload sub error, mark is send,", err.Error())
+		ch.Logger.Errorln("DetermineFileTypeFromFile upload sub error, mark is send,", err.Error())
 		return
 	}
 	if bok == false {
 		notUploadedVideoSubInfos[0].IsSend = true
 		dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-		ch.log.Errorln("DetermineFileTypeFromFile upload sub == false, not match any SubType, mark is send")
+		ch.Logger.Errorln("DetermineFileTypeFromFile upload sub == false, not match any SubType, mark is send")
 		return
 	}
 
-	ch.log.Infoln("AskFroUpload", notUploadedVideoSubInfos[0].SubName)
+	ch.Logger.Infoln("AskFroUpload", notUploadedVideoSubInfos[0].SubName)
 	// 问询这个字幕是否上传过了,如果没有就需要进入上传的队列
 	askForUploadReply, err := ch.FileDownloader.MediaInfoDealers.SubtitleBestApi.AskFroUpload(
 		notUploadedVideoSubInfos[0].SHA256,
@@ -304,22 +304,22 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 		notUploadedVideoSubInfos[0].Feature,
 	)
 	if err != nil {
-		ch.log.Errorln(fmt.Errorf("AskFroUpload err: %v", err))
+		ch.Logger.Errorln(fmt.Errorf("AskFroUpload err: %v", err))
 		return
 	}
 	if askForUploadReply.Status == 3 {
 		// 上传过了,直接标记本地的 is_send 字段为 true
 		notUploadedVideoSubInfos[0].IsSend = true
 		dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-		ch.log.Infoln("Subtitle has been uploaded, so will not upload again")
+		ch.Logger.Infoln("Subtitle has been uploaded, so will not upload again")
 		return
 	} else if askForUploadReply.Status == 4 {
 		// 上传队列满了,等待下次定时器触发
-		ch.log.Infoln("Subtitle upload queue is full, will try ask upload again")
+		ch.Logger.Infoln("Subtitle upload queue is full, will try ask upload again")
 		return
 	} else if askForUploadReply.Status == 2 {
 		// 这个上传任务已经在队列中了,也许有其他人也需要上传这个字幕,或者本机排队的时候故障了,重启也可能遇到这个故障
-		ch.log.Infoln("Subtitle is int the queue")
+		ch.Logger.Infoln("Subtitle is int the queue")
 		return
 	} else if askForUploadReply.Status == 1 {
 		// 正确放入了队列,然后需要按规划的时间进行上传操作
@@ -331,7 +331,7 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 		if waitTime <= 0 {
 			waitTime = 5
 		}
-		ch.log.Infoln("will wait", waitTime, "s 2 upload sub 2 server")
+		ch.Logger.Infoln("will wait", waitTime, "s 2 upload sub 2 server")
 		var sleepCounter int64
 		sleepCounter = 0
 		normalStatus := false
@@ -341,33 +341,33 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 				break
 			}
 			if sleepCounter%30 == 0 {
-				ch.log.Infoln("wait 2 upload sub")
+				ch.Logger.Infoln("wait 2 upload sub")
 			}
 			time.Sleep(1 * time.Second)
 			sleepCounter++
 		}
 		if normalStatus == false || ch.cronHelperRunning == false {
 			// 说明不是正常跳出来的,是结束定时器来执行的
-			ch.log.Infoln("uploadVideoSub early termination")
+			ch.Logger.Infoln("uploadVideoSub early termination")
 			return
 		}
 		// 发送字幕
 
 		releaseTime, err := now.Parse(finalQueryIMDBInfo.Year)
 		if err != nil {
-			ch.log.Errorln("now.Parse error:", err.Error())
+			ch.Logger.Errorln("now.Parse error:", err.Error())
 			return
 		}
-		ch.log.Infoln("UploadSub", notUploadedVideoSubInfos[0].SubName)
+		ch.Logger.Infoln("UploadSub", notUploadedVideoSubInfos[0].SubName)
 		uploadSubReply, err := ch.FileDownloader.MediaInfoDealers.SubtitleBestApi.UploadLowTrustSub(&notUploadedVideoSubInfos[0], shareRootDir, finalQueryIMDBInfo.TmdbId, strconv.Itoa(releaseTime.Year()), "")
 		if err != nil {
-			ch.log.Errorln("UploadLowTrustSub error:", err.Error())
+			ch.Logger.Errorln("UploadLowTrustSub error:", err.Error())
 
 			if errors.Is(err, common.ErrorUpload413) == true {
 				// 文件发送大小超限
 				notUploadedVideoSubInfos[0].IsSend = true
 				dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-				ch.log.Infoln("subtitle upload file over size limit, will not upload again")
+				ch.Logger.Infoln("subtitle upload file over size limit, will not upload again")
 				return
 			}
 
@@ -377,7 +377,7 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 			// 成功,其他情况就等待 Ask for Upload
 			notUploadedVideoSubInfos[0].IsSend = true
 			dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-			ch.log.Infoln("subtitle is uploaded")
+			ch.Logger.Infoln("subtitle is uploaded")
 			return
 		} else if uploadSubReply.Status == 0 {
 
@@ -388,20 +388,20 @@ func (ch *CronHelper) uploadLowTrustVideoSub() {
 				strings.Contains(uploadSubReply.Message, "sub file has no chinese") == true {
 				notUploadedVideoSubInfos[0].IsSend = true
 				dao.GetDb().Save(&notUploadedVideoSubInfos[0])
-				ch.log.Infoln("subtitle upload error, uploadSubReply.Status == 0, Message:", uploadSubReply.Message, "will not upload again")
+				ch.Logger.Infoln("subtitle upload error, uploadSubReply.Status == 0, Message:", uploadSubReply.Message, "will not upload again")
 				return
 			} else {
-				ch.log.Errorln("subtitle upload error, uploadSubReply.Status == 0, not support error:", uploadSubReply.Message)
+				ch.Logger.Errorln("subtitle upload error, uploadSubReply.Status == 0, not support error:", uploadSubReply.Message)
 				return
 			}
 		} else {
-			ch.log.Warningln("UploadSub Message:", uploadSubReply.Message)
+			ch.Logger.Warningln("UploadSub Message:", uploadSubReply.Message)
 			return
 		}
 
 	} else {
 		// 不是预期的返回值,需要报警
-		ch.log.Errorln(fmt.Errorf("AskFroUpload Not the expected return value, Status: %d, Message: %v", askForUploadReply.Status, askForUploadReply.Message))
+		ch.Logger.Errorln(fmt.Errorf("AskFroUpload Not the expected return value, Status: %d, Message: %v", askForUploadReply.Status, askForUploadReply.Message))
 		return
 	}
 }

+ 1 - 1
pkg/media_info_dealers/dealers.go

@@ -29,7 +29,7 @@ func (d *Dealers) SetTmdbHelperInstance(tmdbHelper *tmdb_api.TmdbApi) {
 
 func (d *Dealers) GetMediaInfo(id, source, videoType string) (*models.MediaInfo, error) {
 
-	if d.settings.AdvancedSettings.TmdbApiSettings.Enable == true && d.settings.AdvancedSettings.TmdbApiSettings.ApiKey != "" {
+	if d.tmdbHelper != nil && d.settings.AdvancedSettings.TmdbApiSettings.Enable == true && d.settings.AdvancedSettings.TmdbApiSettings.ApiKey != "" {
 		// 优先使用用户自己的 tmdb api
 		return d.getMediaInfoFromSelfApi(id, source, videoType)
 	} else {

+ 1 - 1
pkg/settings/proxy_settings.go

@@ -85,7 +85,6 @@ func (p *ProxySettings) GetLocalHttpProxyUrl() string {
 
 func (p *ProxySettings) CloseLocalHttpProxyServer() error {
 	defer func() {
-		println("CloseLocalHttpProxyServer Done")
 		p.locker.Unlock()
 	}()
 	p.locker.Lock()
@@ -98,5 +97,6 @@ func (p *ProxySettings) CloseLocalHttpProxyServer() error {
 		return nil
 	}
 
+	println("CloseLocalHttpProxyServer Done")
 	return p.localHttpProxyServer.Stop()
 }

+ 13 - 1
pkg/tmdb_api/tmdb.go

@@ -30,6 +30,7 @@ func NewTmdbHelper(l *logrus.Logger, apiKey string, _proxySettings ...*settings.
 		return nil, err
 	}
 	tmdbClient.SetClientConfig(*restyClient.GetClient())
+	tmdbClient.SetClientAutoRetry()
 	return &TmdbApi{
 		l:          l,
 		apiKey:     apiKey,
@@ -37,6 +38,17 @@ func NewTmdbHelper(l *logrus.Logger, apiKey string, _proxySettings ...*settings.
 	}, nil
 }
 
+func (t *TmdbApi) Alive() bool {
+
+	details, err := t.tmdbClient.GetAccountDetails()
+	if err != nil {
+		t.l.Errorln("GetAccountDetails", err)
+		return false
+	}
+	t.l.Infoln("GetAccountDetails UserName:", details.Username)
+	return true
+}
+
 // GetInfo 获取视频的信息 idType: imdb_id or tmdb_id
 func (t *TmdbApi) GetInfo(iD string, idType string, isMovieOrSeries, isQueryEnOrCNInfo bool) (outFindByID *tmdb.FindByID, err error) {
 
@@ -144,7 +156,7 @@ func (t *TmdbApi) GetInfo(iD string, idType string, isMovieOrSeries, isQueryEnOr
 	return outFindByID, nil
 }
 
-func (t TmdbApi) CovertId(iD string, idType string, isMovieOrSeries bool) (convertIdResult *ConvertIdResult, err error) {
+func (t *TmdbApi) CovertId(iD string, idType string, isMovieOrSeries bool) (convertIdResult *ConvertIdResult, err error) {
 
 	if idType == ImdbID {
 		return nil, fmt.Errorf("imdb id type is not supported")