feat(adapters): port MoviePilot open site framework (7 spiders, 20 user parsers) + MovieClaw v0.27.0 site definitions + mp-sync tools (W1-3c)
- sites/spiders: Haidan/HDDolby/RousiPro/SunnyPT/TNode/TorrentLeech/Yema (+mTorrent wrapper), specialized SiteAdapter, indirect download resolved at download time - sites/user-parsers: SiteParserBase + all 20 MP SiteSchema parsers (lxml XPath via xpath+xmldom), refreshSiteUserData with schema fallback - sites/definitions: zod SiteDefinition schemas, 23 MovieClaw v0.27.0 (MIT) definitions via scripts/mp-sync/movieclaw-import.mjs, registry getSiteDefinition/listSiteDefinitions, NOTICE - scripts/mp-sync: ledger.json (upstream sha256), check.mjs, build-ledger.mjs; docs/porting/mp-sync-ledger.md - license-and-provenance: add copied-mit kind, re-anchor MovieClaw rows to v0.27.0 Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
cf85481d95
commit
d9f2af2f3c
166 files changed
+16577
-186
No files matched your search
@@ -2,30 +2,49 @@
|
||||
* 随产品发布的站点注册表(迁移账本 SA1)。
|
||||
* 对应 MP `SitesHelper.get_indexers()/get_indexer(domain)`(闭源,sites.pyi)与
|
||||
* `IndexerModule` 按 `indexer.parser` 分派专用解析器(`mTorrent` → MTorrentSpider,其余 → SiteSpider)。
|
||||
* 加站:新增 definitions/<site>.json 并在此登记。
|
||||
* 加站:MovieClaw 来源重跑 scripts/mp-sync/movieclaw-import.mjs;其他来源新增 JSON 并登记到 definitions/。
|
||||
*/
|
||||
|
||||
import { audiencesDefinition } from "./definitions";
|
||||
import type { SiteAdapterDeps } from "./deps";
|
||||
import { createMteamAdapter } from "./mteam/adapter";
|
||||
import { type MteamDefinition, mteamDefinition } from "./mteam/definition";
|
||||
import { createSpiderSiteAdapter } from "./spider/adapter";
|
||||
import type { IndexerDefinition } from "./spider/schema";
|
||||
import type { SiteAdapter } from "./types";
|
||||
import { BUILTIN_SITE_DEFINITIONS, type SiteDefinition } from "./definitions/index.ts";
|
||||
import type { SiteAdapterDeps } from "./deps.ts";
|
||||
import { createMteamAdapter } from "./mteam/adapter.ts";
|
||||
import type { MteamDefinition } from "./mteam/definition.ts";
|
||||
import { createSpiderSiteAdapter } from "./spider/adapter.ts";
|
||||
import type { IndexerDefinition } from "./spider/schema.ts";
|
||||
import { createSpecializedAdapterFor } from "./spiders/index.ts";
|
||||
import type { SpecializedSiteDefinition } from "./spiders/types.ts";
|
||||
import type { SiteAdapter } from "./types.ts";
|
||||
|
||||
export type SiteDefinition = IndexerDefinition | MteamDefinition;
|
||||
export type { SiteDefinition };
|
||||
|
||||
export const SITE_DEFINITIONS: Record<string, SiteDefinition> = {
|
||||
audiences: audiencesDefinition,
|
||||
mteam: mteamDefinition,
|
||||
};
|
||||
/** 全部内置定义(含 enabled:false 的未实测站点) */
|
||||
export const SITE_DEFINITIONS: Readonly<Record<string, SiteDefinition>> = BUILTIN_SITE_DEFINITIONS;
|
||||
|
||||
function isMteam(def: SiteDefinition): def is MteamDefinition {
|
||||
return (def as MteamDefinition).parser === "mTorrent";
|
||||
/** MP `SitesHelper.get_indexer`:按 id 取定义;未知返回 undefined */
|
||||
export function getSiteDefinition(id: string): SiteDefinition | undefined {
|
||||
return SITE_DEFINITIONS[id];
|
||||
}
|
||||
|
||||
/** MP `SitesHelper.get_indexers`:列出定义;默认含未启用站点,`enabledOnly` 只列 enabled !== false */
|
||||
export function listSiteDefinitions(opts: { enabledOnly?: boolean } = {}): SiteDefinition[] {
|
||||
return Object.values(SITE_DEFINITIONS)
|
||||
.filter((d) => !opts.enabledOnly || d.enabled !== false)
|
||||
.sort((a, b) => a.id.localeCompare(b.id));
|
||||
}
|
||||
|
||||
/**
|
||||
* MP `IndexerModule` 按 `indexer.parser` 分派:mTorrent → 馒头适配器;SPIDER_PARSER_CLASSES 其余键(umt.kind=api)
|
||||
* → 专用 spider 适配器;其余 → 通用 SiteSpider。
|
||||
*/
|
||||
export function createSiteAdapter(def: SiteDefinition, deps: SiteAdapterDeps): SiteAdapter {
|
||||
return isMteam(def) ? createMteamAdapter(def, deps) : createSpiderSiteAdapter(def, deps);
|
||||
switch (def.umt.kind) {
|
||||
case "mteam":
|
||||
return createMteamAdapter(def as MteamDefinition, deps);
|
||||
case "api":
|
||||
return createSpecializedAdapterFor(def as SpecializedSiteDefinition, deps);
|
||||
default:
|
||||
return createSpiderSiteAdapter(def as IndexerDefinition, deps);
|
||||
}
|
||||
}
|
||||
|
||||
export function getSiteAdapter(siteId: string, deps: SiteAdapterDeps): SiteAdapter {
|
||||
|
||||
Reference in new issue
Block a user