From b3f18a869393d542eb8c83e0a95a0eb05c32f478 Mon Sep 17 00:00:00 2001 From: wetor Date: Wed, 27 Sep 2023 23:29:41 +0800 Subject: [PATCH] =?UTF-8?q?v0.10.0=20-=20=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=89=88=E6=9C=AC=E5=8F=B7=E4=B8=BA`1.6.0`=20-=20bolt?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=87=AA=E5=8A=A8=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/animego/main.go | 25 +-- configs/check.go | 4 +- configs/config_test.go | 14 ++ configs/default.go | 7 +- configs/models.go | 2 +- configs/update.go | 129 ++++++++++++--- configs/utils.go | 37 +++++ configs/version/v_151/models.go | 7 +- configs/version/v_152/models.go | 96 ++++++++++++ internal/animego/database/database_test.go | 4 +- internal/animego/database/init.go | 2 +- .../animego/downloader/downloader_test.go | 4 +- internal/animego/renamer/init.go | 12 +- internal/animego/renamer/renamer.go | 2 +- internal/animego/renamer/renamer_test.go | 4 +- test/testdata/config/animego_151.yaml | 1 - test/testdata/config/animego_152.yaml | 79 ---------- test/testdata/config/animego_160.yaml | 148 ++++++++++++++++++ 18 files changed, 425 insertions(+), 152 deletions(-) create mode 100644 configs/version/v_152/models.go create mode 100644 test/testdata/config/animego_160.yaml diff --git a/cmd/animego/main.go b/cmd/animego/main.go index c43e7ab7..6dd9b7ae 100644 --- a/cmd/animego/main.go +++ b/cmd/animego/main.go @@ -196,8 +196,8 @@ func Main() { // =============================================================================================================== // 初始化renamer配置 renamer.Init(&renamer.Options{ - WG: &WG, - UpdateDelaySecond: config.UpdateDelaySecond, + WG: &WG, + RefreshSecond: config.RefreshSecond, }) // 第一个启用的rename插件 var rename api.RenamerPlugin @@ -216,7 +216,7 @@ func Main() { // 初始化database配置 database.Init(&database.Options{ DownloaderConf: database.DownloaderConf{ - UpdateDelaySecond: config.UpdateDelaySecond, + RefreshSecond: config.RefreshSecond, DownloadPath: xpath.P(config.DownloadPath), SavePath: xpath.P(config.SavePath), Category: config.Category, @@ -235,7 +235,7 @@ func Main() { // =============================================================================================================== // 初始化downloader配置 downloader.Init(&downloader.Options{ - RefreshSecond: config.UpdateDelaySecond, + RefreshSecond: config.RefreshSecond, Category: config.Category, Tag: config.Tag, AllowDuplicateDownload: config.Download.AllowDuplicateDownload, @@ -250,23 +250,6 @@ func Main() { // 启动downloader downloaderSrv.Start(ctx) - //manager.Init(&manager.Options{ - // DownloaderConf: manager.DownloaderConf{ - // UpdateDelaySecond: config.UpdateDelaySecond, - // DownloadPath: xpath.P(config.DownloadPath), - // SavePath: xpath.P(config.SavePath), - // Category: config.Category, - // Tag: config.Tag, - // AllowDuplicateDownload: config.Download.AllowDuplicateDownload, - // SeedingTimeMinute: config.Download.SeedingTimeMinute, - // Rename: config.Advanced.Download.Rename, - // }, - // WG: &WG, - //}) - //// 初始化manager - //managerSrv := manager.NewManager(qbittorrentSrv, bolt, renameSrv) - //// 启动manager - //managerSrv.Start(ctx) // =============================================================================================================== // 初始化parser配置 parser.Init(&parser.Options{ diff --git a/configs/check.go b/configs/check.go index 150d862f..2dcbf772 100644 --- a/configs/check.go +++ b/configs/check.go @@ -7,8 +7,8 @@ const ( ) func (c *Config) Check() { - if c.Advanced.UpdateDelaySecond < UpdateDelaySecondMin { + if c.Advanced.RefreshSecond < UpdateDelaySecondMin { log.Warnf("配置项advanced.update_delay_second值范围错误: %v, 已修改为: %v", UpdateDelaySecondMin) - c.Advanced.UpdateDelaySecond = UpdateDelaySecondMin + c.Advanced.RefreshSecond = UpdateDelaySecondMin } } diff --git a/configs/config_test.go b/configs/config_test.go index e096e463..3531f425 100644 --- a/configs/config_test.go +++ b/configs/config_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/wetor/AnimeGo/configs" + "github.com/wetor/AnimeGo/pkg/log" "github.com/wetor/AnimeGo/pkg/utils" "github.com/wetor/AnimeGo/test" ) @@ -15,7 +16,11 @@ const testdata = "config" func TestMain(m *testing.M) { _ = utils.CreateMutiDir("data") + log.Init(&log.Options{ + File: "data/log.log", + }) m.Run() + log.Close() _ = os.RemoveAll("data") } @@ -95,6 +100,15 @@ func TestUpdateConfig_152(t *testing.T) { EqualFile(t, "data/animego.yaml", test.GetDataPath(testdata, "animego_152.yaml")) } +func TestUpdateConfig_160(t *testing.T) { + configs.ConfigVersion = "1.6.0" + file, _ := test.GetData(testdata, "animego_152.yaml") + _ = os.WriteFile("data/animego.yaml", file, 0666) + configs.UpdateConfig("data/animego.yaml", false) + + EqualFile(t, "data/animego.yaml", test.GetDataPath(testdata, "animego_160.yaml")) +} + func TestInitEnvConfig(t *testing.T) { _ = os.Setenv("ANIMEGO_QBT_URL", "http://127.0.0.1:18080") _ = os.Setenv("ANIMEGO_QBT_DOWNLOAD_PATH", "7766/download") diff --git a/configs/default.go b/configs/default.go index 8ba5f1ad..43f85d41 100644 --- a/configs/default.go +++ b/configs/default.go @@ -97,10 +97,7 @@ func defaultPlugin() { } func defaultAdvancedComment() { - configComment["update_delay_second_help"] = `每隔这一段时间,都会将下载队列添加到下载项、更新下载进度和重命名已完成下载项 -等待过程是异步的,等待期间不影响操作 -在下载项较多、等待时间过少时会出现请求超时,所以有个最小等待时间为2秒的限制 -默认为10,最小值为2` + configComment["refresh_second_help"] = `下载器列表和重命名任务刷新间隔时间。默认为10,最小值为2` configComment["rename_help"] = `下载状态顺序为: 创建下载项->下载->下载完成->做种->做种完成 可选值为: ['link', 'link_delete', 'move', 'wait_move'] @@ -111,7 +108,7 @@ func defaultAdvancedComment() { } func defaultAdvanced() { - defaultConfig.Advanced.UpdateDelaySecond = 10 + defaultConfig.Advanced.RefreshSecond = 10 defaultConfig.Advanced.Request.TimeoutSecond = 5 defaultConfig.Advanced.Request.RetryNum = 3 diff --git a/configs/models.go b/configs/models.go index e3fadbde..a04ba6e3 100644 --- a/configs/models.go +++ b/configs/models.go @@ -52,7 +52,7 @@ type Setting struct { } type Advanced struct { - UpdateDelaySecond int `yaml:"update_delay_second" json:"update_delay_second" attr:"更新状态等待时间" comment_key:"update_delay_second_help"` + RefreshSecond int `yaml:"refresh_second" json:"refresh_second" attr:"刷新间隔时间" comment_key:"refresh_second_help"` Redirect struct { Mikan string `yaml:"mikan" json:"mikan" attr:"默认mikanani.me"` diff --git a/configs/update.go b/configs/update.go index 29ecaf19..8771cd6e 100644 --- a/configs/update.go +++ b/configs/update.go @@ -6,7 +6,6 @@ import ( "os" "path" "strings" - "time" "github.com/jinzhu/copier" "gopkg.in/yaml.v3" @@ -19,9 +18,14 @@ import ( "github.com/wetor/AnimeGo/configs/version/v_141" "github.com/wetor/AnimeGo/configs/version/v_150" "github.com/wetor/AnimeGo/configs/version/v_151" + "github.com/wetor/AnimeGo/configs/version/v_152" + "github.com/wetor/AnimeGo/internal/animego/database" "github.com/wetor/AnimeGo/internal/constant" + "github.com/wetor/AnimeGo/internal/models" + "github.com/wetor/AnimeGo/pkg/cache" + "github.com/wetor/AnimeGo/pkg/dirdb" "github.com/wetor/AnimeGo/pkg/utils" - encoder "github.com/wetor/AnimeGo/third_party/yaml-encoder" + "github.com/wetor/AnimeGo/pkg/xpath" ) type ConfigOnlyVersion struct { @@ -44,6 +48,7 @@ var ( "1.5.0", "1.5.1", "1.5.2", + "1.6.0", } ConfigVersion = versions[len(versions)-1] // 当前配置文件版本 @@ -87,6 +92,11 @@ var ( Desc: "新增下载器独立下载路径设置", UpdateFunc: update_151_152, }, + { + Name: versions[8], + Desc: "更改字段名,数据库迁移", + UpdateFunc: update_152_160, + }, } ) @@ -429,7 +439,6 @@ func update_150_151(file string) { } // 强制写入 assets.WritePlugins(assets.Dir, path.Join(newConfig.DataPath, assets.Dir), false) - } func update_151_152(file string) { @@ -443,7 +452,7 @@ func update_151_152(file string) { log.Fatal("配置文件加载错误:", err) } - newConfig := DefaultConfig() + newConfig := &v_152.Config{} err = copier.Copy(newConfig, oldConfig) if err != nil { log.Fatal("配置文件升级失败:", err) @@ -463,38 +472,108 @@ func update_151_152(file string) { } // 强制写入 assets.WritePlugins(assets.Dir, path.Join(newConfig.DataPath, assets.Dir), false) - } -func encodeConfig(conf any) ([]byte, error) { - defaultSettingComment() - defaultAdvancedComment() - yml := encoder.NewEncoder(conf, - encoder.WithComments(encoder.CommentsOnHead), - encoder.WithCommentsMap(configComment), - ) - content, err := yml.Encode() +func update_152_160(file string) { + data, err := os.ReadFile(file) if err != nil { - return nil, err + log.Fatal("配置文件加载错误:", err) + } + oldConfig := &v_152.Config{} + err = yaml.Unmarshal(data, oldConfig) + if err != nil { + log.Fatal("配置文件加载错误:", err) + } + + newConfig := DefaultConfig() + err = copier.Copy(newConfig, oldConfig) + if err != nil { + log.Fatal("配置文件升级失败:", err) + } + newConfig.Version = "1.6.0" + constant.Init(&constant.Options{ + DataPath: newConfig.DataPath, + }) + log.Println("[变动] 配置项(advanced.update_delay_second) 变更为 advanced.refresh_second") + newConfig.Advanced.RefreshSecond = oldConfig.Advanced.UpdateDelaySecond + + content, err := encodeConfig(newConfig) + if err != nil { + log.Fatal("配置文件升级失败:", err) + } + err = os.WriteFile(file, content, 0644) + if err != nil { + log.Fatal("配置文件升级失败:", err) + } + // 强制写入 + assets.WritePlugins(assets.Dir, path.Join(newConfig.DataPath, assets.Dir), false) + + log.Println("--------------------------------") + log.Println("[数据迁移] 数据库部分迁移到文件标记") + + bolt2dirdb(constant.CacheFile, xpath.P(newConfig.Setting.SavePath)) +} + +func bolt2dirdb(boltPath, savePath string) { + if !utils.IsExist(boltPath) { + return + } + bolt := cache.NewBolt() + bolt.Open(boltPath) + defer bolt.Close() + + keys := bolt.ListKey("name2status") + for _, key := range keys { + + status := models.DownloadStatus{} + _ = bolt.Get("name2status", key, &status) + entity := models.AnimeEntity{} + _ = bolt.Get("name2entity", key, &entity) + + base := models.BaseDBEntity{ + Hash: status.Hash, + Name: key, + CreateAt: utils.Unix(), + UpdateAt: utils.Unix(), + } + if len(status.Path) > 0 { + animePath := xpath.Root(status.Path[0]) + _ = write(path.Join(savePath, animePath, database.AnimeDBName), models.AnimeDBEntity{ + BaseDBEntity: base, + }) + } + for i, f := range status.Path { + file := path.Join(savePath, f) + if utils.IsExist(file) { + filename := fmt.Sprintf(database.EpisodeDBFmt, strings.TrimSuffix(f, path.Ext(f))) + _ = write(path.Join(savePath, filename), models.EpisodeDBEntity{ + BaseDBEntity: base, + StateDB: models.StateDB{ + Seeded: true, + Downloaded: true, + Renamed: true, + Scraped: true, + }, + Season: entity.Season, + Ep: entity.Ep[i].Ep, + Type: entity.Ep[i].Type, + }) + } + } } - return content, nil } -func BackupConfig(file string, version string) error { - dir, name := path.Split(file) - ext := path.Ext(name) - name = strings.TrimSuffix(name, ext) - timeStr := time.Now().Format("20060102150405") - name = fmt.Sprintf("%s-%s-%s%s", name, version, timeStr, ext) - oldFile, err := os.ReadFile(file) +func write(file string, data any) error { + f := dirdb.NewFile(file) + err := f.Open() if err != nil { return err } - out := path.Join(dir, name) - err = os.WriteFile(out, oldFile, 0644) + defer f.Close() + err = f.DB.Marshal(data) if err != nil { return err } - log.Printf("备份原配置文件到:'%s'\n", out) + log.Printf("write %s: %+v\n", file, data) return nil } diff --git a/configs/utils.go b/configs/utils.go index 197709c8..4c026435 100644 --- a/configs/utils.go +++ b/configs/utils.go @@ -3,11 +3,15 @@ package configs import ( "fmt" "log" + "os" + "path" "reflect" "strings" + "time" "github.com/jinzhu/copier" "github.com/pkg/errors" + encoder "github.com/wetor/AnimeGo/third_party/yaml-encoder" "github.com/wetor/AnimeGo/internal/models" ) @@ -69,3 +73,36 @@ func Env2Config(env *Environment, conf *Config, prefix string) error { return nil } + +func encodeConfig(conf any) ([]byte, error) { + defaultSettingComment() + defaultAdvancedComment() + yml := encoder.NewEncoder(conf, + encoder.WithComments(encoder.CommentsOnHead), + encoder.WithCommentsMap(configComment), + ) + content, err := yml.Encode() + if err != nil { + return nil, err + } + return content, nil +} + +func BackupConfig(file string, version string) error { + dir, name := path.Split(file) + ext := path.Ext(name) + name = strings.TrimSuffix(name, ext) + timeStr := time.Now().Format("20060102150405") + name = fmt.Sprintf("%s-%s-%s%s", name, version, timeStr, ext) + oldFile, err := os.ReadFile(file) + if err != nil { + return err + } + out := path.Join(dir, name) + err = os.WriteFile(out, oldFile, 0644) + if err != nil { + return err + } + log.Printf("备份原配置文件到:'%s'\n", out) + return nil +} diff --git a/configs/version/v_151/models.go b/configs/version/v_151/models.go index 362a8167..34238026 100644 --- a/configs/version/v_151/models.go +++ b/configs/version/v_151/models.go @@ -26,10 +26,9 @@ type Plugin struct { type Setting struct { Client struct { QBittorrent struct { - Url string `yaml:"url" json:"url"` - Username string `yaml:"username" json:"username"` - Password string `yaml:"password" json:"password"` - DownloadPath string `yaml:"download_path" json:"download_path"` + Url string `yaml:"url" json:"url"` + Username string `yaml:"username" json:"username"` + Password string `yaml:"password" json:"password"` } `yaml:"qbittorrent" json:"qbittorrent"` } `yaml:"client" json:"client"` DownloadPath string `yaml:"download_path" json:"download_path"` diff --git a/configs/version/v_152/models.go b/configs/version/v_152/models.go new file mode 100644 index 00000000..370519eb --- /dev/null +++ b/configs/version/v_152/models.go @@ -0,0 +1,96 @@ +package v_152 + +type Config struct { + Version string `yaml:"version" json:"version"` + Setting `yaml:"setting" json:"setting"` + Plugin `yaml:"plugin" json:"plugin"` + Advanced `yaml:"advanced" json:"advanced"` +} + +type PluginInfo struct { + Enable bool `yaml:"enable" json:"enable"` + Type string `yaml:"type" json:"type"` + File string `yaml:"file" json:"file"` + Args map[string]any `yaml:"args,omitempty" json:"args,omitempty"` + Vars map[string]any `yaml:"vars,omitempty" json:"vars,omitempty"` +} + +type Plugin struct { + Feed []PluginInfo `yaml:"feed" json:"feed"` + Parser []PluginInfo `yaml:"parser" json:"parser"` + Filter []PluginInfo `yaml:"filter" json:"filter"` + Schedule []PluginInfo `yaml:"schedule" json:"schedule"` + Rename []PluginInfo `yaml:"rename" json:"rename"` +} + +type Setting struct { + Client struct { + QBittorrent struct { + Url string `yaml:"url" json:"url"` + Username string `yaml:"username" json:"username"` + Password string `yaml:"password" json:"password"` + DownloadPath string `yaml:"download_path" json:"download_path"` + } `yaml:"qbittorrent" json:"qbittorrent"` + } `yaml:"client" json:"client"` + DownloadPath string `yaml:"download_path" json:"download_path"` + SavePath string `yaml:"save_path" json:"save_path"` + DataPath string `yaml:"data_path" json:"data_path"` + Category string `yaml:"category" json:"category"` + Tag string `yaml:"tag" json:"tag"` + WebApi struct { + AccessKey string `yaml:"access_key" json:"access_key"` + Host string `yaml:"host" json:"host"` + Port int `yaml:"port" json:"port"` + } `yaml:"webapi" json:"webapi"` + Proxy struct { + Enable bool `yaml:"enable" json:"enable"` + Url string `yaml:"url" json:"url"` + } `yaml:"proxy" json:"proxy"` + Key struct { + Themoviedb string `yaml:"themoviedb" json:"themoviedb"` + } `yaml:"key" json:"key"` +} + +type Advanced struct { + UpdateDelaySecond int `yaml:"update_delay_second" json:"update_delay_second"` + + Redirect struct { + Mikan string `yaml:"mikan" json:"mikan"` + Bangumi string `yaml:"bangumi" json:"bangumi"` + Themoviedb string `yaml:"themoviedb" json:"themoviedb"` + } `yaml:"redirect" json:"redirect"` + + Request struct { + TimeoutSecond int `yaml:"timeout_second" json:"timeout_second"` + RetryNum int `yaml:"retry_num" json:"retry_num"` + RetryWaitSecond int `yaml:"retry_wait_second" json:"retry_wait_second"` + } `yaml:"request" json:"request"` + + Download struct { + AllowDuplicateDownload bool `yaml:"allow_duplicate_download" json:"allow_duplicate_download"` + SeedingTimeMinute int `yaml:"seeding_time_minute" json:"seeding_time_minute"` + Rename string `yaml:"rename" json:"rename"` + } `yaml:"download" json:"download"` + + Feed struct { + DelaySecond int `yaml:"delay_second" json:"delay_second"` + } `yaml:"feed" json:"feed"` + + Default struct { + TMDBFailSkip bool `yaml:"tmdb_fail_skip" json:"tmdb_fail_skip"` + TMDBFailUseTitleSeason bool `yaml:"tmdb_fail_use_title_season" json:"tmdb_fail_use_title_season"` + TMDBFailUseFirstSeason bool `yaml:"tmdb_fail_use_first_season" json:"tmdb_fail_use_first_season"` + } `yaml:"default" json:"default"` + + Client struct { + ConnectTimeoutSecond int `yaml:"connect_timeout_second" json:"connect_timeout_second"` + RetryConnectNum int `yaml:"retry_connect_num" json:"retry_connect_num"` + CheckTimeSecond int `yaml:"check_time_second" json:"check_time_second"` + } `yaml:"client" json:"client"` + + Cache struct { + MikanCacheHour int `yaml:"mikan_cache_hour" json:"mikan_cache_hour"` + BangumiCacheHour int `yaml:"bangumi_cache_hour" json:"bangumi_cache_hour"` + ThemoviedbCacheHour int `yaml:"themoviedb_cache_hour" json:"themoviedb_cache_hour"` + } `yaml:"cache" json:"cache"` +} diff --git a/internal/animego/database/database_test.go b/internal/animego/database/database_test.go index 032ce336..5b886f5a 100644 --- a/internal/animego/database/database_test.go +++ b/internal/animego/database/database_test.go @@ -73,8 +73,8 @@ func TestMain(m *testing.M) { }, }) renamer.Init(&renamer.Options{ - WG: &wg, - UpdateDelaySecond: 1, + WG: &wg, + RefreshSecond: 1, }) renamePlugin = renamerPlugin.NewRenamePlugin(&models.Plugin{ Enable: true, diff --git a/internal/animego/database/init.go b/internal/animego/database/init.go index 60f3a01f..a949c3e4 100644 --- a/internal/animego/database/init.go +++ b/internal/animego/database/init.go @@ -19,7 +19,7 @@ var ( ) type DownloaderConf struct { - UpdateDelaySecond int + RefreshSecond int DownloadPath string SavePath string Category string diff --git a/internal/animego/downloader/downloader_test.go b/internal/animego/downloader/downloader_test.go index 8122f569..20c85569 100644 --- a/internal/animego/downloader/downloader_test.go +++ b/internal/animego/downloader/downloader_test.go @@ -70,8 +70,8 @@ func TestMain(m *testing.M) { }, }) renamer.Init(&renamer.Options{ - WG: &wg, - UpdateDelaySecond: 1, + WG: &wg, + RefreshSecond: 1, }) renamePlugin = renamerPlugin.NewRenamePlugin(&models.Plugin{ Enable: true, diff --git a/internal/animego/renamer/init.go b/internal/animego/renamer/init.go index c5e28bab..02d1ce4d 100644 --- a/internal/animego/renamer/init.go +++ b/internal/animego/renamer/init.go @@ -3,19 +3,19 @@ package renamer import "sync" var ( - WG *sync.WaitGroup - UpdateDelaySecond int - ReInitWG sync.WaitGroup + WG *sync.WaitGroup + RefreshSecond int + ReInitWG sync.WaitGroup ) type Options struct { - WG *sync.WaitGroup - UpdateDelaySecond int + WG *sync.WaitGroup + RefreshSecond int } func Init(opts *Options) { WG = opts.WG - UpdateDelaySecond = opts.UpdateDelaySecond + RefreshSecond = opts.RefreshSecond } func ReInit(opts *Options) { diff --git a/internal/animego/renamer/renamer.go b/internal/animego/renamer/renamer.go index 8c2dbc1b..401045cd 100644 --- a/internal/animego/renamer/renamer.go +++ b/internal/animego/renamer/renamer.go @@ -425,7 +425,7 @@ func (m *Manager) Update(ctx context.Context) (err error) { } func (m *Manager) sleep(ctx context.Context) { - utils.Sleep(UpdateDelaySecond, ctx) + utils.Sleep(RefreshSecond, ctx) } func (m *Manager) Start(ctx context.Context) { diff --git a/internal/animego/renamer/renamer_test.go b/internal/animego/renamer/renamer_test.go index d8ab4d02..22ccc511 100644 --- a/internal/animego/renamer/renamer_test.go +++ b/internal/animego/renamer/renamer_test.go @@ -51,8 +51,8 @@ func TestMain(m *testing.M) { }) wg := sync.WaitGroup{} renamer.Init(&renamer.Options{ - WG: &wg, - UpdateDelaySecond: 1, + WG: &wg, + RefreshSecond: 1, }) p := renamerPlugin.NewRenamePlugin(&models.Plugin{ Enable: true, diff --git a/test/testdata/config/animego_151.yaml b/test/testdata/config/animego_151.yaml index 507479c3..d6fe48e8 100644 --- a/test/testdata/config/animego_151.yaml +++ b/test/testdata/config/animego_151.yaml @@ -5,7 +5,6 @@ setting: url: http://127.0.0.1:8080 username: admin password: adminadmin - download_path: "" download_path: download/incomplete save_path: download/anime data_path: data diff --git a/test/testdata/config/animego_152.yaml b/test/testdata/config/animego_152.yaml index a13ab2be..4884ae39 100644 --- a/test/testdata/config/animego_152.yaml +++ b/test/testdata/config/animego_152.yaml @@ -1,65 +1,26 @@ -# 配置文件版本 version: 1.5.2 -# 常规设置 setting: - # 下载客户端设置 client: - # qBittorrent客户端 qbittorrent: - # 地址. 环境变量ANIMEGO_QBT_URL url: http://127.0.0.1:8080 - # 用户名. 环境变量ANIMEGO_QBT_USERNAME username: admin - # 密码. 环境变量ANIMEGO_QBT_PASSWORD password: adminadmin - # 下载文件夹. 环境变量ANIMEGO_QBT_DOWNLOAD_PATH download_path: download/incomplete - # 下载文件夹. 环境变量ANIMEGO_DOWNLOAD_PATH. 下载器的下载文件夹 download_path: download/incomplete - # 保存文件夹. 环境变量ANIMEGO_SAVE_PATH. 下载完成后,重命名并移动到的文件夹 save_path: download/anime - # 数据文件夹. 环境变量ANIMEGO_DATA_PATH. 用于保存数据库、插件等数据 data_path: data - # 分类名. 环境变量ANIMEGO_CATEGORY. 仅qBittorrent有效 category: AnimeGo - # 标签表达式. 环境变量ANIMEGO_TAG. 仅qBittorrent有效,可用通配符列表: - # {year} int 番剧更新年 - # {quarter} int 番剧季度月号,取值为[4, 7, 10, 1]分别对应[春, 夏, 秋, 冬]季番剧 - # {quarter_index} int 番剧季度序号,取值为[1, 2, 3, 4]分别对应春(4月)、夏(7月)、秋(10月)、冬(1月)季番剧 - # {quarter_name} string 番剧季度名,取值为[春, 夏, 秋, 冬] - # {ep} int 番剧当前剧集序号,从1开始 - # {week} int 番剧更新星期数,取值为[1, 2, 3, 4, 5, 6, 7] - # {week_name} string 番剧更新星期名,取值为[星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日] tag: '{year}年{quarter}月新番' - # WebApi设置 webapi: - # 请求秘钥. 环境变量ANIMEGO_WEB_ACCESS_KEY. 为空则不需要验证 access_key: animego123 - # 域名. 环境变量ANIMEGO_WEB_HOST host: localhost - # 端口. 环境变量ANIMEGO_WEB_PORT port: 7991 - # 代理设置. 开启后AnimeGo所有的网络请求都会使用代理 proxy: - # 启用. 环境变量ANIMEGO_PROXY_URL不为空则启用,否则禁用 enable: true - # 代理链接. 环境变量ANIMEGO_PROXY_URL url: http://127.0.0.1:7890 - # 秘钥设置 key: - # TheMovieDB的APIkey. 环境变量ANIMEGO_THEMOVIEDB_KEY. 可以自行申请链接(需注册):https://www.themoviedb.org/settings/api?language=zh-CN - # 以下为wetor的个人APIkey,仅用于AnimeGo使用 themoviedb: d3d8430aefee6c19520d0f7da145daf5 -# 插件设置. 按顺序依次执行启用的插件 -# 列表类型,每一项需要有以下参数: -# enable: 启用 -# type: 插件类型,目前仅支持 'python'(py) 和 'builtin' 插件类型。builtin为内置插件 -# file: 插件文件,相对于 'data/plugin' 文件夹的路径,或内置插件名 -# args: [可空]插件额外参数,字典类型,会覆盖同名参数 -# vars: [可空]插件全局变量,字典类型,如果变量名前缀或后缀不是'__'将会自动补充,即在插件中变量名前后缀始终为'__', -# 会覆盖插件脚本中同名变量,具体变量和作用参考订阅插件文档 plugin: - # 订阅. 解析订阅链接 feed: - enable: false type: builtin @@ -68,84 +29,44 @@ plugin: cron: 0 0/20 * * * ? name: Mikan url: "" - # 解析器. 解析项目标题 parser: - enable: true type: builtin file: builtin_parser.py - # 过滤器插件. 用来筛选符合条件的项目进行解析下载 filter: - enable: true type: py file: filter/mikan_tool.py - # 定时任务. 定时执行脚本 schedule: [] - # 重命名. 下载完成后重命名规则 rename: - enable: true type: builtin file: builtin_rename.py -# 高级设置 advanced: - # 更新状态等待时间. 每隔这一段时间,都会将下载队列添加到下载项、更新下载进度和重命名已完成下载项 - # 等待过程是异步的,等待期间不影响操作 - # 在下载项较多、等待时间过少时会出现请求超时,所以有个最小等待时间为2秒的限制 - # 默认为10,最小值为2 update_delay_second: 10 - # 域名重定向 redirect: - # 默认mikanani.me mikan: "" - # 默认api.bgm.tv bangumi: "" - # 默认api.themoviedb.org themoviedb: "" - # 网络请求设置 request: - # 请求超时时间 timeout_second: 5 - # 额外重试次数 retry_num: 3 - # 重试间隔等待时间 retry_wait_second: 5 - # 下载设置 download: - # 允许重复下载 allow_duplicate_download: false - # 做种时间 seeding_time_minute: 1 - # 重命名方式. 下载状态顺序为: 创建下载项->下载->下载完成->做种->做种完成 - # 可选值为: ['link', 'link_delete', 'move', 'wait_move'] - # link: 使用硬链接方式,下载完成后触发。不影响做种 - # link_delete: 使用硬链接方式,下载完成后触发。不影响做种,做种完成后删除原文件 - # move: 使用移动方式,下载完成后触发。无法做种 - # wait_move: 使用移动方式,做种完成后触发 rename: link_delete - # 订阅设置 feed: - # 订阅解析间隔时间 delay_second: 2 - # 解析季度默认值. 使用tmdb解析季度失败时,同类型默认值按优先级执行。数值越大,优先级越高 default: - # 跳过当前项. tmdb解析季度失败时,跳过当前项。优先级3 tmdb_fail_skip: false - # 文件名解析季度. tmdb解析季度失败时,从文件名中获取季度信息。优先级2 tmdb_fail_use_title_season: true - # 使用第一季. tmdb解析季度失败时,默认使用第一季。优先级1 tmdb_fail_use_first_season: true - # 下载客户端设置 client: - # 连接超时时间 connect_timeout_second: 5 - # 连接失败重试次数 retry_connect_num: 10 - # 检查连接状态间隔时间 check_time_second: 30 - # 缓存设置 cache: - # Mikan缓存时间. 默认7*24小时(7天)。主要为mikan-id与bangumi-id的映射关系 mikan_cache_hour: 168 - # Bangumi缓存时间. 默认3*24小时(3天)。主要为bangumi-id与详细信息的映射 bangumi_cache_hour: 72 - # Themoviedb缓存时间. 默认14*24小时(14天)。主要为tmdb-id与季度信息的映射 themoviedb_cache_hour: 336 diff --git a/test/testdata/config/animego_160.yaml b/test/testdata/config/animego_160.yaml new file mode 100644 index 00000000..c53b5894 --- /dev/null +++ b/test/testdata/config/animego_160.yaml @@ -0,0 +1,148 @@ +# 配置文件版本 +version: 1.6.0 +# 常规设置 +setting: + # 下载客户端设置 + client: + # qBittorrent客户端 + qbittorrent: + # 地址. 环境变量ANIMEGO_QBT_URL + url: http://127.0.0.1:8080 + # 用户名. 环境变量ANIMEGO_QBT_USERNAME + username: admin + # 密码. 环境变量ANIMEGO_QBT_PASSWORD + password: adminadmin + # 下载文件夹. 环境变量ANIMEGO_QBT_DOWNLOAD_PATH + download_path: download/incomplete + # 下载文件夹. 环境变量ANIMEGO_DOWNLOAD_PATH. 下载器的下载文件夹 + download_path: download/incomplete + # 保存文件夹. 环境变量ANIMEGO_SAVE_PATH. 下载完成后,重命名并移动到的文件夹 + save_path: download/anime + # 数据文件夹. 环境变量ANIMEGO_DATA_PATH. 用于保存数据库、插件等数据 + data_path: data + # 分类名. 环境变量ANIMEGO_CATEGORY. 仅qBittorrent有效 + category: AnimeGo + # 标签表达式. 环境变量ANIMEGO_TAG. 仅qBittorrent有效,可用通配符列表: + # {year} int 番剧更新年 + # {quarter} int 番剧季度月号,取值为[4, 7, 10, 1]分别对应[春, 夏, 秋, 冬]季番剧 + # {quarter_index} int 番剧季度序号,取值为[1, 2, 3, 4]分别对应春(4月)、夏(7月)、秋(10月)、冬(1月)季番剧 + # {quarter_name} string 番剧季度名,取值为[春, 夏, 秋, 冬] + # {ep} int 番剧当前剧集序号,从1开始 + # {week} int 番剧更新星期数,取值为[1, 2, 3, 4, 5, 6, 7] + # {week_name} string 番剧更新星期名,取值为[星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日] + tag: '{year}年{quarter}月新番' + # WebApi设置 + webapi: + # 请求秘钥. 环境变量ANIMEGO_WEB_ACCESS_KEY. 为空则不需要验证 + access_key: animego123 + # 域名. 环境变量ANIMEGO_WEB_HOST + host: localhost + # 端口. 环境变量ANIMEGO_WEB_PORT + port: 7991 + # 代理设置. 开启后AnimeGo所有的网络请求都会使用代理 + proxy: + # 启用. 环境变量ANIMEGO_PROXY_URL不为空则启用,否则禁用 + enable: true + # 代理链接. 环境变量ANIMEGO_PROXY_URL + url: http://127.0.0.1:7890 + # 秘钥设置 + key: + # TheMovieDB的APIkey. 环境变量ANIMEGO_THEMOVIEDB_KEY. 可以自行申请链接(需注册):https://www.themoviedb.org/settings/api?language=zh-CN + # 以下为wetor的个人APIkey,仅用于AnimeGo使用 + themoviedb: d3d8430aefee6c19520d0f7da145daf5 +# 插件设置. 按顺序依次执行启用的插件 +# 列表类型,每一项需要有以下参数: +# enable: 启用 +# type: 插件类型,目前仅支持 'python'(py) 和 'builtin' 插件类型。builtin为内置插件 +# file: 插件文件,相对于 'data/plugin' 文件夹的路径,或内置插件名 +# args: [可空]插件额外参数,字典类型,会覆盖同名参数 +# vars: [可空]插件全局变量,字典类型,如果变量名前缀或后缀不是'__'将会自动补充,即在插件中变量名前后缀始终为'__', +# 会覆盖插件脚本中同名变量,具体变量和作用参考订阅插件文档 +plugin: + # 订阅. 解析订阅链接 + feed: + - enable: false + type: builtin + file: builtin_mikan_rss.py + vars: + cron: 0 0/20 * * * ? + name: Mikan + url: "" + # 解析器. 解析项目标题 + parser: + - enable: true + type: builtin + file: builtin_parser.py + # 过滤器插件. 用来筛选符合条件的项目进行解析下载 + filter: + - enable: true + type: py + file: filter/mikan_tool.py + # 定时任务. 定时执行脚本 + schedule: [] + # 重命名. 下载完成后重命名规则 + rename: + - enable: true + type: builtin + file: builtin_rename.py +# 高级设置 +advanced: + # 刷新间隔时间. 下载器列表和重命名任务刷新间隔时间。默认为10,最小值为2 + refresh_second: 10 + # 域名重定向 + redirect: + # 默认mikanani.me + mikan: "" + # 默认api.bgm.tv + bangumi: "" + # 默认api.themoviedb.org + themoviedb: "" + # 网络请求设置 + request: + # 请求超时时间 + timeout_second: 5 + # 额外重试次数 + retry_num: 3 + # 重试间隔等待时间 + retry_wait_second: 5 + # 下载设置 + download: + # 允许重复下载 + allow_duplicate_download: false + # 做种时间 + seeding_time_minute: 1 + # 重命名方式. 下载状态顺序为: 创建下载项->下载->下载完成->做种->做种完成 + # 可选值为: ['link', 'link_delete', 'move', 'wait_move'] + # link: 使用硬链接方式,下载完成后触发。不影响做种 + # link_delete: 使用硬链接方式,下载完成后触发。不影响做种,做种完成后删除原文件 + # move: 使用移动方式,下载完成后触发。无法做种 + # wait_move: 使用移动方式,做种完成后触发 + rename: link_delete + # 订阅设置 + feed: + # 订阅解析间隔时间 + delay_second: 2 + # 解析季度默认值. 使用tmdb解析季度失败时,同类型默认值按优先级执行。数值越大,优先级越高 + default: + # 跳过当前项. tmdb解析季度失败时,跳过当前项。优先级3 + tmdb_fail_skip: false + # 文件名解析季度. tmdb解析季度失败时,从文件名中获取季度信息。优先级2 + tmdb_fail_use_title_season: true + # 使用第一季. tmdb解析季度失败时,默认使用第一季。优先级1 + tmdb_fail_use_first_season: true + # 下载客户端设置 + client: + # 连接超时时间 + connect_timeout_second: 5 + # 连接失败重试次数 + retry_connect_num: 10 + # 检查连接状态间隔时间 + check_time_second: 30 + # 缓存设置 + cache: + # Mikan缓存时间. 默认7*24小时(7天)。主要为mikan-id与bangumi-id的映射关系 + mikan_cache_hour: 168 + # Bangumi缓存时间. 默认3*24小时(3天)。主要为bangumi-id与详细信息的映射 + bangumi_cache_hour: 72 + # Themoviedb缓存时间. 默认14*24小时(14天)。主要为tmdb-id与季度信息的映射 + themoviedb_cache_hour: 336