settings.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package settings
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/internal/pkg/strcut_json"
  4. "github.com/huandu/go-clone"
  5. "os"
  6. "path/filepath"
  7. "sync"
  8. )
  9. type Settings struct {
  10. configFPath string
  11. UserInfo *UserInfo `json:"user_info"`
  12. CommonSettings *CommonSettings `json:"common_settings"`
  13. AdvancedSettings *AdvancedSettings `json:"advanced_settings"`
  14. EmbySettings *EmbySettings `json:"emby_settings"`
  15. DeveloperSettings *DeveloperSettings `json:"developer_settings"`
  16. TimelineFixerSettings *TimelineFixerSettings `json:"timeline_fixer_settings"`
  17. }
  18. // GetSettings 获取 Settings 的实例
  19. func GetSettings(reloadSettings ...bool) *Settings {
  20. if _settings == nil {
  21. _settingsOnce.Do(func() {
  22. _settings = NewSettings()
  23. if isFile(_settings.configFPath) == false {
  24. // 配置文件不存在,新建一个空白的
  25. err := _settings.Save()
  26. if err != nil {
  27. panic("Can't Save Config File:" + configName + " Error: " + err.Error())
  28. }
  29. } else {
  30. // 读取存在的文件
  31. err := _settings.Read()
  32. if err != nil {
  33. panic("Can't Read Config File:" + configName + " Error: " + err.Error())
  34. }
  35. }
  36. })
  37. // 是否需要重新读取配置信息,这个可能在每次保存配置文件后需要操作
  38. if len(reloadSettings) >= 1 {
  39. if reloadSettings[0] == true {
  40. err := _settings.Read()
  41. if err != nil {
  42. panic("Can't Read Config File:" + configName + " Error: " + err.Error())
  43. }
  44. }
  45. }
  46. }
  47. return _settings
  48. }
  49. // SetFullNewSettings 从 Web 端传入新的 Settings 完整设置
  50. func SetFullNewSettings(inSettings *Settings) error {
  51. nowConfigFPath := _settings.configFPath
  52. _settings = inSettings
  53. _settings.configFPath = nowConfigFPath
  54. return _settings.Save()
  55. }
  56. func NewSettings() *Settings {
  57. nowConfigFPath := filepath.Join(configName)
  58. return &Settings{
  59. configFPath: nowConfigFPath,
  60. UserInfo: &UserInfo{},
  61. CommonSettings: NewCommonSettings(),
  62. AdvancedSettings: NewAdvancedSettings(),
  63. EmbySettings: NewEmbySettings(),
  64. DeveloperSettings: NewDeveloperSettings(),
  65. TimelineFixerSettings: NewTimelineFixerSettings(),
  66. }
  67. }
  68. func (s *Settings) Read() error {
  69. return strcut_json.ToStruct(s.configFPath, s)
  70. }
  71. func (s *Settings) Save() error {
  72. return strcut_json.ToFile(s.configFPath, s)
  73. }
  74. func (s *Settings) GetNoPasswordSettings() *Settings {
  75. nowSettings := clone.Clone(s).(*Settings)
  76. nowSettings.UserInfo.Password = noPassword4Show
  77. return nowSettings
  78. }
  79. // Check 检测,某些参数有范围限制
  80. func (s *Settings) Check() {
  81. // 每个网站最多找 Top 几的字幕结果,评价系统成熟后,才有设计的意义
  82. if s.AdvancedSettings.Topic < 0 || s.AdvancedSettings.Topic > 3 {
  83. s.AdvancedSettings.Topic = 1
  84. }
  85. // 如果 Debug 模式开启了,强制设置线程数为1,方便定位问题
  86. if s.AdvancedSettings.DebugMode == true {
  87. s.CommonSettings.Threads = 1
  88. } else {
  89. // 并发线程的范围控制
  90. if s.CommonSettings.Threads <= 0 {
  91. s.CommonSettings.Threads = 1
  92. } else if s.CommonSettings.Threads >= 3 {
  93. s.CommonSettings.Threads = 3
  94. }
  95. }
  96. }
  97. // isDir 存在且是文件夹
  98. func isDir(path string) bool {
  99. s, err := os.Stat(path)
  100. if err != nil {
  101. return false
  102. }
  103. return s.IsDir()
  104. }
  105. // isFile 存在且是文件
  106. func isFile(filePath string) bool {
  107. s, err := os.Stat(filePath)
  108. if err != nil {
  109. return false
  110. }
  111. return !s.IsDir()
  112. }
  113. var (
  114. _settings *Settings
  115. _settingsOnce sync.Once
  116. )
  117. const (
  118. noPassword4Show = "******" // 填充使用
  119. configName = "ChineseSubFinderSettings.json"
  120. )