浏览代码

重构,尝试修复保存配置没有及时生效的问题

Signed-off-by: allan716 <[email protected]>
allan716 3 年之前
父节点
当前提交
76d1dfc0cd
共有 48 个文件被更改,包括 450 次插入478 次删除
  1. 17 17
      cmd/chinesesubfinder/main.go
  2. 4 4
      internal/backend/controllers/base/change_pwd.go
  3. 2 2
      internal/backend/controllers/base/check_emby_settings.go
  4. 4 4
      internal/backend/controllers/base/login.go
  5. 2 3
      internal/backend/controllers/base/path_things.go
  6. 12 10
      internal/backend/controllers/base/proxy.go
  7. 1 1
      internal/backend/controllers/base/setup.go
  8. 1 1
      internal/backend/controllers/base/system_status.go
  9. 3 1
      internal/backend/controllers/base/tmdb_api.go
  10. 4 2
      internal/backend/controllers/v1/controller_base.go
  11. 4 18
      internal/backend/controllers/v1/settings.go
  12. 1 4
      pkg/cache_center/cache_center.go
  13. 6 4
      pkg/cache_center/download_file_info.go
  14. 3 3
      pkg/cache_center/download_file_info_test.go
  15. 10 8
      pkg/downloader/download_processer.go
  16. 8 10
      pkg/downloader/downloader.go
  17. 6 5
      pkg/downloader/downloader_things.go
  18. 3 2
      pkg/downloader/queue_cloud.go
  19. 2 1
      pkg/downloader/queue_local.go
  20. 55 65
      pkg/emby_api/emby_api.go
  21. 14 15
      pkg/logic/cron_helper/cron_helper.go
  22. 70 70
      pkg/logic/emby_helper/embyhelper.go
  23. 7 8
      pkg/logic/file_downloader/downloader_hub.go
  24. 14 17
      pkg/logic/pre_download_process/pre_download_proces.go
  25. 17 22
      pkg/logic/scan_played_video_subinfo/scan_played_video_subinfo.go
  26. 14 16
      pkg/logic/sub_supplier/a4k/a4k.go
  27. 3 3
      pkg/logic/sub_supplier/a4k/a4k_test.go
  28. 21 23
      pkg/logic/sub_supplier/assrt/assrt.go
  29. 1 2
      pkg/logic/sub_supplier/assrt/assrt_test.go
  30. 8 10
      pkg/logic/sub_supplier/csf/csf.go
  31. 2 2
      pkg/logic/sub_supplier/csf/csf_test.go
  32. 6 8
      pkg/logic/sub_supplier/shooter/shooter.go
  33. 1 2
      pkg/logic/sub_supplier/shooter/shooter_test.go
  34. 4 5
      pkg/logic/sub_supplier/subhd/subhd_test.go
  35. 6 8
      pkg/logic/sub_supplier/xunlei/xunlei.go
  36. 1 2
      pkg/logic/sub_supplier/xunlei/xunlei_test.go
  37. 2 2
      pkg/logic/sub_supplier/zimuku/zimuku_test.go
  38. 4 5
      pkg/media_info_dealers/dealers.go
  39. 1 1
      pkg/rod_helper/multi_browser_test.go
  40. 1 1
      pkg/rod_helper/rod_base.go
  41. 11 12
      pkg/save_sub_helper/save_sub_helper.go
  42. 34 8
      pkg/settings/settings.go
  43. 13 15
      pkg/subtitle_best_api/subtitle_best_api.go
  44. 1 1
      pkg/subtitle_best_api/subtitle_best_api_test.go
  45. 9 8
      pkg/task_queue/get.go
  46. 2 4
      pkg/task_queue/task_queue.go
  47. 6 7
      pkg/task_queue/task_queue_test.go
  48. 29 36
      pkg/video_scan_and_refresh_helper/video_scan_and_refresh_helper.go

+ 17 - 17
cmd/chinesesubfinder/main.go

@@ -41,7 +41,7 @@ func newLog() *logrus.Logger {
 		log_helper.LogNameChineseSubFinder,
 		pkg.ConfigRootDirFPath(),
 		level, time.Duration(7*24)*time.Hour, time.Duration(24)*time.Hour,
-		settings.GetSettings().ExperimentalFunction.ExtendLog)
+		settings.Get().ExperimentalFunction.ExtendLog)
 	logger.AddHook(log_helper.NewLoggerHub())
 
 	return logger
@@ -78,13 +78,13 @@ func init() {
 	}
 	// --------------------------------------------------
 	// 初始化设备的信息
-	dao.UpdateInfo(AppVersion, settings.GetSettings())
+	dao.UpdateInfo(AppVersion, settings.Get())
 
 	// 砍掉,启动就进行扫描的逻辑
-	settings.GetSettings().CommonSettings.RunScanAtStartUp = false
-	err := settings.GetSettings().Save()
+	settings.Get().CommonSettings.RunScanAtStartUp = false
+	err := settings.Get().Save()
 	if err != nil {
-		loggerBase.Panicln("settings.GetSettings().Save() err:", err)
+		loggerBase.Panicln("settings.Get().Save() err:", err)
 	}
 }
 
@@ -92,7 +92,7 @@ func main() {
 
 	// ------------------------------------------------------------------------
 	// 如果是 Debug 模式,那么就需要写入特殊文件
-	if settings.GetSettings().AdvancedSettings.DebugMode == true {
+	if settings.Get().AdvancedSettings.DebugMode == true {
 		err := log_helper.WriteDebugFile()
 		if err != nil {
 			loggerBase.Errorln("log_helper.WriteDebugFile " + err.Error())
@@ -119,20 +119,20 @@ func main() {
 
 	// ------------------------------------------------------------------------
 	// 设置接口的 API TOKEN
-	if settings.GetSettings().ExperimentalFunction.ApiKeySettings.Enabled == true {
-		common.SetApiToken(settings.GetSettings().ExperimentalFunction.ApiKeySettings.Key)
+	if settings.Get().ExperimentalFunction.ApiKeySettings.Enabled == true {
+		common.SetApiToken(settings.Get().ExperimentalFunction.ApiKeySettings.Key)
 	} else {
 		common.SetApiToken("")
 	}
 	// 是否开启开发模式,跳过某些流程
-	settings.GetSettings().SpeedDevMode = true
-	if settings.GetSettings().SpeedDevMode == true {
+	settings.Get().SpeedDevMode = true
+	if settings.Get().SpeedDevMode == true {
 		loggerBase.Infoln("Speed Dev Mode is On")
 		pkg.SetLiteMode(true)
 	} else {
 		loggerBase.Infoln("Speed Dev Mode is Off")
 	}
-	if settings.GetSettings().AdvancedSettings.DebugMode == true {
+	if settings.Get().AdvancedSettings.DebugMode == true {
 		// 如果是 DebugMode 那么开启性能监控
 		go func() {
 			// 开启pprof,监听请求
@@ -144,8 +144,8 @@ func main() {
 	}
 	// ------------------------------------------------------------------------
 	// 前置的任务,热修复、字幕修改文件名格式、提前下载好浏览器
-	if settings.GetSettings().SpeedDevMode == false {
-		pj := pre_job.NewPreJob(settings.GetSettings(), loggerBase)
+	if settings.Get().SpeedDevMode == false {
+		pj := pre_job.NewPreJob(settings.Get(), loggerBase)
 
 		if pkg.LiteMode() == true {
 			// 不启用 Chrome 相关操作
@@ -164,7 +164,7 @@ func main() {
 	}
 	// ----------------------------------------------
 	fileDownloader := file_downloader.NewFileDownloader(
-		cache_center.NewCacheCenter("local_task_queue", settings.GetSettings(), loggerBase),
+		cache_center.NewCacheCenter("local_task_queue", loggerBase),
 		random_auth_key.AuthKey{
 			BaseKey:  pkg.BaseKey(),
 			AESKey16: pkg.AESKey16(),
@@ -172,14 +172,14 @@ func main() {
 		})
 	// ----------------------------------------------
 	cronHelper := cron_helper.NewCronHelper(fileDownloader)
-	if settings.GetSettings().UserInfo.Username == "" || settings.GetSettings().UserInfo.Password == "" {
+	if settings.Get().UserInfo.Username == "" || settings.Get().UserInfo.Password == "" {
 		// 如果没有完成,那么就不开启
 		loggerBase.Infoln("Need do Setup")
 	} else {
 		// 是否完成了 Setup,如果完成了,那么就开启第一次的扫描
 		go func() {
 			loggerBase.Infoln("Setup is Done")
-			cronHelper.Start(settings.GetSettings().CommonSettings.RunScanAtStartUp)
+			cronHelper.Start(settings.Get().CommonSettings.RunScanAtStartUp)
 		}()
 	}
 
@@ -188,7 +188,7 @@ func main() {
 	// 支持在外部配置特殊的端口号,以防止本地本占用了无法使用
 	restartSignal := make(chan interface{}, 1)
 	defer close(restartSignal)
-	bend := backend.NewBackEnd(loggerBase, settings.GetSettings(), cronHelper, nowPort, restartSignal)
+	bend := backend.NewBackEnd(loggerBase, settings.Get(), cronHelper, nowPort, restartSignal)
 	go bend.Restart()
 	restartSignal <- 1
 	// 阻塞

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

@@ -24,19 +24,19 @@ func (cb *ControllerBase) ChangePwdHandler(c *gin.Context) {
 		return
 	}
 
-	if settings.GetSettings().UserInfo.Username == "" || settings.GetSettings().UserInfo.Password == "" {
+	if settings.Get().UserInfo.Username == "" || settings.Get().UserInfo.Password == "" {
 		// 配置文件中的账号和密码任意一个未空,提示用户需要进行 setup 流程
 		c.JSON(http.StatusNoContent, backend2.ReplyCommon{Message: "You need do `Setup`"})
 		return
 	}
 
-	if settings.GetSettings().UserInfo.Password != changePwd.OrgPwd {
+	if settings.Get().UserInfo.Password != changePwd.OrgPwd {
 		// 原始的密码不对
 		c.JSON(http.StatusNoContent, backend2.ReplyCommon{Message: "Org Password Error"})
 	} else {
 		// 同意修改密码
-		settings.GetSettings().UserInfo.Password = changePwd.NewPwd
-		err = settings.GetSettings().Save()
+		settings.Get().UserInfo.Password = changePwd.NewPwd
+		err = settings.Get().Save()
 		if err != nil {
 			return
 		}

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

@@ -32,8 +32,8 @@ func (cb *ControllerBase) CheckEmbySettingsHandler(c *gin.Context) {
 		SeriesPathsMapping:    make(map[string]string, 0),
 	}
 
-	emHelper := emby_helper.NewEmbyHelper(cb.fileDownloader.MediaInfoDealers, &settings.Settings{EmbySettings: &emSettings})
-	userList, err := emHelper.EmbyApi.GetUserIdList()
+	emHelper := emby_helper.NewEmbyHelper(cb.fileDownloader.MediaInfoDealers)
+	userList, err := emHelper.EmbyApi.GetUserIdList(&emSettings)
 	if err != nil {
 		return
 	}

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

@@ -25,14 +25,14 @@ func (cb *ControllerBase) LoginHandler(c *gin.Context) {
 		return
 	}
 
-	if settings.GetSettings().UserInfo.Username == "" || settings.GetSettings().UserInfo.Password == "" {
+	if settings.Get().UserInfo.Username == "" || settings.Get().UserInfo.Password == "" {
 		// 配置文件中的账号和密码任意一个未空,提示用户需要进行 setup 流程
 		c.JSON(http.StatusNoContent, backend2.ReplyCommon{Message: "You need do `Setup`"})
 		return
 	}
 
-	if settings.GetSettings().UserInfo.Username != nowUserInfo.Username ||
-		settings.GetSettings().UserInfo.Password != nowUserInfo.Password {
+	if settings.Get().UserInfo.Username != nowUserInfo.Username ||
+		settings.Get().UserInfo.Password != nowUserInfo.Password {
 		// 账号密码不匹配
 		c.JSON(http.StatusBadRequest, backend2.ReplyCommon{Message: "Username or Password Error"})
 		return
@@ -41,7 +41,7 @@ func (cb *ControllerBase) LoginHandler(c *gin.Context) {
 		nowAccessToken := pkg.GenerateAccessToken()
 		common.SetAccessToken(nowAccessToken)
 		c.JSON(http.StatusOK, backend2.ReplyLogin{AccessToken: nowAccessToken,
-			Settings: *settings.GetSettings().GetNoPasswordSettings()})
+			Settings: *settings.Get().GetNoPasswordSettings()})
 		return
 	}
 }

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

@@ -66,9 +66,8 @@ func (cb *ControllerBase) CheckEmbyPathHandler(c *gin.Context) {
 		emSettings.SeriesPathsMapping[reqCheckPath.CFSMediaPath] = reqCheckPath.EmbyMediaPath
 	}
 
-	emHelper := emby_helper.NewEmbyHelper(cb.fileDownloader.MediaInfoDealers, &settings.Settings{EmbySettings: &emSettings})
-
-	outList, err := emHelper.CheckPath(reqCheckPath.PathType)
+	emHelper := emby_helper.NewEmbyHelper(cb.fileDownloader.MediaInfoDealers)
+	outList, err := emHelper.CheckPath(&emSettings, reqCheckPath.PathType, emSettings.MaxRequestVideoNumber)
 	if err != nil {
 		return
 	}

+ 12 - 10
internal/backend/controllers/base/proxy.go

@@ -3,6 +3,8 @@ package base
 import (
 	"net/http"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/logic/sub_supplier/a4k"
 
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/backend"
@@ -35,15 +37,15 @@ func (cb *ControllerBase) CheckProxyHandler(c *gin.Context) {
 	}
 
 	// 先尝试关闭之前的本地 http 代理
-	err = cb.fileDownloader.Settings.AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
+	err = settings.Get().AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
 	if err != nil {
 		return
 	}
 	// 备份一份
-	bkProxySettings := cb.fileDownloader.Settings.AdvancedSettings.ProxySettings.CopyOne()
+	bkProxySettings := settings.Get().AdvancedSettings.ProxySettings.CopyOne()
 	// 赋值 Web 传递过来的需要测试的代理参数
-	cb.fileDownloader.Settings.AdvancedSettings.ProxySettings = &checkProxy.ProxySettings
-	cb.fileDownloader.Settings.AdvancedSettings.ProxySettings.UseProxy = true
+	settings.Get().AdvancedSettings.ProxySettings = &checkProxy.ProxySettings
+	settings.Get().AdvancedSettings.ProxySettings.UseProxy = true
 
 	// 使用提交过来的这个代理地址,测试多个字幕网站的可用性
 	subSupplierHub := subSupplier.NewSubSupplierHub(
@@ -55,18 +57,18 @@ func (cb *ControllerBase) CheckProxyHandler(c *gin.Context) {
 		a4k.NewSupplier(cb.fileDownloader),
 	)
 
-	if cb.fileDownloader.Settings.SubtitleSources.AssrtSettings.Enabled == true &&
-		cb.fileDownloader.Settings.SubtitleSources.AssrtSettings.Token != "" {
+	if settings.Get().SubtitleSources.AssrtSettings.Enabled == true &&
+		settings.Get().SubtitleSources.AssrtSettings.Token != "" {
 		// 如果开启了 ASSRt 字幕源,则需要测试 ASSRt 的代理
 		subSupplierHub.AddSubSupplier(assrt.NewSupplier(cb.fileDownloader))
 	}
 
-	if cb.fileDownloader.Settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
+	if settings.Get().ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
 		// 如果开启了分享字幕功能,那么就可以开启这个功能
 		subSupplierHub.AddSubSupplier(csf.NewSupplier(cb.fileDownloader))
 	}
 
-	outStatus := subSupplierHub.CheckSubSiteStatus(cb.fileDownloader.Settings.AdvancedSettings.ProxySettings)
+	outStatus := subSupplierHub.CheckSubSiteStatus(settings.Get().AdvancedSettings.ProxySettings)
 
 	defer func() {
 		// 还原
@@ -74,9 +76,9 @@ func (cb *ControllerBase) CheckProxyHandler(c *gin.Context) {
 		if err != nil {
 			return
 		}
-		cb.fileDownloader.Settings.AdvancedSettings.ProxySettings = bkProxySettings
+		settings.Get().AdvancedSettings.ProxySettings = bkProxySettings
 		cb.proxyCheckLocker.Unlock()
-		err = cb.fileDownloader.Settings.AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
+		err = settings.Get().AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
 		if err != nil {
 			return
 		}

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

@@ -23,7 +23,7 @@ func (cb *ControllerBase) SetupHandler(c *gin.Context) {
 	}
 	// 只有当用户不存在的时候才能够执行初始化操作
 	found := false
-	if settings.GetSettings().UserInfo.Username != "" && settings.GetSettings().UserInfo.Password != "" {
+	if settings.Get().UserInfo.Username != "" && settings.Get().UserInfo.Password != "" {
 		found = true
 	}
 

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

@@ -22,7 +22,7 @@ func (cb *ControllerBase) SystemStatusHandler(c *gin.Context) {
 	}()
 
 	isSetup := false
-	if settings.GetSettings().UserInfo.Username != "" && settings.GetSettings().UserInfo.Password != "" {
+	if settings.Get().UserInfo.Username != "" && settings.Get().UserInfo.Password != "" {
 		// 进行过 setup 了,那么就可以 Login 的流程
 		isSetup = true
 	}

+ 3 - 1
internal/backend/controllers/base/tmdb_api.go

@@ -3,6 +3,8 @@ package base
 import (
 	"net/http"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/tmdb_api"
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/backend"
 	"github.com/gin-gonic/gin"
@@ -26,7 +28,7 @@ func (cb *ControllerBase) CheckTmdbApiHandler(c *gin.Context) {
 	}
 	tmdbApi, err := tmdb_api.NewTmdbHelper(cb.fileDownloader.Log,
 		req.ApiKey,
-		cb.fileDownloader.Settings.AdvancedSettings.ProxySettings)
+		settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		cb.fileDownloader.Log.Errorln("NewTmdbHelper", err)
 		return

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

@@ -3,6 +3,8 @@ package v1
 import (
 	"net/http"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/video_list_helper"
 
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/backend"
@@ -34,9 +36,9 @@ func NewControllerBase(cronHelper *cron_helper.CronHelper, restartSignal chan in
 		pathUrlMap: make(map[string]string),
 		// 这里因为不进行任务的添加,仅仅是扫描,所以 downloadQueue 可以为 nil
 		videoScanAndRefreshHelper: video_scan_and_refresh_helper.NewVideoScanAndRefreshHelper(
-			sub_formatter.GetSubFormatter(cronHelper.Logger, cronHelper.Settings.AdvancedSettings.SubNameFormatter),
+			sub_formatter.GetSubFormatter(cronHelper.Logger, settings.Get().AdvancedSettings.SubNameFormatter),
 			cronHelper.FileDownloader, nil),
-		videoListHelper:                 video_list_helper.NewVideoListHelper(cronHelper.Logger, cronHelper.Settings),
+		videoListHelper:                 video_list_helper.NewVideoListHelper(cronHelper.Logger, settings.Get()),
 		videoScanAndRefreshHelperLocker: lock.NewLock(),
 		restartSignal:                   restartSignal,
 	}

+ 4 - 18
internal/backend/controllers/v1/settings.go

@@ -21,7 +21,7 @@ func (cb *ControllerBase) SettingsHandler(c *gin.Context) {
 	case "GET":
 		{
 			// 回复没有密码的 settings
-			c.JSON(http.StatusOK, settings.GetSettings().GetNoPasswordSettings())
+			c.JSON(http.StatusOK, settings.Get().GetNoPasswordSettings())
 		}
 	case "PUT":
 		{
@@ -32,34 +32,20 @@ func (cb *ControllerBase) SettingsHandler(c *gin.Context) {
 				return
 			}
 			// 需要去除 user 的 password 信息再保存,也就是继承之前的 password 即可
-			err = settings.GetSettings().Read()
-			if err != nil {
-				return
-			}
-			nowPassword := settings.GetSettings().UserInfo.Password
+			nowPassword := settings.Get().UserInfo.Password
 			reqSetupInfo.UserInfo.Password = nowPassword
 			err = settings.SetFullNewSettings(&reqSetupInfo)
 			if err != nil {
 				return
 			}
-			err = settings.GetSettings().Save()
-			if err != nil {
-				return
-			}
 			// ----------------------------------------
 			// 设置接口的 API TOKEN
-			if settings.GetSettings().ExperimentalFunction.ApiKeySettings.Enabled == true {
-				common.SetApiToken(settings.GetSettings().ExperimentalFunction.ApiKeySettings.Key)
+			if settings.Get().ExperimentalFunction.ApiKeySettings.Enabled == true {
+				common.SetApiToken(settings.Get().ExperimentalFunction.ApiKeySettings.Key)
 			} else {
 				common.SetApiToken("")
 			}
 			// ----------------------------------------
-			// 不管如何,都进行一次代理服务器的关闭,然后开启由具体的 获取 ProxySettings GetLocalHttpProxyUrl 操作开启这个服务器
-			err = settings.GetSettings().AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
-			if err != nil {
-				return
-			}
-
 			c.JSON(http.StatusOK, backend.ReplyCommon{Message: "Settings Save Success"})
 			// 回复完毕后,发送重启 http server 的信号
 			cb.restartSignal <- 1

+ 1 - 4
pkg/cache_center/cache_center.go

@@ -9,14 +9,12 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/pkg"
 
 	"github.com/allanpk716/ChineseSubFinder/pkg/cache_center/models"
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 	"github.com/sirupsen/logrus"
 	"gorm.io/driver/sqlite"
 	"gorm.io/gorm"
 )
 
 type CacheCenter struct {
-	Settings                 *settings.Settings
 	Log                      *logrus.Logger
 	centerFolder             string
 	downloadFileSaveRootPath string
@@ -27,10 +25,9 @@ type CacheCenter struct {
 	locker                   sync.Mutex
 }
 
-func NewCacheCenter(cacheName string, Settings *settings.Settings, Log *logrus.Logger) *CacheCenter {
+func NewCacheCenter(cacheName string, Log *logrus.Logger) *CacheCenter {
 
 	c := CacheCenter{}
-	c.Settings = Settings
 	c.Log = Log
 	var err error
 	c.centerFolder, err = pkg.GetRootCacheCenterFolder()

+ 6 - 4
pkg/cache_center/download_file_info.go

@@ -7,6 +7,8 @@ import (
 	"path/filepath"
 	"time"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg"
 
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/supplier"
@@ -23,11 +25,11 @@ func (c *CacheCenter) DownloadFileAdd(subInfo *supplier.SubInfo) error {
 	}
 
 	// 只支持秒或者小时为单位
-	tmpTTL := time.Duration(c.Settings.AdvancedSettings.DownloadFileCache.TTL) * time.Second
-	if c.Settings.AdvancedSettings.DownloadFileCache.Unit == "hour" {
-		tmpTTL = time.Duration(c.Settings.AdvancedSettings.DownloadFileCache.TTL) * time.Hour
+	tmpTTL := time.Duration(settings.Get().AdvancedSettings.DownloadFileCache.TTL) * time.Second
+	if settings.Get().AdvancedSettings.DownloadFileCache.Unit == "hour" {
+		tmpTTL = time.Duration(settings.Get().AdvancedSettings.DownloadFileCache.TTL) * time.Hour
 	} else {
-		tmpTTL = time.Duration(c.Settings.AdvancedSettings.DownloadFileCache.TTL) * time.Second
+		tmpTTL = time.Duration(settings.Get().AdvancedSettings.DownloadFileCache.TTL) * time.Second
 	}
 
 	b, err := json.Marshal(subInfo)

+ 3 - 3
pkg/cache_center/download_file_info_test.go

@@ -1,16 +1,16 @@
 package cache_center
 
 import (
+	"testing"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/language"
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/supplier"
-	"testing"
 
 	"github.com/allanpk716/ChineseSubFinder/pkg/log_helper"
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 )
 
 func TestCacheCenter_DownloadFileAdd(t *testing.T) {
-	cc := NewCacheCenter("testFile", settings.GetSettings(), log_helper.GetLogger4Tester())
+	cc := NewCacheCenter("testFile", log_helper.GetLogger4Tester())
 
 	subInfo := supplier.NewSubInfo(
 		"test",

+ 10 - 8
pkg/downloader/download_processer.go

@@ -5,6 +5,8 @@ import (
 	"fmt"
 	"path/filepath"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg"
 
 	taskQueue2 "github.com/allanpk716/ChineseSubFinder/pkg/types/task_queue"
@@ -47,16 +49,16 @@ func (d *Downloader) movieDlFunc(ctx context.Context, job taskQueue2.OneJob, dow
 	d.downloadQueue.AutoDetectUpdateJobStatus(job, nil)
 
 	// TODO 刷新字幕,这里是 Emby 的,如果是其他的,需要再对接对应的媒体服务器
-	if d.settings.EmbySettings.Enable == true && d.embyHelper != nil && job.MediaServerInsideVideoID != "" {
+	if settings.Get().EmbySettings.Enable == true && d.embyHelper != nil && job.MediaServerInsideVideoID != "" {
 
 		d.log.Infoln("字幕下载完毕,尝试刷新 Emby 中对应字幕", job.VideoFPath, job.MediaServerInsideVideoID)
-		err = d.embyHelper.EmbyApi.UpdateVideoSubList(job.MediaServerInsideVideoID)
+		err = d.embyHelper.EmbyApi.UpdateVideoSubList(settings.Get().EmbySettings, job.MediaServerInsideVideoID)
 		if err != nil {
 			d.log.Errorln("UpdateVideoSubList", job.VideoFPath, job.MediaServerInsideVideoID, "Error:", err)
 			return err
 		}
 	} else {
-		if d.settings.EmbySettings.Enable == false {
+		if settings.Get().EmbySettings.Enable == false {
 			d.log.Infoln("字幕下载完毕,尝试刷新 Emby 中对应字幕", job.VideoFPath, "Skip, because Emby enable is false")
 		} else if d.embyHelper == nil {
 			d.log.Infoln("字幕下载完毕,尝试刷新 Emby 中对应字幕", job.VideoFPath, "Skip, because EmbyHelper is nil")
@@ -82,10 +84,10 @@ func (d *Downloader) seriesDlFunc(ctx context.Context, job taskQueue2.OneJob, do
 	// 这里拿到了这一部连续剧的所有的剧集信息,以及所有下载到的字幕信息
 	seriesInfo, err := series_helper.ReadSeriesInfoFromDir(
 		d.fileDownloader.MediaInfoDealers, job.SeriesRootDirPath,
-		d.settings.AdvancedSettings.TaskQueue.ExpirationTime,
+		settings.Get().AdvancedSettings.TaskQueue.ExpirationTime,
 		false,
 		false,
-		d.settings.AdvancedSettings.ProxySettings,
+		settings.Get().AdvancedSettings.ProxySettings,
 		epsMap)
 	if err != nil {
 		err = errors.New(fmt.Sprintf("seriesDlFunc.ReadSeriesInfoFromDir, Error: %v", err))
@@ -213,7 +215,7 @@ func (d *Downloader) seriesDlFunc(ctx context.Context, job taskQueue2.OneJob, do
 		}
 	}
 	// 是否清理全季的缓存字幕文件夹
-	if d.settings.AdvancedSettings.SaveFullSeasonTmpSubtitles == false {
+	if settings.Get().AdvancedSettings.SaveFullSeasonTmpSubtitles == false {
 		err = sub_helper.DeleteOneSeasonSubCacheFolder(seriesInfo.DirPath)
 		if err != nil {
 			d.log.Errorln("seriesDlFunc.DeleteOneSeasonSubCacheFolder", err)
@@ -228,11 +230,11 @@ func (d *Downloader) seriesDlFunc(ctx context.Context, job taskQueue2.OneJob, do
 	// 哪怕有一个写入到本地成功了,也无需对本次任务报错
 	d.downloadQueue.AutoDetectUpdateJobStatus(job, nil)
 	// TODO 刷新字幕,这里是 Emby 的,如果是其他的,需要再对接对应的媒体服务器
-	if d.settings.EmbySettings.Enable == true && d.embyHelper != nil {
+	if settings.Get().EmbySettings.Enable == true && d.embyHelper != nil {
 
 		if job.MediaServerInsideVideoID != "" {
 			d.log.Infoln("字幕下载完毕,尝试刷新 Emby 中对应字幕", job.SeriesRootDirPath, job.MediaServerInsideVideoID, job.Season, job.Episode)
-			err = d.embyHelper.EmbyApi.UpdateVideoSubList(job.MediaServerInsideVideoID)
+			err = d.embyHelper.EmbyApi.UpdateVideoSubList(settings.Get().EmbySettings, job.MediaServerInsideVideoID)
 			if err != nil {
 				d.log.Errorln("UpdateVideoSubList", job.SeriesRootDirPath, job.MediaServerInsideVideoID, job.Season, job.Episode, "Error:", err)
 				return err

+ 8 - 10
pkg/downloader/downloader.go

@@ -33,7 +33,6 @@ import (
 
 // Downloader 实例化一次用一次,不要反复的使用,很多临时标志位需要清理。
 type Downloader struct {
-	settings                 *settings.Settings
 	log                      *logrus.Logger
 	fileDownloader           *file_downloader.FileDownloader
 	ctx                      context.Context
@@ -65,9 +64,8 @@ func NewDownloader(inSubFormatter ifaces.ISubFormatter, fileDownloader *file_dow
 	downloader.fileDownloader = fileDownloader
 	downloader.log = fileDownloader.Log
 	// 参入设置信息
-	downloader.settings = fileDownloader.Settings
 	// 检测是否某些参数超出范围
-	downloader.settings.Check()
+	settings.Get().Check()
 	// 这里就不单独弄一个 settings.SubNameFormatter 字段来传递值了,因为 inSubFormatter 就已经知道是什么 formatter 了
 	downloader.subNameFormatter = subCommon.FormatterName(downloader.subFormatter.GetFormatterFormatterName())
 
@@ -80,12 +78,12 @@ func NewDownloader(inSubFormatter ifaces.ISubFormatter, fileDownloader *file_dow
 	sitesSequence = append(sitesSequence, common2.SubSiteA4K)
 	sitesSequence = append(sitesSequence, common2.SubSiteShooter)
 	sitesSequence = append(sitesSequence, common2.SubSiteXunLei)
-	downloader.mk = markSystem.NewMarkingSystem(downloader.log, sitesSequence, downloader.settings.AdvancedSettings.SubTypePriority)
+	downloader.mk = markSystem.NewMarkingSystem(downloader.log, sitesSequence, settings.Get().AdvancedSettings.SubTypePriority)
 
 	// 初始化,字幕校正的实例
-	downloader.subTimelineFixerHelperEx = sub_timeline_fixer.NewSubTimelineFixerHelperEx(downloader.log, *downloader.settings.TimelineFixerSettings)
+	downloader.subTimelineFixerHelperEx = sub_timeline_fixer.NewSubTimelineFixerHelperEx(downloader.log, *settings.Get().TimelineFixerSettings)
 
-	if downloader.settings.AdvancedSettings.FixTimeLine == true {
+	if settings.Get().AdvancedSettings.FixTimeLine == true {
 		downloader.subTimelineFixerHelperEx.Check()
 	}
 	// 任务队列
@@ -93,15 +91,15 @@ func NewDownloader(inSubFormatter ifaces.ISubFormatter, fileDownloader *file_dow
 	// 单个任务的超时设置
 	downloader.ctx, downloader.cancel = context.WithCancel(context.Background())
 	// 用于字幕下载后的刷新
-	if downloader.settings.EmbySettings.Enable == true {
-		downloader.embyHelper = embyHelper.NewEmbyHelper(downloader.fileDownloader.MediaInfoDealers, downloader.settings)
+	if settings.Get().EmbySettings.Enable == true {
+		downloader.embyHelper = embyHelper.NewEmbyHelper(downloader.fileDownloader.MediaInfoDealers)
 	}
 
 	downloader.ScanLogic = scan_logic.NewScanLogic(downloader.log)
 
 	downloader.SaveSubHelper = save_sub_helper.NewSaveSubHelper(
 		downloader.log,
-		downloader.settings, downloader.subFormatter,
+		downloader.subFormatter,
 		downloader.subTimelineFixerHelperEx)
 
 	downloader.ManualUploadSub2Local = manual_upload_sub_2_local.NewManualUploadSub2Local(downloader.log, downloader.SaveSubHelper, downloader.ScanLogic)
@@ -150,7 +148,7 @@ func (d *Downloader) SupplierCheck() {
 	// 下载前的初始化
 	d.log.Infoln("PreDownloadProcess.Init().Check().Wait()...")
 
-	if d.settings.SpeedDevMode == true {
+	if settings.Get().SpeedDevMode == true {
 		// 这里是调试使用的,指定了只用一个字幕源
 		//subSupplierHub := subSupplier.NewSubSupplierHub(csf.NewSupplier(d.fileDownloader))
 		subSupplierHub := subSupplier.NewSubSupplierHub(assrt.NewSupplier(d.fileDownloader))

+ 6 - 5
pkg/downloader/downloader_things.go

@@ -7,6 +7,7 @@ import (
 
 	"github.com/allanpk716/ChineseSubFinder/pkg"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/common"
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/series"
 	"github.com/allanpk716/ChineseSubFinder/pkg/types/subparser"
@@ -29,7 +30,7 @@ func (d *Downloader) oneVideoSelectBestSub(oneVideoFullPath string, organizeSubF
 	videoFileName := filepath.Base(oneVideoFullPath)
 	// -------------------------------------------------
 	// 调试缓存,把下载好的字幕写到对应的视频目录下,方便调试
-	if d.settings.AdvancedSettings.DebugMode == true {
+	if settings.Get().AdvancedSettings.DebugMode == true {
 
 		err = pkg.CopyFiles2DebugFolder([]string{videoFileName}, organizeSubFiles)
 		if err != nil {
@@ -50,7 +51,7 @@ func (d *Downloader) oneVideoSelectBestSub(oneVideoFullPath string, organizeSubF
 		// 找个错误可以忍
 		d.log.Errorln("SearchVideoMatchSubFileAndRemoveExtMark,", oneVideoFullPath, err)
 	}
-	if d.settings.AdvancedSettings.SaveMultiSub == false {
+	if settings.Get().AdvancedSettings.SaveMultiSub == false {
 		// 选择最优的一个字幕
 		var finalSubFile *subparser.FileInfo
 		finalSubFile = d.mk.SelectOneSubFile(organizeSubFiles)
@@ -72,7 +73,7 @@ func (d *Downloader) oneVideoSelectBestSub(oneVideoFullPath string, organizeSubF
 		// 找到了,写入文件
 		err = d.SaveSubHelper.WriteSubFile2VideoPath(oneVideoFullPath, *finalSubFile, "", bSetDefault, false)
 		if err != nil {
-			return errors.New(fmt.Sprintf("SaveMultiSub: %v, writeSubFile2VideoPath, Error: %v ", d.settings.AdvancedSettings.SaveMultiSub, err))
+			return errors.New(fmt.Sprintf("SaveMultiSub: %v, writeSubFile2VideoPath, Error: %v ", settings.Get().AdvancedSettings.SaveMultiSub, err))
 		}
 	} else {
 		// 每个网站 Top1 的字幕
@@ -97,7 +98,7 @@ func (d *Downloader) oneVideoSelectBestSub(oneVideoFullPath string, organizeSubF
 				}
 				err = d.SaveSubHelper.WriteSubFile2VideoPath(oneVideoFullPath, file, siteNames[i], setDefault, false)
 				if err != nil {
-					return errors.New(fmt.Sprintf("SaveMultiSub: %v, writeSubFile2VideoPath, Error: %v ", d.settings.AdvancedSettings.SaveMultiSub, err))
+					return errors.New(fmt.Sprintf("SaveMultiSub: %v, writeSubFile2VideoPath, Error: %v ", settings.Get().AdvancedSettings.SaveMultiSub, err))
 				}
 			}
 		} else {
@@ -111,7 +112,7 @@ func (d *Downloader) oneVideoSelectBestSub(oneVideoFullPath string, organizeSubF
 			for i := len(finalSubFiles) - 1; i > -1; i-- {
 				err = d.SaveSubHelper.WriteSubFile2VideoPath(oneVideoFullPath, finalSubFiles[i], siteNames[i], false, false)
 				if err != nil {
-					return errors.New(fmt.Sprintf("SaveMultiSub: %v, writeSubFile2VideoPath, Error: %v ", d.settings.AdvancedSettings.SaveMultiSub, err))
+					return errors.New(fmt.Sprintf("SaveMultiSub: %v, writeSubFile2VideoPath, Error: %v ", settings.Get().AdvancedSettings.SaveMultiSub, err))
 				}
 			}
 		}

+ 3 - 2
pkg/downloader/queue_cloud.go

@@ -2,12 +2,13 @@ package downloader
 
 import (
 	"github.com/allanpk716/ChineseSubFinder/pkg"
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 )
 
 func (d *Downloader) queueDownloaderCloud() {
 
 	if pkg.LiteMode() == true ||
-		d.settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == false ||
+		settings.Get().ExperimentalFunction.ShareSubSettings.ShareSubEnabled == false ||
 		d.needSkipCloudTask == true {
 		// Lite 版本无法执行复杂的任务,因为没有浏览器
 		// 如果没有开启共享字幕也不会触发获取云端任务的逻辑
@@ -15,7 +16,7 @@ func (d *Downloader) queueDownloaderCloud() {
 	}
 
 	// 查询云端是否有任务
-	//nowInfo := dao.UpdateInfo(global_value.AppVersion(), d.settings)
+	//nowInfo := dao.UpdateInfo(global_value.AppVersion(), settings.Get())
 	//askDownloadTaskReply, err := d.fileDownloader.SubtitleBestApi.AskDownloadTask(nowInfo.Id)
 	//if err != nil {
 	//	d.log.Errorf("queueDownloaderCloud AskDownloadTask error: %v", err)

+ 2 - 1
pkg/downloader/queue_local.go

@@ -2,6 +2,7 @@ package downloader
 
 import (
 	"fmt"
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 
 	"github.com/allanpk716/ChineseSubFinder/pkg"
 
@@ -133,7 +134,7 @@ func (d *Downloader) queueDownloaderLocal() {
 		isPlayed := false
 		if d.embyHelper != nil {
 			// 在拿出来后,如果是有内部媒体服务器媒体 ID 的,那么就去查询是否已经观看过了
-			isPlayed, err = d.embyHelper.IsVideoPlayed(oneJob.MediaServerInsideVideoID)
+			isPlayed, err = d.embyHelper.IsVideoPlayed(settings.Get().EmbySettings, oneJob.MediaServerInsideVideoID)
 			if err != nil {
 				d.log.Errorln("d.embyHelper.IsVideoPlayed()", oneJob.VideoFPath, err)
 				return

+ 55 - 65
pkg/emby_api/emby_api.go

@@ -16,44 +16,23 @@ import (
 )
 
 type EmbyApi struct {
-	log                   *logrus.Logger
-	embyConfig            *settings.EmbySettings
-	maxRequestVideoNumber int
-	skipWatched           bool
-	timeOut               time.Duration
-	client                *resty.Client
+	log     *logrus.Logger
+	timeOut time.Duration
 }
 
-func NewEmbyApi(log *logrus.Logger, embyConfig *settings.EmbySettings) *EmbyApi {
+func NewEmbyApi(log *logrus.Logger) *EmbyApi {
 	em := EmbyApi{}
 	em.log = log
-	em.embyConfig = embyConfig
 	// 检查是否超过范围
-	em.embyConfig.Check()
+	settings.Get().Check()
 	// 强制设置
 	em.timeOut = 5 * 60 * time.Second
-	em.maxRequestVideoNumber = embyConfig.MaxRequestVideoNumber
-	em.skipWatched = embyConfig.SkipWatched
-	// 见 https://github.com/allanpk716/ChineseSubFinder/issues/140
-	em.client = resty.New().SetTransport(&http.Transport{
-		DisableKeepAlives:   true,
-		MaxIdleConns:        100,
-		MaxIdleConnsPerHost: 100,
-	}).RemoveProxy().SetTimeout(em.timeOut)
 	return &em
 }
 
-func (em *EmbyApi) SetMaxRequestVideoNumber(maxValue int) {
-	em.maxRequestVideoNumber = maxValue
-}
-
-func (em *EmbyApi) SetSkipWatched(skip bool) {
-	em.skipWatched = skip
-}
-
 // RefreshRecentlyVideoInfo 字幕下载完毕一次,就可以触发一次这个。并发 6 线程去刷新
-func (em *EmbyApi) RefreshRecentlyVideoInfo() error {
-	items, err := em.GetRecentlyItems()
+func (em *EmbyApi) RefreshRecentlyVideoInfo(embySettings *settings.EmbySettings, SkipWatched bool, maxRequestVideoNumber int) error {
+	items, err := em.GetRecentlyItems(embySettings, SkipWatched, maxRequestVideoNumber)
 	if err != nil {
 		return err
 	}
@@ -62,9 +41,9 @@ func (em *EmbyApi) RefreshRecentlyVideoInfo() error {
 
 	updateFunc := func(i interface{}) error {
 		tmpId := i.(string)
-		return em.UpdateVideoSubList(tmpId)
+		return em.UpdateVideoSubList(embySettings, tmpId)
 	}
-	p, err := ants.NewPoolWithFunc(em.embyConfig.Threads, func(inData interface{}) {
+	p, err := ants.NewPoolWithFunc(embySettings.Threads, func(inData interface{}) {
 		data := inData.(InputData)
 		defer data.Wg.Done()
 		ctx, cancel := context.WithTimeout(context.Background(), em.timeOut)
@@ -116,15 +95,15 @@ func (em *EmbyApi) RefreshRecentlyVideoInfo() error {
 	return nil
 }
 
-func (em *EmbyApi) GetRecentItemsByUserID(userId string) (emby.EmbyRecentlyItems, error) {
+func (em *EmbyApi) GetRecentItemsByUserID(embySettings *settings.EmbySettings, userId string, maxRequestVideoNumber int) (emby.EmbyRecentlyItems, error) {
 
 	var tmpRecItems emby.EmbyRecentlyItems
 	// 获取指定用户的视频列表
-	_, err := em.client.R().
+	_, err := em.createClient().R().
 		SetQueryParams(map[string]string{
-			"api_key":          em.embyConfig.APIKey,
+			"api_key":          embySettings.APIKey,
 			"IsUnaired":        "false",
-			"Limit":            fmt.Sprintf("%d", em.maxRequestVideoNumber),
+			"Limit":            fmt.Sprintf("%d", maxRequestVideoNumber),
 			"Recursive":        "true",
 			"SortOrder":        "Descending",
 			"IncludeItemTypes": "Episode,Movie",
@@ -132,7 +111,7 @@ func (em *EmbyApi) GetRecentItemsByUserID(userId string) (emby.EmbyRecentlyItems
 			"SortBy":           "DateCreated",
 		}).
 		SetResult(&tmpRecItems).
-		Get(em.embyConfig.AddressUrl + "/emby/Users/" + userId + "/Items")
+		Get(embySettings.AddressUrl + "/emby/Users/" + userId + "/Items")
 	if err != nil {
 		return emby.EmbyRecentlyItems{}, err
 	}
@@ -142,22 +121,22 @@ func (em *EmbyApi) GetRecentItemsByUserID(userId string) (emby.EmbyRecentlyItems
 
 // GetRecentlyItems 获取近期的视频(根据 SkipWatched 的情况,如果不跳过,那么就是获取所有用户的列表,如果是跳过,那么就会单独读取每个用户的再交叉判断)
 // 在 API 调试界面 -- ItemsService
-func (em *EmbyApi) GetRecentlyItems() (emby.EmbyRecentlyItems, error) {
+func (em *EmbyApi) GetRecentlyItems(embySettings *settings.EmbySettings, SkipWatched bool, maxRequestVideoNumber int) (emby.EmbyRecentlyItems, error) {
 
 	var recItems emby.EmbyRecentlyItems
 	recItems.Items = make([]emby.EmbyRecentlyItem, 0)
 	var recItemMap = make(map[string]emby.EmbyRecentlyItem)
 	var recItemExsitMap = make(map[string]emby.EmbyRecentlyItem)
 	var err error
-	if em.skipWatched == false {
+	if SkipWatched == false {
 		em.log.Debugln("Emby Setting SkipWatched = false")
 
 		// 默认是不指定某一个User的视频列表
-		_, err = em.client.R().
+		_, err = em.createClient().R().
 			SetQueryParams(map[string]string{
-				"api_key":          em.embyConfig.APIKey,
+				"api_key":          embySettings.APIKey,
 				"IsUnaired":        "false",
-				"Limit":            fmt.Sprintf("%d", em.maxRequestVideoNumber),
+				"Limit":            fmt.Sprintf("%d", maxRequestVideoNumber),
 				"Recursive":        "true",
 				"SortOrder":        "Descending",
 				"IncludeItemTypes": "Episode,Movie",
@@ -165,7 +144,7 @@ func (em *EmbyApi) GetRecentlyItems() (emby.EmbyRecentlyItems, error) {
 				"SortBy":           "DateCreated",
 			}).
 			SetResult(&recItems).
-			Get(em.embyConfig.AddressUrl + "/emby/Items")
+			Get(embySettings.AddressUrl + "/emby/Items")
 
 		if err != nil {
 			return emby.EmbyRecentlyItems{}, err
@@ -174,14 +153,14 @@ func (em *EmbyApi) GetRecentlyItems() (emby.EmbyRecentlyItems, error) {
 		em.log.Debugln("Emby Setting SkipWatched = true")
 
 		var userIds emby.EmbyUsers
-		userIds, err = em.GetUserIdList()
+		userIds, err = em.GetUserIdList(embySettings)
 		if err != nil {
 			return emby.EmbyRecentlyItems{}, err
 		}
 
 		for _, item := range userIds.Items {
 
-			tmpRecItems, err := em.GetRecentItemsByUserID(item.Id)
+			tmpRecItems, err := em.GetRecentItemsByUserID(embySettings, item.Id, maxRequestVideoNumber)
 			if err != nil {
 				return emby.EmbyRecentlyItems{}, err
 			}
@@ -224,14 +203,15 @@ func (em *EmbyApi) GetRecentlyItems() (emby.EmbyRecentlyItems, error) {
 }
 
 // GetUserIdList 获取所有的 UserId
-func (em *EmbyApi) GetUserIdList() (emby.EmbyUsers, error) {
+func (em *EmbyApi) GetUserIdList(embySettings *settings.EmbySettings) (emby.EmbyUsers, error) {
 	var recItems emby.EmbyUsers
-	_, err := em.client.R().
+
+	_, err := em.createClient().R().
 		SetQueryParams(map[string]string{
-			"api_key": em.embyConfig.APIKey,
+			"api_key": embySettings.APIKey,
 		}).
 		SetResult(&recItems).
-		Get(em.embyConfig.AddressUrl + "/emby/Users/Query")
+		Get(embySettings.AddressUrl + "/emby/Users/Query")
 
 	if err != nil {
 		return emby.EmbyUsers{}, err
@@ -240,16 +220,16 @@ func (em *EmbyApi) GetUserIdList() (emby.EmbyUsers, error) {
 }
 
 // GetItemAncestors 获取父级信息,在 API 调试界面 -- LibraryService
-func (em *EmbyApi) GetItemAncestors(id string) ([]emby.EmbyItemsAncestors, error) {
+func (em *EmbyApi) GetItemAncestors(embySettings *settings.EmbySettings, id string) ([]emby.EmbyItemsAncestors, error) {
 
 	var recItems []emby.EmbyItemsAncestors
 
-	_, err := em.client.R().
+	_, err := em.createClient().R().
 		SetQueryParams(map[string]string{
-			"api_key": em.embyConfig.APIKey,
+			"api_key": embySettings.APIKey,
 		}).
 		SetResult(&recItems).
-		Get(em.embyConfig.AddressUrl + "/emby/Items/" + id + "/Ancestors")
+		Get(embySettings.AddressUrl + "/emby/Items/" + id + "/Ancestors")
 	if err != nil {
 		return nil, err
 	}
@@ -259,16 +239,16 @@ func (em *EmbyApi) GetItemAncestors(id string) ([]emby.EmbyItemsAncestors, error
 
 // GetItemVideoInfo 在 API 调试界面 -- UserLibraryService,如果是电影,那么是可以从 ProviderIds 得到 IMDB ID 的
 // 如果是连续剧,那么不能使用一集的ID取获取,需要是这个剧集的 ID,注意一季的ID也是不行的
-func (em *EmbyApi) GetItemVideoInfo(id string) (emby.EmbyVideoInfo, error) {
+func (em *EmbyApi) GetItemVideoInfo(embySettings *settings.EmbySettings, id string) (emby.EmbyVideoInfo, error) {
 
 	var recItem emby.EmbyVideoInfo
 
-	_, err := em.client.R().
+	_, err := em.createClient().R().
 		SetQueryParams(map[string]string{
-			"api_key": em.embyConfig.APIKey,
+			"api_key": embySettings.APIKey,
 		}).
 		SetResult(&recItem).
-		Get(em.embyConfig.AddressUrl + "/emby/LiveTv/Programs/" + id)
+		Get(embySettings.AddressUrl + "/emby/LiveTv/Programs/" + id)
 	if err != nil {
 		return emby.EmbyVideoInfo{}, err
 	}
@@ -277,16 +257,16 @@ func (em *EmbyApi) GetItemVideoInfo(id string) (emby.EmbyVideoInfo, error) {
 }
 
 // GetItemVideoInfoByUserId 可以拿到这个视频的选择字幕Index,配合 GetItemVideoInfo 使用。 在 API 调试界面 -- UserLibraryService
-func (em *EmbyApi) GetItemVideoInfoByUserId(userId, videoId string) (emby.EmbyVideoInfoByUserId, error) {
+func (em *EmbyApi) GetItemVideoInfoByUserId(embySettings *settings.EmbySettings, userId, videoId string) (emby.EmbyVideoInfoByUserId, error) {
 
 	var recItem emby.EmbyVideoInfoByUserId
 
-	_, err := em.client.R().
+	_, err := em.createClient().R().
 		SetQueryParams(map[string]string{
-			"api_key": em.embyConfig.APIKey,
+			"api_key": embySettings.APIKey,
 		}).
 		SetResult(&recItem).
-		Get(em.embyConfig.AddressUrl + "/emby/Users/" + userId + "/Items/" + videoId)
+		Get(embySettings.AddressUrl + "/emby/Users/" + userId + "/Items/" + videoId)
 	if err != nil {
 		return emby.EmbyVideoInfoByUserId{}, err
 	}
@@ -295,14 +275,14 @@ func (em *EmbyApi) GetItemVideoInfoByUserId(userId, videoId string) (emby.EmbyVi
 }
 
 // UpdateVideoSubList 更新字幕列表, 在 API 调试界面 -- ItemRefreshService
-func (em *EmbyApi) UpdateVideoSubList(id string) error {
+func (em *EmbyApi) UpdateVideoSubList(embySettings *settings.EmbySettings, id string) error {
 
-	_, err := em.client.R().
+	_, err := em.createClient().R().
 		SetQueryParams(map[string]string{
 			"Recursive": "true",
-			"api_key":   em.embyConfig.APIKey,
+			"api_key":   embySettings.APIKey,
 		}).
-		Post(em.embyConfig.AddressUrl + "/emby/Items/" + id + "/Refresh")
+		Post(embySettings.AddressUrl + "/emby/Items/" + id + "/Refresh")
 	if err != nil {
 		return err
 	}
@@ -311,10 +291,10 @@ func (em *EmbyApi) UpdateVideoSubList(id string) error {
 }
 
 // GetSubFileData 下载字幕 subExt -> .ass or .srt , 在 API 调试界面 -- SubtitleService
-func (em *EmbyApi) GetSubFileData(videoId, mediaSourceId, subIndex, subExt string) (string, error) {
+func (em *EmbyApi) GetSubFileData(embySettings *settings.EmbySettings, videoId, mediaSourceId, subIndex, subExt string) (string, error) {
 
-	response, err := em.client.R().
-		Get(em.embyConfig.AddressUrl + "/emby/Videos/" + videoId + "/" + mediaSourceId + "/Subtitles/" + subIndex + "/Stream" + subExt)
+	response, err := em.createClient().R().
+		Get(embySettings.AddressUrl + "/emby/Videos/" + videoId + "/" + mediaSourceId + "/Subtitles/" + subIndex + "/Stream" + subExt)
 	if err != nil {
 		return "", err
 	}
@@ -322,6 +302,16 @@ func (em *EmbyApi) GetSubFileData(videoId, mediaSourceId, subIndex, subExt strin
 	return response.String(), nil
 }
 
+func (em *EmbyApi) createClient() *resty.Client {
+	// 见 https://github.com/allanpk716/ChineseSubFinder/issues/140
+	client := resty.New().SetTransport(&http.Transport{
+		DisableKeepAlives:   true,
+		MaxIdleConns:        100,
+		MaxIdleConnsPerHost: 100,
+	}).RemoveProxy().SetTimeout(em.timeOut)
+	return client
+}
+
 type InputData struct {
 	Id string
 	Wg *sync.WaitGroup

+ 14 - 15
pkg/logic/cron_helper/cron_helper.go

@@ -5,6 +5,7 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/pkg"
 	"github.com/allanpk716/ChineseSubFinder/pkg/logic/file_downloader"
 	"github.com/allanpk716/ChineseSubFinder/pkg/logic/scan_played_video_subinfo"
+	"github.com/allanpk716/ChineseSubFinder/pkg/types/common"
 
 	//"github.com/allanpk716/ChineseSubFinder/internal/logic/pre_job"
 	"sync"
@@ -29,7 +30,6 @@ type CronHelper struct {
 	videoScanAndRefreshHelper     *video_scan_and_refresh_helper.VideoScanAndRefreshHelper // 视频扫描和刷新的帮助类
 	cronLock                      sync.Mutex                                               // 锁
 	c                             *cron.Cron                                               // 定时器实例
-	Settings                      *settings.Settings                                       // 设置实例
 	Logger                        *logrus.Logger                                           // 日志实例
 	entryIDScanVideoProcess       cron.EntryID
 	entryIDSupplierCheck          cron.EntryID
@@ -43,7 +43,6 @@ func NewCronHelper(fileDownloader *file_downloader.FileDownloader) *CronHelper {
 	ch := CronHelper{
 		FileDownloader: fileDownloader,
 		Logger:         fileDownloader.Log,
-		Settings:       fileDownloader.Settings,
 		// 实例化下载队列
 		DownloadQueue: task_queue.NewTaskQueue(fileDownloader.CacheCenter),
 	}
@@ -51,21 +50,21 @@ func NewCronHelper(fileDownloader *file_downloader.FileDownloader) *CronHelper {
 	var err error
 	// ----------------------------------------------
 	// 扫描已播放
-	ch.scanPlayedVideoSubInfo, err = scan_played_video_subinfo.NewScanPlayedVideoSubInfo(ch.Logger, ch.Settings, fileDownloader)
+	ch.scanPlayedVideoSubInfo, err = scan_played_video_subinfo.NewScanPlayedVideoSubInfo(ch.Logger, fileDownloader)
 	if err != nil {
 		ch.Logger.Panicln(err)
 	}
 	// ----------------------------------------------
 	// 字幕扫描器
 	ch.videoScanAndRefreshHelper = video_scan_and_refresh_helper.NewVideoScanAndRefreshHelper(
-		sub_formatter.GetSubFormatter(ch.Logger, ch.Settings.AdvancedSettings.SubNameFormatter),
+		sub_formatter.GetSubFormatter(ch.Logger, settings.Get().AdvancedSettings.SubNameFormatter),
 		ch.FileDownloader,
 		ch.DownloadQueue)
 
 	// ----------------------------------------------
 	// 初始化下载者,里面的两个 func 需要使用定时器启动 SupplierCheck QueueDownloader
 	ch.Downloader = downloader.NewDownloader(
-		sub_formatter.GetSubFormatter(ch.Logger, ch.Settings.AdvancedSettings.SubNameFormatter),
+		sub_formatter.GetSubFormatter(ch.Logger, settings.Get().AdvancedSettings.SubNameFormatter),
 		ch.FileDownloader, ch.DownloadQueue)
 
 	// 强制进行一次字幕源有效性检查
@@ -91,11 +90,11 @@ func (ch *CronHelper) Start(runImmediately bool) {
 	ch.cronLock.Unlock()
 	// ----------------------------------------------
 	// 判断扫描任务的时间间隔是否符合要求,不符合则重写默认值
-	_, err := cron.ParseStandard(ch.Settings.CommonSettings.ScanInterval)
+	_, err := cron.ParseStandard(settings.Get().CommonSettings.ScanInterval)
 	if err != nil {
 		ch.Logger.Warningln("CommonSettings.ScanInterval format error, after v0.25.x , need reset this at WebUI")
 		// 如果解析错误了,就需要重新赋值默认值过来,然后保存
-		nowSettings := ch.Settings
+		nowSettings := settings.Get()
 		nowSettings.CommonSettings.ScanInterval = settings.NewCommonSettings().ScanInterval
 		err = settings.SetFullNewSettings(nowSettings)
 		if err != nil {
@@ -107,9 +106,9 @@ func (ch *CronHelper) Start(runImmediately bool) {
 	ch.c = cron.New(cron.WithChain(cron.DelayIfStillRunning(cron.DefaultLogger)))
 	{
 		// 测试部分定时器代码,提前运行
-		if ch.Settings.SpeedDevMode == true {
+		if settings.Get().SpeedDevMode == true {
 
-			//pj := pre_job.NewPreJob(ch.Settings, ch.Logger)
+			//pj := pre_job.NewPreJob(settings.Get(), ch.Logger)
 			//err = pj.HotFix().Wait()
 			//if err != nil {
 			//	ch.Logger.Errorln(err)
@@ -125,7 +124,7 @@ func (ch *CronHelper) Start(runImmediately bool) {
 
 	// 定时器
 	// 这个暂时无法被取消执行
-	ch.entryIDScanVideoProcess, err = ch.c.AddFunc(ch.Settings.CommonSettings.ScanInterval, ch.scanVideoProcessAdd2DownloadQueue)
+	ch.entryIDScanVideoProcess, err = ch.c.AddFunc(settings.Get().CommonSettings.ScanInterval, ch.scanVideoProcessAdd2DownloadQueue)
 	if err != nil {
 		ch.Logger.Panicln("CronHelper scanVideoProcessAdd2DownloadQueue, scanVideoProcessAdd2DownloadQueue Cron entryID:", ch.entryIDScanVideoProcess, "Error:", err)
 	}
@@ -145,10 +144,10 @@ func (ch *CronHelper) Start(runImmediately bool) {
 		ch.Logger.Panicln("CronHelper QueueDownloader, scanPlayedVideoSub Cron entryID:", ch.entryIDScanPlayedVideoSubInfo, "Error:", err)
 	}
 	// 字幕的上传逻辑
-	if ch.Settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
+	if settings.Get().ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
 
 		intervalNowTask := "@every 10s"
-		if ch.Settings.SpeedDevMode == true {
+		if settings.Get().SpeedDevMode == true {
 			intervalNowTask = "@every 1s"
 		}
 		ch.entryIDUploadPlayedVideoSub, err = ch.c.AddFunc(intervalNowTask, ch.uploadVideoSub)
@@ -166,7 +165,7 @@ func (ch *CronHelper) Start(runImmediately bool) {
 			//----------------------------------------------
 			// 没有停止,那么继续扫描
 			ch.Logger.Infoln("First Time scanVideoProcessAdd2DownloadQueue Start")
-			if ch.Settings.SpeedDevMode == false {
+			if settings.Get().SpeedDevMode == false {
 				ch.scanVideoProcessAdd2DownloadQueue()
 			}
 			ch.Logger.Infoln("First Time scanVideoProcessAdd2DownloadQueue End")
@@ -249,7 +248,7 @@ func (ch *CronHelper) Stop() {
 func (ch *CronHelper) scanPlayedVideoSub() {
 
 	ch.Logger.Infoln("Update Info...")
-	nowInfo := dao.UpdateInfo(pkg.AppVersion(), ch.Settings)
+	nowInfo := dao.UpdateInfo(pkg.AppVersion(), settings.Get())
 	_, err := ch.FileDownloader.MediaInfoDealers.SubtitleBestApi.FeedBack(
 		nowInfo.Id,
 		nowInfo.Version, nowInfo.MediaServer,
@@ -266,7 +265,7 @@ func (ch *CronHelper) scanPlayedVideoSub() {
 		ch.Logger.Infoln("scanPlayedVideoSub End, Cost:", time.Since(startT).Minutes(), "min")
 		ch.Logger.Infoln("------------------------------------------------------")
 	}()
-	bok, err := ch.scanPlayedVideoSubInfo.GetPlayedItemsSubtitle()
+	bok, err := ch.scanPlayedVideoSubInfo.GetPlayedItemsSubtitle(settings.Get().EmbySettings, common.EmbyApiGetItemsLimitMax)
 	if err != nil {
 		ch.Logger.Errorln(err)
 	}

+ 70 - 70
pkg/logic/emby_helper/embyhelper.go

@@ -8,6 +8,8 @@ import (
 	"sync"
 	"time"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/media_info_dealers"
 
 	"github.com/allanpk716/ChineseSubFinder/pkg"
@@ -20,7 +22,6 @@ import (
 	embyHelper "github.com/allanpk716/ChineseSubFinder/pkg/emby_api"
 	"github.com/allanpk716/ChineseSubFinder/pkg/imdb_helper"
 	"github.com/allanpk716/ChineseSubFinder/pkg/path_helper"
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 	"github.com/allanpk716/ChineseSubFinder/pkg/sort_things"
 	"github.com/allanpk716/ChineseSubFinder/pkg/sub_parser_hub"
 	"github.com/panjf2000/ants/v2"
@@ -31,31 +32,30 @@ import (
 type EmbyHelper struct {
 	EmbyApi  *embyHelper.EmbyApi
 	log      *logrus.Logger
-	settings *settings.Settings
 	dealers  *media_info_dealers.Dealers
 	timeOut  time.Duration
 	listLock sync.Mutex
 }
 
-func NewEmbyHelper(dealers *media_info_dealers.Dealers, _settings *settings.Settings) *EmbyHelper {
-	em := EmbyHelper{log: dealers.Logger, settings: _settings, dealers: dealers}
-	em.EmbyApi = embyHelper.NewEmbyApi(dealers.Logger, _settings.EmbySettings)
+func NewEmbyHelper(dealers *media_info_dealers.Dealers) *EmbyHelper {
+	em := EmbyHelper{log: dealers.Logger, dealers: dealers}
+	em.EmbyApi = embyHelper.NewEmbyApi(dealers.Logger)
 	em.timeOut = 60 * time.Second
 	return &em
 }
 
-func (em *EmbyHelper) SetMaxRequestVideoNumber(maxValue int) {
-	em.EmbyApi.SetMaxRequestVideoNumber(maxValue)
-}
-
-func (em *EmbyHelper) SetSkipWatched(skip bool) {
-	em.EmbyApi.SetSkipWatched(skip)
-}
-
 // GetRecentlyAddVideoListWithNoChineseSubtitle 获取最近新添加的视频,且没有中文字幕的
-func (em *EmbyHelper) GetRecentlyAddVideoListWithNoChineseSubtitle(needForcedScanAndDownSub ...bool) ([]emby2.EmbyMixInfo, map[string][]emby2.EmbyMixInfo, error) {
+func (em *EmbyHelper) GetRecentlyAddVideoListWithNoChineseSubtitle(embySettings *settings.EmbySettings, needForcedScanAndDownSub ...bool) ([]emby2.EmbyMixInfo, map[string][]emby2.EmbyMixInfo, error) {
+
+	skip := embySettings.SkipWatched
+	maxRequestVideoNumber := embySettings.MaxRequestVideoNumber
+	if len(needForcedScanAndDownSub) > 0 && needForcedScanAndDownSub[0] == true {
+		// 强制扫描,无需过滤
+		skip = false
+		maxRequestVideoNumber = common.EmbyApiGetItemsLimitMax
+	}
 
-	filterMovieList, filterSeriesList, err := em.GetRecentlyAddVideoList()
+	filterMovieList, filterSeriesList, err := em.GetRecentlyAddVideoList(embySettings, skip, maxRequestVideoNumber)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -129,9 +129,9 @@ func (em *EmbyHelper) GetRecentlyAddVideoListWithNoChineseSubtitle(needForcedSca
 }
 
 // GetRecentlyAddVideoList 获取最近新添加的视频
-func (em *EmbyHelper) GetRecentlyAddVideoList() ([]emby2.EmbyMixInfo, []emby2.EmbyMixInfo, error) {
+func (em *EmbyHelper) GetRecentlyAddVideoList(embySettings *settings.EmbySettings, SkipWatched bool, maxRequestVideoNumber int) ([]emby2.EmbyMixInfo, []emby2.EmbyMixInfo, error) {
 	// 获取最近的影片列表
-	items, err := em.EmbyApi.GetRecentlyItems()
+	items, err := em.EmbyApi.GetRecentlyItems(embySettings, SkipWatched, maxRequestVideoNumber)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -158,11 +158,11 @@ func (em *EmbyHelper) GetRecentlyAddVideoList() ([]emby2.EmbyMixInfo, []emby2.Em
 	}
 
 	// 过滤出有效的电影、连续剧的资源出来
-	filterMovieList, err := em.getMoreVideoInfoList(MovieIdList, true)
+	filterMovieList, err := em.getMoreVideoInfoList(embySettings, MovieIdList, true)
 	if err != nil {
 		return nil, nil, err
 	}
-	filterSeriesList, err := em.getMoreVideoInfoList(EpisodeIdList, false)
+	filterSeriesList, err := em.getMoreVideoInfoList(embySettings, EpisodeIdList, false)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -182,19 +182,19 @@ func (em *EmbyHelper) GetRecentlyAddVideoList() ([]emby2.EmbyMixInfo, []emby2.Em
 }
 
 // GetVideoIDPlayedMap 获取已经播放过的视频的ID
-func (em *EmbyHelper) GetVideoIDPlayedMap() map[string]bool {
+func (em *EmbyHelper) GetVideoIDPlayedMap(embySettings *settings.EmbySettings, maxRequestVideoNumber int) map[string]bool {
 
 	videoIDPlayedMap := make(map[string]bool)
 	// 获取有那些用户
 	var userIds emby2.EmbyUsers
-	userIds, err := em.EmbyApi.GetUserIdList()
+	userIds, err := em.EmbyApi.GetUserIdList(embySettings)
 	if err != nil {
 		em.log.Errorln("IsVideoIDPlayed - GetUserIdList error:", err)
 		return videoIDPlayedMap
 	}
 	// 所有用户观看过的视频有那些
 	for _, item := range userIds.Items {
-		tmpRecItems, err := em.EmbyApi.GetRecentItemsByUserID(item.Id)
+		tmpRecItems, err := em.EmbyApi.GetRecentItemsByUserID(embySettings, item.Id, maxRequestVideoNumber)
 		if err != nil {
 			em.log.Errorln("IsVideoIDPlayed - GetRecentItemsByUserID, UserID:", item.Id, "error:", err)
 			return videoIDPlayedMap
@@ -212,19 +212,19 @@ func (em *EmbyHelper) GetVideoIDPlayedMap() map[string]bool {
 }
 
 // GetPlayedItemsSubtitle 所有用户标记播放过的视频,返回 电影、连续剧, 视频全路径 -- 对应字幕全路径(经过转换的)
-func (em *EmbyHelper) GetPlayedItemsSubtitle() (map[string]string, map[string]string, error) {
+func (em *EmbyHelper) GetPlayedItemsSubtitle(embySettings *settings.EmbySettings, maxRequestVideoNumber int) (map[string]string, map[string]string, error) {
 
 	// 这个用户看过那些视频
 	var userPlayedItemsList = make([]emby2.UserPlayedItems, 0)
 	// 获取有那些用户
 	var userIds emby2.EmbyUsers
-	userIds, err := em.EmbyApi.GetUserIdList()
+	userIds, err := em.EmbyApi.GetUserIdList(embySettings)
 	if err != nil {
 		return nil, nil, err
 	}
 	// 所有用户观看过的视频有那些,需要分用户统计出来
 	for _, item := range userIds.Items {
-		tmpRecItems, err := em.EmbyApi.GetRecentItemsByUserID(item.Id)
+		tmpRecItems, err := em.EmbyApi.GetRecentItemsByUserID(embySettings, item.Id, maxRequestVideoNumber)
 		if err != nil {
 			return nil, nil, err
 		}
@@ -256,12 +256,12 @@ func (em *EmbyHelper) GetPlayedItemsSubtitle() (map[string]string, map[string]st
 
 		for _, item := range playedItems.Items {
 
-			videoInfoByUserId, err := em.EmbyApi.GetItemVideoInfoByUserId(playedItems.UserID, item.Id)
+			videoInfoByUserId, err := em.EmbyApi.GetItemVideoInfoByUserId(embySettings, playedItems.UserID, item.Id)
 			if err != nil {
 				return nil, nil, err
 			}
 
-			videoInfo, err := em.EmbyApi.GetItemVideoInfo(item.Id)
+			videoInfo, err := em.EmbyApi.GetItemVideoInfo(embySettings, item.Id)
 			if err != nil {
 				return nil, nil, err
 			}
@@ -288,11 +288,11 @@ func (em *EmbyHelper) GetPlayedItemsSubtitle() (map[string]string, map[string]st
 		}
 	}
 	// 路径转换
-	phyMovieList, err := em.getMoreVideoInfoList(MovieIdList, true)
+	phyMovieList, err := em.getMoreVideoInfoList(embySettings, MovieIdList, true)
 	if err != nil {
 		return nil, nil, err
 	}
-	phySeriesList, err := em.getMoreVideoInfoList(EpisodeIdList, false)
+	phySeriesList, err := em.getMoreVideoInfoList(embySettings, EpisodeIdList, false)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -334,28 +334,28 @@ func (em *EmbyHelper) GetPlayedItemsSubtitle() (map[string]string, map[string]st
 }
 
 // RefreshEmbySubList 字幕下载完毕一次,就可以触发一次这个。并发 6 线程去刷新
-func (em *EmbyHelper) RefreshEmbySubList() (bool, error) {
+func (em *EmbyHelper) RefreshEmbySubList(embySettings *settings.EmbySettings, SkipWatched bool, maxRequestVideoNumber int) (bool, error) {
 	if em.EmbyApi == nil {
 		return false, nil
 	}
-	err := em.EmbyApi.RefreshRecentlyVideoInfo()
+	err := em.EmbyApi.RefreshRecentlyVideoInfo(embySettings, SkipWatched, maxRequestVideoNumber)
 	if err != nil {
 		return false, err
 	}
 	return true, nil
 }
 
-func (em *EmbyHelper) IsVideoPlayed(videoID string) (bool, error) {
+func (em *EmbyHelper) IsVideoPlayed(embySettings *settings.EmbySettings, videoID string) (bool, error) {
 
 	// 获取有那些用户
 	var userIds emby2.EmbyUsers
-	userIds, err := em.EmbyApi.GetUserIdList()
+	userIds, err := em.EmbyApi.GetUserIdList(embySettings)
 	if err != nil {
 		return false, err
 	}
 	// 所有用户观看过的视频有那些,需要分用户统计出来
 	for _, item := range userIds.Items {
-		videoInfo, err := em.EmbyApi.GetItemVideoInfoByUserId(item.Id, videoID)
+		videoInfo, err := em.EmbyApi.GetItemVideoInfoByUserId(embySettings, item.Id, videoID)
 		if err != nil {
 			return false, err
 		}
@@ -370,21 +370,21 @@ func (em *EmbyHelper) IsVideoPlayed(videoID string) (bool, error) {
 // findMappingPath 从 Emby 内置路径匹配到物理路径,返回,需要替换的前缀,以及替换到的前缀
 // X:\电影    - /mnt/share1/电影
 // X:\连续剧  - /mnt/share1/连续剧
-func (em *EmbyHelper) findMappingPath(fileFPathWithEmby string, isMovieOrSeries bool) (bool, string, string) {
+func (em *EmbyHelper) findMappingPath(embySettings *settings.EmbySettings, fileFPathWithEmby string, isMovieOrSeries bool) (bool, string, string) {
 
 	// 这里进行路径匹配的时候需要考虑嵌套路径的问题
 	// 比如,映射了 /电影  以及 /电影/AA ,那么如果有一部电影 /电影/AA/xx/xx.mkv 那么,应该匹配的是最长的路径 /电影/AA
 	matchedEmbyPaths := make([]string, 0)
 	if isMovieOrSeries == true {
 		// 电影的情况
-		for _, embyPath := range em.settings.EmbySettings.MoviePathsMapping {
+		for _, embyPath := range embySettings.MoviePathsMapping {
 			if strings.HasPrefix(fileFPathWithEmby, embyPath) == true {
 				matchedEmbyPaths = append(matchedEmbyPaths, embyPath)
 			}
 		}
 	} else {
 		// 连续剧的情况
-		for _, embyPath := range em.settings.EmbySettings.SeriesPathsMapping {
+		for _, embyPath := range embySettings.SeriesPathsMapping {
 			if strings.HasPrefix(fileFPathWithEmby, embyPath) == true {
 				matchedEmbyPaths = append(matchedEmbyPaths, embyPath)
 			}
@@ -401,7 +401,7 @@ func (em *EmbyHelper) findMappingPath(fileFPathWithEmby string, isMovieOrSeries
 	nowPhRootPath := ""
 	if isMovieOrSeries == true {
 		// 电影的情况
-		for physicalPath, embyPath := range em.settings.EmbySettings.MoviePathsMapping {
+		for physicalPath, embyPath := range embySettings.MoviePathsMapping {
 			if embyPath == pathSlices[0].Path {
 				nowPhRootPath = physicalPath
 				break
@@ -409,7 +409,7 @@ func (em *EmbyHelper) findMappingPath(fileFPathWithEmby string, isMovieOrSeries
 		}
 	} else {
 		// 连续剧的情况
-		for physicalPath, embyPath := range em.settings.EmbySettings.SeriesPathsMapping {
+		for physicalPath, embyPath := range embySettings.SeriesPathsMapping {
 			if embyPath == pathSlices[0].Path {
 				nowPhRootPath = physicalPath
 				break
@@ -425,16 +425,16 @@ func (em *EmbyHelper) findMappingPath(fileFPathWithEmby string, isMovieOrSeries
 }
 
 // getVideoIMDBId 从视频的内部 ID 找到 IMDB id
-func (em *EmbyHelper) getMoreVideoInfo(videoID string, isMovieOrSeries bool) (*emby2.EmbyMixInfo, error) {
+func (em *EmbyHelper) getMoreVideoInfo(embySettings *settings.EmbySettings, videoID string, isMovieOrSeries bool) (*emby2.EmbyMixInfo, error) {
 
 	if isMovieOrSeries == true {
 		// 电影的情况
-		info, err := em.EmbyApi.GetItemVideoInfo(videoID)
+		info, err := em.EmbyApi.GetItemVideoInfo(embySettings, videoID)
 		if err != nil {
 			return nil, err
 		}
 
-		ancs, err := em.EmbyApi.GetItemAncestors(videoID)
+		ancs, err := em.EmbyApi.GetItemAncestors(embySettings, videoID)
 		if err != nil {
 			return nil, err
 		}
@@ -449,7 +449,7 @@ func (em *EmbyHelper) getMoreVideoInfo(videoID string, isMovieOrSeries bool) (*e
 		return &mixInfo, nil
 	} else {
 		// 连续剧的情况,需要从一集对算到 series 目录,得到内部 series 的 ID,然后再得到 IMDB ID
-		ancs, err := em.EmbyApi.GetItemAncestors(videoID)
+		ancs, err := em.EmbyApi.GetItemAncestors(embySettings, videoID)
 		if err != nil {
 			return nil, err
 		}
@@ -467,17 +467,17 @@ func (em *EmbyHelper) getMoreVideoInfo(videoID string, isMovieOrSeries bool) (*e
 			return nil, nil
 		}
 		// 这里的目标是从 Emby 获取 IMDB ID
-		info, err := em.EmbyApi.GetItemVideoInfo(ancs[ancestorIndex].ID)
+		info, err := em.EmbyApi.GetItemVideoInfo(embySettings, ancs[ancestorIndex].ID)
 		if err != nil {
 			return nil, err
 		}
 		nowSeriesIMDBID := info.ProviderIds.Imdb
 		// 然后还是要跟电影一样的使用 Video ID 去获取 Ancestors 和 VideoInfo,而上面一步获取的是这个 Series 的 ID
-		info, err = em.EmbyApi.GetItemVideoInfo(videoID)
+		info, err = em.EmbyApi.GetItemVideoInfo(embySettings, videoID)
 		if err != nil {
 			return nil, err
 		}
-		ancs, err = em.EmbyApi.GetItemAncestors(videoID)
+		ancs, err = em.EmbyApi.GetItemAncestors(embySettings, videoID)
 		if err != nil {
 			return nil, err
 		}
@@ -509,7 +509,7 @@ func (em *EmbyHelper) autoFindMappingPathWithMixInfoByIMDBId(mixInfo *emby2.Emby
 			ImdbId: mixInfo.IMDBId,
 			TmdbId: mixInfo.TMDBId,
 		},
-		em.settings.AdvancedSettings.ProxySettings)
+		settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 
 		em.log.Errorln("autoFindMappingPathWithMixInfoByIMDBId.GetIMDBInfoFromVideoNfoInfo", err)
@@ -583,7 +583,7 @@ func (em *EmbyHelper) autoFindMappingPathWithMixInfoByIMDBId(mixInfo *emby2.Emby
 // findMappingPathWithMixInfo 从 Emby 内置路径匹配到物理路径
 // X:\电影    - /mnt/share1/电影
 // X:\连续剧  - /mnt/share1/连续剧
-func (em *EmbyHelper) findMappingPathWithMixInfo(mixInfo *emby2.EmbyMixInfo, isMovieOrSeries bool) bool {
+func (em *EmbyHelper) findMappingPathWithMixInfo(embySettings *settings.EmbySettings, mixInfo *emby2.EmbyMixInfo, isMovieOrSeries bool) bool {
 
 	defer func() {
 		// 见 https://github.com/allanpk716/ChineseSubFinder/issues/278
@@ -600,14 +600,14 @@ func (em *EmbyHelper) findMappingPathWithMixInfo(mixInfo *emby2.EmbyMixInfo, isM
 	matchedEmbyPaths := make([]string, 0)
 	if isMovieOrSeries == true {
 		// 电影的情况
-		for _, embyPath := range em.settings.EmbySettings.MoviePathsMapping {
+		for _, embyPath := range embySettings.MoviePathsMapping {
 			if strings.HasPrefix(mixInfo.VideoInfo.Path, embyPath) == true {
 				matchedEmbyPaths = append(matchedEmbyPaths, embyPath)
 			}
 		}
 	} else {
 		// 连续剧的情况
-		for _, embyPath := range em.settings.EmbySettings.SeriesPathsMapping {
+		for _, embyPath := range embySettings.SeriesPathsMapping {
 			if strings.HasPrefix(mixInfo.VideoInfo.Path, embyPath) == true {
 				matchedEmbyPaths = append(matchedEmbyPaths, embyPath)
 			}
@@ -623,7 +623,7 @@ func (em *EmbyHelper) findMappingPathWithMixInfo(mixInfo *emby2.EmbyMixInfo, isM
 	nowPhRootPath := ""
 	if isMovieOrSeries == true {
 		// 电影的情况
-		for physicalPath, embyPath := range em.settings.EmbySettings.MoviePathsMapping {
+		for physicalPath, embyPath := range embySettings.MoviePathsMapping {
 			if embyPath == pathSlices[0].Path {
 				nowPhRootPath = physicalPath
 				break
@@ -631,7 +631,7 @@ func (em *EmbyHelper) findMappingPathWithMixInfo(mixInfo *emby2.EmbyMixInfo, isM
 		}
 	} else {
 		// 连续剧的情况
-		for physicalPath, embyPath := range em.settings.EmbySettings.SeriesPathsMapping {
+		for physicalPath, embyPath := range embySettings.SeriesPathsMapping {
 			if embyPath == pathSlices[0].Path {
 				nowPhRootPath = physicalPath
 				break
@@ -700,18 +700,18 @@ func (em *EmbyHelper) findMappingPathWithMixInfo(mixInfo *emby2.EmbyMixInfo, isM
 }
 
 // getMoreVideoInfoList 把视频的更多信息查询出来,需要并发去做
-func (em *EmbyHelper) getMoreVideoInfoList(videoIdList []string, isMovieOrSeries bool) ([]emby2.EmbyMixInfo, error) {
+func (em *EmbyHelper) getMoreVideoInfoList(embySettings *settings.EmbySettings, videoIdList []string, isMovieOrSeries bool) ([]emby2.EmbyMixInfo, error) {
 	var filterVideoEmbyInfo = make([]emby2.EmbyMixInfo, 0)
 
 	// 这个方法是使用两边的路径映射表来实现的转换,使用的体验不佳,很多人搞不定
 	queryFuncByMatchPath := func(m string) (*emby2.EmbyMixInfo, error) {
 
-		oneMixInfo, err := em.getMoreVideoInfo(m, isMovieOrSeries)
+		oneMixInfo, err := em.getMoreVideoInfo(embySettings, m, isMovieOrSeries)
 		if err != nil {
 			return nil, err
 		}
 
-		if em.settings.EmbySettings.AutoOrManual == true {
+		if embySettings.AutoOrManual == true {
 			// 通过 IMDB ID 自动转换路径
 			if isMovieOrSeries == true {
 				// 电影
@@ -733,14 +733,14 @@ func (em *EmbyHelper) getMoreVideoInfoList(videoIdList []string, isMovieOrSeries
 			if isMovieOrSeries == true {
 				// 电影
 				// 过滤掉不符合要求的,拼接绝对路径
-				isFit := em.findMappingPathWithMixInfo(oneMixInfo, isMovieOrSeries)
+				isFit := em.findMappingPathWithMixInfo(embySettings, oneMixInfo, isMovieOrSeries)
 				if isFit == false {
 					return nil, err
 				}
 			} else {
 				// 连续剧
 				// 过滤掉不符合要求的,拼接绝对路径
-				isFit := em.findMappingPathWithMixInfo(oneMixInfo, isMovieOrSeries)
+				isFit := em.findMappingPathWithMixInfo(embySettings, oneMixInfo, isMovieOrSeries)
 				if isFit == false {
 					return nil, err
 				}
@@ -751,7 +751,7 @@ func (em *EmbyHelper) getMoreVideoInfoList(videoIdList []string, isMovieOrSeries
 	}
 
 	// em.threads
-	p, err := ants.NewPoolWithFunc(em.settings.EmbySettings.Threads, func(inData interface{}) {
+	p, err := ants.NewPoolWithFunc(embySettings.Threads, func(inData interface{}) {
 		data := inData.(InputData)
 		defer data.Wg.Done()
 		ctx, cancel := context.WithTimeout(context.Background(), em.timeOut)
@@ -826,7 +826,7 @@ func (em *EmbyHelper) filterNoChineseSubVideoList(videoList []emby2.EmbyMixInfo)
 
 		needDlSub3Month := false
 		// 3个月内,或者没有字幕都要进行下载
-		if info.VideoInfo.PremiereDate.AddDate(0, 0, em.settings.AdvancedSettings.TaskQueue.ExpirationTime).After(currentTime) == true {
+		if info.VideoInfo.PremiereDate.AddDate(0, 0, settings.Get().AdvancedSettings.TaskQueue.ExpirationTime).After(currentTime) == true {
 			// 需要下载的
 			needDlSub3Month = true
 		}
@@ -861,7 +861,7 @@ func (em *EmbyHelper) filterNoChineseSubVideoList(videoList []emby2.EmbyMixInfo)
 		if haveExternalChineseSub == false {
 			// 没有外置字幕
 			// 如果创建了7天,且有内置的中文字幕,那么也不进行下载了
-			if info.VideoInfo.DateCreated.AddDate(0, 0, em.settings.AdvancedSettings.TaskQueue.DownloadSubDuringXDays).After(currentTime) == false && haveInsideChineseSub == true {
+			if info.VideoInfo.DateCreated.AddDate(0, 0, settings.Get().AdvancedSettings.TaskQueue.DownloadSubDuringXDays).After(currentTime) == false && haveInsideChineseSub == true {
 				em.log.Debugln("Create Over 7 Days, And It Has Inside ChineseSub, Than Skip", info.VideoFileName)
 				continue
 			}
@@ -889,15 +889,15 @@ func (em *EmbyHelper) filterNoChineseSubVideoList(videoList []emby2.EmbyMixInfo)
 }
 
 // GetInternalEngSubAndExChineseEnglishSub 获取对应 videoId 的内置英文字幕,外置中文字幕(只要是带有中文的都算,简体、繁体、简英、繁英,需要后续额外的判断)字幕
-func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (bool, []emby2.SubInfo, []emby2.SubInfo, error) {
+func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(embySettings *settings.EmbySettings, videoId string) (bool, []emby2.SubInfo, []emby2.SubInfo, error) {
 
 	// 先刷新以下这个资源,避免找到的字幕不存在了
-	err := em.EmbyApi.UpdateVideoSubList(videoId)
+	err := em.EmbyApi.UpdateVideoSubList(embySettings, videoId)
 	if err != nil {
 		return false, nil, nil, err
 	}
 	// 获取这个资源的信息
-	videoInfo, err := em.EmbyApi.GetItemVideoInfo(videoId)
+	videoInfo, err := em.EmbyApi.GetItemVideoInfo(embySettings, videoId)
 	if err != nil {
 		return false, nil, nil, err
 	}
@@ -969,7 +969,7 @@ func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (b
 		var tmpSubContentLenList = make([]int, 0)
 		for _, index := range insideEngSUbIndexList {
 			// TODO 这里默认是去 Emby 去拿字幕,但是其实可以缓存在视频文件同级的目录下,这样后续就无需多次下载了,毕竟每次下载都需要读取完整的视频
-			subFileData, err := em.EmbyApi.GetSubFileData(videoId, mediaSourcesId, fmt.Sprintf("%d", index), common.SubExtSRT)
+			subFileData, err := em.EmbyApi.GetSubFileData(embySettings, videoId, mediaSourcesId, fmt.Sprintf("%d", index), common.SubExtSRT)
 			if err != nil {
 				return false, nil, nil, err
 			}
@@ -989,7 +989,7 @@ func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (b
 		if i == 1 {
 			tmpExt = common.SubExtASS
 		}
-		subFileData, err := em.EmbyApi.GetSubFileData(videoId, mediaSourcesId, fmt.Sprintf("%d", InsideEngSubIndex), tmpExt)
+		subFileData, err := em.EmbyApi.GetSubFileData(embySettings, videoId, mediaSourcesId, fmt.Sprintf("%d", InsideEngSubIndex), tmpExt)
 		if err != nil {
 			return false, nil, nil, err
 		}
@@ -999,7 +999,7 @@ func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (b
 	}
 	// 再下载外置的
 	for i, subInfo := range exSubList {
-		subFileData, err := em.EmbyApi.GetSubFileData(videoId, mediaSourcesId, fmt.Sprintf("%d", subInfo.EmbyStreamIndex), subInfo.Ext)
+		subFileData, err := em.EmbyApi.GetSubFileData(embySettings, videoId, mediaSourcesId, fmt.Sprintf("%d", subInfo.EmbyStreamIndex), subInfo.Ext)
 		if err != nil {
 			return false, nil, nil, err
 		}
@@ -1010,10 +1010,10 @@ func (em *EmbyHelper) GetInternalEngSubAndExChineseEnglishSub(videoId string) (b
 }
 
 // CheckPath 检查路径 EmbyConfig 配置中的映射路径是否是有效的,
-func (em *EmbyHelper) CheckPath(pathType string) ([]string, error) {
+func (em *EmbyHelper) CheckPath(embySettings *settings.EmbySettings, pathType string, maxRequestVideoNumber int) ([]string, error) {
 
 	// 获取最近的影片列表
-	items, err := em.EmbyApi.GetRecentlyItems()
+	items, err := em.EmbyApi.GetRecentlyItems(embySettings, false, maxRequestVideoNumber)
 	if err != nil {
 		return nil, err
 	}
@@ -1040,7 +1040,7 @@ func (em *EmbyHelper) CheckPath(pathType string) ([]string, error) {
 
 	if pathType == "movie" {
 		// 过滤出有效的电影、连续剧的资源出来
-		filterMovieList, err := em.getMoreVideoInfoList(MovieIdList, true)
+		filterMovieList, err := em.getMoreVideoInfoList(embySettings, MovieIdList, true)
 		if err != nil {
 			return nil, err
 		}
@@ -1057,7 +1057,7 @@ func (em *EmbyHelper) CheckPath(pathType string) ([]string, error) {
 		}
 
 	} else {
-		filterSeriesList, err := em.getMoreVideoInfoList(EpisodeIdList, false)
+		filterSeriesList, err := em.getMoreVideoInfoList(embySettings, EpisodeIdList, false)
 		if err != nil {
 			return nil, err
 		}

+ 7 - 8
pkg/logic/file_downloader/downloader_hub.go

@@ -26,7 +26,6 @@ import (
 )
 
 type FileDownloader struct {
-	Settings         *settings.Settings
 	Log              *logrus.Logger
 	CacheCenter      *cache_center.CacheCenter
 	SubParserHub     *sub_parser_hub.SubParserHub
@@ -35,11 +34,11 @@ type FileDownloader struct {
 
 func NewFileDownloader(cacheCenter *cache_center.CacheCenter, authKey random_auth_key.AuthKey) *FileDownloader {
 
-	f := FileDownloader{Settings: cacheCenter.Settings,
+	f := FileDownloader{
 		Log:              cacheCenter.Log,
 		CacheCenter:      cacheCenter,
 		SubParserHub:     sub_parser_hub.NewSubParserHub(cacheCenter.Log, ass.NewParser(cacheCenter.Log), srt.NewParser(cacheCenter.Log)),
-		MediaInfoDealers: media_info_dealers.NewDealers(cacheCenter.Log, cacheCenter.Settings, subtitle_best_api.NewSubtitleBestApi(cacheCenter.Log, authKey, cacheCenter.Settings.AdvancedSettings.ProxySettings)),
+		MediaInfoDealers: media_info_dealers.NewDealers(cacheCenter.Log, subtitle_best_api.NewSubtitleBestApi(cacheCenter.Log, authKey)),
 	}
 	return &f
 }
@@ -67,13 +66,13 @@ func (f *FileDownloader) Get(supplierName string, topN int64, videoFileName stri
 	}
 	// 如果不存在那么就先下载,然后再存入缓存中
 	if found == false {
-		fileData, downloadFileName, err := pkg.DownFile(f.Log, fileDownloadUrl, f.Settings.AdvancedSettings.ProxySettings)
+		fileData, downloadFileName, err := pkg.DownFile(f.Log, fileDownloadUrl, settings.Get().AdvancedSettings.ProxySettings)
 		if err != nil {
 			return nil, err
 		}
 		// 下载成功需要统计到今天的次数中
 		_, err = f.CacheCenter.DailyDownloadCountAdd(supplierName,
-			pkg.GetPublicIP(f.Log, f.Settings.AdvancedSettings.TaskQueue, f.Settings.AdvancedSettings.ProxySettings))
+			pkg.GetPublicIP(f.Log, settings.Get().AdvancedSettings.TaskQueue, settings.Get().AdvancedSettings.ProxySettings))
 		if err != nil {
 			f.Log.Warningln(supplierName, "FileDownloader.Get.DailyDownloadCountAdd", err)
 		}
@@ -117,13 +116,13 @@ func (f *FileDownloader) GetA4k(supplierName string, topN int64, season, eps int
 	}
 	// 如果不存在那么就先下载,然后再存入缓存中
 	if found == false {
-		fileData, downloadFileName, err := pkg.DownFile(f.Log, fileDownloadUrl, f.Settings.AdvancedSettings.ProxySettings)
+		fileData, downloadFileName, err := pkg.DownFile(f.Log, fileDownloadUrl, settings.Get().AdvancedSettings.ProxySettings)
 		if err != nil {
 			return nil, err
 		}
 		// 下载成功需要统计到今天的次数中
 		_, err = f.CacheCenter.DailyDownloadCountAdd(supplierName,
-			pkg.GetPublicIP(f.Log, f.Settings.AdvancedSettings.TaskQueue, f.Settings.AdvancedSettings.ProxySettings))
+			pkg.GetPublicIP(f.Log, settings.Get().AdvancedSettings.TaskQueue, settings.Get().AdvancedSettings.ProxySettings))
 		if err != nil {
 			f.Log.Warningln(supplierName, "FileDownloader.Get.DailyDownloadCountAdd", err)
 		}
@@ -170,7 +169,7 @@ func (f *FileDownloader) GetEx(supplierName string, browser *rod.Browser, subDow
 		}
 		// 下载成功需要统计到今天的次数中
 		_, err = f.CacheCenter.DailyDownloadCountAdd(supplierName,
-			pkg.GetPublicIP(f.Log, f.Settings.AdvancedSettings.TaskQueue, f.Settings.AdvancedSettings.ProxySettings))
+			pkg.GetPublicIP(f.Log, settings.Get().AdvancedSettings.TaskQueue, settings.Get().AdvancedSettings.ProxySettings))
 		if err != nil {
 			f.Log.Warningln(supplierName, "FileDownloader.GetEx.DailyDownloadCountAdd", err)
 		}

+ 14 - 17
pkg/logic/pre_download_process/pre_download_proces.go

@@ -25,10 +25,8 @@ import (
 )
 
 type PreDownloadProcess struct {
-	stageName string
-	gError    error
-
-	settings       *settings.Settings
+	stageName      string
+	gError         error
 	log            *logrus.Logger
 	fileDownloader *file_downloader.FileDownloader
 	SubSupplierHub *subSupplier.SubSupplierHub
@@ -39,7 +37,6 @@ func NewPreDownloadProcess(_fileDownloader *file_downloader.FileDownloader) *Pre
 	preDownloadProcess := PreDownloadProcess{
 		fileDownloader: _fileDownloader,
 		log:            _fileDownloader.Log,
-		settings:       _fileDownloader.Settings,
 	}
 	return &preDownloadProcess
 }
@@ -58,7 +55,7 @@ func (p *PreDownloadProcess) Init() *PreDownloadProcess {
 
 	// ------------------------------------------------------------------------
 	// 初始化通知缓存模块
-	notify_center.Notify = notify_center.NewNotifyCenter(p.log, p.settings.DeveloperSettings.BarkServerAddress)
+	notify_center.Notify = notify_center.NewNotifyCenter(p.log, settings.Get().DeveloperSettings.BarkServerAddress)
 	// 清理通知中心
 	notify_center.Notify.Clear()
 	// ------------------------------------------------------------------------
@@ -98,7 +95,7 @@ func (p *PreDownloadProcess) Init() *PreDownloadProcess {
 	}
 	// ------------------------------------------------------------------------
 	// 构建每个字幕站点下载者的实例
-	if p.settings.SpeedDevMode == true {
+	if settings.Get().SpeedDevMode == true {
 
 		p.SubSupplierHub = subSupplier.NewSubSupplierHub(
 			//csf.NewSupplier(p.fileDownloader),
@@ -113,13 +110,13 @@ func (p *PreDownloadProcess) Init() *PreDownloadProcess {
 			a4k.NewSupplier(p.fileDownloader),
 		)
 
-		if p.settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
+		if settings.Get().ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
 			// 如果开启了分享字幕功能,那么就可以开启这个功能
 			p.SubSupplierHub.AddSubSupplier(csf.NewSupplier(p.fileDownloader))
 		}
 
-		if p.settings.SubtitleSources.AssrtSettings.Enabled == true &&
-			p.settings.SubtitleSources.AssrtSettings.Token != "" {
+		if settings.Get().SubtitleSources.AssrtSettings.Enabled == true &&
+			settings.Get().SubtitleSources.AssrtSettings.Token != "" {
 			// 如果开启了 ASSRt 字幕源,则需要新增
 			p.SubSupplierHub.AddSubSupplier(assrt.NewSupplier(p.fileDownloader))
 		}
@@ -158,7 +155,7 @@ func (p *PreDownloadProcess) Check() *PreDownloadProcess {
 	p.log.Infoln("PreDownloadProcess.Check() Start...")
 	// ------------------------------------------------------------------------
 	// 是否启用代理
-	if p.settings.AdvancedSettings.ProxySettings.UseProxy == false {
+	if settings.Get().AdvancedSettings.ProxySettings.UseProxy == false {
 
 		p.log.Infoln("UseHttpProxy = false")
 		// 如果不使用代理,那么默认需要检测 baidu 的连通性,不通过也继续
@@ -170,9 +167,9 @@ func (p *PreDownloadProcess) Check() *PreDownloadProcess {
 		}
 	} else {
 
-		p.log.Infoln("UseHttpProxy By:", p.settings.AdvancedSettings.ProxySettings.UseWhichProxyProtocol)
+		p.log.Infoln("UseHttpProxy By:", settings.Get().AdvancedSettings.ProxySettings.UseWhichProxyProtocol)
 		// 如果使用了代理,那么默认需要检测 google 的连通性,不通过也继续
-		proxyStatus, proxySpeed, err := url_connectedness_helper.UrlConnectednessTest(url_connectedness_helper.GoogleUrl, p.settings.AdvancedSettings.ProxySettings.GetLocalHttpProxyUrl())
+		proxyStatus, proxySpeed, err := url_connectedness_helper.UrlConnectednessTest(url_connectedness_helper.GoogleUrl, settings.Get().AdvancedSettings.ProxySettings.GetLocalHttpProxyUrl())
 		if err != nil {
 			p.log.Errorln(errors.New("UrlConnectednessTest Target Site " + url_connectedness_helper.GoogleUrl + ", " + err.Error()))
 		} else {
@@ -184,20 +181,20 @@ func (p *PreDownloadProcess) Check() *PreDownloadProcess {
 	p.SubSupplierHub.CheckSubSiteStatus()
 	// ------------------------------------------------------------------------
 	// 判断文件夹是否存在
-	if len(p.settings.CommonSettings.MoviePaths) < 1 {
+	if len(settings.Get().CommonSettings.MoviePaths) < 1 {
 		p.log.Warningln("MoviePaths not set, len == 0")
 	}
-	if len(p.settings.CommonSettings.SeriesPaths) < 1 {
+	if len(settings.Get().CommonSettings.SeriesPaths) < 1 {
 		p.log.Warningln("SeriesPaths not set, len == 0")
 	}
-	for i, path := range p.settings.CommonSettings.MoviePaths {
+	for i, path := range settings.Get().CommonSettings.MoviePaths {
 		if pkg.IsDir(path) == false {
 			p.log.Errorln("MovieFolder not found Index", i, "--", path)
 		} else {
 			p.log.Infoln("MovieFolder Index", i, "--", path)
 		}
 	}
-	for i, path := range p.settings.CommonSettings.SeriesPaths {
+	for i, path := range settings.Get().CommonSettings.SeriesPaths {
 		if pkg.IsDir(path) == false {
 			p.log.Errorln("SeriesPaths not found Index", i, "--", path)
 		} else {

+ 17 - 22
pkg/logic/scan_played_video_subinfo/scan_played_video_subinfo.go

@@ -34,15 +34,12 @@ import (
 )
 
 type ScanPlayedVideoSubInfo struct {
-	settings       *settings.Settings
 	log            *logrus.Logger
 	fileDownloader *file_downloader.FileDownloader
-
-	embyHelper *embyHelper.EmbyHelper
-
-	taskControl  *task_control.TaskControl
-	canceled     bool
-	canceledLock sync.Mutex
+	embyHelper     *embyHelper.EmbyHelper
+	taskControl    *task_control.TaskControl
+	canceled       bool
+	canceledLock   sync.Mutex
 
 	movieSubMap  map[string]string
 	seriesSubMap map[string]string
@@ -55,7 +52,7 @@ type ScanPlayedVideoSubInfo struct {
 	cacheImdbInfoCacheLocker sync.Mutex
 }
 
-func NewScanPlayedVideoSubInfo(log *logrus.Logger, _settings *settings.Settings, fileDownloader *file_downloader.FileDownloader) (*ScanPlayedVideoSubInfo, error) {
+func NewScanPlayedVideoSubInfo(log *logrus.Logger, fileDownloader *file_downloader.FileDownloader) (*ScanPlayedVideoSubInfo, error) {
 	var err error
 	var scanPlayedVideoSubInfo ScanPlayedVideoSubInfo
 	scanPlayedVideoSubInfo.log = log
@@ -63,21 +60,19 @@ func NewScanPlayedVideoSubInfo(log *logrus.Logger, _settings *settings.Settings,
 	scanPlayedVideoSubInfo.fileDownloader = fileDownloader
 	// 参入设置信息
 	// 最大获取的视频数目设置到 100W
-	scanPlayedVideoSubInfo.settings = _settings
-	//scanPlayedVideoSubInfo.settings = clone.Clone(_settings).(*settings.Settings)
-	//scanPlayedVideoSubInfo.settings.EmbySettings.MaxRequestVideoNumber = 1000000
+	//settings.Get() = clone.Clone(_settings).(*settings.Settings)
+	//settings.Get().EmbySettings.MaxRequestVideoNumber = 1000000
 	// 检测是否某些参数超出范围
-	scanPlayedVideoSubInfo.settings.Check()
+	settings.Get().Check()
 	// 初始化 Emby API 接口
-	if scanPlayedVideoSubInfo.settings.EmbySettings.Enable == true && scanPlayedVideoSubInfo.settings.EmbySettings.AddressUrl != "" &&
-		scanPlayedVideoSubInfo.settings.EmbySettings.APIKey != "" {
+	if settings.Get().EmbySettings.Enable == true && settings.Get().EmbySettings.AddressUrl != "" &&
+		settings.Get().EmbySettings.APIKey != "" {
 
-		scanPlayedVideoSubInfo.embyHelper = embyHelper.NewEmbyHelper(fileDownloader.MediaInfoDealers, scanPlayedVideoSubInfo.settings)
-		scanPlayedVideoSubInfo.embyHelper.SetMaxRequestVideoNumber(common2.EmbyApiGetItemsLimitMax)
+		scanPlayedVideoSubInfo.embyHelper = embyHelper.NewEmbyHelper(fileDownloader.MediaInfoDealers)
 	}
 
 	// 初始化任务控制
-	scanPlayedVideoSubInfo.taskControl, err = task_control.NewTaskControl(scanPlayedVideoSubInfo.settings.CommonSettings.Threads, log)
+	scanPlayedVideoSubInfo.taskControl, err = task_control.NewTaskControl(settings.Get().CommonSettings.Threads, log)
 	if err != nil {
 		return nil, err
 	}
@@ -108,7 +103,7 @@ func (s *ScanPlayedVideoSubInfo) Cancel() {
 	s.taskControl.Release()
 }
 
-func (s *ScanPlayedVideoSubInfo) GetPlayedItemsSubtitle() (bool, error) {
+func (s *ScanPlayedVideoSubInfo) GetPlayedItemsSubtitle(embySettings *settings.EmbySettings, maxRequestVideoNumber int) (bool, error) {
 
 	var err error
 	// 是否是通过 emby_helper api 获取的列表
@@ -118,7 +113,7 @@ func (s *ScanPlayedVideoSubInfo) GetPlayedItemsSubtitle() (bool, error) {
 		return false, nil
 	}
 
-	s.movieSubMap, s.seriesSubMap, err = s.embyHelper.GetPlayedItemsSubtitle()
+	s.movieSubMap, s.seriesSubMap, err = s.embyHelper.GetPlayedItemsSubtitle(embySettings, maxRequestVideoNumber)
 	if err != nil {
 		return false, err
 	}
@@ -250,7 +245,7 @@ func (s *ScanPlayedVideoSubInfo) Scan() error {
 
 				bFoundMovie := false
 				bFoundSeries := false
-				for _, moviePath := range s.settings.CommonSettings.MoviePaths {
+				for _, moviePath := range settings.Get().CommonSettings.MoviePaths {
 					// 先判断类型是否是 Movie
 					if strings.HasPrefix(thirdPartSetVideoPlayedInfo.PhysicalVideoFileFullPath, moviePath) == true {
 						bFoundMovie = true
@@ -258,7 +253,7 @@ func (s *ScanPlayedVideoSubInfo) Scan() error {
 					}
 				}
 				if bFoundMovie == false {
-					for _, seriesPath := range s.settings.CommonSettings.SeriesPaths {
+					for _, seriesPath := range settings.Get().CommonSettings.SeriesPaths {
 						// 判断是否是 Series
 						if strings.HasPrefix(thirdPartSetVideoPlayedInfo.PhysicalVideoFileFullPath, seriesPath) == true {
 							bFoundSeries = true
@@ -360,7 +355,7 @@ func (s *ScanPlayedVideoSubInfo) dealOneVideo(index int, videoFPath, orgSubFPath
 
 	// 通过视频的绝对路径,从本地的视频文件对应的 nfo 获取到这个视频的 IMDB ID,
 	var err error
-	imdbInfoFromVideoFile, err := imdb_helper.GetIMDBInfoFromVideoFile(s.fileDownloader.MediaInfoDealers, videoFPath, isMovie, s.settings.AdvancedSettings.ProxySettings)
+	imdbInfoFromVideoFile, err := imdb_helper.GetIMDBInfoFromVideoFile(s.fileDownloader.MediaInfoDealers, videoFPath, isMovie, settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		s.log.Errorln("GetIMDBInfoFromVideoFile", err)
 		return

+ 14 - 16
pkg/logic/sub_supplier/a4k/a4k.go

@@ -29,7 +29,6 @@ import (
 )
 
 type Supplier struct {
-	settings       *settings.Settings
 	log            *logrus.Logger
 	fileDownloader *file_downloader.FileDownloader
 	topic          int
@@ -44,9 +43,8 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	sup.topic = common2.DownloadSubsPerSite
 	sup.isAlive = true // 默认是可以使用的,如果 check 后,再调整状态
 
-	sup.settings = fileDownloader.Settings
-	if sup.settings.AdvancedSettings.Topic > 0 && sup.settings.AdvancedSettings.Topic != sup.topic {
-		sup.topic = sup.settings.AdvancedSettings.Topic
+	if settings.Get().AdvancedSettings.Topic > 0 && settings.Get().AdvancedSettings.Topic != sup.topic {
+		sup.topic = settings.Get().AdvancedSettings.Topic
 	}
 
 	return &sup
@@ -56,12 +54,12 @@ func (s *Supplier) CheckAlive(proxySettings ...*settings.ProxySettings) (bool, i
 
 	// 计算当前时间
 	startT := time.Now()
-	httpClient, err := pkg.NewHttpClient(s.settings.AdvancedSettings.ProxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		s.log.Errorln(s.GetSupplierName(), "CheckAlive.NewHttpClient", err)
 		return false, 0
 	}
-	searPageUrl := fmt.Sprintf(s.settings.AdvancedSettings.SuppliersSettings.A4k.RootUrl)
+	searPageUrl := fmt.Sprintf(settings.Get().AdvancedSettings.SuppliersSettings.A4k.RootUrl)
 	resp, err := httpClient.R().Get(searPageUrl)
 	if err != nil {
 		s.log.Errorln(s.GetSupplierName(), "CheckAlive.Get", err)
@@ -81,7 +79,7 @@ func (s *Supplier) IsAlive() bool {
 
 func (s *Supplier) OverDailyDownloadLimit() bool {
 
-	if s.settings.AdvancedSettings.SuppliersSettings.A4k.DailyDownloadLimit == 0 {
+	if settings.Get().AdvancedSettings.SuppliersSettings.A4k.DailyDownloadLimit == 0 {
 		s.log.Warningln(s.GetSupplierName(), "DailyDownloadLimit is 0, will Skip Download")
 		return true
 	}
@@ -95,7 +93,7 @@ func (s *Supplier) GetLogger() *logrus.Logger {
 }
 
 func (s *Supplier) GetSettings() *settings.Settings {
-	return s.settings
+	return settings.Get()
 }
 
 func (s *Supplier) GetSupplierName() string {
@@ -113,7 +111,7 @@ func (s *Supplier) GetSubListFromFile4Movie(videoFPath string) ([]supplier.SubIn
 	outSubInfos := make([]supplier.SubInfo, 0)
 
 	mediaInfo, err := mix_media_info.GetMixMediaInfo(s.fileDownloader.MediaInfoDealers,
-		videoFPath, true, s.settings.AdvancedSettings.ProxySettings)
+		videoFPath, true, settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		s.log.Errorln(s.GetSupplierName(), "GetMixMediaInfo", err)
 		return nil, err
@@ -144,7 +142,7 @@ func (s *Supplier) GetSubListFromFile4Movie(videoFPath string) ([]supplier.SubIn
 	downloadCounter := 0
 	for _, searchResultItem := range searchResultItems {
 
-		downloadPageUrl := s.settings.AdvancedSettings.SuppliersSettings.A4k.RootUrl + searchResultItem.RUrl
+		downloadPageUrl := settings.Get().AdvancedSettings.SuppliersSettings.A4k.RootUrl + searchResultItem.RUrl
 		subInfo, err := s.downloadSub(videoFPath, downloadPageUrl, 0, 0)
 		if err != nil {
 			s.log.Errorln(s.GetSupplierName(), "downloadSub", err)
@@ -176,7 +174,7 @@ func (s *Supplier) GetSubListFromFile4Series(seriesInfo *series.SeriesInfo) ([]s
 	for _, episodeInfo := range seriesInfo.NeedDlEpsKeyList {
 
 		mediaInfo, err := mix_media_info.GetMixMediaInfo(s.fileDownloader.MediaInfoDealers,
-			episodeInfo.FileFullPath, false, s.settings.AdvancedSettings.ProxySettings)
+			episodeInfo.FileFullPath, false, settings.Get().AdvancedSettings.ProxySettings)
 		if err != nil {
 			s.log.Errorln(s.GetSupplierName(), "GetMixMediaInfo", err)
 			return nil, err
@@ -222,7 +220,7 @@ func (s *Supplier) GetSubListFromFile4Series(seriesInfo *series.SeriesInfo) ([]s
 			} else if episodeInfo.Season == searchResultItem.Season && searchResultItem.IsFullSeason == true {
 				// Season 匹配上,Eps 为 0 则下载,全季
 			}
-			downloadPageUrl := s.settings.AdvancedSettings.SuppliersSettings.A4k.RootUrl + searchResultItem.RUrl
+			downloadPageUrl := settings.Get().AdvancedSettings.SuppliersSettings.A4k.RootUrl + searchResultItem.RUrl
 			// 注意这里传入的 Season Episode 是这个字幕下载时候解析出来的信息
 			subInfo, err := s.downloadSub(episodeInfo.FileFullPath, downloadPageUrl, searchResultItem.Season, searchResultItem.Episode)
 			if err != nil {
@@ -287,13 +285,13 @@ func (s *Supplier) listPageItems(keyword string, pageIndex int, isMovie bool) (s
 		time.Sleep(time.Second * 10)
 	}()
 	searchResultItems = make([]SearchResultItem, 0)
-	httpClient, err := pkg.NewHttpClient(s.settings.AdvancedSettings.ProxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		err = errors.New("NewHttpClient error:" + err.Error())
 		return
 	}
 	// 先对第一页进行分析
-	searPageUrl := fmt.Sprintf(s.settings.AdvancedSettings.SuppliersSettings.A4k.RootUrl+"/search?term=%s&page=%d", url.QueryEscape(keyword), pageIndex)
+	searPageUrl := fmt.Sprintf(settings.Get().AdvancedSettings.SuppliersSettings.A4k.RootUrl+"/search?term=%s&page=%d", url.QueryEscape(keyword), pageIndex)
 	resp, err := httpClient.R().Get(searPageUrl)
 	if err != nil {
 		err = errors.New("http get error:" + err.Error())
@@ -390,7 +388,7 @@ func (s *Supplier) downloadSub(videoFileName, downloadPageUrl string, season, ep
 	}()
 
 	var httpClient *resty.Client
-	httpClient, err = pkg.NewHttpClient(s.settings.AdvancedSettings.ProxySettings)
+	httpClient, err = pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		err = errors.New("NewHttpClient error:" + err.Error())
 		return
@@ -420,7 +418,7 @@ func (s *Supplier) downloadSub(videoFileName, downloadPageUrl string, season, ep
 		return
 	}
 	// 开始下载
-	downloadFileUrl := s.settings.AdvancedSettings.SuppliersSettings.A4k.RootUrl + downloadBtHrefUrl
+	downloadFileUrl := settings.Get().AdvancedSettings.SuppliersSettings.A4k.RootUrl + downloadBtHrefUrl
 	subInfo, err = s.fileDownloader.GetA4k(s.GetSupplierName(), 0, season, eps, videoFileName, downloadFileUrl)
 	if err != nil {
 		err = errors.New("fileDownloader.Get error:" + err.Error())

+ 3 - 3
pkg/logic/sub_supplier/a4k/a4k_test.go

@@ -55,7 +55,7 @@ func TestSupplier_GetSubListFromFile4Series(t *testing.T) {
 	ser := filepath.Join(rootDir, "zimuku", "series", "黄石 (2018)")
 	// 读取本地的视频和字幕信息
 	seriesInfo, err := series_helper.ReadSeriesInfoFromDir(log_helper.GetLogger4Tester(), ser,
-		90, false, false, settings.GetSettings().AdvancedSettings.ProxySettings, epsMap)
+		90, false, false, settings.Get().AdvancedSettings.ProxySettings, epsMap)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -93,9 +93,9 @@ func defInstance() {
 		AESIv16:  pkg.AESIv16(),
 	}
 
-	nowSettings := settings.GetSettings()
+	nowSettings := settings.Get()
 	nowSettings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled = true
 
 	a4kInstance = NewSupplier(file_downloader.NewFileDownloader(
-		cache_center.NewCacheCenter("test", nowSettings, log_helper.GetLogger4Tester()), authKey))
+		cache_center.NewCacheCenter("test", log_helper.GetLogger4Tester()), authKey))
 }

+ 21 - 23
pkg/logic/sub_supplier/assrt/assrt.go

@@ -28,7 +28,6 @@ import (
 )
 
 type Supplier struct {
-	settings          *settings.Settings
 	log               *logrus.Logger
 	fileDownloader    *file_downloader.FileDownloader
 	topic             int
@@ -44,9 +43,8 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	sup.topic = common2.DownloadSubsPerSite
 	sup.isAlive = true // 默认是可以使用的,如果 check 后,再调整状态
 
-	sup.settings = fileDownloader.Settings
-	if sup.settings.AdvancedSettings.Topic > 0 && sup.settings.AdvancedSettings.Topic != sup.topic {
-		sup.topic = sup.settings.AdvancedSettings.Topic
+	if settings.Get().AdvancedSettings.Topic > 0 && settings.Get().AdvancedSettings.Topic != sup.topic {
+		sup.topic = settings.Get().AdvancedSettings.Topic
 	}
 
 	sup.theSearchInterval = 20 * time.Second
@@ -57,7 +55,7 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 func (s *Supplier) CheckAlive(proxySettings ...*settings.ProxySettings) (bool, int64) {
 
 	// 如果没有设置这个 API 接口,那么就任务是不可用的
-	if s.settings.SubtitleSources.AssrtSettings.Token == "" {
+	if settings.Get().SubtitleSources.AssrtSettings.Token == "" {
 		s.isAlive = false
 		return false, 0
 	}
@@ -82,7 +80,7 @@ func (s *Supplier) IsAlive() bool {
 
 func (s *Supplier) OverDailyDownloadLimit() bool {
 
-	if s.settings.AdvancedSettings.SuppliersSettings.Assrt.DailyDownloadLimit == 0 {
+	if settings.Get().AdvancedSettings.SuppliersSettings.Assrt.DailyDownloadLimit == 0 {
 		s.log.Warningln(s.GetSupplierName(), "DailyDownloadLimit is 0, will Skip Download")
 		return true
 	}
@@ -96,7 +94,7 @@ func (s *Supplier) GetLogger() *logrus.Logger {
 }
 
 func (s *Supplier) GetSettings() *settings.Settings {
-	return s.settings
+	return settings.Get()
 }
 
 func (s *Supplier) GetSupplierName() string {
@@ -106,11 +104,11 @@ func (s *Supplier) GetSupplierName() string {
 func (s *Supplier) GetSubListFromFile4Movie(filePath string) ([]supplier.SubInfo, error) {
 
 	outSubInfos := make([]supplier.SubInfo, 0)
-	if s.settings.SubtitleSources.AssrtSettings.Enabled == false {
+	if settings.Get().SubtitleSources.AssrtSettings.Enabled == false {
 		return outSubInfos, nil
 	}
 
-	if s.settings.SubtitleSources.AssrtSettings.Token == "" {
+	if settings.Get().SubtitleSources.AssrtSettings.Token == "" {
 		return nil, errors.New("Token is empty")
 	}
 
@@ -120,11 +118,11 @@ func (s *Supplier) GetSubListFromFile4Movie(filePath string) ([]supplier.SubInfo
 func (s *Supplier) GetSubListFromFile4Series(seriesInfo *series.SeriesInfo) ([]supplier.SubInfo, error) {
 
 	outSubInfos := make([]supplier.SubInfo, 0)
-	if s.settings.SubtitleSources.AssrtSettings.Enabled == false {
+	if settings.Get().SubtitleSources.AssrtSettings.Enabled == false {
 		return outSubInfos, nil
 	}
 
-	if s.settings.SubtitleSources.AssrtSettings.Token == "" {
+	if settings.Get().SubtitleSources.AssrtSettings.Token == "" {
 		return nil, errors.New("Token is empty")
 	}
 
@@ -134,11 +132,11 @@ func (s *Supplier) GetSubListFromFile4Series(seriesInfo *series.SeriesInfo) ([]s
 func (s *Supplier) GetSubListFromFile4Anime(seriesInfo *series.SeriesInfo) ([]supplier.SubInfo, error) {
 
 	outSubInfos := make([]supplier.SubInfo, 0)
-	if s.settings.SubtitleSources.AssrtSettings.Enabled == false {
+	if settings.Get().SubtitleSources.AssrtSettings.Enabled == false {
 		return outSubInfos, nil
 	}
 
-	if s.settings.SubtitleSources.AssrtSettings.Token == "" {
+	if settings.Get().SubtitleSources.AssrtSettings.Token == "" {
 		return nil, errors.New("Token is empty")
 	}
 
@@ -154,7 +152,7 @@ func (s *Supplier) getSubListFromFile(videoFPath string, isMovie bool) ([]suppli
 	s.log.Debugln(s.GetSupplierName(), videoFPath, "Start...")
 
 	outSubInfoList := make([]supplier.SubInfo, 0)
-	mediaInfo, err := mix_media_info.GetMixMediaInfo(s.fileDownloader.MediaInfoDealers, videoFPath, isMovie, s.settings.AdvancedSettings.ProxySettings)
+	mediaInfo, err := mix_media_info.GetMixMediaInfo(s.fileDownloader.MediaInfoDealers, videoFPath, isMovie, settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		s.log.Errorln(s.GetSupplierName(), videoFPath, "GetMixMediaInfo", err)
 		return nil, err
@@ -287,16 +285,16 @@ func (s *Supplier) getSubByKeyWord(keyword string) (*SearchSubResult, error) {
 
 	s.log.Infoln("Search KeyWord:", keyword)
 	tt := url.QueryEscape(keyword)
-	httpClient, err := pkg.NewHttpClient(s.settings.AdvancedSettings.ProxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
 	var errKnow error
 	resp, err := httpClient.R().
-		Get(s.settings.AdvancedSettings.SuppliersSettings.Assrt.RootUrl +
+		Get(settings.Get().AdvancedSettings.SuppliersSettings.Assrt.RootUrl +
 			"/sub/search?q=" + tt +
 			"&cnt=15&pos=0" +
-			"&token=" + s.settings.SubtitleSources.AssrtSettings.Token)
+			"&token=" + settings.Get().SubtitleSources.AssrtSettings.Token)
 	if err != nil {
 		return nil, err
 	}
@@ -340,17 +338,17 @@ func (s *Supplier) getSubDetail(subID int) (OneSubDetail, error) {
 
 	var subDetail OneSubDetail
 
-	httpClient, err := pkg.NewHttpClient(s.settings.AdvancedSettings.ProxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return subDetail, err
 	}
 	resp, err := httpClient.R().
 		SetQueryParams(map[string]string{
-			"token": s.settings.SubtitleSources.AssrtSettings.Token,
+			"token": settings.Get().SubtitleSources.AssrtSettings.Token,
 			"id":    strconv.Itoa(subID),
 		}).
 		SetResult(&subDetail).
-		Get(s.settings.AdvancedSettings.SuppliersSettings.Assrt.RootUrl + "/sub/detail")
+		Get(settings.Get().AdvancedSettings.SuppliersSettings.Assrt.RootUrl + "/sub/detail")
 	if err != nil {
 		if resp != nil {
 			s.log.Errorln(s.GetSupplierName(), "NewHttpClient:", subID, err.Error())
@@ -379,16 +377,16 @@ func (s *Supplier) getUserInfo() (UserInfo, error) {
 
 	var userInfo UserInfo
 
-	httpClient, err := pkg.NewHttpClient(s.settings.AdvancedSettings.ProxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return userInfo, err
 	}
 	resp, err := httpClient.R().
 		SetQueryParams(map[string]string{
-			"token": s.settings.SubtitleSources.AssrtSettings.Token,
+			"token": settings.Get().SubtitleSources.AssrtSettings.Token,
 		}).
 		SetResult(&userInfo).
-		Get(s.settings.AdvancedSettings.SuppliersSettings.Assrt.RootUrl + "/user/quota")
+		Get(settings.Get().AdvancedSettings.SuppliersSettings.Assrt.RootUrl + "/user/quota")
 	if err != nil {
 		if resp != nil {
 			s.log.Errorln(s.GetSupplierName(), "NewHttpClient:", err.Error())

+ 1 - 2
pkg/logic/sub_supplier/assrt/assrt_test.go

@@ -10,7 +10,6 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/pkg/cache_center"
 	"github.com/allanpk716/ChineseSubFinder/pkg/log_helper"
 	"github.com/allanpk716/ChineseSubFinder/pkg/random_auth_key"
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 )
 
 var assrtInstance *Supplier
@@ -26,7 +25,7 @@ func defInstance() {
 	}
 
 	assrtInstance = NewSupplier(file_downloader.NewFileDownloader(
-		cache_center.NewCacheCenter("test", settings.GetSettings(), log_helper.GetLogger4Tester()), authKey))
+		cache_center.NewCacheCenter("test", log_helper.GetLogger4Tester()), authKey))
 }
 
 func TestSupplier_getSubListFromFile(t *testing.T) {

+ 8 - 10
pkg/logic/sub_supplier/csf/csf.go

@@ -30,7 +30,6 @@ import (
 )
 
 type Supplier struct {
-	settings       *settings.Settings
 	log            *logrus.Logger
 	fileDownloader *file_downloader.FileDownloader
 	topic          int
@@ -45,9 +44,8 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	sup.topic = common2.DownloadSubsPerSite
 	sup.isAlive = true // 默认是可以使用的,如果 check 后,再调整状态
 
-	sup.settings = fileDownloader.Settings
-	if sup.settings.AdvancedSettings.Topic > 0 && sup.settings.AdvancedSettings.Topic != sup.topic {
-		sup.topic = sup.settings.AdvancedSettings.Topic
+	if settings.Get().AdvancedSettings.Topic > 0 && settings.Get().AdvancedSettings.Topic != sup.topic {
+		sup.topic = settings.Get().AdvancedSettings.Topic
 	}
 
 	return &sup
@@ -73,7 +71,7 @@ func (s *Supplier) IsAlive() bool {
 
 func (s *Supplier) OverDailyDownloadLimit() bool {
 
-	if s.settings.AdvancedSettings.SuppliersSettings.ChineseSubFinder.DailyDownloadLimit == 0 {
+	if settings.Get().AdvancedSettings.SuppliersSettings.ChineseSubFinder.DailyDownloadLimit == 0 {
 		s.log.Warningln(s.GetSupplierName(), "DailyDownloadLimit is 0, will Skip Download")
 		return true
 	}
@@ -87,7 +85,7 @@ func (s *Supplier) GetLogger() *logrus.Logger {
 }
 
 func (s *Supplier) GetSettings() *settings.Settings {
-	return s.settings
+	return settings.Get()
 }
 
 func (s *Supplier) GetSupplierName() string {
@@ -97,7 +95,7 @@ func (s *Supplier) GetSupplierName() string {
 func (s *Supplier) GetSubListFromFile4Movie(filePath string) ([]supplier.SubInfo, error) {
 
 	outSubInfos := make([]supplier.SubInfo, 0)
-	if s.settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == false {
+	if settings.Get().ExperimentalFunction.ShareSubSettings.ShareSubEnabled == false {
 		return outSubInfos, nil
 	}
 
@@ -107,7 +105,7 @@ func (s *Supplier) GetSubListFromFile4Movie(filePath string) ([]supplier.SubInfo
 func (s *Supplier) GetSubListFromFile4Series(seriesInfo *series.SeriesInfo) ([]supplier.SubInfo, error) {
 
 	outSubInfos := make([]supplier.SubInfo, 0)
-	if s.settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == false {
+	if settings.Get().ExperimentalFunction.ShareSubSettings.ShareSubEnabled == false {
 		return outSubInfos, nil
 	}
 
@@ -127,7 +125,7 @@ func (s *Supplier) GetSubListFromFile4Series(seriesInfo *series.SeriesInfo) ([]s
 func (s *Supplier) GetSubListFromFile4Anime(seriesInfo *series.SeriesInfo) ([]supplier.SubInfo, error) {
 
 	outSubInfos := make([]supplier.SubInfo, 0)
-	if s.settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == false {
+	if settings.Get().ExperimentalFunction.ShareSubSettings.ShareSubEnabled == false {
 		return outSubInfos, nil
 	}
 
@@ -158,7 +156,7 @@ func (s *Supplier) findAndDownload(videoFPath string, isMovie bool, Season, Epis
 		err = errors.New(fmt.Sprintf("%s.Calculate %s %s", s.GetSupplierName(), videoFPath, err))
 		return
 	}
-	mediaInfo, err := mix_media_info.GetMixMediaInfo(s.fileDownloader.MediaInfoDealers, videoFPath, isMovie, s.settings.AdvancedSettings.ProxySettings)
+	mediaInfo, err := mix_media_info.GetMixMediaInfo(s.fileDownloader.MediaInfoDealers, videoFPath, isMovie, settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		err = errors.New(fmt.Sprintf("%s.GetMixMediaInfo %s %s", s.GetSupplierName(), videoFPath, err))
 		return

+ 2 - 2
pkg/logic/sub_supplier/csf/csf_test.go

@@ -75,9 +75,9 @@ func defInstance() {
 		AESIv16:  pkg.AESIv16(),
 	}
 
-	nowSettings := settings.GetSettings()
+	nowSettings := settings.Get()
 	nowSettings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled = true
 
 	csfInstance = NewSupplier(file_downloader.NewFileDownloader(
-		cache_center.NewCacheCenter("test", nowSettings, log_helper.GetLogger4Tester()), authKey))
+		cache_center.NewCacheCenter("test", log_helper.GetLogger4Tester()), authKey))
 }

+ 6 - 8
pkg/logic/sub_supplier/shooter/shooter.go

@@ -23,7 +23,6 @@ import (
 )
 
 type Supplier struct {
-	settings       *settings.Settings
 	log            *logrus.Logger
 	fileDownloader *file_downloader.FileDownloader
 	topic          int
@@ -38,9 +37,8 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	sup.topic = common.DownloadSubsPerSite
 	sup.isAlive = true // 默认是可以使用的,如果 check 后,再调整状态
 
-	sup.settings = fileDownloader.Settings
-	if sup.settings.AdvancedSettings.Topic > 0 && sup.settings.AdvancedSettings.Topic != sup.topic {
-		sup.topic = sup.settings.AdvancedSettings.Topic
+	if settings.Get().AdvancedSettings.Topic > 0 && settings.Get().AdvancedSettings.Topic != sup.topic {
+		sup.topic = settings.Get().AdvancedSettings.Topic
 	}
 
 	return &sup
@@ -66,7 +64,7 @@ func (s *Supplier) IsAlive() bool {
 
 func (s *Supplier) OverDailyDownloadLimit() bool {
 
-	if s.settings.AdvancedSettings.SuppliersSettings.Shooter.DailyDownloadLimit == 0 {
+	if settings.Get().AdvancedSettings.SuppliersSettings.Shooter.DailyDownloadLimit == 0 {
 		s.log.Warningln(s.GetSupplierName(), "DailyDownloadLimit is 0, will Skip Download")
 		return true
 	}
@@ -79,7 +77,7 @@ func (s *Supplier) GetLogger() *logrus.Logger {
 }
 
 func (s *Supplier) GetSettings() *settings.Settings {
-	return s.settings
+	return settings.Get()
 }
 
 func (s *Supplier) GetSupplierName() string {
@@ -165,7 +163,7 @@ func (s *Supplier) getSubInfos(fileHash, fileName, qLan string) ([]SublistShoote
 
 	var jsonList []SublistShooter
 
-	httpClient, err := pkg.NewHttpClient(s.settings.AdvancedSettings.ProxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -177,7 +175,7 @@ func (s *Supplier) getSubInfos(fileHash, fileName, qLan string) ([]SublistShoote
 			"lang":     qLan,
 		}).
 		SetResult(&jsonList).
-		Post(s.settings.AdvancedSettings.SuppliersSettings.Shooter.RootUrl)
+		Post(settings.Get().AdvancedSettings.SuppliersSettings.Shooter.RootUrl)
 	if err != nil {
 		if resp != nil {
 			s.log.Errorln(s.GetSupplierName(), "NewHttpClient:", fileName, err.Error())

+ 1 - 2
pkg/logic/sub_supplier/shooter/shooter_test.go

@@ -10,7 +10,6 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/pkg/log_helper"
 	"github.com/allanpk716/ChineseSubFinder/pkg/logic/file_downloader"
 	"github.com/allanpk716/ChineseSubFinder/pkg/random_auth_key"
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 	"github.com/allanpk716/ChineseSubFinder/pkg/unit_test_helper"
 )
 
@@ -40,7 +39,7 @@ func TestNewSupplier(t *testing.T) {
 	if err != nil {
 		t.Fatal(err)
 	}
-	shooter := NewSupplier(file_downloader.NewFileDownloader(cache_center.NewCacheCenter("test", settings.NewSettings(pkg.ConfigRootDirFPath()), log_helper.GetLogger4Tester()), authKey))
+	shooter := NewSupplier(file_downloader.NewFileDownloader(cache_center.NewCacheCenter("test", log_helper.GetLogger4Tester()), authKey))
 	outList, err := shooter.getSubListFromFile(gVideoFPath)
 	if err != nil {
 		t.Error(err)

+ 4 - 5
pkg/logic/sub_supplier/subhd/subhd_test.go

@@ -16,7 +16,6 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/pkg/cache_center"
 	"github.com/allanpk716/ChineseSubFinder/pkg/log_helper"
 	"github.com/allanpk716/ChineseSubFinder/pkg/random_auth_key"
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 	"github.com/allanpk716/ChineseSubFinder/pkg/something_static"
 	"github.com/allanpk716/ChineseSubFinder/pkg/unit_test_helper"
 )
@@ -47,7 +46,7 @@ func TestSupplier_GetSubListFromFile(t *testing.T) {
 	rootDir := unit_test_helper.GetTestDataResourceRootPath([]string{"sub_spplier"}, 5, true)
 	movie1 := filepath.Join(rootDir, "zimuku", "movies", "消失爱人 (2016)", "消失爱人 (2016) 720p AAC.rmvb")
 
-	subhd := NewSupplier(file_downloader.NewFileDownloader(cache_center.NewCacheCenter("test", settings.NewSettings(pkg.ConfigRootDirFPath()), log_helper.GetLogger4Tester()), authKey))
+	subhd := NewSupplier(file_downloader.NewFileDownloader(cache_center.NewCacheCenter("test", log_helper.GetLogger4Tester()), authKey))
 	outList, err := subhd.getSubListFromFile4Movie(movie1)
 	if err != nil {
 		t.Error(err)
@@ -89,7 +88,7 @@ func TestSupplier_GetSubListFromFile4Series(t *testing.T) {
 	if err != nil {
 		t.Fatal(err)
 	}
-	s := NewSupplier(file_downloader.NewFileDownloader(cache_center.NewCacheCenter("test", settings.NewSettings(pkg.ConfigRootDirFPath()), log_helper.GetLogger4Tester()), authKey))
+	s := NewSupplier(file_downloader.NewFileDownloader(cache_center.NewCacheCenter("test", log_helper.GetLogger4Tester()), authKey))
 	outList, err := s.GetSubListFromFile4Series(seriesInfo)
 	if err != nil {
 		t.Fatal(err)
@@ -111,7 +110,7 @@ func TestSupplier_getSubListFromKeyword4Movie(t *testing.T) {
 	//imdbID := "tt3626476" // Vacation Friends (2021)
 	getCode()
 	defInstance()
-	subhd := NewSupplier(file_downloader.NewFileDownloader(cache_center.NewCacheCenter("test", settings.NewSettings(pkg.ConfigRootDirFPath()), log_helper.GetLogger4Tester()), authKey))
+	subhd := NewSupplier(file_downloader.NewFileDownloader(cache_center.NewCacheCenter("test", log_helper.GetLogger4Tester()), authKey))
 	subInfos, err := subhd.getSubListFromKeyword4Movie(imdbID)
 	if err != nil {
 		t.Fatal(err)
@@ -128,7 +127,7 @@ func getCode() {
 		return
 	}
 	fileDownloader := file_downloader.NewFileDownloader(
-		cache_center.NewCacheCenter("local_task_queue", settings.GetSettings(), log_helper.GetLogger4Tester()),
+		cache_center.NewCacheCenter("local_task_queue", log_helper.GetLogger4Tester()),
 		random_auth_key.AuthKey{
 			BaseKey:  pkg.BaseKey(),
 			AESKey16: pkg.AESKey16(),

+ 6 - 8
pkg/logic/sub_supplier/xunlei/xunlei.go

@@ -25,7 +25,6 @@ import (
 )
 
 type Supplier struct {
-	settings       *settings.Settings
 	log            *logrus.Logger
 	fileDownloader *file_downloader.FileDownloader
 	topic          int
@@ -40,9 +39,8 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	sup.topic = common.DownloadSubsPerSite
 	sup.isAlive = true // 默认是可以使用的,如果 check 后,再调整状态
 
-	sup.settings = fileDownloader.Settings
-	if sup.settings.AdvancedSettings.Topic > 0 && sup.settings.AdvancedSettings.Topic != sup.topic {
-		sup.topic = sup.settings.AdvancedSettings.Topic
+	if settings.Get().AdvancedSettings.Topic > 0 && settings.Get().AdvancedSettings.Topic != sup.topic {
+		sup.topic = settings.Get().AdvancedSettings.Topic
 	}
 
 	return &sup
@@ -75,7 +73,7 @@ func (s *Supplier) IsAlive() bool {
 
 func (s *Supplier) OverDailyDownloadLimit() bool {
 
-	if s.settings.AdvancedSettings.SuppliersSettings.Xunlei.DailyDownloadLimit == 0 {
+	if settings.Get().AdvancedSettings.SuppliersSettings.Xunlei.DailyDownloadLimit == 0 {
 		s.log.Warningln(s.GetSupplierName(), "DailyDownloadLimit is 0, will Skip Download")
 		return true
 	}
@@ -89,7 +87,7 @@ func (s *Supplier) GetLogger() *logrus.Logger {
 }
 
 func (s *Supplier) GetSettings() *settings.Settings {
-	return s.settings
+	return settings.Get()
 }
 
 func (s *Supplier) GetSupplierName() string {
@@ -192,13 +190,13 @@ func (s *Supplier) getSubListFromFile(filePath string) ([]supplier.SubInfo, erro
 func (s *Supplier) getSubInfos(filePath, cid string) (SublistSliceXunLei, error) {
 	var jsonList SublistSliceXunLei
 
-	httpClient, err := pkg.NewHttpClient(s.settings.AdvancedSettings.ProxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return jsonList, err
 	}
 	resp, err := httpClient.R().
 		SetResult(&jsonList).
-		Get(fmt.Sprintf(s.settings.AdvancedSettings.SuppliersSettings.Xunlei.RootUrl, cid))
+		Get(fmt.Sprintf(settings.Get().AdvancedSettings.SuppliersSettings.Xunlei.RootUrl, cid))
 	if err != nil {
 		if resp != nil {
 			s.log.Errorln(s.GetSupplierName(), "NewHttpClient:", filePath, err.Error())

+ 1 - 2
pkg/logic/sub_supplier/xunlei/xunlei_test.go

@@ -11,7 +11,6 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/pkg/cache_center"
 	"github.com/allanpk716/ChineseSubFinder/pkg/log_helper"
 	"github.com/allanpk716/ChineseSubFinder/pkg/random_auth_key"
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 	"github.com/allanpk716/ChineseSubFinder/pkg/unit_test_helper"
 )
 
@@ -65,5 +64,5 @@ func defInstance() {
 	}
 
 	xunleiInstance = NewSupplier(file_downloader.NewFileDownloader(
-		cache_center.NewCacheCenter("test", settings.GetSettings(), log_helper.GetLogger4Tester()), authKey))
+		cache_center.NewCacheCenter("test", log_helper.GetLogger4Tester()), authKey))
 }

+ 2 - 2
pkg/logic/sub_supplier/zimuku/zimuku_test.go

@@ -93,7 +93,7 @@ func TestSupplier_GetSubListFromFile4Series(t *testing.T) {
 		90,
 		false,
 		false,
-		settings.GetSettings().AdvancedSettings.ProxySettings,
+		settings.Get().AdvancedSettings.ProxySettings,
 		epsMap)
 	if err != nil {
 		t.Fatal(err)
@@ -185,5 +185,5 @@ func defInstance() {
 	}
 
 	zimukuInstance = NewSupplier(file_downloader.NewFileDownloader(
-		cache_center.NewCacheCenter("test", settings.GetSettings(), log_helper.GetLogger4Tester()), authKey))
+		cache_center.NewCacheCenter("test", log_helper.GetLogger4Tester()), authKey))
 }

+ 4 - 5
pkg/media_info_dealers/dealers.go

@@ -14,13 +14,12 @@ import (
 
 type Dealers struct {
 	Logger          *logrus.Logger
-	settings        *settings.Settings
 	SubtitleBestApi *subtitle_best_api.SubtitleBestApi
 	tmdbHelper      *tmdb_api.TmdbApi
 }
 
-func NewDealers(log *logrus.Logger, settings *settings.Settings, subtitleBestApi *subtitle_best_api.SubtitleBestApi) *Dealers {
-	return &Dealers{Logger: log, settings: settings, SubtitleBestApi: subtitleBestApi}
+func NewDealers(log *logrus.Logger, subtitleBestApi *subtitle_best_api.SubtitleBestApi) *Dealers {
+	return &Dealers{Logger: log, SubtitleBestApi: subtitleBestApi}
 }
 
 func (d *Dealers) SetTmdbHelperInstance(tmdbHelper *tmdb_api.TmdbApi) {
@@ -30,7 +29,7 @@ func (d *Dealers) SetTmdbHelperInstance(tmdbHelper *tmdb_api.TmdbApi) {
 // ConvertId 目前仅仅支持 TMDB ID 转 IMDB ID
 func (d *Dealers) ConvertId(iD string, idType string, isMovieOrSeries bool) (convertIdResult *tmdb_api.ConvertIdResult, err error) {
 
-	if d.tmdbHelper != nil && d.settings.AdvancedSettings.TmdbApiSettings.Enable == true && d.settings.AdvancedSettings.TmdbApiSettings.ApiKey != "" {
+	if d.tmdbHelper != nil && settings.Get().AdvancedSettings.TmdbApiSettings.Enable == true && settings.Get().AdvancedSettings.TmdbApiSettings.ApiKey != "" {
 		// 优先使用用户自己的 tmdb api
 		return d.tmdbHelper.ConvertId(iD, idType, isMovieOrSeries)
 	} else {
@@ -56,7 +55,7 @@ func (d *Dealers) ConvertId(iD string, idType string, isMovieOrSeries bool) (con
 
 func (d *Dealers) GetMediaInfo(id, source, videoType string) (*models.MediaInfo, error) {
 
-	if d.tmdbHelper != nil && d.settings.AdvancedSettings.TmdbApiSettings.Enable == true && d.settings.AdvancedSettings.TmdbApiSettings.ApiKey != "" {
+	if d.tmdbHelper != nil && settings.Get().AdvancedSettings.TmdbApiSettings.Enable == true && settings.Get().AdvancedSettings.TmdbApiSettings.ApiKey != "" {
 		// 优先使用用户自己的 tmdb api
 		return d.getMediaInfoFromSelfApi(id, source, videoType)
 	} else {

+ 1 - 1
pkg/rod_helper/multi_browser_test.go

@@ -10,7 +10,7 @@ import (
 
 func TestNewMultiBrowser(t *testing.T) {
 
-	browserOptions := NewBrowserOptions(log_helper.GetLogger4Tester(), true, settings.GetSettings())
+	browserOptions := NewBrowserOptions(log_helper.GetLogger4Tester(), true, settings.Get())
 	browserOptions.SetXrayPoolUrl("127.0.0.1")
 	browserOptions.SetXrayPoolPort("19035")
 	b := NewMultiBrowser(browserOptions)

+ 1 - 1
pkg/rod_helper/rod_base.go

@@ -416,7 +416,7 @@ func HttpGetFromBrowser(browser *rod.Browser, inputUrl string, tt time.Duration,
 
 // ReloadBrowser 提前把浏览器下载好
 func ReloadBrowser(log *logrus.Logger) {
-	newBrowser, err := NewBrowserEx(NewBrowserOptions(log, true, settings.GetSettings()))
+	newBrowser, err := NewBrowserEx(NewBrowserOptions(log, true, settings.Get()))
 	if err != nil {
 		return
 	}

+ 11 - 12
pkg/save_sub_helper/save_sub_helper.go

@@ -16,13 +16,12 @@ import (
 
 type SaveSubHelper struct {
 	log                      *logrus.Logger
-	settings                 *settings.Settings
 	SubFormatter             ifaces.ISubFormatter                         // 字幕格式化命名的实现
 	subTimelineFixerHelperEx *sub_timeline_fixer.SubTimelineFixerHelperEx // 字幕时间轴校正
 }
 
-func NewSaveSubHelper(log *logrus.Logger, settings *settings.Settings, subFormatter ifaces.ISubFormatter, subTimelineFixerHelperEx *sub_timeline_fixer.SubTimelineFixerHelperEx) *SaveSubHelper {
-	return &SaveSubHelper{settings: settings, log: log, SubFormatter: subFormatter, subTimelineFixerHelperEx: subTimelineFixerHelperEx}
+func NewSaveSubHelper(log *logrus.Logger, subFormatter ifaces.ISubFormatter, subTimelineFixerHelperEx *sub_timeline_fixer.SubTimelineFixerHelperEx) *SaveSubHelper {
+	return &SaveSubHelper{log: log, SubFormatter: subFormatter, subTimelineFixerHelperEx: subTimelineFixerHelperEx}
 }
 
 // WriteSubFile2VideoPath 在前面需要进行语言的筛选、排序,这里仅仅是存储, extraSubPreName 这里传递是字幕的网站,有就认为是多字幕的存储。空就是单字幕,单字幕就可以setDefault
@@ -58,17 +57,17 @@ func (s *SaveSubHelper) WriteSubFile2VideoPath(videoFileFullPath string, finalSu
 	s.log.Infoln("SubDownAt:", desSubFullPath)
 
 	// 然后还需要判断是否需要校正字幕的时间轴
-	if s.settings.AdvancedSettings.FixTimeLine == true {
+	if settings.Get().AdvancedSettings.FixTimeLine == true {
 		err = s.subTimelineFixerHelperEx.Process(videoFileFullPath, desSubFullPath)
 		if err != nil {
 			return err
 		}
 	}
 	// 判断是否需要转换字幕的编码
-	if s.settings.ExperimentalFunction.AutoChangeSubEncode.Enable == true {
+	if settings.Get().ExperimentalFunction.AutoChangeSubEncode.Enable == true {
 		s.log.Infoln("----------------------------------")
-		s.log.Infoln("change_file_encode to", s.settings.ExperimentalFunction.AutoChangeSubEncode.GetDesEncodeType())
-		err = change_file_encode.Process(desSubFullPath, s.settings.ExperimentalFunction.AutoChangeSubEncode.DesEncodeType)
+		s.log.Infoln("change_file_encode to", settings.Get().ExperimentalFunction.AutoChangeSubEncode.GetDesEncodeType())
+		err = change_file_encode.Process(desSubFullPath, settings.Get().ExperimentalFunction.AutoChangeSubEncode.DesEncodeType)
 		if err != nil {
 			return err
 		}
@@ -77,12 +76,12 @@ func (s *SaveSubHelper) WriteSubFile2VideoPath(videoFileFullPath string, finalSu
 	// 判断是否需要进行简繁互转
 	// 一定得是 UTF-8 才能够执行简繁转换
 	// 测试了先转 UTF-8 进行简繁转换然后再转 GBK,有些时候会出错,所以还是不支持这样先
-	if s.settings.ExperimentalFunction.AutoChangeSubEncode.Enable == true &&
-		s.settings.ExperimentalFunction.AutoChangeSubEncode.DesEncodeType == 0 &&
-		s.settings.ExperimentalFunction.ChsChtChanger.Enable == true {
+	if settings.Get().ExperimentalFunction.AutoChangeSubEncode.Enable == true &&
+		settings.Get().ExperimentalFunction.AutoChangeSubEncode.DesEncodeType == 0 &&
+		settings.Get().ExperimentalFunction.ChsChtChanger.Enable == true {
 		s.log.Infoln("----------------------------------")
-		s.log.Infoln("chs_cht_changer to", s.settings.ExperimentalFunction.ChsChtChanger.GetDesChineseLanguageTypeString())
-		err = chs_cht_changer.Process(desSubFullPath, s.settings.ExperimentalFunction.ChsChtChanger.DesChineseLanguageType)
+		s.log.Infoln("chs_cht_changer to", settings.Get().ExperimentalFunction.ChsChtChanger.GetDesChineseLanguageTypeString())
+		err = chs_cht_changer.Process(desSubFullPath, settings.Get().ExperimentalFunction.ChsChtChanger.DesChineseLanguageType)
 		if err != nil {
 			return err
 		}

+ 34 - 8
pkg/settings/settings.go

@@ -23,8 +23,12 @@ type Settings struct {
 	ExperimentalFunction  *ExperimentalFunction  `json:"experimental_function"`
 }
 
-// GetSettings 获取 Settings 的实例
-func GetSettings(reloadSettings ...bool) *Settings {
+// Get 获取 Settings 的实例
+func Get(reloadSettings ...bool) *Settings {
+
+	_settingsLocker.Lock()
+	defer _settingsLocker.Unlock()
+
 	if _settings == nil {
 
 		_settingsOnce.Do(func() {
@@ -46,7 +50,7 @@ func GetSettings(reloadSettings ...bool) *Settings {
 				}
 			} else {
 				// 读取存在的文件
-				err := _settings.Read()
+				err := _settings.read()
 				if err != nil {
 					panic("Can't Read Config File:" + configName + " Error: " + err.Error())
 				}
@@ -55,7 +59,7 @@ func GetSettings(reloadSettings ...bool) *Settings {
 		// 是否需要重新读取配置信息,这个可能在每次保存配置文件后需要操作
 		if len(reloadSettings) >= 1 {
 			if reloadSettings[0] == true {
-				err := _settings.Read()
+				err := _settings.read()
 				if err != nil {
 					panic("Can't Read Config File:" + configName + " Error: " + err.Error())
 				}
@@ -69,6 +73,14 @@ func GetSettings(reloadSettings ...bool) *Settings {
 // SetFullNewSettings 从 Web 端传入新的 Settings 完整设置
 func SetFullNewSettings(inSettings *Settings) error {
 
+	_settingsLocker.Lock()
+	defer _settingsLocker.Unlock()
+
+	// 保存前进行本地代理的关闭
+	err := _settings.AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
+	if err != nil {
+		return err
+	}
 	nowConfigFPath := _settings.configFPath
 	_settings = inSettings
 	_settings.configFPath = nowConfigFPath
@@ -76,7 +88,7 @@ func SetFullNewSettings(inSettings *Settings) error {
 	return _settings.Save()
 }
 
-// SetConfigRootPath 需要先设置这个信息再调用 GetSettings
+// SetConfigRootPath 需要先设置这个信息再调用 Get
 func SetConfigRootPath(configRootPath string) {
 	_configRootPath = configRootPath
 }
@@ -98,7 +110,7 @@ func NewSettings(configRootDirFPath string) *Settings {
 	}
 }
 
-func (s *Settings) Read() error {
+func (s *Settings) read() error {
 
 	// 需要检查 url 是否正确
 	newEmbyAddressUrl := removeSuffixAddressSlash(s.EmbySettings.AddressUrl)
@@ -106,9 +118,18 @@ func (s *Settings) Read() error {
 	if err != nil {
 		return err
 	}
+	// 因为是重新加载配置文件信息,所以需要考虑提前关闭之前开启的本地代理
+	err = s.AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
+	if err != nil {
+		return err
+	}
+	err = strcut_json.ToStruct(s.configFPath, s)
+	if err != nil {
+		return err
+	}
 	s.EmbySettings.AddressUrl = newEmbyAddressUrl
 
-	return strcut_json.ToStruct(s.configFPath, s)
+	return nil
 }
 
 func (s *Settings) Save() error {
@@ -119,6 +140,10 @@ func (s *Settings) Save() error {
 	if err != nil {
 		return err
 	}
+	err = s.AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
+	if err != nil {
+		return err
+	}
 	s.EmbySettings.AddressUrl = newEmbyAddressUrl
 
 	return strcut_json.ToFile(s.configFPath, s)
@@ -127,7 +152,7 @@ func (s *Settings) Save() error {
 func (s *Settings) GetNoPasswordSettings() *Settings {
 
 	nowSettings := NewSettings(_configRootPath)
-	err := nowSettings.Read()
+	err := nowSettings.read()
 	if err != nil {
 		panic("Can't Read Config File:" + configName + " Error: " + err.Error())
 	}
@@ -191,6 +216,7 @@ func removeSuffixAddressSlash(orgAddressUrlString string) string {
 
 var (
 	_settings       *Settings
+	_settingsLocker sync.Mutex
 	_settingsOnce   sync.Once
 	_configRootPath string
 )

+ 13 - 15
pkg/subtitle_best_api/subtitle_best_api.go

@@ -28,15 +28,13 @@ type SubtitleBestApi struct {
 	log           *logrus.Logger
 	authKey       random_auth_key.AuthKey
 	randomAuthKey *random_auth_key.RandomAuthKey
-	proxySettings *settings.ProxySettings
 }
 
-func NewSubtitleBestApi(log *logrus.Logger, inAuthKey random_auth_key.AuthKey, proxySettings *settings.ProxySettings) *SubtitleBestApi {
+func NewSubtitleBestApi(log *logrus.Logger, inAuthKey random_auth_key.AuthKey) *SubtitleBestApi {
 	return &SubtitleBestApi{
 		log:           log,
 		randomAuthKey: random_auth_key.NewRandomAuthKey(5, inAuthKey),
 		authKey:       inAuthKey,
-		proxySettings: proxySettings,
 	}
 }
 
@@ -79,7 +77,7 @@ func (s *SubtitleBestApi) GetCode() (string, error) {
 	}
 
 	postUrl := webUrlBase + "/v1/subhd-code"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return "", err
 	}
@@ -132,7 +130,7 @@ func (s *SubtitleBestApi) GetMediaInfo(id, source, videoType string) (*MediaInfo
 	}
 
 	postUrl := webUrlBase + "/v1/media-info"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -171,7 +169,7 @@ func (s *SubtitleBestApi) AskFroUpload(subSha256 string, IsMovie, trusted bool,
 		return nil, errors.New("auth key is not set")
 	}
 	postUrl := webUrlBase + "/v1/ask-for-upload"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -233,7 +231,7 @@ func (s *SubtitleBestApi) UploadSub(videoSubInfo *models.VideoSubInfo, subSaveRo
 	}
 
 	postUrl := webUrlBase + "/v1/upload-sub"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -318,7 +316,7 @@ func (s *SubtitleBestApi) UploadLowTrustSub(lowTrustVideoSubInfo *models.LowVide
 	}
 
 	postUrl := webUrlBase + "/v1/upload-sub"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -407,7 +405,7 @@ func (s *SubtitleBestApi) AskFindSub(VideoFeature, ImdbId, TmdbId, Season, Episo
 		return nil, errors.New("auth key is not set")
 	}
 	postUrl := webUrlBase + "/v1/ask-find-sub"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -452,7 +450,7 @@ func (s *SubtitleBestApi) FindSub(VideoFeature, ImdbId, TmdbId, Season, Episode,
 		return nil, errors.New("auth key is not set")
 	}
 	postUrl := webUrlBase + "/v1/find-sub"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -497,7 +495,7 @@ func (s *SubtitleBestApi) AskDownloadSub(SubSha256, DownloadToken, ApiKey string
 		return nil, errors.New("auth key is not set")
 	}
 	postUrl := webUrlBase + "/v1/ask-for-download"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -539,7 +537,7 @@ func (s *SubtitleBestApi) DownloadSub(SubSha256, DownloadToken, ApiKey, download
 		return nil, errors.New("auth key is not set")
 	}
 	postUrl := webUrlBase + "/v1/download-sub"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -613,7 +611,7 @@ func (s *SubtitleBestApi) ConvertId(id, source, videoType string) (*IdConvertRep
 	}
 
 	postUrl := webUrlBase + "/v1/id-convert"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -658,7 +656,7 @@ func (s *SubtitleBestApi) FeedBack(id, version, MediaServer string, EnableShare,
 	}
 
 	postUrl := webUrlBase + "/v1/feedback"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}
@@ -705,7 +703,7 @@ func (s *SubtitleBestApi) AskDownloadTask(id string) (*AskDownloadTaskReply, err
 	}
 
 	postUrl := webUrlBase + "/v1/ask-download-task"
-	httpClient, err := pkg.NewHttpClient(s.proxySettings)
+	httpClient, err := pkg.NewHttpClient(settings.Get().AdvancedSettings.ProxySettings)
 	if err != nil {
 		return nil, err
 	}

+ 1 - 1
pkg/subtitle_best_api/subtitle_best_api_test.go

@@ -20,7 +20,7 @@ func TestSubtitleBestApi_GetMediaInfo(t *testing.T) {
 			BaseKey:  pkg.BaseKey(),
 			AESKey16: pkg.AESKey16(),
 			AESIv16:  pkg.AESIv16(),
-		}, settings.GetSettings().AdvancedSettings.ProxySettings)
+		}, settings.Get().AdvancedSettings.ProxySettings)
 
 	downloadTaskReply, err := bapi.AskDownloadTask("123")
 	if err != nil {

+ 9 - 8
pkg/task_queue/get.go

@@ -1,6 +1,7 @@
 package task_queue
 
 import (
+	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 	"time"
 
 	task_queue2 "github.com/allanpk716/ChineseSubFinder/pkg/types/task_queue"
@@ -17,15 +18,15 @@ func (t *TaskQueue) BeforeGetOneJob() {
 			nowOneJob := value.(task_queue2.OneJob)
 			if //nowOneJob.JobStatus == task_queue.Done &&
 			// 默认是 90day, A.After(B) : A > B == true
-			(time.Time)(nowOneJob.UpdateTime).AddDate(0, 0, t.settings.AdvancedSettings.TaskQueue.ExpirationTime).After(time.Now()) == false {
+			(time.Time)(nowOneJob.UpdateTime).AddDate(0, 0, settings.Get().AdvancedSettings.TaskQueue.ExpirationTime).After(time.Now()) == false {
 				// 找到就删除
 				bok, err := t.del(nowOneJob.Id)
 				if err != nil {
-					t.log.Errorf("GetOneWaitingJob.Del.Done ExpirationTime %v error: %s", t.settings.AdvancedSettings.TaskQueue.ExpirationTime, err.Error())
+					t.log.Errorf("GetOneWaitingJob.Del.Done ExpirationTime %v error: %s", settings.Get().AdvancedSettings.TaskQueue.ExpirationTime, err.Error())
 					return
 				}
 				if bok == false {
-					t.log.Errorf("GetOneWaitingJob.Del.Done ExpirationTime %v error: %s", t.settings.AdvancedSettings.TaskQueue.ExpirationTime, "Del failed")
+					t.log.Errorf("GetOneWaitingJob.Del.Done ExpirationTime %v error: %s", settings.Get().AdvancedSettings.TaskQueue.ExpirationTime, "Del failed")
 					return
 
 				}
@@ -73,11 +74,11 @@ func (t *TaskQueue) GetOneWaitingJob() (bool, task_queue2.OneJob, error) {
 				// 优先级 <= 3 也可以提前取出
 				TaskPriority <= HighTaskPriorityLevel ||
 				// 默认是 12h, A.After(B) : A > B == true
-				(time.Time)(tOneJob.UpdateTime).Add(time.Duration(t.settings.AdvancedSettings.TaskQueue.OneSubDownloadInterval)*time.Hour).After(time.Now()) == false && tOneJob.DownloadTimes > 0) {
+				(time.Time)(tOneJob.UpdateTime).Add(time.Duration(settings.Get().AdvancedSettings.TaskQueue.OneSubDownloadInterval)*time.Hour).After(time.Now()) == false && tOneJob.DownloadTimes > 0) {
 				// 找到就返回
 				t.log.Debugln("tOneJob.UpdateTime", (time.Time)(tOneJob.UpdateTime).String())
-				t.log.Debugln("tOneJob.UpdateTime", (time.Time)(tOneJob.UpdateTime).Add(time.Duration(t.settings.AdvancedSettings.TaskQueue.OneSubDownloadInterval)*time.Hour).String())
-				t.log.Debugln("tOneJob.UpdateTime is ", (time.Time)(tOneJob.UpdateTime).Add(time.Duration(t.settings.AdvancedSettings.TaskQueue.OneSubDownloadInterval)*time.Hour).After(time.Now()))
+				t.log.Debugln("tOneJob.UpdateTime", (time.Time)(tOneJob.UpdateTime).Add(time.Duration(settings.Get().AdvancedSettings.TaskQueue.OneSubDownloadInterval)*time.Hour).String())
+				t.log.Debugln("tOneJob.UpdateTime is ", (time.Time)(tOneJob.UpdateTime).Add(time.Duration(settings.Get().AdvancedSettings.TaskQueue.OneSubDownloadInterval)*time.Hour).After(time.Now()))
 				found = true
 				return true
 			}
@@ -116,10 +117,10 @@ func (t *TaskQueue) GetOneDoneJob() (bool, task_queue2.OneJob, error) {
 			// 见《任务队列设计》--以优先级顺序取出描述
 			if tOneJob.JobStatus == task_queue2.Done &&
 				// 要在 三个月内
-				(time.Time)(tOneJob.CreatedTime).AddDate(0, 0, t.settings.AdvancedSettings.TaskQueue.ExpirationTime).After(time.Now()) == true &&
+				(time.Time)(tOneJob.CreatedTime).AddDate(0, 0, settings.Get().AdvancedSettings.TaskQueue.ExpirationTime).After(time.Now()) == true &&
 				// 已经下载过的视频,要间隔 12 小时再次下载
 				(time.Time)(tOneJob.UpdateTime).Add(
-					time.Duration(t.settings.AdvancedSettings.TaskQueue.OneSubDownloadInterval)*time.Hour).After(time.Now()) == false {
+					time.Duration(settings.Get().AdvancedSettings.TaskQueue.OneSubDownloadInterval)*time.Hour).After(time.Now()) == false {
 				// 找到就返回
 				found = true
 				return true

+ 2 - 4
pkg/task_queue/task_queue.go

@@ -22,7 +22,6 @@ import (
 
 type TaskQueue struct {
 	queueName           string                    // 队列的名称
-	settings            *settings.Settings        // 设置
 	log                 *logrus.Logger            // 日志
 	center              *cache_center.CacheCenter // 缓存中心
 	taskPriorityMapList []*treemap.Map            // 这里有 0-10 个优先级划分的存储 List,每Add一个数据的时候需要切换到这个 List 中去 save
@@ -34,7 +33,6 @@ type TaskQueue struct {
 func NewTaskQueue(center *cache_center.CacheCenter) *TaskQueue {
 
 	tq := &TaskQueue{queueName: center.GetName(),
-		settings:            center.Settings,
 		log:                 center.Log,
 		center:              center,
 		taskPriorityMapList: make([]*treemap.Map, 0),
@@ -212,7 +210,7 @@ func (t *TaskQueue) AutoDetectUpdateJobStatus(oneJob task_queue2.OneJob, inErr e
 		oneJob.DownloadTimes += 1
 	} else {
 		// 超过了时间限制,默认是 90 天, A.Before(B) : A < B == true
-		if (time.Time)(oneJob.AddedTime).AddDate(0, 0, t.settings.AdvancedSettings.TaskQueue.ExpirationTime).Before(time.Now()) == true {
+		if (time.Time)(oneJob.AddedTime).AddDate(0, 0, settings.Get().AdvancedSettings.TaskQueue.ExpirationTime).Before(time.Now()) == true {
 			// 超过 90 天了
 			oneJob.JobStatus = task_queue2.Failed
 		} else {
@@ -223,7 +221,7 @@ func (t *TaskQueue) AutoDetectUpdateJobStatus(oneJob task_queue2.OneJob, inErr e
 				oneJob.RetryTimes = 0
 				oneJob.TaskPriority = FirstRetryTaskPriorityLevel
 			} else {
-				if oneJob.RetryTimes > t.settings.AdvancedSettings.TaskQueue.MaxRetryTimes {
+				if oneJob.RetryTimes > settings.Get().AdvancedSettings.TaskQueue.MaxRetryTimes {
 					// 超过重试次数会进行一次降级,然后重置这个次数
 					oneJob.RetryTimes = 0
 					oneJob = t.degrade(oneJob)

+ 6 - 7
pkg/task_queue/task_queue_test.go

@@ -10,7 +10,6 @@ import (
 
 	"github.com/allanpk716/ChineseSubFinder/pkg/cache_center"
 	"github.com/allanpk716/ChineseSubFinder/pkg/log_helper"
-	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 )
 
 const taskQueueName = "testQueue"
@@ -22,7 +21,7 @@ func TestTaskQueue_AddAndGetAndDel(t *testing.T) {
 	}()
 	cache_center.DelDb(taskQueueName)
 
-	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, settings.GetSettings(), log_helper.GetLogger4Tester()))
+	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, log_helper.GetLogger4Tester()))
 	defer func() {
 		taskQueue.Close()
 	}()
@@ -77,7 +76,7 @@ func TestTaskQueue_AddAndClear(t *testing.T) {
 	}()
 	cache_center.DelDb(taskQueueName)
 
-	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, settings.GetSettings(), log_helper.GetLogger4Tester()))
+	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, log_helper.GetLogger4Tester()))
 	for i := taskPriorityCount; i >= 0; i-- {
 		bok, err := taskQueue.Add(*task_queue2.NewOneJob(common.Movie, pkg.RandStringBytesMaskImprSrcSB(10), i))
 		if err != nil {
@@ -105,7 +104,7 @@ func TestTaskQueue_Update(t *testing.T) {
 	}()
 	cache_center.DelDb(taskQueueName)
 
-	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, settings.GetSettings(), log_helper.GetLogger4Tester()))
+	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, log_helper.GetLogger4Tester()))
 	for i := taskPriorityCount; i >= 0; i-- {
 		bok, err := taskQueue.Add(*task_queue2.NewOneJob(common.Movie, pkg.RandStringBytesMaskImprSrcSB(10), i))
 		if err != nil {
@@ -168,7 +167,7 @@ func TestTaskQueue_UpdateAdGetOneWaiting(t *testing.T) {
 	}()
 	cache_center.DelDb(taskQueueName)
 
-	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, settings.GetSettings(), log_helper.GetLogger4Tester()))
+	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, log_helper.GetLogger4Tester()))
 	for i := taskPriorityCount; i >= 0; i-- {
 		bok, err := taskQueue.Add(*task_queue2.NewOneJob(common.Movie, fmt.Sprintf("%d", i), i))
 		if err != nil {
@@ -220,7 +219,7 @@ func TestTaskQueue_UpdatePriority(t *testing.T) {
 	}()
 	cache_center.DelDb(taskQueueName)
 
-	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, settings.GetSettings(), log_helper.GetLogger4Tester()))
+	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, log_helper.GetLogger4Tester()))
 	for i := taskPriorityCount; i >= 0; i-- {
 		bok, err := taskQueue.Add(*task_queue2.NewOneJob(common.Movie, fmt.Sprintf("%d", i), i))
 		if err != nil {
@@ -284,7 +283,7 @@ func TestTaskQueue_AddAndGetOneJob(t *testing.T) {
 	}()
 	cache_center.DelDb(taskQueueName)
 
-	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, settings.GetSettings(), log_helper.GetLogger4Tester()))
+	taskQueue := NewTaskQueue(cache_center.NewCacheCenter(taskQueueName, log_helper.GetLogger4Tester()))
 
 	for i := taskPriorityCount; i >= 0; i-- {
 		bok, err := taskQueue.Add(*task_queue2.NewOneJob(common.Movie, fmt.Sprintf("%d", i), DefaultTaskPriorityLevel))

+ 29 - 36
pkg/video_scan_and_refresh_helper/video_scan_and_refresh_helper.go

@@ -53,7 +53,6 @@ import (
 )
 
 type VideoScanAndRefreshHelper struct {
-	settings                 *settings.Settings              // 设置的实例
 	log                      *logrus.Logger                  // 日志实例
 	fileDownloader           *file_downloader.FileDownloader // 文件下载器
 	NeedForcedScanAndDownSub bool                            // 将会强制扫描所有的视频,下载字幕,替换已经存在的字幕,不进行时间段和已存在则跳过的判断。且不会进过 Emby API 的逻辑,智能进行强制去以本程序的方式去扫描。
@@ -71,7 +70,7 @@ type VideoScanAndRefreshHelper struct {
 }
 
 func NewVideoScanAndRefreshHelper(inSubFormatter ifaces.ISubFormatter, fileDownloader *file_downloader.FileDownloader, downloadQueue *task_queue.TaskQueue) *VideoScanAndRefreshHelper {
-	v := VideoScanAndRefreshHelper{settings: fileDownloader.Settings, log: fileDownloader.Log, downloadQueue: downloadQueue,
+	v := VideoScanAndRefreshHelper{log: fileDownloader.Log, downloadQueue: downloadQueue,
 		subSupplierHub: subSupplier.NewSubSupplierHub(
 			xunlei.NewSupplier(fileDownloader),
 		),
@@ -82,7 +81,7 @@ func NewVideoScanAndRefreshHelper(inSubFormatter ifaces.ISubFormatter, fileDownl
 	}
 
 	var err error
-	v.taskControl, err = task_control.NewTaskControl(fileDownloader.Settings.CommonSettings.Threads, v.log)
+	v.taskControl, err = task_control.NewTaskControl(settings.Get().CommonSettings.Threads, v.log)
 	if err != nil {
 		fileDownloader.Log.Panicln(err)
 	}
@@ -131,7 +130,7 @@ func (v *VideoScanAndRefreshHelper) Start(scanLogic *scan_logic.ScanLogic) error
 		v.log.Errorln("FilterMovieAndSeriesNeedDownload", err)
 		return err
 	}
-	if v.settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
+	if settings.Get().ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
 		v.log.Infoln("ShareSubEnabled is true, will scan share sub")
 		// 根据上面得到的 scanResult 的 Normal 部分进行字幕的扫描,也存入到 VideoSubInfo 中,但是需要标记这个是低可信度的
 		v.scanLowVideoSubInfo(scanResult)
@@ -206,7 +205,7 @@ func (v *VideoScanAndRefreshHelper) ScanNormalMovieAndSeries() (*ScanVideoResult
 		// --------------------------------------------------
 		// 电影
 		// 没有填写 emby_helper api 的信息,那么就走常规的全文件扫描流程
-		normalScanResult.MoviesDirMap, errMovie = search.MatchedVideoFileFromDirs(v.log, v.settings.CommonSettings.MoviePaths)
+		normalScanResult.MoviesDirMap, errMovie = search.MatchedVideoFileFromDirs(v.log, settings.Get().CommonSettings.MoviePaths)
 	}()
 	wg.Add(1)
 	go func() {
@@ -217,7 +216,7 @@ func (v *VideoScanAndRefreshHelper) ScanNormalMovieAndSeries() (*ScanVideoResult
 		// --------------------------------------------------
 		// 连续剧
 		// 遍历连续剧总目录下的第一层目录
-		normalScanResult.SeriesDirMap, errSeries = seriesHelper.GetSeriesListFromDirs(v.log, v.settings.CommonSettings.SeriesPaths)
+		normalScanResult.SeriesDirMap, errSeries = seriesHelper.GetSeriesListFromDirs(v.log, settings.Get().CommonSettings.SeriesPaths)
 		// ------------------------------------------------------------------------------
 		// 输出调试信息,有那些连续剧文件夹名称
 		if normalScanResult.SeriesDirMap == nil {
@@ -256,7 +255,7 @@ func (v *VideoScanAndRefreshHelper) ScanEmbyMovieAndSeries(scanVideoResult *Scan
 	}()
 	v.log.Infoln("ScanEmbyMovieAndSeries Start...")
 
-	if v.settings.EmbySettings.Enable == false {
+	if settings.Get().EmbySettings.Enable == false {
 		v.embyHelper = nil
 		v.log.Infoln("EmbyHelper == nil")
 	} else {
@@ -265,13 +264,10 @@ func (v *VideoScanAndRefreshHelper) ScanEmbyMovieAndSeries(scanVideoResult *Scan
 
 			v.log.Infoln("Forced Scan And DownSub, tmpSetting.EmbySettings.MaxRequestVideoNumber = 1000000")
 			// 如果是强制,那么就临时修改 Setting 的 Emby MaxRequestVideoNumber 参数为 1000000
-			//tmpSetting := clone.Clone(v.settings).(*settings.Settings)
-			v.embyHelper = embyHelper.NewEmbyHelper(v.fileDownloader.MediaInfoDealers, v.settings)
-			v.embyHelper.SetMaxRequestVideoNumber(common2.EmbyApiGetItemsLimitMax)
-			v.embyHelper.SetSkipWatched(false)
+			v.embyHelper = embyHelper.NewEmbyHelper(v.fileDownloader.MediaInfoDealers)
 		} else {
 			v.log.Infoln("Not Forced Scan And DownSub")
-			v.embyHelper = embyHelper.NewEmbyHelper(v.fileDownloader.MediaInfoDealers, v.settings)
+			v.embyHelper = embyHelper.NewEmbyHelper(v.fileDownloader.MediaInfoDealers)
 		}
 	}
 	var err error
@@ -284,7 +280,7 @@ func (v *VideoScanAndRefreshHelper) ScanEmbyMovieAndSeries(scanVideoResult *Scan
 		embyScanResult := EmbyScanVideoResult{}
 		v.log.Infoln("Movie Sub Dl From Emby API...")
 		// Emby 情况,从 Emby 获取视频信息
-		err = v.refreshEmbySubList()
+		err = v.refreshEmbySubList(settings.Get().EmbySettings, false, common2.EmbyApiGetItemsLimitMax)
 		if err != nil {
 			v.log.Errorln("refreshEmbySubList", err)
 			return err
@@ -306,14 +302,14 @@ func (v *VideoScanAndRefreshHelper) ScanEmbyMovieAndSeries(scanVideoResult *Scan
 // FilterMovieAndSeriesNeedDownload 过滤出需要下载字幕的视频,比如是否跳过中文的剧集,是否超过3个月的下载时间,丢入队列中
 func (v *VideoScanAndRefreshHelper) FilterMovieAndSeriesNeedDownload(scanVideoResult *ScanVideoResult, scanLogic *scan_logic.ScanLogic) error {
 
-	if scanVideoResult.Normal != nil && v.settings.EmbySettings.Enable == false {
+	if scanVideoResult.Normal != nil && settings.Get().EmbySettings.Enable == false {
 		err := v.filterMovieAndSeriesNeedDownloadNormal(scanVideoResult.Normal, scanLogic)
 		if err != nil {
 			return err
 		}
 	}
 
-	if scanVideoResult.Emby != nil && v.settings.EmbySettings.Enable == true {
+	if scanVideoResult.Emby != nil && settings.Get().EmbySettings.Enable == true {
 
 		// 先获取缓存的 Emby 视频信息,有那些已经在这次扫描的时候播放过了
 
@@ -330,7 +326,7 @@ func (v *VideoScanAndRefreshHelper) FilterMovieAndSeriesNeedDownload(scanVideoRe
 // RefreshMediaServerSubList 刷新媒体服务器的字幕列表
 func (v *VideoScanAndRefreshHelper) RefreshMediaServerSubList() error {
 
-	if v.settings.EmbySettings.Enable == false {
+	if settings.Get().EmbySettings.Enable == false {
 		return nil
 	}
 	v.log.Infoln("Refresh Media Server Sub List...")
@@ -340,15 +336,12 @@ func (v *VideoScanAndRefreshHelper) RefreshMediaServerSubList() error {
 
 	v.log.Infoln("tmpSetting.EmbySettings.MaxRequestVideoNumber = 1000000")
 	// 如果是强制,那么就临时修改 Setting 的 Emby MaxRequestVideoNumber 参数为 1000000
-	//tmpSetting := clone.Clone(v.settings).(*settings.Settings)
-	v.embyHelper = embyHelper.NewEmbyHelper(v.fileDownloader.MediaInfoDealers, v.settings)
-	v.embyHelper.SetMaxRequestVideoNumber(common2.EmbyApiGetItemsLimitMax)
-	v.embyHelper.SetSkipWatched(false)
+	v.embyHelper = embyHelper.NewEmbyHelper(v.fileDownloader.MediaInfoDealers)
 	var err error
 	if v.embyHelper != nil {
 		// TODO 如果后续支持了 Jellyfin、Plex 那么这里需要额外正在对应的扫描逻辑
 		// Emby 情况,从 Emby 获取视频信息
-		err = v.refreshEmbySubList()
+		err = v.refreshEmbySubList(settings.Get().EmbySettings, false, common2.EmbyApiGetItemsLimitMax)
 		if err != nil {
 			v.log.Errorln("refreshEmbySubList", err)
 			return err
@@ -380,7 +373,7 @@ func (v *VideoScanAndRefreshHelper) scanLowVideoSubInfo(scanVideoResult *ScanVid
 
 			v.log.Infoln("--------------------------------------------------------------------------------")
 			v.log.Infoln("scanLowVideoSubInfo.MovieHasChineseSub", videoIndex, videoFPath)
-			mixMediaInfo, err := mix_media_info.GetMixMediaInfo(v.fileDownloader.MediaInfoDealers, videoFPath, true, v.settings.AdvancedSettings.ProxySettings)
+			mixMediaInfo, err := mix_media_info.GetMixMediaInfo(v.fileDownloader.MediaInfoDealers, videoFPath, true, settings.Get().AdvancedSettings.ProxySettings)
 			if err != nil {
 				v.log.Warningln("scanLowVideoSubInfo.GetMixMediaInfo", videoFPath, err)
 				continue
@@ -430,7 +423,7 @@ func (v *VideoScanAndRefreshHelper) scanLowVideoSubInfo(scanVideoResult *ScanVid
 		seriesDirRootFPathLisst := seriesFPath.([]string)
 		for seriesDirIndex, seriesDirRootFPath := range seriesDirRootFPathLisst {
 
-			seriesInfo, err := seriesHelper.ReadSeriesInfoFromDir(v.fileDownloader.MediaInfoDealers, seriesDirRootFPath, 90, true, true, v.settings.AdvancedSettings.ProxySettings)
+			seriesInfo, err := seriesHelper.ReadSeriesInfoFromDir(v.fileDownloader.MediaInfoDealers, seriesDirRootFPath, 90, true, true, settings.Get().AdvancedSettings.ProxySettings)
 			if err != nil {
 				v.log.Warningln("scanLowVideoSubInfo.ReadSeriesInfoFromDir", seriesDirRootFPath, err)
 				return false
@@ -440,7 +433,7 @@ func (v *VideoScanAndRefreshHelper) scanLowVideoSubInfo(scanVideoResult *ScanVid
 				continue
 			}
 
-			mixMediaInfo, err := mix_media_info.GetMixMediaInfo(v.fileDownloader.MediaInfoDealers, seriesInfo.EpList[0].FileFullPath, false, v.settings.AdvancedSettings.ProxySettings)
+			mixMediaInfo, err := mix_media_info.GetMixMediaInfo(v.fileDownloader.MediaInfoDealers, seriesInfo.EpList[0].FileFullPath, false, settings.Get().AdvancedSettings.ProxySettings)
 			if err != nil {
 				v.log.Warningln("scanLowVideoSubInfo.GetMixMediaInfo", seriesInfo.EpList[0].FileFullPath, err)
 				continue
@@ -572,11 +565,11 @@ func (v *VideoScanAndRefreshHelper) ScrabbleUpVideoList(scanVideoResult *ScanVid
 		scanVideoResult = nil
 	}()
 
-	if scanVideoResult.Normal != nil && v.settings.EmbySettings.Enable == false {
+	if scanVideoResult.Normal != nil && settings.Get().EmbySettings.Enable == false {
 		return v.scrabbleUpVideoListNormal(scanVideoResult.Normal, pathUrlMap)
 	}
 
-	if scanVideoResult.Emby != nil && v.settings.EmbySettings.Enable == true {
+	if scanVideoResult.Emby != nil && settings.Get().EmbySettings.Enable == true {
 		return v.scrabbleUpVideoListEmby(scanVideoResult.Emby, pathUrlMap)
 	}
 
@@ -780,8 +773,8 @@ func (v *VideoScanAndRefreshHelper) scrabbleUpVideoListEmby(emby *EmbyScanVideoR
 		return movieInfos, seasonInfos
 	}
 	// 排序得到匹配上的路径,最长的那个
-	sortMoviePaths := sort_things.SortStringSliceByLength(v.settings.CommonSettings.MoviePaths)
-	sortSeriesPaths := sort_things.SortStringSliceByLength(v.settings.CommonSettings.SeriesPaths)
+	sortMoviePaths := sort_things.SortStringSliceByLength(settings.Get().CommonSettings.MoviePaths)
+	sortSeriesPaths := sort_things.SortStringSliceByLength(settings.Get().CommonSettings.SeriesPaths)
 	// ----------------------------------------
 	// Emby 过滤,电影
 
@@ -1009,7 +1002,7 @@ func (v *VideoScanAndRefreshHelper) scrabbleUpVideoListEmby(emby *EmbyScanVideoR
 	return movieInfos, seasonInfos
 }
 
-func (v *VideoScanAndRefreshHelper) refreshEmbySubList() error {
+func (v *VideoScanAndRefreshHelper) refreshEmbySubList(embySettings *settings.EmbySettings, SkipWatched bool, maxRequestVideoNumber int) error {
 
 	if v.embyHelper == nil {
 		return nil
@@ -1025,7 +1018,7 @@ func (v *VideoScanAndRefreshHelper) refreshEmbySubList() error {
 	}()
 	v.log.Infoln("Refresh Emby Sub List Start...")
 	//------------------------------------------------------
-	bRefresh, err := v.embyHelper.RefreshEmbySubList()
+	bRefresh, err := v.embyHelper.RefreshEmbySubList(embySettings, SkipWatched, maxRequestVideoNumber)
 	if err != nil {
 		return err
 	}
@@ -1053,7 +1046,7 @@ func (v *VideoScanAndRefreshHelper) updateLocalVideoCacheInfo(scanVideoResult *S
 			return err
 		}
 		// 获取 IMDB 信息
-		localIMDBInfo, err := imdb_helper.GetIMDBInfoFromVideoNfoInfo(v.fileDownloader.MediaInfoDealers, videoImdbInfo, v.settings.AdvancedSettings.ProxySettings)
+		localIMDBInfo, err := imdb_helper.GetIMDBInfoFromVideoNfoInfo(v.fileDownloader.MediaInfoDealers, videoImdbInfo, settings.Get().AdvancedSettings.ProxySettings)
 		if err != nil {
 			v.log.Warningln("GetIMDBInfoFromVideoNfoInfo,IMDB:", videoImdbInfo.ImdbId, movieInputData.InputPath, err)
 			return err
@@ -1107,7 +1100,7 @@ func (v *VideoScanAndRefreshHelper) updateLocalVideoCacheInfo(scanVideoResult *S
 		}
 
 		// 获取 IMDB 信息
-		localIMDBInfo, err := imdb_helper.GetIMDBInfoFromVideoNfoInfo(v.fileDownloader.MediaInfoDealers, videoNfoInfo, v.settings.AdvancedSettings.ProxySettings)
+		localIMDBInfo, err := imdb_helper.GetIMDBInfoFromVideoNfoInfo(v.fileDownloader.MediaInfoDealers, videoNfoInfo, settings.Get().AdvancedSettings.ProxySettings)
 		if err != nil {
 			v.log.Warningln("GetIMDBInfoFromVideoNfoInfo,IMDB:", videoNfoInfo.ImdbId, seriesInputData.InputPath, err)
 			return err
@@ -1279,8 +1272,8 @@ func (v *VideoScanAndRefreshHelper) filterMovieAndSeriesNeedDownloadNormal(norma
 func (v *VideoScanAndRefreshHelper) filterMovieAndSeriesNeedDownloadEmby(emby *EmbyScanVideoResult, scanLogic *scan_logic.ScanLogic) error {
 
 	playedVideoIdMap := make(map[string]bool)
-	if v.settings.EmbySettings.SkipWatched == true {
-		playedVideoIdMap = v.embyHelper.GetVideoIDPlayedMap()
+	if settings.Get().EmbySettings.SkipWatched == true {
+		playedVideoIdMap = v.embyHelper.GetVideoIDPlayedMap(settings.Get().EmbySettings, settings.Get().EmbySettings.MaxRequestVideoNumber)
 	}
 	// ----------------------------------------
 	// Emby 过滤,电影
@@ -1400,7 +1393,7 @@ func (v *VideoScanAndRefreshHelper) getUpdateVideoListFromEmby() ([]emby.EmbyMix
 	var err error
 	var movieList []emby.EmbyMixInfo
 	var seriesSubNeedDlMap map[string][]emby.EmbyMixInfo //  多个需要搜索字幕的连续剧目录,连续剧文件夹名称 -- 每一集的 EmbyMixInfo List
-	movieList, seriesSubNeedDlMap, err = v.embyHelper.GetRecentlyAddVideoListWithNoChineseSubtitle(v.NeedForcedScanAndDownSub)
+	movieList, seriesSubNeedDlMap, err = v.embyHelper.GetRecentlyAddVideoListWithNoChineseSubtitle(settings.Get().EmbySettings, v.NeedForcedScanAndDownSub)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -1425,7 +1418,7 @@ func (v *VideoScanAndRefreshHelper) RestoreFixTimelineBK() error {
 	defer v.log.Infoln("End Restore Fix Timeline BK")
 	v.log.Infoln("Start Restore Fix Timeline BK...")
 	//------------------------------------------------------
-	_, err := subTimelineFixerPKG.Restore(v.log, v.settings.CommonSettings.MoviePaths, v.settings.CommonSettings.SeriesPaths)
+	_, err := subTimelineFixerPKG.Restore(v.log, settings.Get().CommonSettings.MoviePaths, settings.Get().CommonSettings.SeriesPaths)
 	if err != nil {
 		return err
 	}