settings.go 4.7 KB

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