settings.go 4.1 KB

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