settings.go 4.6 KB

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