diff --git a/cmd/animego/main.go b/cmd/animego/main.go index 2c4d12ac..7a0f19e4 100644 --- a/cmd/animego/main.go +++ b/cmd/animego/main.go @@ -188,9 +188,10 @@ func Main() { }, BangumiCache: bangumiCache, BangumiCacheLock: &BangumiCacheMutex, - RedirectMikan: config.Advanced.Redirect.Mikan, - RedirectBangumi: config.Advanced.Redirect.Bangumi, - RedirectThemoviedb: config.Advanced.Redirect.Themoviedb, + RedirectMikan: config.Advanced.AniData.Mikan.Redirect, + RedirectBangumi: config.Advanced.AniData.Bangumi.Redirect, + RedirectThemoviedb: config.Advanced.AniData.Themoviedb.Redirect, + MikanCookie: config.Advanced.AniData.Mikan.Cookie, }, }) diff --git a/configs/config_test.go b/configs/config_test.go index 3531f425..84de53d6 100644 --- a/configs/config_test.go +++ b/configs/config_test.go @@ -109,6 +109,15 @@ func TestUpdateConfig_160(t *testing.T) { EqualFile(t, "data/animego.yaml", test.GetDataPath(testdata, "animego_160.yaml")) } +func TestUpdateConfig_161(t *testing.T) { + configs.ConfigVersion = "1.6.1" + file, _ := test.GetData(testdata, "animego_160.yaml") + _ = os.WriteFile("data/animego.yaml", file, 0666) + configs.UpdateConfig("data/animego.yaml", false) + + EqualFile(t, "data/animego.yaml", test.GetDataPath(testdata, "animego_161.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/models.go b/configs/models.go index a04ba6e3..b7abc029 100644 --- a/configs/models.go +++ b/configs/models.go @@ -54,11 +54,18 @@ type Setting struct { type Advanced struct { 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"` - Bangumi string `yaml:"bangumi" json:"bangumi" attr:"默认api.bgm.tv"` - Themoviedb string `yaml:"themoviedb" json:"themoviedb" attr:"默认api.themoviedb.org"` - } `yaml:"redirect" json:"redirect" attr:"域名重定向"` + AniData struct { + Mikan struct { + Redirect string `yaml:"redirect" json:"redirect" attr:"默认mikanani.me"` + Cookie string `yaml:"cookie" json:"cookie" attr:"mikan的Cookie" comment:"使用登录后的Cookie可以正常下载mikan的被隐藏番剧. 登录状态的Cookie名为'.AspNetCore.Identity.Application'"` + } `yaml:"mikan" json:"mikan"` + Bangumi struct { + Redirect string `yaml:"redirect" json:"redirect" attr:"默认api.bgm.tv"` + } `yaml:"bangumi" json:"bangumi"` + Themoviedb struct { + Redirect string `yaml:"redirect" json:"redirect" attr:"默认api.themoviedb.org"` + } `yaml:"themoviedb" json:"themoviedb"` + } `yaml:"anidata" json:"anidata" attr:"资源网站设置"` Request struct { TimeoutSecond int `yaml:"timeout_second" json:"timeout_second" attr:"请求超时时间"` diff --git a/configs/update.go b/configs/update.go index 8771cd6e..ae11df7d 100644 --- a/configs/update.go +++ b/configs/update.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/jinzhu/copier" + "github.com/wetor/AnimeGo/configs/version/v_160" "gopkg.in/yaml.v3" "github.com/wetor/AnimeGo/assets" @@ -49,6 +50,7 @@ var ( "1.5.1", "1.5.2", "1.6.0", + "1.6.1", } ConfigVersion = versions[len(versions)-1] // 当前配置文件版本 @@ -97,6 +99,11 @@ var ( Desc: "更改字段名,数据库迁移", UpdateFunc: update_152_160, }, + { + Name: versions[9], + Desc: "更改域名重定向设置,支持设置Mikan的Cookie", + UpdateFunc: update_160_161, + }, } ) @@ -485,7 +492,7 @@ func update_152_160(file string) { log.Fatal("配置文件加载错误:", err) } - newConfig := DefaultConfig() + newConfig := &v_160.Config{} err = copier.Copy(newConfig, oldConfig) if err != nil { log.Fatal("配置文件升级失败:", err) @@ -563,6 +570,44 @@ func bolt2dirdb(boltPath, savePath string) { } } +func update_160_161(file string) { + data, err := os.ReadFile(file) + if err != nil { + log.Fatal("配置文件加载错误:", err) + } + oldConfig := &v_160.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.1" + + log.Println("[变动] 配置项(advanced.redirect.mikan) 变更为 advanced.anidata.mikan.redirect") + log.Println("[新增] 配置项(advanced.anidata.mikan.cookie)") + newConfig.Advanced.AniData.Mikan.Redirect = oldConfig.Advanced.Redirect.Mikan + log.Println("[变动] 配置项(advanced.redirect.bangumi) 变更为 advanced.anidata.bangumi.redirect") + newConfig.Advanced.AniData.Bangumi.Redirect = oldConfig.Advanced.Redirect.Bangumi + log.Println("[变动] 配置项(advanced.redirect.themoviedb) 变更为 advanced.anidata.themoviedb.redirect") + newConfig.Advanced.AniData.Themoviedb.Redirect = oldConfig.Advanced.Redirect.Themoviedb + + 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) +} + func write(file string, data any) error { f := dirdb.NewFile(file) err := f.Open() diff --git a/configs/version/v_160/models.go b/configs/version/v_160/models.go new file mode 100644 index 00000000..bc406c0d --- /dev/null +++ b/configs/version/v_160/models.go @@ -0,0 +1,96 @@ +package v_160 + +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 { + RefreshSecond int `yaml:"refresh_second" json:"refresh_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/anidata/anidata.go b/internal/animego/anidata/anidata.go index ad403a91..03ae3166 100644 --- a/internal/animego/anidata/anidata.go +++ b/internal/animego/anidata/anidata.go @@ -16,6 +16,8 @@ var ( RedirectMikan string RedirectBangumi string RedirectThemoviedb string + + MikanCookie string ) type Options struct { @@ -27,6 +29,8 @@ type Options struct { RedirectMikan string RedirectBangumi string RedirectThemoviedb string + + MikanCookie string } func Init(opts *Options) { @@ -38,4 +42,6 @@ func Init(opts *Options) { RedirectMikan = opts.RedirectMikan RedirectBangumi = opts.RedirectBangumi RedirectThemoviedb = opts.RedirectThemoviedb + + MikanCookie = opts.MikanCookie } diff --git a/internal/animego/anidata/mikan/mikan.go b/internal/animego/anidata/mikan/mikan.go index b585dd64..70a4799e 100644 --- a/internal/animego/anidata/mikan/mikan.go +++ b/internal/animego/anidata/mikan/mikan.go @@ -24,6 +24,8 @@ const ( IdXPath = "//a[@class='mikan-rss']" // Mikan番剧id获取XPath GroupXPath = "//p[@class='bangumi-info']/a[@class='magnet-link-wrap']" // Mikan番剧信息获取group字幕组id和name BangumiUrlXPath = "//p[@class='bangumi-info']/a[contains(@href, 'bgm.tv')]" // Mikan番剧信息中bangumi id获取XPath + + AuthCookie = ".AspNetCore.Identity.Application" ) var ( @@ -134,7 +136,13 @@ func (a *Mikan) cacheParseMikanBangumiID(mikanID int) (bangumiID int, err error) func (a *Mikan) loadHtml(url string) (*html.Node, error) { buf := bytes.NewBuffer(nil) - err := request.GetWriter(url, buf) + cookie := anidata.MikanCookie + if !strings.Contains(cookie, AuthCookie+"=") { + cookie = AuthCookie + "=" + cookie + } + err := request.GetWriter(url, buf, map[string]string{ + "Cookie": cookie, + }) if err != nil { log.DebugErr(err) return nil, errors.WithStack(&exceptions.ErrRequest{Name: a.Name()}) diff --git a/pkg/request/request.go b/pkg/request/request.go index 1a9762de..687f7f61 100644 --- a/pkg/request/request.go +++ b/pkg/request/request.go @@ -127,10 +127,14 @@ func GetString(uri string, args ...interface{}) (string, error) { return str, nil } -func Get(uri string, body interface{}) error { +func Get(uri string, body interface{}, args ...interface{}) error { ReInitWG.Add(1) defer ReInitWG.Done() - resp, _, errs := request(uri, "GET", nil, nil).EndStruct(body) + var header map[string]string = nil + if len(args) > 0 { + header = args[0].(map[string]string) + } + resp, _, errs := request(uri, "GET", nil, header).EndStruct(body) err := handleError(resp, errs) if err != nil { return err @@ -138,10 +142,14 @@ func Get(uri string, body interface{}) error { return nil } -func Post(uri string, req interface{}, body interface{}) error { +func Post(uri string, req interface{}, body interface{}, args ...interface{}) error { ReInitWG.Add(1) defer ReInitWG.Done() - resp, _, errs := request(uri, "POST", req, nil).EndStruct(body) + var header map[string]string = nil + if len(args) > 0 { + header = args[0].(map[string]string) + } + resp, _, errs := request(uri, "POST", req, header).EndStruct(body) err := handleError(resp, errs) if err != nil { return err @@ -149,10 +157,14 @@ func Post(uri string, req interface{}, body interface{}) error { return nil } -func GetFile(uri string, file string) error { +func GetFile(uri string, file string, args ...interface{}) error { ReInitWG.Add(1) defer ReInitWG.Done() - resp, bodyBytes, errs := request(uri, "GET", nil, nil).EndBytes() + var header map[string]string = nil + if len(args) > 0 { + header = args[0].(map[string]string) + } + resp, bodyBytes, errs := request(uri, "GET", nil, header).EndBytes() err := handleError(resp, errs) if err != nil { return err @@ -164,10 +176,14 @@ func GetFile(uri string, file string) error { return nil } -func GetWriter(uri string, w io.Writer) error { +func GetWriter(uri string, w io.Writer, args ...interface{}) error { ReInitWG.Add(1) defer ReInitWG.Done() - resp, bodyBytes, errs := request(uri, "GET", nil, nil).EndBytes() + var header map[string]string = nil + if len(args) > 0 { + header = args[0].(map[string]string) + } + resp, bodyBytes, errs := request(uri, "GET", nil, header).EndBytes() err := handleError(resp, errs) if err != nil { return err diff --git a/test/testdata/config/animego_160.yaml b/test/testdata/config/animego_160.yaml index c53b5894..5ecfb56d 100644 --- a/test/testdata/config/animego_160.yaml +++ b/test/testdata/config/animego_160.yaml @@ -1,65 +1,26 @@ -# 配置文件版本 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 @@ -68,81 +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: - # 刷新间隔时间. 下载器列表和重命名任务刷新间隔时间。默认为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 diff --git a/test/testdata/config/animego_161.yaml b/test/testdata/config/animego_161.yaml new file mode 100644 index 00000000..25f971fe --- /dev/null +++ b/test/testdata/config/animego_161.yaml @@ -0,0 +1,153 @@ +# 配置文件版本 +version: 1.6.1 +# 常规设置 +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 + # 资源网站设置 + anidata: + mikan: + # 默认mikanani.me + redirect: "" + # mikan的Cookie. 使用登录后的Cookie可以正常下载mikan的被隐藏番剧. 登录状态的Cookie名为'.AspNetCore.Identity.Application' + cookie: "" + bangumi: + # 默认api.bgm.tv + redirect: "" + themoviedb: + # 默认api.themoviedb.org + redirect: "" + # 网络请求设置 + 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