import mteamJson from "../definitions/mteam.json" with { type: "json" }; import { parseMteamDefinition } from "../definitions/schema.ts"; import type { DefinitionProvenance } from "../spider/schema.ts"; import type { SiteCapabilities } from "../types.ts"; /** * 馒头站点定义:键名沿用 MP indexer dict(id/name/domain/parser/timeout), * `umt` 为本项目扩展。API Key 不在定义里,经 SecretResolver 注入(MP 放在 indexer['apikey'])。 */ export interface MteamDefinition { id: string; name: string; enabled?: boolean; /** MP 用户信息解析器 schema(MTorrent) */ schema?: string; provenance?: DefinitionProvenance; /** 网页域(MP `_url`,详情页 = `${domain}detail/${id}`) */ domain: string; parser: "mTorrent"; timeout: number; umt: { version: string; kind: "mteam"; displayName: string; /** API 基址;缺省为 `https://api.<根域>`(MP `_searchurl % _domain`) */ apiBaseUrl?: string; timezone: string; rateLimit: { minIntervalMs: number; burst: number }; capabilities: SiteCapabilities; /** 原始分类 ID → 名称(自行编制,待核验) */ categoryNames: Record; authSupported?: string[]; customClass?: string; }; } /** * 馒头定义:definitions/mteam.json(由 scripts/mp-sync/movieclaw-import.mjs 从 MovieClaw v0.27.0 mteam.yaml 转换, * W1-3b 原值经 movieclaw-overrides/mteam.json 覆盖),加载时 zod 校验。 */ export const mteamDefinition: MteamDefinition = parseMteamDefinition(mteamJson); /** MP `site_rules.extract_domain` 的简化:取主机名最后两级。 */ export function rootDomain(url: string): string { const host = new URL(url).hostname; const parts = host.split("."); return parts.length >= 2 ? parts.slice(-2).join(".") : host; } export function mteamApiBase(def: MteamDefinition): string { return (def.umt.apiBaseUrl ?? `https://api.${rootDomain(def.domain)}`).replace(/\/$/, ""); }