Merge pull request #1064 from EstrellaXD/feat/anibt-search-provider

This commit is contained in:
Estrella Pan
2026-07-09 15:42:45 +02:00
4 changed files with 33 additions and 3 deletions

View File

@@ -18,6 +18,7 @@ def _default_parser(site: str) -> str:
DEFAULT_PROVIDER: dict[str, ProviderConfig] = {
"mikan": {"url": "https://mikanani.me/RSS/Search?searchstr=%s", "parser": "mikan"},
"anibt": {"url": "https://anibt.net/rss/magnets.xml?q=%s", "parser": "tmdb"},
"nyaa": {"url": "https://nyaa.si/?page=rss&q=%s&c=0_0&f=0", "parser": "tmdb"},
"dmhy": {"url": "http://dmhy.org/topics/rss/rss.xml?keyword=%s", "parser": "tmdb"},
}
@@ -41,7 +42,12 @@ def _normalize(raw: dict) -> dict[str, ProviderConfig]:
def load_provider() -> dict[str, ProviderConfig]:
if PROVIDER_PATH.exists():
return _normalize(json_config.load(PROVIDER_PATH))
providers = _normalize(json_config.load(PROVIDER_PATH))
# 旧配置文件可能缺少后来新增的内置搜索源(如 anibt):补齐缺失项,
# 用户对已有站点的自定义 URL / 解析器保持不变。
for site, config in DEFAULT_PROVIDER.items():
providers.setdefault(site, config)
return providers
else:
PROVIDER_PATH.parent.mkdir(parents=True, exist_ok=True)
json_config.save(PROVIDER_PATH, DEFAULT_PROVIDER)

View File

@@ -49,6 +49,14 @@ class TestNormalize:
assert result["custom"]["parser"] == "tmdb"
class TestDefaultProvider:
def test_default_provider_includes_anibt_with_tmdb_parser(self):
"""anibt is a built-in default provider searched via its RSS feed."""
anibt = search_provider_module.DEFAULT_PROVIDER["anibt"]
assert anibt["url"] == "https://anibt.net/rss/magnets.xml?q=%s"
assert anibt["parser"] == "tmdb"
class TestLoadProvider:
def test_load_provider_backward_compatible_with_legacy_file(
self, tmp_path, monkeypatch
@@ -74,6 +82,22 @@ class TestLoadProvider:
assert result == search_provider_module.DEFAULT_PROVIDER
assert search_provider_module.PROVIDER_PATH.exists()
def test_load_provider_merges_new_default_sites_into_saved_config(self):
"""A saved config that predates a newly added built-in provider gains
that provider on load, while user-customized entries are kept as-is."""
from module.utils import json_config
json_config.save(
search_provider_module.PROVIDER_PATH,
{"mikan": {"url": "https://my.mirror/RSS/Search?searchstr=%s"}},
)
result = load_provider()
assert result["mikan"]["url"] == "https://my.mirror/RSS/Search?searchstr=%s"
assert result["anibt"] == search_provider_module.DEFAULT_PROVIDER["anibt"]
assert result["nyaa"] == search_provider_module.DEFAULT_PROVIDER["nyaa"]
class TestSaveProvider:
def test_save_provider_stores_url_and_parser(self):

View File

@@ -85,7 +85,7 @@ const canAdd = computed(
);
// Default providers that cannot be deleted
const defaultProviderNames = ['mikan', 'nyaa', 'dmhy'];
const defaultProviderNames = ['mikan', 'anibt', 'nyaa', 'dmhy'];
onMounted(() => {
loadProviders();

View File

@@ -25,7 +25,7 @@ export interface GroupedBangumi {
}
export const useSearchStore = defineStore('search', () => {
const providers = ref<string[]>(['mikan', 'dmhy', 'nyaa']);
const providers = ref<string[]>(['mikan', 'anibt', 'dmhy', 'nyaa']);
const {
keyword,