diff --git a/CHANGELOG.md b/CHANGELOG.md index e92e291b..b64d8b33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ ## [Unreleased] +### 修复(ID-2 身份匹配对照 MoviePilot) +- 憨憨 RSS 标题的分类前缀「[电视剧]」「[动漫]」「[音乐]」被当成中文名,经别名召回把多部剧的资源并入同一部作品;分类词、单字、停用词不再作为片名或别名参与比对,自动绑定也不再登记它们。存量用 `scripts/identity-reevaluate.ts --rollback-wrong` 撤销(缺省只读)。 +- 副标题与 RSS 内嵌描述里的中文名、别名参与匹配;中英名任一精确 + 年份精确即高证据,续作 / 章节序号与季号参与区分,同级多候选按年份精确、命中的名称文字种数取舍;评分权重成表可覆盖。 +- `Travis - 12 Memories` 不再被当成第 12 集。 +- 站点资源标题更新后按新标题重新解析并重新识别,不能确认时撤销原自动绑定。 +- 憨憨真实标题差分集(113 条)对照 MP:修前一致 88.5%,修后 100%(含 1 条 MP 误识别),见 `docs/porting/moviepilot-identity-match.md`。 + ### 已知限制 需求逐条覆盖见 `docs/plan/11-requirements-coverage.md`:当前相当于 REQ 的 M0 大部分 + M1(仅 mock 环境)+ M2 约三分之一。 diff --git a/apps/server/src/modules/sources-identity/service/resolve.ts b/apps/server/src/modules/sources-identity/service/resolve.ts index 64c1dc4f..70263a47 100644 --- a/apps/server/src/modules/sources-identity/service/resolve.ts +++ b/apps/server/src/modules/sources-identity/service/resolve.ts @@ -1,10 +1,11 @@ import { createHash } from "node:crypto"; -import { type MetadataCandidate, TmdbError } from "@umt/adapters"; +import { type MetadataCandidate, recallTmdbCandidates, TmdbError } from "@umt/adapters"; import type { EvidenceLevel, PoolCandidate } from "@umt/contracts"; import { type SourceReleaseRow, sql } from "@umt/db"; import { type IdentityCandidate as DomainCandidate, type IdentityResolution, + isGenericAliasName, normalizeTitle, PARSER_VERSION, type ParsedRelease, @@ -35,6 +36,7 @@ import { resolveEntityId, } from "./entities.ts"; import { detachFromIdentityDecisions, openGroupDecision, refreshGroupDecision } from "./identity-decisions.ts"; +import { tmdbRecallInput, tmdbToCandidate } from "./tmdb-candidate.ts"; import { loadRecognizeCache, type RecognizeMeta, recognizeMetaOf, saveRecognizeCache } from "./tmdb-recognize-cache.ts"; // resolveObservation:parseRelease → 本地召回(别名 pg_trgm + 已有外部身份 + 人工锁)→ [按需] TMDB 候选 → domain.resolveIdentity。 @@ -97,26 +99,7 @@ export function evidenceVersion(parsed: ParsedRelease | null, ranked: RankedCand return `p${PARSER_VERSION}:${h}`; } -function yearOf(d: string | null | undefined): number | undefined { - return d && /^\d{4}/.test(d) ? Number(d.slice(0, 4)) : undefined; -} - -export function tmdbToCandidate(m: MetadataCandidate): DomainCandidate { - const titles = [m.title, ...(m.originalTitle ? [m.originalTitle] : [])]; - for (const t of m.titles) if (t.kind !== "alias" && !titles.includes(t.text)) titles.push(t.text); - const aliases = [...new Set([...m.aliases, ...m.titles.filter((t) => t.kind === "alias").map((t) => t.text)])]; - const seasonYears = m.seasons?.map((s) => yearOf(s.airDate)).filter((y): y is number => y !== undefined); - return { - provider: "tmdb", - entityType: m.entityType, - externalId: m.externalId, - titles, - ...(m.year !== null ? { year: m.year } : {}), - aliases, - ...(seasonYears?.length ? { seasonYears } : {}), - ...(m.externalIds?.imdb ? { linkedExternalIds: [{ provider: "imdb", id: m.externalIds.imdb }] } : {}), - }; -} +export { tmdbToCandidate }; function poolCandidate(r: RankedCandidate): PoolCandidate { const c = r.candidate; @@ -208,15 +191,8 @@ async function tmdbCandidates( return { remote: [], cacheHit: true, meta }; } } - const queries = [parsed.titleCn, parsed.titleEn, parsed.title].filter((t): t is string => !!t); - const seen = new Map(); - for (const q of [...new Set(queries)].slice(0, 2)) { - for (const m of await tmdb.searchAll(q)) { - const k = `${m.entityType}:${m.externalId}`; - if (!seen.has(k)) seen.set(k, m); - } - } - return { remote: [...seen.values()].slice(0, 20), cacheHit: false, meta }; + const remote = await recallTmdbCandidates(tmdb, tmdbRecallInput(parsed)); + return { remote, cacheHit: false, meta }; } async function tmdbByExplicitIds( @@ -512,6 +488,11 @@ function rankedSummary(r: RankedCandidate | undefined) { return r ? { ...poolCandidate(r), titleMatch: r.titleMatch, yearMatch: r.yearMatch, typeMatch: r.typeMatch } : null; } +/** 自动绑定后能否把站点标题登记为别名:标题精确命中,或别名命中且有第二种文字的名称佐证 */ +export function siteAliasAllowed(best: RankedCandidate): boolean { + return best.titleMatch === "exact" || (best.titleMatch === "alias" && best.signals.nameLangs > 1); +} + async function bindAuto( rt: SourcesRuntime, release: SourceReleaseRow, @@ -563,9 +544,17 @@ async function bindAuto( .where("id", "=", entityId) .executeTakeFirstOrThrow(); const units = await ensureUnits(trx, entityId, entity.kind, parsed); - // 站点标题作为别名:下次同名资源可直接本地召回 - if (parsed.titleCn) await addAliasIfAbsent(trx, entityId, parsed.titleCn, "site_title", "site", "zh"); - if (parsed.titleEn) await addAliasIfAbsent(trx, entityId, parsed.titleEn, "site_title", "site", "en"); + // 站点标题作为别名:下次同名资源可直接本地召回。只在名称本身命中过(不是仅靠别名单线命中)时登记, + // 且通用词(分类词 / 单字 / 停用词)不登记,避免错误别名链式扩散(ID-2) + if (siteAliasAllowed(best)) { + for (const [t, lang] of [ + [parsed.titleCn, "zh"], + [parsed.titleEn, "en"], + ] as const) { + if (t && !isGenericAliasName(normalizeTitle(t))) + await addAliasIfAbsent(trx, entityId, t, "site_title", "site", lang); + } + } const evidence = { level, @@ -784,6 +773,8 @@ async function toPool( .set({ parser_version: cols.parserVersion, parsed: jsonb(cols.parsed), + // 重新识别(标题更新 / 复查)后不再能确认:撤销之前的自动绑定(人工锁定的不走到这里) + ...(release.media_entity_id ? { media_entity_id: null, content_unit_id: null } : {}), resolution_status: toReleaseResolutionStatus(contractStatus), resolution_evidence: jsonb({ reason, diff --git a/apps/server/src/modules/sources-identity/service/snapshot.ts b/apps/server/src/modules/sources-identity/service/snapshot.ts index 9c434bf9..91358cc7 100644 --- a/apps/server/src/modules/sources-identity/service/snapshot.ts +++ b/apps/server/src/modules/sources-identity/service/snapshot.ts @@ -1,3 +1,4 @@ +import { createHash } from "node:crypto"; import { type SiteDetailPage, SiteError, type SitePage, type SiteRelease } from "@umt/adapters"; import type { SiteSnapshotKind } from "@umt/contracts"; import { type SiteRow, sql } from "@umt/db"; @@ -41,7 +42,14 @@ export async function upsertSiteRelease( const parsed = parseRelease(r.title, r.subtitle ? { subtitle: r.subtitle } : {}); const c = siteReleaseToSourceRelease(r, { siteId: site.id, parsed }); const row = ( - await sql<{ id: string; inserted: boolean }>` + await sql<{ + id: string; + inserted: boolean; + resolution_locked: boolean; + prev_title: string | null; + prev_subtitle: string | null; + }>` + with prev as (select title, subtitle from source_release where site_id = ${site.id} and site_release_id = ${c.siteReleaseId}) insert into source_release (site_id, site_release_id, title, subtitle, category_raw, tags_raw, size_bytes, infohash_v1, infohash_v2, promotion, promotion_expires_at, seeders, leechers, source_published_at, parsed, parser_version, raw, detail_fetched_at) @@ -51,6 +59,12 @@ export async function upsertSiteRelease( ${jsonb(c.parsed ?? {})}::jsonb, ${c.parserVersion ?? null}, ${jsonb(c.raw ?? {})}::jsonb, ${null}) on conflict (site_id, site_release_id) do update set title = excluded.title, subtitle = coalesce(excluded.subtitle, source_release.subtitle), + parsed = case when source_release.title is distinct from excluded.title + or coalesce(excluded.subtitle, source_release.subtitle) is distinct from source_release.subtitle + then excluded.parsed else source_release.parsed end, + parser_version = case when source_release.title is distinct from excluded.title + or coalesce(excluded.subtitle, source_release.subtitle) is distinct from source_release.subtitle + then excluded.parser_version else source_release.parser_version end, category_raw = coalesce(excluded.category_raw, source_release.category_raw), tags_raw = excluded.tags_raw, size_bytes = coalesce(excluded.size_bytes, source_release.size_bytes), infohash_v1 = coalesce(excluded.infohash_v1, source_release.infohash_v1), @@ -60,7 +74,8 @@ export async function upsertSiteRelease( source_published_at = coalesce(source_release.source_published_at, excluded.source_published_at), raw = source_release.raw || excluded.raw, last_seen_at = now(), availability = case when source_release.availability = 'expired' then 'active' else source_release.availability end - returning id, (xmax = 0) as inserted`.execute(trx) + returning id, (xmax = 0) as inserted, resolution_locked, + (select p.title from prev p) as prev_title, (select p.subtitle from prev p) as prev_subtitle`.execute(trx) ).rows[0]!; if (row.inserted) { await rt.ctx.outbox.emit( @@ -69,8 +84,23 @@ export async function upsertSiteRelease( { sourceReleaseId: row.id, observationId: null, siteId: site.id, isNew: true }, { idempotencyKey: `release.observed:${row.id}` }, ); + } else if ( + !row.resolution_locked && + (row.prev_title !== c.title || (c.subtitle != null && row.prev_subtitle !== c.subtitle)) + ) { + // 标题 / 副标题更新(RSS 标题 → 列表标题等):按新标题重新解析并重新识别,不沿用旧解析(ID-2) + const digest = createHash("sha1") + .update(`${c.title}\n${c.subtitle ?? ""}`) + .digest("hex") + .slice(0, 16); + await rt.ctx.outbox.emit( + trx, + "release.observed", + { sourceReleaseId: row.id, observationId: null, siteId: site.id, isNew: false }, + { idempotencyKey: `release.observed:${row.id}:${digest}` }, + ); } - return row; + return { id: row.id, inserted: row.inserted }; } /** 凭据失效:账号标失效 + 站点健康 failing + 待处理(不重试) */ diff --git a/apps/server/src/modules/sources-identity/service/tmdb-candidate.ts b/apps/server/src/modules/sources-identity/service/tmdb-candidate.ts new file mode 100644 index 00000000..15c997fb --- /dev/null +++ b/apps/server/src/modules/sources-identity/service/tmdb-candidate.ts @@ -0,0 +1,51 @@ +import type { MetadataCandidate } from "@umt/adapters"; +import { type IdentityCandidate, isGenericAliasName, normalizeTitle, type ParsedRelease } from "@umt/domain"; + +function yearOf(d: string | null | undefined): number | undefined { + return d && /^\d{4}/.test(d) ? Number(d.slice(0, 4)) : undefined; +} + +/** + * TMDB 候选 → 身份候选。标题 = 主标题 / 原标题 / 其他语言的本地化标题(精确命中算 exact); + * 别名 = alternative_titles + translations(对照 MP __get_names,命中算 alias,ID-2 起译名不再算主标题)。 + * 剧集带各季首播年份与季号(取了详情才有)。 + */ +export function tmdbToCandidate(m: MetadataCandidate): IdentityCandidate { + const titles = [m.title, ...(m.originalTitle ? [m.originalTitle] : [])].filter(Boolean); + for (const t of m.titles) + if ((t.kind === "localized" || t.kind === "original") && !titles.includes(t.text)) titles.push(t.text); + const aliases = [ + ...new Set([ + ...m.aliases, + ...m.titles.filter((t) => t.kind === "alias" || t.kind === "translation").map((t) => t.text), + ]), + ].filter((a) => !titles.includes(a)); + const seasons = (m.seasons ?? []).filter((s) => s.seasonNumber > 0); + const seasonYears = seasons.map((s) => yearOf(s.airDate)).filter((y): y is number => y !== undefined); + return { + provider: "tmdb", + entityType: m.entityType, + externalId: m.externalId, + titles, + ...(m.year !== null ? { year: m.year } : {}), + aliases, + ...(seasonYears.length ? { seasonYears } : {}), + ...(seasons.length ? { seasonNumbers: seasons.map((s) => s.seasonNumber) } : {}), + ...(m.externalIds?.imdb ? { linkedExternalIds: [{ provider: "imdb", id: m.externalIds.imdb }] } : {}), + }; +} + +/** + * 召回输入(ID-2):中文名(含副标题补出的)在前、英文名在后,通用词不搜;剧集线索只搜 tv;年份用于挑选拉详情的候选。 + * 对照 MP _prepare_search_names(cn_name → en_name)。 + */ +export function tmdbRecallInput(parsed: ParsedRelease) { + const names = [parsed.titleCn, parsed.titleEn, parsed.title].filter( + (t): t is string => !!t && !isGenericAliasName(normalizeTitle(t)), + ); + return { + names, + ...(parsed.mediaTypeHint === "tv" ? { type: "tv" as const } : {}), + ...(parsed.year !== undefined ? { year: parsed.year } : {}), + }; +} diff --git a/apps/server/src/modules/sources-identity/tasks.ts b/apps/server/src/modules/sources-identity/tasks.ts index 7ae65dd8..6aaa9dcb 100644 --- a/apps/server/src/modules/sources-identity/tasks.ts +++ b/apps/server/src/modules/sources-identity/tasks.ts @@ -231,9 +231,15 @@ export const sourcesOutboxRoutes: Record = { }, "release.observed": (ev) => { const p = ev.payload as P; + // 标题更新(isNew=false):按新标题重新解析并重新评估,已识别的也不短路(ID-2);触发来源仍是 observed(DEC-1 不变) + const retitled = p.isNew === false; return { task: "resolveObservation", - input: { sourceReleaseId: p.sourceReleaseId, observationId: p.observationId }, + input: { + sourceReleaseId: p.sourceReleaseId, + observationId: p.observationId, + ...(retitled ? { force: true, trigger: "observed" } : {}), + }, }; }, "feed.gap_suspected": (ev) => { diff --git a/apps/server/test/sources-identity/identity-differential.lib.ts b/apps/server/test/sources-identity/identity-differential.lib.ts new file mode 100644 index 00000000..73f700bb --- /dev/null +++ b/apps/server/test/sources-identity/identity-differential.lib.ts @@ -0,0 +1,238 @@ +/** + * 身份匹配差分(ID-2):憨憨真实标题 → parseRelease → TMDB 候选召回(recallTmdbCandidates)→ resolveIdentity, + * 与 MoviePilot(MetaInfo + TheMovieDbModule 名称识别链,见 gen-identity-mp.py)逐条比对。 + * + * 数据在 packages/domain/test/differential/identity/: + * samples.json 输入标题(用户栈只读导出) + * mp.json MP 侧期望(gen-identity-mp.py 生成) + * tmdb-fixtures.json 我们侧用到的 TMDB 响应(脱敏裁剪,测试离线回放) + * deviations.json 逐条归因(mp_defect / intentional / known_gap) + * poisoned-local.json 真机误识别:含分类词别名的本地作品(回归「电视剧」别名把 15 条资源并入一部剧) + * 重新录制:identity-differential.run.ts(走本地 TMDB 缓存代理)。 + */ +import { readFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { recallTmdbCandidates, TmdbClient } from "@umt/adapters"; +import { type IdentityCandidate, type IdentityResolution, parseRelease, resolveIdentity } from "@umt/domain"; +import { localIdentityCandidate } from "@umt/mapping"; +import { tmdbRecallInput, tmdbToCandidate } from "../../src/modules/sources-identity/service/tmdb-candidate.ts"; + +export const DATA_DIR = join( + dirname(fileURLToPath(import.meta.url)), + "../../../../packages/domain/test/differential/identity", +); + +export interface Sample { + id: string; + work: string; + kind: string; + title: string; + subtitle: string | null; +} +export interface MpResult { + meta?: Record; + names?: string[]; + match: { tmdbId: number; type: "movie" | "tv"; title: string; year: number | null; by: string } | null; + error?: string; +} +export type Verdict = "consistent" | "ours_missed" | "ours_wrong" | "ours_extra"; +export interface Deviation { + kind: "mp_defect" | "intentional" | "known_gap"; + expect?: string | null; + note: string; +} +export interface Row { + id: string; + title: string; + parsed: { titleCn?: string; titleEn?: string; altTitles?: string[]; year?: number; season?: number }; + mp: string | null; + ours: string | null; + status: IdentityResolution["status"]; + reason: string; + best: string | null; + bestEvidence: string[]; + verdict: Verdict; + deviation?: Deviation; +} + +const readJson = (f: string): T => JSON.parse(readFileSync(join(DATA_DIR, f), "utf8")) as T; + +export function loadData() { + return { + samples: readJson<{ samples: Sample[] }>("samples.json").samples, + mp: readJson<{ results: Record }>("mp.json").results, + deviations: readJson<{ deviations: Record }>("deviations.json").deviations, + }; +} + +/** TMDB 请求的缓存键:路径 + 排序后的参数(去掉凭证) */ +export function fixtureKey(url: string): string { + const u = new URL(url); + const params = [...u.searchParams.entries()].filter(([k]) => k !== "api_key").sort(([a], [b]) => a.localeCompare(b)); + return `${u.pathname.replace(/^\/3/, "")}?${new URLSearchParams(params).toString()}`; +} + +const pick = (o: Record, keys: string[]) => + Object.fromEntries(keys.filter((k) => o[k] !== undefined && o[k] !== null).map((k) => [k, o[k]])); +const BRIEF = [ + "id", + "media_type", + "title", + "name", + "original_title", + "original_name", + "original_language", + "release_date", + "first_air_date", + "popularity", + "origin_country", +]; + +/** 只留识别用到的字段(标题、日期、别名、译名标题、外部 ID、季列表) */ +export function trimTmdb(body: unknown): unknown { + const b = body as Record; + if (Array.isArray(b.results)) { + return { results: (b.results as Record[]).map((r) => pick(r, BRIEF)) }; + } + const out = pick(b, BRIEF); + const alt = b.alternative_titles as Record | undefined; + if (alt) { + const list = (alt.titles ?? alt.results ?? []) as Record[]; + out.alternative_titles = { [alt.titles ? "titles" : "results"]: list.map((a) => pick(a, ["title", "iso_3166_1"])) }; + } + const tr = (b.translations as { translations?: Record[] } | undefined)?.translations; + if (tr) { + out.translations = { + translations: tr + .map((t) => ({ + iso_639_1: t.iso_639_1, + iso_3166_1: t.iso_3166_1, + data: pick((t.data ?? {}) as Record, ["title", "name"]), + })) + .filter((t) => Object.keys(t.data).length), + }; + } + const ext = b.external_ids as Record | undefined; + if (ext) out.external_ids = pick(ext, ["imdb_id", "tvdb_id"]); + if (Array.isArray(b.seasons)) + out.seasons = (b.seasons as Record[]).map((s) => + pick(s, ["season_number", "air_date", "episode_count", "name"]), + ); + return out; +} + +/** 离线回放:按键取录制的响应;没录到的请求直接报错(说明召回逻辑变了,需要重新录制) */ +export function fixtureFetch(fixtures: Record): typeof fetch { + return (async (input: string | URL | Request) => { + const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url; + const key = fixtureKey(url); + if (!(key in fixtures)) throw new Error(`TMDB 回放缺少请求 ${key}(召回逻辑变化,需重新录制)`); + const body = fixtures[key] as { __status?: number }; + const status = body.__status ?? 200; + return new Response(JSON.stringify(status === 200 ? body : { status_message: "not found" }), { + status, + headers: { "content-type": "application/json" }, + }); + }) as typeof fetch; +} + +export function tmdbFor(fetchImpl: typeof fetch, baseUrl = "http://tmdb.fixture/3"): TmdbClient { + return new TmdbClient({ apiKey: "x", baseUrl, fetch: fetchImpl, retries: 0 }); +} + +const keyOf = (c: { entityType: string; externalId: string } | undefined) => + c ? `${c.entityType}:${c.externalId}` : null; + +/** 单条:解析 → 召回 → 打分(local = 额外的本地候选,例如真机误识别场景) */ +export async function resolveSample(tmdb: TmdbClient, s: Sample, local: IdentityCandidate[] = []) { + const parsed = parseRelease(s.title, s.subtitle ? { subtitle: s.subtitle } : {}); + const remote = await recallTmdbCandidates(tmdb, tmdbRecallInput(parsed)); + const resolution = resolveIdentity(parsed, [...local, ...remote.map(tmdbToCandidate)]); + return { parsed, resolution }; +} + +export async function runDifferential(tmdb: TmdbClient): Promise { + const { samples, mp, deviations } = loadData(); + const rows: Row[] = []; + for (const s of samples) { + const { parsed, resolution } = await resolveSample(tmdb, s); + const m = mp[s.id]?.match ?? null; + const mpKey = m ? `${m.type}:${m.tmdbId}` : null; + const best = resolution.best?.candidate; + const ours = resolution.status === "auto" ? keyOf(best) : null; + const verdict: Verdict = + mpKey === ours ? "consistent" : !ours ? "ours_missed" : !mpKey ? "ours_extra" : "ours_wrong"; + rows.push({ + id: s.id, + title: s.title, + parsed: { + ...(parsed.titleCn ? { titleCn: parsed.titleCn } : {}), + ...(parsed.titleEn ? { titleEn: parsed.titleEn } : {}), + ...(parsed.altTitles ? { altTitles: parsed.altTitles } : {}), + ...(parsed.year !== undefined ? { year: parsed.year } : {}), + ...(parsed.season !== undefined ? { season: parsed.season } : {}), + }, + mp: mpKey, + ours, + status: resolution.status, + reason: resolution.reason, + best: best ? `${keyOf(best)} ${best.titles[0] ?? ""} ${best.year ?? ""}`.trim() : null, + bestEvidence: resolution.best ? [`level:${resolution.best.level}`, ...resolution.best.evidence] : [], + verdict, + ...(deviations[s.id] ? { deviation: deviations[s.id] } : {}), + }); + } + return rows; +} + +/** 汇总:非故意偏离项的一致率(MP 缺陷且我们正确的计为一致) */ +export function summarize(rows: Row[]) { + const scored = rows.filter((r) => r.deviation?.kind !== "intentional"); + const ok = scored.filter( + (r) => r.verdict === "consistent" || (r.deviation?.kind === "mp_defect" && r.ours === (r.deviation.expect ?? null)), + ); + const count = (v: Verdict) => rows.filter((r) => r.verdict === v).length; + return { + samples: rows.length, + works: new Set(loadData().samples.map((s) => s.work)).size, + consistent: count("consistent"), + oursMissed: count("ours_missed"), + oursWrong: count("ours_wrong"), + oursExtra: count("ours_extra"), + intentional: rows.length - scored.length, + mpDefect: rows.filter((r) => r.deviation?.kind === "mp_defect").length, + rate: scored.length ? ok.length / scored.length : 1, + }; +} + +export interface PoisonedCase { + title: string; + subtitle: string | null; + /** 正确的 TMDB 身份 type:id,或 not_local = 不得自动并入被污染的本地作品 */ + expect: string; +} + +/** 真机误识别回归:带「电视剧」等错误站点别名的本地作品 + 被误并入的资源,重新识别的结果 */ +export async function runPoisoned(tmdb: TmdbClient) { + const d = readJson<{ + entity: { id: string; kind: "series"; title: string; originalTitle: string; year: number }; + aliases: string[]; + identities: { provider: string; externalId: string; status: "accepted" }[]; + cases: PoisonedCase[]; + }>("poisoned-local.json"); + const local = localIdentityCandidate(d.entity, d.aliases, d.identities)!; + const out: { c: PoisonedCase; status: string; best: string | null; local: boolean; ok: boolean }[] = []; + for (const c of d.cases) { + const s: Sample = { id: "poisoned", work: "", kind: "", title: c.title, subtitle: c.subtitle }; + const { resolution } = await resolveSample(tmdb, s, [local]); + const best = resolution.best?.candidate; + const auto = resolution.status === "auto"; + // 本地作品已映射 tmdb:312027:自动并入本地作品等价于识别为该 TMDB 身份 + const key = !auto || !best ? null : best.provider === "local" ? "local" : keyOf(best); + const effective = key === "local" ? "tv:312027" : key; + const ok = c.expect === "not_local" ? key !== "local" : effective === c.expect; + out.push({ c, status: resolution.status, best: key, local: key === "local", ok }); + } + return out; +} diff --git a/apps/server/test/sources-identity/identity-differential.run.ts b/apps/server/test/sources-identity/identity-differential.run.ts new file mode 100644 index 00000000..72d48eb4 --- /dev/null +++ b/apps/server/test/sources-identity/identity-differential.run.ts @@ -0,0 +1,52 @@ +/** + * 重新录制身份匹配差分(ID-2):我们侧的 TMDB 请求走本地缓存代理(scratchpad tmdb_proxy.py,上行计数封顶), + * 录下的响应裁剪后写入 tmdb-fixtures.json,逐条结果写入 ours.json 并打印汇总。 + * + * TMDB_PROXY=http://127.0.0.1:18731 deno run -A apps/server/test/sources-identity/identity-differential.run.ts + */ +import { writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { + DATA_DIR, + fixtureKey, + runDifferential, + runPoisoned, + summarize, + tmdbFor, + trimTmdb, +} from "./identity-differential.lib.ts"; + +const proxy = Deno.env.get("TMDB_PROXY") ?? "http://127.0.0.1:18731"; +const fixtures: Record = {}; +const recording: typeof fetch = async (input, init) => { + const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url; + const res = await fetch(url, init); + const body = await res.clone().json(); + // 录制时代理离线未命中的详情按 404 记下(回放同样走"取不到详情"分支) + fixtures[fixtureKey(url)] = res.ok ? trimTmdb(body) : { __status: res.status }; + return res; +}; +const tmdb = tmdbFor(recording, `${proxy}/3`); +const rows = await runDifferential(tmdb); +const poisoned = await runPoisoned(tmdb); +for (const p of poisoned) if (!p.ok) console.log("POISONED FAIL", p.c.title.slice(0, 60), p.status, p.best); +console.log("poisoned", poisoned.filter((p) => p.ok).length, "/", poisoned.length); +const sorted = Object.fromEntries(Object.entries(fixtures).sort(([a], [b]) => a.localeCompare(b))); +writeFileSync(join(DATA_DIR, "tmdb-fixtures.json"), `${JSON.stringify(sorted)}\n`); +writeFileSync(join(DATA_DIR, "ours.json"), `${JSON.stringify({ summary: summarize(rows), rows }, null, 1)}\n`); +for (const r of rows) + if (r.verdict !== "consistent") + console.log( + r.id, + r.verdict, + r.deviation?.kind ?? "", + "| mp", + r.mp, + "| ours", + r.status, + r.best, + r.bestEvidence.join(","), + "|", + r.title.slice(0, 50), + ); +console.log(summarize(rows)); diff --git a/apps/server/test/sources-identity/identity-differential.test.ts b/apps/server/test/sources-identity/identity-differential.test.ts new file mode 100644 index 00000000..6ccbe8a9 --- /dev/null +++ b/apps/server/test/sources-identity/identity-differential.test.ts @@ -0,0 +1,65 @@ +/** + * 身份匹配差分回归(ID-2):憨憨真实标题,MP 期望(mp.json)vs 我们(parse → 召回 → resolveIdentity), + * TMDB 响应离线回放(tmdb-fixtures.json)。说明见 identity-differential.lib.ts 与 + * docs/porting/moviepilot-identity-match.md。 + */ +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import { describe, expect, it } from "vitest"; +import { + DATA_DIR, + fixtureFetch, + loadData, + runDifferential, + runPoisoned, + summarize, + tmdbFor, +} from "./identity-differential.lib.ts"; + +const fixtures = JSON.parse(readFileSync(join(DATA_DIR, "tmdb-fixtures.json"), "utf8")) as Record; +const tmdb = () => tmdbFor(fixtureFetch(fixtures)); + +describe("身份匹配差分(MP recognize ↔ resolveIdentity)", async () => { + const rows = await runDifferential(tmdb()); + const byId = new Map(rows.map((r) => [r.id, r])); + const { samples, deviations } = loadData(); + + it("样本 ≥ 100 条,覆盖「英文 [中文]」RSS、动漫、续作、通用词、短剧", () => { + expect(samples.length).toBeGreaterThanOrEqual(100); + const kinds = new Set(samples.map((s) => s.kind)); + for (const k of ["rss_bracket", "title_subtitle", "short_drama"]) expect(kinds.has(k), k).toBe(true); + }); + + it("非故意偏离项一致率 ≥ 95%", () => { + expect(summarize(rows).rate).toBeGreaterThanOrEqual(0.95); + }); + + it("登记的偏离都对应存在的样本,且 mp_defect 的结果与登记一致", () => { + for (const [id, d] of Object.entries(deviations)) { + const r = byId.get(id); + expect(r, id).toBeDefined(); + if (d.kind === "mp_defect") expect(r!.ours, id).toBe(d.expect ?? null); + } + }); + + it("未登记的样本全部与 MP 一致(新增不一致需要归因后登记)", () => { + const unexplained = rows.filter((r) => r.verdict !== "consistent" && !r.deviation).map((r) => `${r.id} ${r.title}`); + expect(unexplained).toEqual([]); + }); + + it("brief 三类:方括号中文名(武神主宰)、续作章节(物怪第三章)、通用词 + 副标题中文名(档案)", () => { + for (const r of rows.filter((x) => x.title.includes("Martial Master"))) expect(r.ours, r.id).toBe("tv:110181"); + for (const r of rows.filter((x) => x.title.startsWith("Mononoke The Movie Chapter III"))) + expect(r.ours, r.id).toBe("movie:1322562"); + for (const r of rows.filter((x) => x.title.startsWith("Archives S01 2009"))) expect(r.ours, r.id).toBe("tv:201401"); + }); +}); + +describe("真机误识别回归:分类词别名污染的本地作品", async () => { + const results = await runPoisoned(tmdb()); + it("被误并入《东北有个周东北》的资源重新识别到各自的作品,只有英文名时也不并入", () => { + expect(results.length).toBeGreaterThanOrEqual(15); + const bad = results.filter((r) => !r.ok).map((r) => `${r.c.title} → ${r.status} ${r.best}`); + expect(bad).toEqual([]); + }); +}); diff --git a/apps/server/test/sources-identity/resolve.test.ts b/apps/server/test/sources-identity/resolve.test.ts index 88add63d..00b31fb3 100644 --- a/apps/server/test/sources-identity/resolve.test.ts +++ b/apps/server/test/sources-identity/resolve.test.ts @@ -1,5 +1,6 @@ import { CapabilityRegistry } from "@umt/agent"; import { sql } from "@umt/db"; +import { PARSER_VERSION } from "@umt/domain"; import { createMockTmdb, type MockTmdb, TMDB_FIXTURES, type TmdbFixture } from "@umt/testkit"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; import { refreshMetadata } from "../../src/modules/sources-identity/service/metadata.ts"; @@ -82,7 +83,11 @@ describe.skipIf(!up)("resolveObservation / 身份与元数据", () => { const created = await h.db.selectFrom("media_entity").selectAll().where("id", "=", oppId).executeTakeFirstOrThrow(); expect((created.metadata as Record).overview?.source).toBe("tmdb"); const rel = await h.db.selectFrom("source_release").selectAll().where("id", "=", r.id).executeTakeFirstOrThrow(); - expect(rel).toMatchObject({ resolution_status: "resolved", media_entity_id: oppId, parser_version: "1" }); + expect(rel).toMatchObject({ + resolution_status: "resolved", + media_entity_id: oppId, + parser_version: String(PARSER_VERSION), + }); expect((rel.parsed as { year: number }).year).toBe(2023); const ev = (await h.outbox("release.resolved")).find((x) => x.payload.sourceReleaseId === r.id); expect(ev?.payload).toMatchObject({ mediaEntityId: oppId, evidenceLevel: "rule_confirmed", contentUnitIds: [] }); diff --git a/apps/server/test/sources-identity/retitle.test.ts b/apps/server/test/sources-identity/retitle.test.ts new file mode 100644 index 00000000..eb2f80ac --- /dev/null +++ b/apps/server/test/sources-identity/retitle.test.ts @@ -0,0 +1,75 @@ +/** + * ID-2:站点资源标题更新(RSS 带分类前缀 / 内嵌描述的标题 → 列表标题)后按新标题重新解析并重新识别, + * 不沿用旧解析;已识别的资源也不短路。 + */ +import type { SiteRelease } from "@umt/adapters"; +import { PARSER_VERSION } from "@umt/domain"; +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { upsertSiteRelease } from "../../src/modules/sources-identity/service/snapshot.ts"; +import { sourcesOutboxRoutes } from "../../src/modules/sources-identity/tasks.ts"; +import { createHarness, type Harness, pgAvailable, seedSite } from "./harness.ts"; + +const up = await pgAvailable(); + +const rel = (title: string, subtitle?: string): SiteRelease => ({ + siteId: "x", + siteReleaseId: "9001", + title, + ...(subtitle ? { subtitle } : {}), + category: { id: "402", name: "剧集" }, + sizeBytes: null, + seeders: null, + leechers: null, + snatched: null, + promotion: { type: "none", downloadFactor: 1, uploadFactor: 1, expiresAt: null } as SiteRelease["promotion"], + hr: false, + uploadedAt: null, + detailUrl: "https://hhan.example/details.php?id=9001", + tags: [], + raw: {}, + observedAt: new Date().toISOString(), +}); + +describe.skipIf(!up)("标题更新后重新解析 + 重新识别", () => { + let h: Harness; + let siteId: string; + beforeAll(async () => { + h = await createHarness("retitle"); + siteId = (await seedSite(h, { baseUrl: "https://hhan.example/" })).site.id; + }); + afterAll(async () => { + await h?.close(); + }); + + it("RSS 标题 → 列表标题:parsed 按新标题重算,发 release.observed(isNew=false)并强制重新识别", async () => { + const rss = + "[电视剧]Irreplaceable S01 2026 1080p YK WEB-DL H.264 DTS5.1-HHWEB[无可替代 | 第03集 | 1080p | 类型: 剧情][510.37 MB]"; + const first = await h.db.transaction().execute((trx) => upsertSiteRelease(h.rt, trx, { id: siteId }, rel(rss))); + expect(first.inserted).toBe(true); + let row = await h.db.selectFrom("source_release").selectAll().where("id", "=", first.id).executeTakeFirstOrThrow(); + // 分类前缀不进片名;内嵌描述里的中文名补作中文名 + expect(row.parsed).toMatchObject({ titleCn: "无可替代", titleEn: "Irreplaceable", category: "电视剧" }); + + const listTitle = "Irreplaceable S01 2026 1080p YK WEB-DL H.264 DTS5.1-HHWEB"; + const again = await h.db + .transaction() + .execute((trx) => upsertSiteRelease(h.rt, trx, { id: siteId }, rel(listTitle, "无可替代 | 第04集 | 1080p"))); + expect(again).toEqual({ id: first.id, inserted: false }); + row = await h.db.selectFrom("source_release").selectAll().where("id", "=", first.id).executeTakeFirstOrThrow(); + expect(row.title).toBe(listTitle); + expect(row.parser_version).toBe(String(PARSER_VERSION)); + expect(row.parsed).toMatchObject({ titleCn: "无可替代", episodes: { start: 4, end: 4 } }); + + const events = (await h.outbox("release.observed")).filter((e) => e.payload.sourceReleaseId === first.id); + expect(events.map((e) => e.payload.isNew)).toEqual([true, false]); + const route = sourcesOutboxRoutes["release.observed"]!({ payload: events[1]!.payload } as never); + expect(route).toMatchObject({ task: "resolveObservation", input: { force: true, trigger: "observed" } }); + + // 同标题再次快照:不再发重新识别 + await h.db + .transaction() + .execute((trx) => upsertSiteRelease(h.rt, trx, { id: siteId }, rel(listTitle, "无可替代 | 第04集 | 1080p"))); + const after = (await h.outbox("release.observed")).filter((e) => e.payload.sourceReleaseId === first.id); + expect(after).toHaveLength(2); + }); +}); diff --git a/apps/server/vitest.config.ts b/apps/server/vitest.config.ts index d06077e4..51b93d72 100644 --- a/apps/server/vitest.config.ts +++ b/apps/server/vitest.config.ts @@ -10,6 +10,7 @@ const UNIT = [ "test/api-registry.test.ts", "test/auth.test.ts", "test/health.test.ts", + "test/sources-identity/identity-differential.test.ts", "test/invoke-limits.test.ts", "test/logger.test.ts", "test/mapping-compat.test.ts", diff --git a/docs/porting/moviepilot-identity-match.md b/docs/porting/moviepilot-identity-match.md new file mode 100644 index 00000000..97eb7e42 --- /dev/null +++ b/docs/porting/moviepilot-identity-match.md @@ -0,0 +1,107 @@ +# MoviePilot 身份匹配(TMDB 识别)对照与差分(ID-2) + +> 只记录上游行为与本项目的取舍,不复制上游源码。上游快照与许可见 `moviepilot-metadata-recognition.md` §0(`e6820a8`,GPLv3)。 +> 标题解析(MetaInfo ↔ parseRelease)的字段级差分见 `moviepilot-metadata-recognition.md` 与 `packages/domain/test/differential/meta-*`;本文只管"解析结果 → 哪个 TMDB 条目"。 + +## 1. 结论 + +| 项 | 值 | +| --- | --- | +| 差分集 | 憨憨真实标题 113 条(50 部作品):主标题 + 副标题 77 条,RSS「`[分类]英文名 … -GRP[中文名 / … \| 第N集 \| …][体积]`」21 条,短剧 15 条;同一标题只留一条 | +| MP 侧 | 99 条命中 TMDB,14 条无结果(短剧) | +| 修前(`c3aaf90`) | 100 / 113 与 MP 一致(88.5%);13 条不一致全是我们漏:RSS 分类前缀被当成中文名(武神主宰 / 三角洲 / 掌门低调点 6 条)、副标题中文名不参与(档案、猪猪侠 5 条)、中英名各命中一部(A Prophet)、英文名只在 TMDB 别名里而旧链路不取详情(China Now) | +| 修后 | 112 / 113 一致;剩 1 条是 MP 误识别(短剧《人中之龙第一季》被 MP 按译名配到《如龙》2024),我们不自动绑定。非故意偏离项一致率 100%(MP 缺陷且我们正确的计为一致) | +| 真机误识别回归 | 用户栈里被「电视剧」别名并入《东北有个周东北》的资源(32 条标题 / 副标题组合,含只有英文名的变体)全部识别回各自作品或不并入 | +| TMDB 请求 | 上行 191 次(预算 200),全部经本地缓存代理;测试离线回放 `tmdb-fixtures.json` | + +## 2. MP 的识别链(按实际调用顺序) + +1. `MetaInfo(title, subtitle)`:副标题**只取季集**(`init_subtitle`),不取片名。RSS 标题里内嵌的描述方括号整体丢弃;开头的分类方括号 `[动漫]` 被 `_prepare_meta_input` 去掉。所以憨憨标题在 MP 里只有英文名。 +2. `TheMovieDbModule._prepare_search_names`:`[cn_name, 简体 cn_name, en_name]` 去重,逐个名称识别,首个命中即停。 +3. `_build_match_plan`(`app/modules/themoviedb/__init__.py`): + - 剧集:`match(name, year, tv, season_year=year, season_number)`,再退到无年份; + - 其他:电影 + 年份 → 剧集 + 年份 → `match_multi`(无类型无年份时直接 multi)。 +4. `TmdbApi.match`(`tmdbapi.py`):季年份步骤优先(`__search_tv_by_season`:首播年 = 季年份,或详情里该季 air_date 年份 = 季年份),再按年份 `[y, y+1, y-1]` 逐个搜;每次搜索结果按日期降序、按年份过滤后,**标题 / 原标题规范化后完全相等**即命中;否则**逐个拉详情**用别名 + 各语言译名(`__get_names`)比对,首个相等即命中。 +5. `match_multi`:电影在前、日期降序,同样先标题后别名。 + +特点:没有"证据强弱",第一个名称相等的候选就是答案;中英名只按顺序尝试,不会互相佐证;通用词(`Archives`)与续作序号没有特别处理,靠年份过滤和"第一个"兜底。 + +## 3. 我们的链路(修后) + +`parseRelease` → `recallTmdbCandidates`(`packages/adapters/src/tmdb/recall.ts`)→ `tmdbToCandidate`(`sources-identity/service/tmdb-candidate.ts`)→ `resolveIdentity`(`packages/domain/src/identity/match.ts`)。DEC-1 的触发(何时查 TMDB)与池 / 合并事项逻辑没改。 + +| 环节 | MP | 我们 | 性质 | +| --- | --- | --- | --- | +| 分类前缀 `[电视剧]` `[音乐]` … | 去掉 | 去掉,记为 `parsed.category`(词表:电影 / 电视剧 / 动漫 / 综艺 / 纪录片 / 音乐 / 短剧 / 体育 / 游戏 / 软件 / 学习 / 其他) | 修复(修前当成中文名) | +| RSS 内嵌描述 `-GRP[中文名 / … \| 第N集 \| …][体积]` | 丢弃 | 拆出来当副标题用(补中文名、别名、季集) | 增强 | +| 副标题片名 | 不取 | 第一段按 `/` 拆:主标题无中文名时第一个中文名作 `titleCn`(去季号后缀),其余进 `altTitles`;字幕 / 音轨 / 简介字段不算 | 增强(元数据差分登记为 intentional) | +| `Travis - 12 Memories` | — | `- 12` 后紧跟普通单词时不是集号 | 修复 | +| 搜索名称 | cn → 简体 cn → en,逐个短路 | cn → en,两个都搜,候选合成一个池;通用词(分类词 / 单字 / 停用词)不搜 | 故意偏离:收集后打分,同名多候选进池而不是取第一个 | +| 搜索语言 | `TMDB_LOCALE` 单语言 | 首选语言单语言(`searchRaw`) | 对齐(修前是 zh-CN + en-US 各搜一遍) | +| 类型 | 剧集线索只搜 tv;否则 movie → tv → multi | 剧集线索只搜 tv;否则 movie + tv | 对齐 | +| 别名回退 | 标题对不上时对**全部**候选逐个拉详情 | 年份相容的候选按年份相近度取前 3 个拉详情,直接命中的前 2 个也拉(看另一种文字的名称能否佐证);详情失败保留搜索结果 | 故意偏离:限次 | +| 标题 vs 别名 | 同等对待 | 主标题 / 原标题 / 其他语言本地化标题 = exact;alternative_titles + translations + 副标题别名 = alias | 故意偏离:别名证据弱一级 | +| 年份 | 年份过滤 `[y, y+1, y-1]`,季年份优先 | 精确 / 季首播年 / ±1 / 未知 / 不符(不符直接拒绝) | 对齐 | +| 续作 / 章节 | 无 | `Chapter III`、`Part Two`、`第3章`、`Ⅲ` 解析成序号,候选名里有序号且不一致 → 拒绝,一致 → 加分 | 增强 | +| 季号 | 只用于季年份 | 明写的季号不在候选(取了详情)的季列表里 → 扣分 | 增强 | +| 通用词 | 无 | 单个英文词只靠别名命中、且池里 ≥3 个候选名称含该词(`Archives`)→ 封顶待确认;中文名命中则不受影响 | 增强 | +| 别名佐证 | 无 | 只靠别名命中时需要年份相容或第二种文字的名称也命中,否则封顶待确认 | 增强(`人中之龙` → 《如龙》即此类) | +| 多候选 | 取第一个 | 同等级时:年份精确优先 → 命中的名称文字种数(中文 / 拉丁)→ 分值;严格占优才自动确认,完全对称进池 | 故意偏离 | + +### 3.1 评分权重表(`DEFAULT_MATCH_WEIGHTS`,可由 `MatchOptions.weights` 覆盖) + +| 证据 | 分值 | +| --- | --- | +| 标题 exact / alias / partial / none | 4 / 3 / 1 / 0 | +| 年份 exact / season_year / ±1 / 未知 | 3 / 3 / 2 / 0(不符直接拒绝) | +| 年份未知但明写季号且类型一致 | +2 | +| 第二种文字的名称也命中 | +1 | +| 续作序号一致 | +1(冲突直接拒绝) | +| 明写季号不在候选季列表 | −3 | +| 定级阈值 | ≥7 rule_confirmed,≥5 multi_evidence,≥1 needs_confirm | + +硬规则优先于分值:年份不符 / 续作冲突 / 标题无关 → 拒绝;部分包含、通用词只靠别名、别名缺佐证、类型冲突 → 封顶 needs_confirm;显式 ID 提升一级。默认值下 v0.1 的判定不变(`identity.test.ts` 原样通过)。分值不是概率,只用于定级和同级排序。 + +## 4. 差分方法 + +- 样本:`packages/domain/test/differential/identity/samples.json`,2026-09-29 从用户栈 `source_release`(憨憨)只读导出,同标题去重;非短剧全收(98 条 / 35 部),短剧取前 15 部。 +- MP 侧:`gen-identity-mp.py`(MP 仓库 `.venv`,`MetaInfo` 未注入 Rust 加速器,走 Python 参考实现;名称识别直接调 `TheMovieDbModule._prepare_search_names` + `_search_by_name`,不含识别缓存、插件辅助识别与详情补全),结果 `mp.json`。 +- 我们侧:`apps/server/test/sources-identity/identity-differential.lib.ts`(与生产同一组函数),`identity-differential.run.ts` 录制,结果 `ours.json`。 +- TMDB:两侧都经本地缓存代理(会话临时目录,不入库):同一请求只上行一次;搜索结果集与 `language` 无关,所以 zh-CN 为空时其他语言直接判空;带年份的搜索先取无年份结果,总数 ≤20 时按日期年份本地过滤;上行计数封顶。上行 191 次后改为离线,离线未命中的 13 个详情请求按"取不到详情"处理(录进 fixture 为 404,回放同样走这条分支)。 +- 修前基线:在 `c3aaf90` 的工作树里用旧链路(`searchAll` 双语言、旧打分)跑同一批样本。基线需要的 en-US 搜索由代理从 zh-CN 结果 + 已缓存详情的英文译名合成,48 个未缓存请求按空结果近似——基线数字是近似值,修后数字是实测回放。 +- 归因:`deviations.json`(`mp_defect` / `intentional` / `known_gap`);测试要求未登记的样本全部与 MP 一致。 +- 回归测试:`identity-differential.test.ts`(unit 组,不连 PG、不连 TMDB),含 brief 三类案例与真机误识别场景(`poisoned-local.json`)。 + +重新录制: + +```sh +# 1. 起缓存代理(TMDB key 只从 .local/admin-credentials 读),见会话记录;然后 +cd /opt/moviepilot-plus/upstream/MoviePilot && PYTHONPATH=. TMDB_PROXY=http://127.0.0.1:18731 \ + .venv/bin/python /opt/uhd_media_tool/packages/domain/test/differential/identity/gen-identity-mp.py +TMDB_PROXY=http://127.0.0.1:18731 deno run -A apps/server/test/sources-identity/identity-differential.run.ts +``` + +## 5. brief 三类案例 + +| 案例 | 修前 | 修后 | +| --- | --- | --- | +| `[动漫]Martial Master S01 2020 …[武神主宰 / … ]`(3 条) | 分类词「动漫」当中文名,英文名在 zh-CN 结果里对不上 → 无匹配 | 中文名 武神主宰 精确 + 2020 精确 → rule_confirmed,2023 的同名剧年份不符被拒 → 自动确认 tv:110181 | +| `Mononoke The Movie Chapter III … 2026` | 生产里判歧义 | 候选 1322562 的英文译名精确 + 年份精确 + 第 3 章序号一致 → 自动确认;第 1 / 2 章若在池里按序号冲突拒绝 | +| `Archives S01 2009`(副标题 `档案 / 档案解密`) | 只有英文名,部分包含 → 待确认 | 中文名 档案 精确 + 2009 → 自动确认 tv:201401;没有副标题时 `Archives` 只靠别名且池里撞名 → 待确认 | + +## 6. 真机误识别(2026-09-29,用户栈) + +憨憨 RSS 标题带分类前缀,修前解析器把「电视剧」当中文名;第一条这样的资源经本地别名命中《东北有个周东北》后,`bindAuto` 把「电视剧」和各资源的英文名(`Irreplaceable`、`Spark of the Long March`、`A Prophet`、`Spring of the Blade`)都登记成站点别名,后续资源再经这些别名以"别名 + 年份精确"自动并入,链式扩散。修复: + +1. 解析:分类前缀识别为 `category`,不进片名。 +2. 比对:通用词(分类词 / 单字 / ≤2 个拉丁字符 / 纯数字 / 停用词)不作为查询名,也不作为候选别名参与比对;只靠别名命中需要年份相容或第二种文字的名称佐证。 +3. 登记:自动绑定只在标题精确命中(或别名命中且有第二种文字佐证)时登记站点别名,通用词不登记。 +4. 标题更新:快照 upsert 在标题 / 副标题变化时重算 `parsed` 并发 `release.observed(isNew=false)`;Feed 标题修正同样;路由对 `isNew=false` 带 `force` 重新识别(触发来源仍是 observed,DEC-1 不变),重新识别后不能确认的撤销原自动绑定。 +5. 存量:`scripts/identity-reevaluate.ts --rollback-wrong`(见 `docs/runbook/identity.md`)。在用户库副本上演练:解除 23 条误并入、删除 7 个站点别名(「电视剧」「动漫」「综艺」与 4 个链式英文名),资源退回池并排入立即复查。 + +## 7. 已知差距 + +- 别名回退限次(前 3 + 直接命中前 2):MP 会把全部候选的详情拉一遍。候选多且目标排得靠后时,我们可能拿不到别名证据而进池(不会误绑)。 +- 同名多候选我们进池,MP 取日期最新的一个:MP 在这类场景"答对"时算我们漏。本批样本未出现。 +- 剧集组(episode group)季年份未迁移(同 `match.ts` 头注释)。 +- 副标题片名只取第一段;第一段是简介句子的站点(非憨憨格式)会被 `cnTitleFromSubtitle` 的长度 / 空白 / 句读守卫挡掉,但守卫是启发式。 diff --git a/docs/runbook/identity.md b/docs/runbook/identity.md index 495bfc2a..f6888dce 100644 --- a/docs/runbook/identity.md +++ b/docs/runbook/identity.md @@ -22,7 +22,13 @@ | `new_title_rule` | 有已发布、开启 `newTitle` 且有有效持续授权的获取策略,资源类型在规则的 `mediaKinds` 内,标题年份(若有)不早于窗口能覆盖的年份 | 都不满足:只进池,`reason = unmatched`,不查 TMDB,不开待处理。 -3. 查了 TMDB 的,走原来的 `domain.resolveIdentity`:auto 建档 / 关联并发 `release.resolved`;否则进池。 +3. 查了 TMDB 的,召回 TMDB 候选(`recallTmdbCandidates`:中文名 → 英文名,按类型单语言搜索,标题对不上的按年份相近度拉前几个详情比对别名 / 译名), + 交给 `domain.resolveIdentity` 打分:auto 建档 / 关联并发 `release.resolved`;否则进池。打分规则与 MP 的对照见 + `docs/porting/moviepilot-identity-match.md`(ID-2)。 +4. 自动绑定时把站点标题登记为作品别名,只在标题精确命中(或别名命中且另一种文字的名称也命中)时登记,分类词 / 单字 / 停用词不登记。 + +标题更新(RSS 标题与列表标题不同、站点改标题):按新标题重新解析,发 `release.observed(isNew=false)`,以 `force` 重新识别 +(已识别的也不短路,触发来源仍是 observed);重新识别不能确认时撤销原自动绑定、进池。人工锁定的不动。 任务输入 `trigger` 缺省:`force` 为 true 视为 `review`(池复查),否则 `observed`。 搜索模块想让搜索结果直接识别,入队 `resolveObservation` 时传 `trigger: "search"`(目前搜索结果经 `release.observed` 进来, @@ -75,6 +81,24 @@ 需要重建镜像 / 重启 api + worker 才生效(迁移随启动执行)。 +## 规则更新后的存量重评(ID-2,`scripts/identity-reevaluate.ts`) + +匹配规则更新(新镜像已部署、api + worker 已重启)后,用这个脚本处理存量。缺省只读,加 `--apply` 才改库;DATABASE_URL 必须显式给出。 + +```sh +# 用户栈的 PG 不对宿主暴露端口:取容器 IP,密码取栈的 .env +PGIP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' umt-postgres-1) +DATABASE_URL=postgres://umt:<密码>@$PGIP:5432/umt deno run -A scripts/identity-reevaluate.ts --rollback-wrong # 先看清单 +DATABASE_URL=postgres://umt:<密码>@$PGIP:5432/umt deno run -A scripts/identity-reevaluate.ts --rollback-wrong --apply # 确认后执行 +``` + +- 待识别事项:列出 open 的 `identity_ambiguous` 成员,按新解析规则给出预估(只用池里存的候选,不查 TMDB);`--apply` 把这些池条目排入立即复查, + 由运行中的服务按新规则重新识别——能自动确认的绑定作品、建映射,并从合并事项摘除(组空即关闭)。 +- `--rollback-wrong`:找站点来源的分类词 / 通用词别名(例如「电视剧」),对挂着它的作品用新解析 + 作品自身名称(主标题 / 原标题 / 非站点来源别名) + 核对已绑定资源;对不上的解除绑定、退回池(`reason = no_match`,立即复查),删除该别名和由误并入资源登记的站点别名,各记一条 + `resolution_attempt(outcome = manual, reason = rollback_wrong_alias)`。内容单元不删,只报告无资源引用的数量;引用了这些资源的其他表只报告。 +- 2026-09-29 用户库副本演练:《东北有个周东北》29 条绑定里 23 条误并入,删除 7 个站点别名(「电视剧」「动漫」「综艺」与 4 个链式英文名)。 + ## 排查 ```sql @@ -86,6 +110,9 @@ select resolution_status, resolution_evidence->>'lookup' as lookup, resolution_e -- 某个合并事项的成员 select p.source_release_id, r.title, p.reason from identity_candidate p join source_release r on r.id = p.source_release_id where p.decision_id = '' and p.status = 'pending'; +-- 站点来源的可疑别名(分类词等) +select e.title, a.alias, a.created_at from title_alias a join media_entity e on e.id = a.media_entity_id + where a.source = 'site' and a.normalized in ('电视剧', '动漫', '综艺', '电影', '纪录片', '音乐', '短剧'); -- 迁移搬走的事项 select count(*) from decision where resolution->>'resolution' = 'moved_to_pool'; ``` diff --git a/packages/adapters/src/tmdb/README.md b/packages/adapters/src/tmdb/README.md index 9fb7ebc5..22919407 100644 --- a/packages/adapters/src/tmdb/README.md +++ b/packages/adapters/src/tmdb/README.md @@ -1,5 +1,5 @@ # tmdb -TMDB v3 查询:多语言搜索(默认 zh-CN + en-US,按 ID 合并标题)、`searchMulti`、详情(别名 alternative_titles、译名 translations、外部 ID、季列表)、季集列表;内存 LRU + TTL 缓存(默认 1024 条/24h,空结果 30min)与并发合并,并发/间隔限流,429 按 Retry-After 退避。输出归一化候选 `MetadataCandidate`(provider `tmdb`,entityType,externalId,titles,year,aliases,seasons?)。`matchTmdb`/`matchTmdbMulti` 迁移 MoviePilot 的匹配链(名称规范化后完全相等、年份 ±1、季年份优先、别名/译名回退)。错误为 `TmdbError`(auth/network/timeout/notfound/rate/protocol),不会把查询失败当成无结果。 +TMDB v3 查询:多语言搜索(默认 zh-CN + en-US,按 ID 合并标题)、`searchMulti`、详情(别名 alternative_titles、译名 translations、外部 ID、季列表)、季集列表;内存 LRU + TTL 缓存(默认 1024 条/24h,空结果 30min)与并发合并,并发/间隔限流,429 按 Retry-After 退避。输出归一化候选 `MetadataCandidate`(provider `tmdb`,entityType,externalId,titles,year,aliases,seasons?)。`matchTmdb`/`matchTmdbMulti` 迁移 MoviePilot 的匹配链(名称规范化后完全相等、年份 ±1、季年份优先、别名/译名回退)。`recallTmdbCandidates` 是身份识别的候选召回(ID-2,对照 MP 名称顺序与别名回退:中文名/英文名按类型单语言搜索,标题对不上的按年份相近度拉前几个详情比对别名/译名),打分交给 `domain.resolveIdentity`。错误为 `TmdbError`(auth/network/timeout/notfound/rate/protocol),不会把查询失败当成无结果。 仅对 mock 与官方 API 文档验证,未连接真实实例。 diff --git a/packages/adapters/src/tmdb/index.ts b/packages/adapters/src/tmdb/index.ts index 1de8bc4e..9cd5e2c2 100644 --- a/packages/adapters/src/tmdb/index.ts +++ b/packages/adapters/src/tmdb/index.ts @@ -2,4 +2,5 @@ export { RequestLimiter, TtlLruCache } from "./cache.ts"; export * from "./client.ts"; export * from "./details.ts"; export * from "./match.ts"; +export * from "./recall.ts"; export * from "./translations.ts"; diff --git a/packages/adapters/src/tmdb/recall.ts b/packages/adapters/src/tmdb/recall.ts new file mode 100644 index 00000000..50f7f737 --- /dev/null +++ b/packages/adapters/src/tmdb/recall.ts @@ -0,0 +1,71 @@ +/** + * 身份识别的 TMDB 候选召回(ID-2),对照 MoviePilot TheMovieDbModule._prepare_search_names + TmdbApi 的 + * __search_movie_by_name / __search_tv_by_name / _candidate_resolution: + * - 名称顺序 [中文名, 英文名](MP:cn_name → 简体 cn_name → en_name); + * - 按类型搜索(剧集线索只搜 tv,否则 movie + tv),单语言(首选语言,与 MP 相同); + * - 搜索结果的标题/原标题都对不上名称时,按年份相近度取前几个拉详情,用别名 + 译名比对(MP 对全部候选逐个拉详情, + * 这里设上限,打分交给 domain.resolveIdentity)。 + * 与 MP 的差异:MP 在第一个命中处短路,这里收集候选池交给证据打分(同名多候选 → 进待识别池而不是取第一个)。 + */ +import { type MediaEntityType, type MetadataCandidate, type TmdbClient, TmdbError } from "./client.ts"; +import { normalizeTitleForCompare } from "./match.ts"; + +export interface TmdbRecallInput { + /** 查询名称,按优先级(中文名在前);空值与重复会被忽略 */ + names: (string | null | undefined)[]; + /** 有剧集线索时只搜 tv */ + type?: MediaEntityType; + year?: number; + /** 最多用几个名称搜索,默认 2 */ + maxNames?: number; + /** 最多为几个候选拉详情(别名比对),默认 3 */ + maxDetails?: number; + /** 候选池上限,默认 20 */ + limit?: number; +} + +const yearDistance = (c: MetadataCandidate, year: number | undefined, type: MediaEntityType): number => { + if (year === undefined || c.year === null) return 50; + const d = year - c.year; + // 剧集:发布标题的年份可能是后续季的年份(晚于首播) + if (type === "tv" && d > 0) return Math.min(d, 5); + return Math.abs(d); +}; + +export async function recallTmdbCandidates(tmdb: TmdbClient, input: TmdbRecallInput): Promise { + const names: string[] = []; + for (const n of input.names) { + const t = n?.trim(); + if (t && !names.some((x) => normalizeTitleForCompare(x) === normalizeTitleForCompare(t))) names.push(t); + } + const types: MediaEntityType[] = input.type ? [input.type] : ["movie", "tv"]; + const seen = new Map(); + for (const name of names.slice(0, input.maxNames ?? 2)) { + for (const type of types) { + for (const m of await tmdb.searchRaw(type, name)) { + const k = `${m.entityType}:${m.externalId}`; + if (!seen.has(k)) seen.set(k, m); + } + } + } + const pool = [...seen.values()]; + const keys = new Set(names.map(normalizeTitleForCompare)); + const direct = (c: MetadataCandidate) => + [c.title, c.originalTitle].some((t) => !!t && keys.has(normalizeTitleForCompare(t))); + // 年份相容(±1,剧集允许季年份更晚)的候选按年份相近度排序:标题对不上的拉详情比对别名; + // 直接命中的前两个也拉详情(自动绑定本来就要取详情),看另一种文字的名称能否佐证(中文名命中一部、英文名命中另一部时靠它区分) + const compatible = pool + .filter((c) => yearDistance(c, input.year, c.entityType) <= (c.entityType === "tv" ? 5 : 1)) + .sort((a, b) => yearDistance(a, input.year, a.entityType) - yearDistance(b, input.year, b.entityType)); + const directs = compatible.filter(direct); + const needDetail = [...directs.slice(0, 2), ...compatible.filter((c) => !direct(c)).slice(0, input.maxDetails ?? 3)]; + for (const c of needDetail) { + try { + seen.set(`${c.entityType}:${c.externalId}`, await tmdb.details(c.entityType, c.externalId)); + } catch (e) { + // 对照 MP get_info 失败返回 None 后继续:详情只用于补别名,取不到保留搜索结果 + if (!(e instanceof TmdbError)) throw e; + } + } + return [...seen.values()].slice(0, input.limit ?? 20); +} diff --git a/packages/domain/src/identity/index.ts b/packages/domain/src/identity/index.ts index 5e2fa1b2..43fd25ee 100644 --- a/packages/domain/src/identity/index.ts +++ b/packages/domain/src/identity/index.ts @@ -1,8 +1,11 @@ export { + DEFAULT_MATCH_WEIGHTS, type EvidenceLevel, type IdentityCandidate, type IdentityResolution, type MatchOptions, + type MatchWeights, + poolGenericNames, queryTitles, type RankedCandidate, rankCandidates, @@ -12,5 +15,6 @@ export { type TypeMatch, type YearMatch, } from "./match.ts"; -export { normalizeTitle, stripSeasonSuffix } from "./normalize.ts"; +export { isGenericAliasName, normalizeTitle, stripSeasonSuffix } from "./normalize.ts"; +export { sequelNumbers } from "./sequel.ts"; export { TRAD_TO_SIMP, toSimplified } from "./zh-map.ts"; diff --git a/packages/domain/src/identity/match.ts b/packages/domain/src/identity/match.ts index 54f8e569..97f9184d 100644 --- a/packages/domain/src/identity/match.ts +++ b/packages/domain/src/identity/match.ts @@ -1,16 +1,21 @@ import type { Confidence, ParsedRelease } from "../release-parser/types.ts"; -import { normalizeTitle } from "./normalize.ts"; +import { isGenericAliasName, normalizeTitle } from "./normalize.ts"; +import { sequelNumbers } from "./sequel.ts"; export interface IdentityCandidate { /** tmdb / local(本地别名召回)/ 其他提供方 */ provider: string; entityType: "movie" | "tv"; externalId: string; + /** 主标题与原标题(以及其他语言的本地化标题);精确命中这里算 exact */ titles: string[]; year?: number; + /** 别名 / 译名(TMDB alternative_titles + translations、本地登记的别名);命中这里算 alias */ aliases: string[]; /** 剧集各季首播年份(发布标题里的年份可能是季年份) */ seasonYears?: number[]; + /** 剧集已有的季号(取了详情才有;用于季号区分) */ + seasonNumbers?: number[]; /** local 候选:本地实体 UUID 及其已登记的外部映射 */ localEntityId?: string; linkedExternalIds?: { provider: string; id: string }[]; @@ -21,6 +26,39 @@ export type TitleMatch = "exact" | "alias" | "partial" | "none"; export type YearMatch = "exact" | "season_year" | "within_tolerance" | "unknown" | "mismatch"; export type TypeMatch = "match" | "mismatch" | "unknown"; +/** + * 评分权重表(ID-2,可配置):各项证据的分值相加,按阈值落到证据等级;硬规则(年份不符、续作序号冲突、 + * 标题无关)直接拒绝,部分包含 / 通用词只靠别名 / 别名命中缺少佐证 / 类型冲突封顶 needs_confirm。 + * 分值只用于定级与同等级排序,不是概率。默认值下 v0.1 的规则式判定不变(identity.test.ts), + * 在此基础上加了第二语言名称、续作序号、季号三项。 + */ +export interface MatchWeights { + title: Record; + year: Record, number>; + /** 年份未知,但剧集季号是明写的且类型一致 */ + tvSeasonNoYear: number; + /** 中文名与英文名(不同文字)各自命中,每多一种加一次 */ + secondName: number; + /** 续作 / 章节 / Part 序号一致 */ + sequelMatch: number; + /** 明写的季号在候选的季列表里 / 不在 */ + seasonMatch: number; + seasonMissing: number; + /** 分值 ≥ 阈值即达到该等级 */ + thresholds: { rule_confirmed: number; multi_evidence: number; needs_confirm: number }; +} + +export const DEFAULT_MATCH_WEIGHTS: MatchWeights = { + title: { exact: 4, alias: 3, partial: 1, none: 0 }, + year: { exact: 3, season_year: 3, within_tolerance: 2, unknown: 0 }, + tvSeasonNoYear: 2, + secondName: 1, + sequelMatch: 1, + seasonMatch: 0, + seasonMissing: -3, + thresholds: { rule_confirmed: 7, multi_evidence: 5, needs_confirm: 1 }, +}; + export interface RankedCandidate { candidate: IdentityCandidate; level: EvidenceLevel; @@ -28,11 +66,46 @@ export interface RankedCandidate { yearMatch: YearMatch; typeMatch: TypeMatch; evidence: string[]; + /** 排序用信号(分值不是概率,只在同等级间比较) */ + signals: { + points: number; + /** 命中(精确或别名)的名称文字种数:中文 / 拉丁 */ + nameLangs: number; + sequel: "match" | "conflict" | "none"; + genericName: boolean; + }; } export interface MatchOptions { /** 年份容差,默认 ±1 */ yearTolerance?: number; + /** 覆盖部分权重 */ + weights?: Partial; + /** + * 候选池里"撞名"的通用词(归一化形态):单个拉丁词且池中 ≥ 3 个候选的名称包含它(`Archives`)。 + * rankCandidates / resolveIdentity 按池自动计算;单独调用 scoreCandidate 时可传入。 + */ + genericNames?: ReadonlySet; +} + +/** 池里撞名的阈值:单个拉丁词被 ≥ 3 个候选的名称包含 */ +const GENERIC_POOL_HITS = 3; + +/** 按候选池找出通用词:单个拉丁词、且池中多个候选的标题/别名都包含它 */ +export function poolGenericNames(p: ParsedRelease, candidates: readonly IdentityCandidate[]): Set { + const out = new Set(); + for (const q of queryNames(p)) { + if (!isSingleLatinWord(q)) continue; + let hits = 0; + for (const c of candidates) { + if ([...c.titles, ...c.aliases].some((t) => normalizeTitle(t).includes(q.norm))) hits++; + if (hits >= GENERIC_POOL_HITS) { + out.add(q.norm); + break; + } + } + } + return out; } const LEVEL_RANK: Record = { @@ -52,30 +125,81 @@ const YEAR_RANK: Record = { const raise = (l: EvidenceLevel): EvidenceLevel => l === "needs_confirm" ? "multi_evidence" : l === "multi_evidence" ? "rule_confirmed" : l; +const capAt = (l: EvidenceLevel, max: EvidenceLevel): EvidenceLevel => (LEVEL_RANK[l] > LEVEL_RANK[max] ? max : l); -export function queryTitles(p: ParsedRelease): string[] { - const out: string[] = []; - for (const t of [p.titleCn, p.titleEn, p.title]) { - if (!t) continue; - const n = normalizeTitle(t); - if (n && !out.includes(n)) out.push(n); - } +function weightsOf(opts: MatchOptions): MatchWeights { + const w = opts.weights; + if (!w) return DEFAULT_MATCH_WEIGHTS; + return { + ...DEFAULT_MATCH_WEIGHTS, + ...w, + title: { ...DEFAULT_MATCH_WEIGHTS.title, ...w.title }, + year: { ...DEFAULT_MATCH_WEIGHTS.year, ...w.year }, + thresholds: { ...DEFAULT_MATCH_WEIGHTS.thresholds, ...w.thresholds }, + }; +} + +interface QueryName { + raw: string; + norm: string; + /** primary = 主标题解析出的中/英文名;alt = 副标题别名(命中只算 alias) */ + primary: boolean; + script: "han" | "latin"; +} + +function queryNames(p: ParsedRelease): QueryName[] { + const out: QueryName[] = []; + const add = (raw: string | undefined, primary: boolean) => { + if (!raw) return; + const norm = normalizeTitle(raw); + // 通用词守卫:分类词 / 单字 / 过短 / 停用词不作为名称参与比对 + if (!norm || isGenericAliasName(norm) || out.some((q) => q.norm === norm)) return; + out.push({ raw, norm, primary, script: /\p{Script=Han}/u.test(raw) ? "han" : "latin" }); + }; + add(p.titleCn, true); + add(p.titleEn, true); + add(p.title, true); + for (const a of p.altTitles ?? []) add(a, false); return out; } -function titleMatch(queries: string[], c: IdentityCandidate): TitleMatch { +/** 召回/比对用的归一化名称:中文名、英文名、展示名,再加副标题里的别名(已排除通用词) */ +export function queryTitles(p: ParsedRelease): string[] { + return queryNames(p).map((q) => q.norm); +} + +/** 单个拉丁词(去掉冠词后);再加上池里撞名(poolGenericNames)才算通用词 */ +const isSingleLatinWord = (q: QueryName) => + q.script === "latin" && + q.raw + .trim() + .replace(/^(?:the|a|an)\s+/i, "") + .split(/[\s._-]+/) + .filter(Boolean).length === 1; + +interface NameResult { + tm: TitleMatch; + matched: QueryName[]; +} + +function titleMatch(queries: QueryName[], c: IdentityCandidate): NameResult { const titles = c.titles.map(normalizeTitle).filter(Boolean); - const aliases = c.aliases.map(normalizeTitle).filter(Boolean); - if (queries.some((q) => titles.includes(q))) return "exact"; - if (queries.some((q) => aliases.includes(q))) return "alias"; + const aliases = c.aliases.map(normalizeTitle).filter((a) => a && !isGenericAliasName(a)); + const exact = queries.filter((q) => q.primary && titles.includes(q.norm)); + const alias = queries.filter((q) => !exact.includes(q) && (titles.includes(q.norm) || aliases.includes(q.norm))); + const matched = [...exact, ...alias]; + if (exact.length) return { tm: "exact", matched }; + if (alias.length) return { tm: "alias", matched }; const all = [...titles, ...aliases]; - const partial = queries.some((q) => - all.some((t) => { - const [short, long] = q.length <= t.length ? [q, t] : [t, q]; - return short.length >= 2 && long.includes(short); - }), + const partial = queries.some( + (q) => + q.primary && + all.some((t) => { + const [short, long] = q.norm.length <= t.length ? [q.norm, t] : [t, q.norm]; + return short.length >= 2 && long.includes(short); + }), ); - return partial ? "partial" : "none"; + return { tm: partial ? "partial" : "none", matched: [] }; } function yearMatch(p: ParsedRelease, c: IdentityCandidate, tol: number): YearMatch { @@ -93,13 +217,31 @@ function typeMatch(p: ParsedRelease, c: IdentityCandidate): TypeMatch { return "unknown"; } -/** 单个候选的证据等级(纯函数,不产生概率数字) */ +function sequelOf(p: ParsedRelease, c: IdentityCandidate): "match" | "conflict" | "none" { + const q = new Set(); + for (const t of [p.titleEn, p.titleCn, ...(p.altTitles ?? [])]) for (const n of sequelNumbers(t ?? "")) q.add(n); + if (!q.size) return "none"; + const cand = new Set(); + for (const t of [...c.titles, ...c.aliases]) for (const n of sequelNumbers(t)) cand.add(n); + if (!cand.size) return "none"; + return [...q].some((n) => cand.has(n)) ? "match" : "conflict"; +} + +/** 单个候选的证据等级(纯函数) */ export function scoreCandidate(p: ParsedRelease, c: IdentityCandidate, opts: MatchOptions = {}): RankedCandidate { + const w = weightsOf(opts); const tol = opts.yearTolerance ?? 1; - const tm = titleMatch(queryTitles(p), c); + const queries = queryNames(p); + const { tm, matched } = titleMatch(queries, c); const ym = yearMatch(p, c, tol); const ty = typeMatch(p, c); + const sequel = sequelOf(p, c); + const nameLangs = new Set(matched.map((q) => q.script)).size; + const genericName = + tm === "alias" && matched.every((q) => isSingleLatinWord(q) && (opts.genericNames?.has(q.norm) ?? false)); const evidence: string[] = [`title:${tm}`, `year:${ym}`, `type:${ty}`]; + if (nameLangs > 1) evidence.push(`name_langs:${nameLangs}`); + if (sequel !== "none") evidence.push(`sequel:${sequel}`); const explicit = p.explicitIds.some( (x) => (x.provider === c.provider && x.id === c.externalId) || @@ -108,37 +250,83 @@ export function scoreCandidate(p: ParsedRelease, c: IdentityCandidate, opts: Mat if (explicit) evidence.push("explicit_id"); if (c.provider === "local") evidence.push("local_entity"); - let level: EvidenceLevel; - if (ym === "mismatch") level = "rejected"; + // 分值 + let points = w.title[tm] + (ym === "mismatch" ? 0 : w.year[ym]); + const explicitSeason = p.season !== undefined && !p.seasonInferred; + if (ym === "unknown" && ty === "match" && explicitSeason) points += w.tvSeasonNoYear; + if (nameLangs > 1) points += w.secondName * (nameLangs - 1); + if (sequel === "match") points += w.sequelMatch; + if (explicitSeason && p.season! > 0 && c.entityType === "tv" && c.seasonNumbers?.length) { + if (c.seasonNumbers.includes(p.season!)) points += w.seasonMatch; + else { + points += w.seasonMissing; + evidence.push("season:missing"); + } + } + + let level: EvidenceLevel = + points >= w.thresholds.rule_confirmed + ? "rule_confirmed" + : points >= w.thresholds.multi_evidence + ? "multi_evidence" + : points >= w.thresholds.needs_confirm + ? "needs_confirm" + : "rejected"; + // 硬规则 + if (ym === "mismatch" || sequel === "conflict") level = "rejected"; else if (tm === "none") level = explicit ? "needs_confirm" : "rejected"; - else if (tm === "partial") level = "needs_confirm"; - else if (ym === "exact" || ym === "season_year") level = tm === "exact" ? "rule_confirmed" : "multi_evidence"; - else if (ym === "within_tolerance") level = "multi_evidence"; else { - // 年份未知:剧集有季集信息且类型一致时仍算多证据,电影需确认 - level = ty === "match" && p.season !== undefined ? "multi_evidence" : "needs_confirm"; + if (level === "rejected") level = "needs_confirm"; + if (tm === "partial") level = capAt(level, "needs_confirm"); + if (genericName) { + level = capAt(level, "needs_confirm"); + evidence.push("generic_name"); + } + // 只靠别名命中:还要年份相容或另一种文字的名字也命中,否则只作提示 + if (tm === "alias" && nameLangs < 2 && ym === "unknown") { + level = capAt(level, "needs_confirm"); + evidence.push("alias_uncorroborated"); + } } if (level !== "rejected" && ty === "mismatch") { level = "needs_confirm"; evidence.push("type_conflict"); } if (explicit && level !== "rejected" && tm !== "none") level = raise(level); - return { candidate: c, level, titleMatch: tm, yearMatch: ym, typeMatch: ty, evidence }; + return { + candidate: c, + level, + titleMatch: tm, + yearMatch: ym, + typeMatch: ty, + evidence, + signals: { points, nameLangs, sequel, genericName }, + }; } -/** 候选排序:等级 > 标题 > 年份 > 本地优先 > 原顺序 */ +/** 同等级内的取舍:年份精确优先,再按命中的名称文字种数,再按分值 */ +function tieBreak(a: RankedCandidate, b: RankedCandidate): number { + return ( + YEAR_RANK[b.yearMatch] - YEAR_RANK[a.yearMatch] || + b.signals.nameLangs - a.signals.nameLangs || + b.signals.points - a.signals.points + ); +} + +/** 候选排序:等级 > 年份 > 名称文字种数 > 分值 > 标题 > 本地优先 > 原顺序 */ export function rankCandidates( p: ParsedRelease, candidates: readonly IdentityCandidate[], opts: MatchOptions = {}, ): RankedCandidate[] { + const o = opts.genericNames ? opts : { ...opts, genericNames: poolGenericNames(p, candidates) }; return candidates - .map((c, i) => ({ r: scoreCandidate(p, c, opts), i })) + .map((c, i) => ({ r: scoreCandidate(p, c, o), i })) .sort( (a, b) => LEVEL_RANK[b.r.level] - LEVEL_RANK[a.r.level] || + tieBreak(a.r, b.r) || TITLE_RANK[b.r.titleMatch] - TITLE_RANK[a.r.titleMatch] || - YEAR_RANK[b.r.yearMatch] - YEAR_RANK[a.r.yearMatch] || Number(b.r.candidate.provider === "local") - Number(a.r.candidate.provider === "local") || a.i - b.i, ) @@ -173,6 +361,8 @@ export function resolveIdentity( const rivals = ranked.filter( (r) => r !== top && LEVEL_RANK[r.level] >= LEVEL_RANK[top.level] && !sameIdentity(r.candidate, top.candidate), ); - if (rivals.length > 0) return { status: "ambiguous", best: top, ranked, reason: "multiple_candidates_same_level" }; - return { status: "auto", best: top, ranked, reason: top.level }; + // 同等级多个候选:年份精确 / 名称文字种数 / 分值上严格占优才自动确认,否则进池 + if (rivals.some((r) => tieBreak(top, r) >= 0)) + return { status: "ambiguous", best: top, ranked, reason: "multiple_candidates_same_level" }; + return { status: "auto", best: top, ranked, reason: rivals.length ? `${top.level}:tie_break` : top.level }; } diff --git a/packages/domain/src/identity/normalize.ts b/packages/domain/src/identity/normalize.ts index ffc7a918..582b1323 100644 --- a/packages/domain/src/identity/normalize.ts +++ b/packages/domain/src/identity/normalize.ts @@ -35,3 +35,69 @@ export function normalizeTitle(s: string): string { .replace(/&/g, "and") .replace(/[^\p{L}\p{N}]+/gu, ""); } + +/** 分类词(站点分类 / RSS 标题前缀)与常见停用词:不能当片名或别名用于身份比对(ID-2) */ +const GENERIC_NAMES = new Set( + [ + "电影", + "电视剧", + "剧集", + "连续剧", + "动漫", + "动画", + "番剧", + "国漫", + "日漫", + "综艺", + "纪录片", + "记录片", + "音乐", + "短剧", + "微短剧", + "体育", + "游戏", + "软件", + "学习", + "其他", + "其它", + "未知", + "新", + "合集", + "全集", + "中字", + "国语", + "粤语", + "高清", + "蓝光", + "原盘", + "movie", + "movies", + "tv", + "tvseries", + "series", + "anime", + "animation", + "documentary", + "music", + "variety", + "show", + "the", + "season", + "complete", + "unknown", + "other", + ].map((s) => s.toLowerCase()), +); + +/** + * 归一化后的名称是否太"通用"不能用于身份比对:分类词、停用词、单个汉字、两个以内的拉丁字符、纯数字。 + * 参数是 normalizeTitle 之后的形态。 + */ +export function isGenericAliasName(norm: string): boolean { + if (!norm) return true; + if (GENERIC_NAMES.has(norm)) return true; + if (/^\d+$/.test(norm)) return true; + const han = norm.match(/\p{Script=Han}/gu)?.length ?? 0; + if (han > 0) return [...norm].length < 2; + return norm.length <= 2; +} diff --git a/packages/domain/src/identity/sequel.ts b/packages/domain/src/identity/sequel.ts new file mode 100644 index 00000000..15f3b611 --- /dev/null +++ b/packages/domain/src/identity/sequel.ts @@ -0,0 +1,60 @@ +/** + * 续作 / 章节 / Part 序号(ID-2):`Chapter III`、`Part Two`、`Vol. 2`、`第3章`、`第三章`、`Ⅲ`。 + * 只认显式关键词或罗马数字符号,不把片名末尾的普通数字当序号(`Blade Runner 2049`、`Apollo 13`)。 + * 季号不在这里(季由解析器单独给出)。 + */ +import { cnToInt } from "../release-parser/cn-number.ts"; + +const WORD_NUM: Record = { + one: 1, + two: 2, + three: 3, + four: 4, + five: 5, + six: 6, + seven: 7, + eight: 8, + nine: 9, + ten: 10, + first: 1, + second: 2, + third: 3, + fourth: 4, + final: -1, +}; +const ROMAN: Record = { i: 1, ii: 2, iii: 3, iv: 4, v: 5, vi: 6, vii: 7, viii: 8, ix: 9, x: 10 }; +const ROMAN_CHAR: Record = { + Ⅰ: 1, + Ⅱ: 2, + Ⅲ: 3, + Ⅳ: 4, + Ⅴ: 5, + Ⅵ: 6, + Ⅶ: 7, + Ⅷ: 8, + Ⅸ: 9, + Ⅹ: 10, +}; + +function toNum(tok: string): number | undefined { + const t = tok.toLowerCase(); + if (/^\d{1,2}$/.test(t)) return Number(t); + if (t in ROMAN) return ROMAN[t]; + if (t in WORD_NUM) return WORD_NUM[t]! > 0 ? WORD_NUM[t] : undefined; + return undefined; +} + +export function sequelNumbers(title: string): number[] { + if (!title) return []; + const out = new Set(); + const s = title.replace(/[ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ]/g, (c) => ` ${ROMAN_CHAR[c]} `); + for (const m of s.matchAll(/\b(?:chapter|part|vol(?:ume)?)\b\.?\s*[::-]?\s*([0-9]{1,2}|[ivx]{1,4}|[a-z]+)\b/giu)) { + const n = toNum(m[1]!); + if (n !== undefined) out.add(n); + } + for (const m of s.matchAll(/第\s*([0-9]{1,2}|[一二三四五六七八九十]{1,3})\s*章/gu)) { + const n = /^\d+$/.test(m[1]!) ? Number(m[1]) : cnToInt(m[1]!); + if (n !== undefined) out.add(n); + } + return [...out]; +} diff --git a/packages/domain/src/release-parser/parse.ts b/packages/domain/src/release-parser/parse.ts index 6abf3e25..e554f379 100644 --- a/packages/domain/src/release-parser/parse.ts +++ b/packages/domain/src/release-parser/parse.ts @@ -2,6 +2,7 @@ import { CN_NUM, cnToInt } from "./cn-number.ts"; import { evalEpisodeOffset } from "./offset.ts"; import { PLATFORMS } from "./platforms.ts"; import { buildGroupRegex, defaultGroupRegex } from "./release-groups.ts"; +import { splitEmbeddedDescription, subtitleTitles } from "./subtitle-titles.ts"; import { type Confidence, type ContentType, @@ -753,6 +754,9 @@ const ANIME_TAG_BARE = new RegExp(`★\\s*${ANIME_TAG_CORE}\\s*★?|(? 24) return undefined; + if (/\p{Script=Han}\s+\p{Script=Han}/u.test(core)) return undefined; + return /[。??]/u.test(core) ? undefined : core; +} + /** 常见拼音音节(不含声调);用于判断英文名是否其实是拼音 */ const PINYIN_SYLLABLE = /^(?:[bpmfdtnlgkhjqxrzcsyw]|zh|ch|sh)?(?:iang|iong|uang|ueng|ang|eng|ing|ong|ian|iao|uai|uan|ai|ei|ao|ou|an|en|in|un|ia|ie|iu|ua|uo|ui|ue|er|a|o|e|i|u|v)$/i; @@ -839,6 +851,17 @@ export function parseRelease(input: string, opts: ParseOptions = {}): ParsedRele s = s.slice(0, -(ext.length + 1)); } else if (opts.isFile) d.isFile = true; + // 1b. RSS 标题末尾内嵌的站点描述 `…-GRP[中文名 / … | 第N集 | …][体积]`:拆出来当副标题用 + let subtitle = opts.subtitle; + if (!kind) { + const emb = splitEmbeddedDescription(s); + if (emb.description) { + s = emb.title; + subtitle = subtitle ? `${emb.description} | ${subtitle}` : emb.description; + ev.push("subtitle:embedded"); + } + } + // 2. 显式身份标签:先取 `{[k=v;…]}` 块(季/集/类型一并给出),再取单个 `[tmdbid=…]` s = s.replace(/\{\[([^\]{}]*)\]\}/g, (all, body: string) => { const block = parseExplicitBlock(body); @@ -860,7 +883,11 @@ export function parseRelease(input: string, opts: ParseOptions = {}): ParsedRele s = s.replace(BRACKET_DOT_TITLE, " $1 "); // 2c. 动漫前缀标签(★7月新番★、[国漫]、【22年日剧】、[2022年7月番])与开头的分类方括号([Animations(动画片)]) s = s.replace(ANIME_TAG_BRACKET, " ").replace(ANIME_TAG_BARE, " "); - s = s.replace(CATEGORY_LEAD, ""); + s = s.replace(CATEGORY_LEAD, "").replace(CATEGORY_WORD_LEAD, (_all, c: string) => { + d.category = c; + ev.push("category:lead"); + return ""; + }); // 2d. `中文名A / 中文名B`:同一作品的两个中文译名只留后一个(与 MP 取法一致),避免拼成一个名字 s = s.replace(CN_ALIAS_SLASH, ""); @@ -955,13 +982,17 @@ export function parseRelease(input: string, opts: ParseOptions = {}): ParsedRele ev.push("pack:fin"); return MARK_HARD; }); - s = s.replace(/\s-\s(\d{1,3})(?:v\d)?(?=\s|\[|【|$)/u, (_all, n: string) => { - if (!d.episodes) { - d.episodes = { start: Number(n), end: Number(n) }; - ev.push("episode:anime_dash"); - } - return MARK_HARD; - }); + // `Travis - 12 Memories`:数字后紧跟一个普通单词时是片名的一部分,不是集号 + s = s.replace( + /\s-\s(\d{1,3})(?:v\d)?(?=\s|\[|【|$)(?!\s+(?!(?:END|Fin|Final|RAW)\b)[A-Za-z][a-z]+\b)/u, + (_all, n: string) => { + if (!d.episodes) { + d.episodes = { start: Number(n), end: Number(n) }; + ev.push("episode:anime_dash"); + } + return MARK_HARD; + }, + ); // `[Group][Name][05]`、`Name [01][1080p]`:名称后的方括号纯数字是集号 s = s.replace(/(?<=\S\s*)[[【](\d{1,3})(?:v\d)?[\]】]/u, (all, n: string) => { if (d.episodes) return all; @@ -991,26 +1022,36 @@ export function parseRelease(input: string, opts: ParseOptions = {}): ParsedRele } // 13. 副标题补缺 - if (opts.subtitle) { + if (subtitle) { // 英文名其实是拼音(Mai Xiang ↔ 麦香):中文名取副标题第一个词 if (!d.titleCn && d.titleEn) { const words = d.titleEn.split(/\s+/); - const first = /^\s*(\p{Script=Han}{2,12})(?=[\s||/,,]|$)/u.exec(opts.subtitle)?.[1]; + const first = /^\s*(\p{Script=Han}{2,12})(?=[\s||/,,]|$)/u.exec(subtitle)?.[1]; if (first && words.length === [...first].length && words.every((w) => PINYIN_SYLLABLE.test(w))) { d.titleCn = first; ev.push("subtitle:title_cn_pinyin"); } } - const sub = scanCnMarkers(opts.subtitle); + // 副标题第一段的片名(ID-2):主标题没有中文名时取第一个中文名;其余作为别名参与匹配 + const names = subtitleTitles(subtitle); + const first = names.find((n) => /\p{Script=Han}/u.test(n)); + const cn = first ? cnTitleFromSubtitle(first) : undefined; + if (!d.titleCn && cn) { + d.titleCn = cn; + ev.push("subtitle:title_cn"); + } + const alts = names.filter((n) => n !== d.titleCn && n !== d.titleEn).slice(0, 6); + if (alts.length) d.altTitles = alts; + const sub = scanCnMarkers(subtitle); // 副标题里的拉丁字幕标记 CHS/CHT/GB/BIG5(`60 GB` 这类体积不算) - for (const m of opts.subtitle.matchAll(/(?= 0; i--) { + const c = s[i]!; + if (c === "]" || c === "】") depth++; + else if (c === "[" || c === "【") { + depth--; + if (depth === 0) { + start = i; + break; + } + } + } + if (start <= 0) return { title: input }; + const content = s.slice(start + 1, -1).trim(); + const head = s.slice(0, start).trimEnd(); + if (!/\p{Script=Han}/u.test(content) || !/\||\s\/\s/u.test(content)) return { title: input }; + // 前面必须像一个发布名(含拉丁字母) + if (!/[A-Za-z]{2,}/.test(head)) return { title: input }; + return { title: head, description: content }; +} + +/** 名称里出现这些词就不是片名(字幕/音轨/版本/简介字段) */ +const NOT_A_TITLE = + /中字|字幕|[国國粤粵]语|[国國]配|双语|雙語|多语|音轨|音軌|配音|杜比|原盘|原盤|特效|章节|章節|类型|類型|导演|導演|主演|简繁|簡繁|简体|繁体|繁體|内封|内嵌|內嵌|高码|作品|收藏|合集|更新|完结|完結|[全共]\s*\d+\s*[集期]|第\s*\d+\s*[集期]|\d+\s*集|4K|HDR|\d{3,4}[pP]|DTS|TrueHD|Atmos|FLAC|\bAAC\b|DDP|\d\.\d|\bTop\b|\*|#/u; +const REGION_NOTE = /\s*[((]\s*(?:港|台|澳|港台|大陆|陆|新|马)\s*[))]\s*/gu; +const BRACKETED = /[[【][^\]】]*[\]】]/gu; +const VERSION_SUFFIX = /\s*\S*版\s*$/u; + +/** + * 副标题第一段(第一个 `|` 之前)里的片名,按 `/` 拆分,顺序保留;去掉地区注记与方括号标签, + * 丢弃字幕/音轨/简介字段。只返回看起来像片名的项(含字母或汉字,长度合理)。 + */ +export function subtitleTitles(subtitle: string | undefined): string[] { + if (!subtitle) return []; + const first = subtitle.split(/\s*[||]\s*/u)[0] ?? ""; + const out: string[] = []; + for (const raw of first.replace(BRACKETED, " ").split(/\s*[//]\s*/u)) { + let t = raw.replace(REGION_NOTE, " ").replace(/\s+/g, " ").trim(); + if (!t) continue; + if (NOT_A_TITLE.test(t)) continue; + // `星际穿越 IMAX版`:版本后缀不属于片名 + if (/\p{Script=Han}/u.test(t) && /\s\S*版$/u.test(t)) t = t.replace(VERSION_SUFFIX, "").trim(); + if (!/[\p{L}\p{N}]/u.test(t) || [...t].length > 40) continue; + // 非拉丁/汉字文字(天城文等)不参与匹配 + if (!/^[\p{Script=Han}\p{Script=Latin}\p{N}\p{P}\p{S}\p{Zs}ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ]+$/u.test(t)) continue; + if (!out.includes(t)) out.push(t); + } + return out; +} diff --git a/packages/domain/src/release-parser/types.ts b/packages/domain/src/release-parser/types.ts index 432483ca..a4f8f398 100644 --- a/packages/domain/src/release-parser/types.ts +++ b/packages/domain/src/release-parser/types.ts @@ -1,5 +1,5 @@ /** 解析器版本:规则变化时递增,缓存/识别结果按此失效 */ -export const PARSER_VERSION = 1; +export const PARSER_VERSION = 2; export type Resolution = "4320p" | "2160p" | "1440p" | "1080p" | "1080i" | "720p" | "576p" | "480p"; @@ -75,6 +75,10 @@ export interface ParsedRelease { title?: string; titleCn?: string; titleEn?: string; + /** 标题开头的站点分类方括号(`[电视剧]`、`[音乐]`),不属于片名 */ + category?: string; + /** 副标题 / RSS 内嵌描述第一段里的其他片名(译名、别名),参与身份匹配,不用于展示 */ + altTitles?: string[]; year?: number; season?: number; seasonEnd?: number; @@ -125,7 +129,7 @@ export interface ParsedRelease { } export interface ParseOptions { - /** 站点副标题,只补主标题缺失的季集信息 */ + /** 站点副标题:补主标题缺失的季集信息;第一段里的片名补中文名与别名(altTitles) */ subtitle?: string; /** 附加发布组(设置表扩展) */ releaseGroups?: string[]; diff --git a/packages/domain/test/differential/identity/deviations.json b/packages/domain/test/differential/identity/deviations.json new file mode 100644 index 00000000..b75fd6d9 --- /dev/null +++ b/packages/domain/test/differential/identity/deviations.json @@ -0,0 +1,10 @@ +{ + "note": "逐条归因(ID-2)。kind:mp_defect=MP 误识别、我们的结果正确(expect=正确结果 type:id,null=不应自动绑定);intentional=故意偏离(不计入一致率);known_gap=已知差距。", + "deviations": { + "H-104": { + "kind": "mp_defect", + "expect": null, + "note": "短剧《人中之龙第一季》(全98集,无年份):MP 用中文名搜 tv 无直达标题,逐个拉详情后按译名「人中之龙」命中《如龙》(Like a Dragon: Yakuza,2024)。我们:别名命中既无年份也无第二种文字的名称佐证 → 不自动绑定" + } + } +} diff --git a/packages/domain/test/differential/identity/gen-identity-mp.py b/packages/domain/test/differential/identity/gen-identity-mp.py new file mode 100644 index 00000000..b09ea448 --- /dev/null +++ b/packages/domain/test/differential/identity/gen-identity-mp.py @@ -0,0 +1,96 @@ +"""身份匹配差分:用 MP 上游 MetaInfo + TheMovieDbModule 的名称识别链生成 mp.json。 + +用法(MP 仓库根目录,用其 .venv;TMDB 走本地缓存代理,见 docs/porting/moviepilot-identity-match.md): + cd /opt/moviepilot-plus/upstream/MoviePilot && PYTHONPATH=. TMDB_PROXY=http://127.0.0.1:18731 \ + .venv/bin/python /opt/uhd_media_tool/packages/domain/test/differential/identity/gen-identity-mp.py + +按 MP 实际识别顺序:MetaInfo(title, subtitle) → _prepare_search_names(cn_name, 简体 cn_name, en_name) +→ 逐个名称 _search_by_name(_build_match_plan:电视剧 [季年份+年份, 无年份];其他 [电影+年份, 电视剧+年份, multi])。 +不含识别缓存、插件辅助识别与详情补全(只取匹配到的 id/类型/名称/年份)。只记录行为输出,不复制 MP 源码。 +""" + +import json +import os +import pathlib +import subprocess + +from app.domain.metainfo import MetaInfo +from app.modules.themoviedb import TheMovieDbModule +from app.modules.themoviedb.tmdbapi import TmdbApi +from app.modules.themoviedb.tmdbv3api import tmdb as tmdb_mod + +HERE = pathlib.Path(__file__).parent +PROXY = os.environ.get("TMDB_PROXY", "http://127.0.0.1:18731") + + +def _build_url(self, action, params=""): + return "%s/3%s?api_key=x&%s&language=%s" % (PROXY, action, params, self.language) + + +tmdb_mod.TMDb._build_url = _build_url + +samples = json.loads((HERE / "samples.json").read_text(encoding="utf-8"))["samples"] +if os.environ.get("LIMIT"): + samples = samples[: int(os.environ["LIMIT"])] +# 只需名称匹配链:不走 init_module(识别缓存/分类配置需要启动层) +module = TheMovieDbModule.__new__(TheMovieDbModule) +module.tmdb = TmdbApi() + + +def val(v): + return getattr(v, "value", v) + + +def run(s: dict) -> dict: + meta = MetaInfo(s["title"], s.get("subtitle")) + out = { + "meta": { + "name": meta.name, + "cn_name": meta.cn_name, + "en_name": meta.en_name, + "year": meta.year, + "type": val(meta.type), + "begin_season": meta.begin_season, + "begin_episode": meta.begin_episode, + }, + "names": module._prepare_search_names(meta), + "match": None, + } + if not meta.name: + return out + for name in out["names"]: + info = module._search_by_name(name, meta, []) + if info: + mtype = val(info.get("media_type")) + mtype = "movie" if mtype in ("movie", "电影") else "tv" + date = info.get("release_date") or info.get("first_air_date") or "" + out["match"] = { + "by": name, + "tmdbId": info.get("id"), + "type": mtype, + "title": info.get("title") or info.get("name"), + "year": int(date[:4]) if date[:4].isdigit() else None, + } + break + return out + + +result = {} +for s in samples: + try: + result[s["id"]] = run(s) + except Exception as e: # noqa: BLE001 + result[s["id"]] = {"error": f"{type(e).__name__}: {e}"} + +commit = subprocess.run(["git", "rev-parse", "--short", "HEAD"], capture_output=True, text=True).stdout.strip() +(HERE / "mp.json").write_text( + json.dumps( + {"generatedFrom": {"repo": "MoviePilot", "commit": commit, "entry": "MetaInfo + TheMovieDbModule._search_by_name"}, + "results": result}, + ensure_ascii=False, + indent=1, + ) + + "\n", + encoding="utf-8", +) +print(len(result)) diff --git a/packages/domain/test/differential/identity/mp.json b/packages/domain/test/differential/identity/mp.json new file mode 100644 index 00000000..133f147b --- /dev/null +++ b/packages/domain/test/differential/identity/mp.json @@ -0,0 +1,2072 @@ +{ + "generatedFrom": { + "repo": "MoviePilot", + "commit": "e6820a8", + "entry": "MetaInfo + TheMovieDbModule._search_by_name" + }, + "results": { + "H-001": { + "meta": { + "name": "Martial Master", + "cn_name": null, + "en_name": "Martial Master", + "year": "2020", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 685 + }, + "names": ["Martial Master"], + "match": { + "by": "Martial Master", + "tmdbId": 110181, + "type": "tv", + "title": "武神主宰", + "year": 2020 + } + }, + "H-002": { + "meta": { + "name": "Martial Master", + "cn_name": null, + "en_name": "Martial Master", + "year": "2020", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 685 + }, + "names": ["Martial Master"], + "match": { + "by": "Martial Master", + "tmdbId": 110181, + "type": "tv", + "title": "武神主宰", + "year": 2020 + } + }, + "H-003": { + "meta": { + "name": "Martial Master", + "cn_name": null, + "en_name": "Martial Master", + "year": "2020", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 685 + }, + "names": ["Martial Master"], + "match": { + "by": "Martial Master", + "tmdbId": 110181, + "type": "tv", + "title": "武神主宰", + "year": 2020 + } + }, + "H-004": { + "meta": { + "name": "Mononoke The Movie Chapter Iii The Curse Of The Serpent", + "cn_name": null, + "en_name": "Mononoke The Movie Chapter Iii The Curse Of The Serpent", + "year": "2026", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Mononoke The Movie Chapter Iii The Curse Of The Serpent"], + "match": { + "by": "Mononoke The Movie Chapter Iii The Curse Of The Serpent", + "tmdbId": 1322562, + "type": "movie", + "title": "剧场版物怪:第 3 章:蛇神", + "year": 2026 + } + }, + "H-005": { + "meta": { + "name": "Archives", + "cn_name": null, + "en_name": "Archives", + "year": "2009", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 152 + }, + "names": ["Archives"], + "match": { + "by": "Archives", + "tmdbId": 201401, + "type": "tv", + "title": "档案", + "year": 2009 + } + }, + "H-006": { + "meta": { + "name": "A Different World", + "cn_name": null, + "en_name": "A Different World", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["A Different World"], + "match": { + "by": "A Different World", + "tmdbId": 305357, + "type": "tv", + "title": "别样世界", + "year": 2026 + } + }, + "H-007": { + "meta": { + "name": "A Different World", + "cn_name": null, + "en_name": "A Different World", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["A Different World"], + "match": { + "by": "A Different World", + "tmdbId": 305357, + "type": "tv", + "title": "别样世界", + "year": 2026 + } + }, + "H-008": { + "meta": { + "name": "A Prophet", + "cn_name": null, + "en_name": "A Prophet", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 5 + }, + "names": ["A Prophet"], + "match": { + "by": "A Prophet", + "tmdbId": 289078, + "type": "tv", + "title": "我不是大师", + "year": 2026 + } + }, + "H-009": { + "meta": { + "name": "Baby Do Die Do", + "cn_name": null, + "en_name": "Baby Do Die Do", + "year": "2026", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Baby Do Die Do"], + "match": { + "by": "Baby Do Die Do", + "tmdbId": 1512084, + "type": "movie", + "title": "贝比毙咚", + "year": 2026 + } + }, + "H-010": { + "meta": { + "name": "Baby Do Die Do", + "cn_name": null, + "en_name": "Baby Do Die Do", + "year": "2026", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Baby Do Die Do"], + "match": { + "by": "Baby Do Die Do", + "tmdbId": 1512084, + "type": "movie", + "title": "贝比毙咚", + "year": 2026 + } + }, + "H-011": { + "meta": { + "name": "Baby Do Die Do", + "cn_name": null, + "en_name": "Baby Do Die Do", + "year": "2026", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Baby Do Die Do"], + "match": { + "by": "Baby Do Die Do", + "tmdbId": 1512084, + "type": "movie", + "title": "贝比毙咚", + "year": 2026 + } + }, + "H-012": { + "meta": { + "name": "Chef On Fire", + "cn_name": null, + "en_name": "Chef On Fire", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 4 + }, + "names": ["Chef On Fire"], + "match": { + "by": "Chef On Fire", + "tmdbId": 333167, + "type": "tv", + "title": "开火开伙", + "year": 2026 + } + }, + "H-013": { + "meta": { + "name": "China Now", + "cn_name": null, + "en_name": "China Now", + "year": "2019", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 350 + }, + "names": ["China Now"], + "match": { + "by": "China Now", + "tmdbId": 206367, + "type": "tv", + "title": "这就是中国", + "year": 2019 + } + }, + "H-014": { + "meta": { + "name": "Delta Force The Creator", + "cn_name": null, + "en_name": "Delta Force The Creator", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 25 + }, + "names": ["Delta Force The Creator"], + "match": { + "by": "Delta Force The Creator", + "tmdbId": 331320, + "type": "tv", + "title": "三角洲:造物主玩家", + "year": 2026 + } + }, + "H-015": { + "meta": { + "name": "Dongbei'S Back", + "cn_name": null, + "en_name": "Dongbei'S Back", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 9 + }, + "names": ["Dongbei'S Back"], + "match": { + "by": "Dongbei'S Back", + "tmdbId": 312027, + "type": "tv", + "title": "东北有个周东北", + "year": 2026 + } + }, + "H-016": { + "meta": { + "name": "Dongbei'S Back", + "cn_name": null, + "en_name": "Dongbei'S Back", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 10 + }, + "names": ["Dongbei'S Back"], + "match": { + "by": "Dongbei'S Back", + "tmdbId": 312027, + "type": "tv", + "title": "东北有个周东北", + "year": 2026 + } + }, + "H-017": { + "meta": { + "name": "Dongbei'S Back", + "cn_name": null, + "en_name": "Dongbei'S Back", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 9 + }, + "names": ["Dongbei'S Back"], + "match": { + "by": "Dongbei'S Back", + "tmdbId": 312027, + "type": "tv", + "title": "东北有个周东北", + "year": 2026 + } + }, + "H-018": { + "meta": { + "name": "Dongbei'S Back", + "cn_name": null, + "en_name": "Dongbei'S Back", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 9 + }, + "names": ["Dongbei'S Back"], + "match": { + "by": "Dongbei'S Back", + "tmdbId": 312027, + "type": "tv", + "title": "东北有个周东北", + "year": 2026 + } + }, + "H-019": { + "meta": { + "name": "Dongbei'S Back", + "cn_name": null, + "en_name": "Dongbei'S Back", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 9 + }, + "names": ["Dongbei'S Back"], + "match": { + "by": "Dongbei'S Back", + "tmdbId": 312027, + "type": "tv", + "title": "东北有个周东北", + "year": 2026 + } + }, + "H-020": { + "meta": { + "name": "Dongbei'S Back", + "cn_name": null, + "en_name": "Dongbei'S Back", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 4 + }, + "names": ["Dongbei'S Back"], + "match": { + "by": "Dongbei'S Back", + "tmdbId": 312027, + "type": "tv", + "title": "东北有个周东北", + "year": 2026 + } + }, + "H-021": { + "meta": { + "name": "False Memory", + "cn_name": null, + "en_name": "False Memory", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["False Memory"], + "match": { + "by": "False Memory", + "tmdbId": 280564, + "type": "tv", + "title": "记忆管理局", + "year": 2026 + } + }, + "H-022": { + "meta": { + "name": "False Memory", + "cn_name": null, + "en_name": "False Memory", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["False Memory"], + "match": { + "by": "False Memory", + "tmdbId": 280564, + "type": "tv", + "title": "记忆管理局", + "year": 2026 + } + }, + "H-023": { + "meta": { + "name": "False Memory", + "cn_name": null, + "en_name": "False Memory", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["False Memory"], + "match": { + "by": "False Memory", + "tmdbId": 280564, + "type": "tv", + "title": "记忆管理局", + "year": 2026 + } + }, + "H-024": { + "meta": { + "name": "Gg Bond Interstellar Mission", + "cn_name": null, + "en_name": "Gg Bond Interstellar Mission", + "year": "2024", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Gg Bond Interstellar Mission"], + "match": { + "by": "Gg Bond Interstellar Mission", + "tmdbId": 1260260, + "type": "movie", + "title": "猪猪侠大电影·星际行动", + "year": 2024 + } + }, + "H-025": { + "meta": { + "name": "Gg Bond Interstellar Mission", + "cn_name": null, + "en_name": "Gg Bond Interstellar Mission", + "year": "2024", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Gg Bond Interstellar Mission"], + "match": { + "by": "Gg Bond Interstellar Mission", + "tmdbId": 1260260, + "type": "movie", + "title": "猪猪侠大电影·星际行动", + "year": 2024 + } + }, + "H-026": { + "meta": { + "name": "Gg Bond Interstellar Mission", + "cn_name": null, + "en_name": "Gg Bond Interstellar Mission", + "year": "2024", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Gg Bond Interstellar Mission"], + "match": { + "by": "Gg Bond Interstellar Mission", + "tmdbId": 1260260, + "type": "movie", + "title": "猪猪侠大电影·星际行动", + "year": 2024 + } + }, + "H-027": { + "meta": { + "name": "Gg Bond Interstellar Mission", + "cn_name": null, + "en_name": "Gg Bond Interstellar Mission", + "year": "2024", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Gg Bond Interstellar Mission"], + "match": { + "by": "Gg Bond Interstellar Mission", + "tmdbId": 1260260, + "type": "movie", + "title": "猪猪侠大电影·星际行动", + "year": 2024 + } + }, + "H-028": { + "meta": { + "name": "Gladiator In The Theater", + "cn_name": null, + "en_name": "Gladiator In The Theater", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 32 + }, + "names": ["Gladiator In The Theater"], + "match": { + "by": "Gladiator In The Theater", + "tmdbId": 288873, + "type": "tv", + "title": "云雀叫天录", + "year": 2026 + } + }, + "H-029": { + "meta": { + "name": "Gladiator In The Theater", + "cn_name": null, + "en_name": "Gladiator In The Theater", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 32 + }, + "names": ["Gladiator In The Theater"], + "match": { + "by": "Gladiator In The Theater", + "tmdbId": 288873, + "type": "tv", + "title": "云雀叫天录", + "year": 2026 + } + }, + "H-030": { + "meta": { + "name": "Guan", + "cn_name": null, + "en_name": "Guan", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 11 + }, + "names": ["Guan"], + "match": { + "by": "Guan", + "tmdbId": 303287, + "type": "tv", + "title": "一斩苍穹", + "year": 2026 + } + }, + "H-031": { + "meta": { + "name": "Guan", + "cn_name": null, + "en_name": "Guan", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 11 + }, + "names": ["Guan"], + "match": { + "by": "Guan", + "tmdbId": 303287, + "type": "tv", + "title": "一斩苍穹", + "year": 2026 + } + }, + "H-032": { + "meta": { + "name": "Guan", + "cn_name": null, + "en_name": "Guan", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 11 + }, + "names": ["Guan"], + "match": { + "by": "Guan", + "tmdbId": 303287, + "type": "tv", + "title": "一斩苍穹", + "year": 2026 + } + }, + "H-033": { + "meta": { + "name": "Habeas Corpus", + "cn_name": null, + "en_name": "Habeas Corpus", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Habeas Corpus"], + "match": { + "by": "Habeas Corpus", + "tmdbId": 308963, + "type": "tv", + "title": "人身保护令", + "year": 2026 + } + }, + "H-034": { + "meta": { + "name": "Habeas Corpus", + "cn_name": null, + "en_name": "Habeas Corpus", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Habeas Corpus"], + "match": { + "by": "Habeas Corpus", + "tmdbId": 308963, + "type": "tv", + "title": "人身保护令", + "year": 2026 + } + }, + "H-035": { + "meta": { + "name": "Habeas Corpus", + "cn_name": null, + "en_name": "Habeas Corpus", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Habeas Corpus"], + "match": { + "by": "Habeas Corpus", + "tmdbId": 308963, + "type": "tv", + "title": "人身保护令", + "year": 2026 + } + }, + "H-036": { + "meta": { + "name": "Heart Signal", + "cn_name": null, + "en_name": "Heart Signal", + "year": "2018", + "type": "电视剧", + "begin_season": 9, + "begin_episode": 29 + }, + "names": ["Heart Signal"], + "match": { + "by": "Heart Signal", + "tmdbId": 103147, + "type": "tv", + "title": "心动的信号", + "year": 2018 + } + }, + "H-037": { + "meta": { + "name": "Heart Signal", + "cn_name": null, + "en_name": "Heart Signal", + "year": "2018", + "type": "电视剧", + "begin_season": 9, + "begin_episode": 29 + }, + "names": ["Heart Signal"], + "match": { + "by": "Heart Signal", + "tmdbId": 103147, + "type": "tv", + "title": "心动的信号", + "year": 2018 + } + }, + "H-038": { + "meta": { + "name": "Hi Come In", + "cn_name": null, + "en_name": "Hi Come In", + "year": "2022", + "type": "电视剧", + "begin_season": 7, + "begin_episode": 11 + }, + "names": ["Hi Come In"], + "match": { + "by": "Hi Come In", + "tmdbId": 211849, + "type": "tv", + "title": "嗨!营业中", + "year": 2022 + } + }, + "H-039": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-040": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-041": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-042": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-043": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-044": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-045": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-046": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-047": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-048": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-049": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-050": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-051": { + "meta": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Interstellar"], + "match": { + "by": "Interstellar", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-052": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 4 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-053": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 4 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-054": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-055": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-056": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 4 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-057": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 4 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-058": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-059": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-060": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 4 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-061": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-062": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-063": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-064": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-065": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-066": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-067": { + "meta": { + "name": "Irreplaceable", + "cn_name": null, + "en_name": "Irreplaceable", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 3 + }, + "names": ["Irreplaceable"], + "match": { + "by": "Irreplaceable", + "tmdbId": 297982, + "type": "tv", + "title": "无可替代", + "year": 2026 + } + }, + "H-068": { + "meta": { + "name": "Lego One Piece", + "cn_name": null, + "en_name": "Lego One Piece", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Lego One Piece"], + "match": { + "by": "Lego One Piece", + "tmdbId": 318918, + "type": "tv", + "title": "乐高航海王", + "year": 2026 + } + }, + "H-069": { + "meta": { + "name": "Lanterns", + "cn_name": null, + "en_name": "Lanterns", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 7 + }, + "names": ["Lanterns"], + "match": { + "by": "Lanterns", + "tmdbId": 95350, + "type": "tv", + "title": "绿灯军团", + "year": 2026 + } + }, + "H-070": { + "meta": { + "name": "Lanterns", + "cn_name": null, + "en_name": "Lanterns", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 7 + }, + "names": ["Lanterns"], + "match": { + "by": "Lanterns", + "tmdbId": 95350, + "type": "tv", + "title": "绿灯军团", + "year": 2026 + } + }, + "H-071": { + "meta": { + "name": "Lanterns", + "cn_name": null, + "en_name": "Lanterns", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 7 + }, + "names": ["Lanterns"], + "match": { + "by": "Lanterns", + "tmdbId": 95350, + "type": "tv", + "title": "绿灯军团", + "year": 2026 + } + }, + "H-072": { + "meta": { + "name": "Live Forever", + "cn_name": null, + "en_name": "Live Forever", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 12 + }, + "names": ["Live Forever"], + "match": { + "by": "Live Forever", + "tmdbId": 318884, + "type": "tv", + "title": "长生契", + "year": 2026 + } + }, + "H-073": { + "meta": { + "name": "Live Forever", + "cn_name": null, + "en_name": "Live Forever", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 12 + }, + "names": ["Live Forever"], + "match": { + "by": "Live Forever", + "tmdbId": 318884, + "type": "tv", + "title": "长生契", + "year": 2026 + } + }, + "H-074": { + "meta": { + "name": "Not A Stranger", + "cn_name": null, + "en_name": "Not A Stranger", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Not A Stranger"], + "match": { + "by": "Not A Stranger", + "tmdbId": 320760, + "type": "tv", + "title": "不识陌生人", + "year": 2026 + } + }, + "H-075": { + "meta": { + "name": "Not A Stranger", + "cn_name": null, + "en_name": "Not A Stranger", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Not A Stranger"], + "match": { + "by": "Not A Stranger", + "tmdbId": 320760, + "type": "tv", + "title": "不识陌生人", + "year": 2026 + } + }, + "H-076": { + "meta": { + "name": "Not A Stranger", + "cn_name": null, + "en_name": "Not A Stranger", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Not A Stranger"], + "match": { + "by": "Not A Stranger", + "tmdbId": 320760, + "type": "tv", + "title": "不识陌生人", + "year": 2026 + } + }, + "H-077": { + "meta": { + "name": "One Hundred Thousand Years Of Qi Refining", + "cn_name": null, + "en_name": "One Hundred Thousand Years Of Qi Refining", + "year": "2023", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 381 + }, + "names": ["One Hundred Thousand Years Of Qi Refining"], + "match": { + "by": "One Hundred Thousand Years Of Qi Refining", + "tmdbId": 220850, + "type": "tv", + "title": "炼气十万年", + "year": 2023 + } + }, + "H-078": { + "meta": { + "name": "One Hundred Thousand Years Of Qi Refining", + "cn_name": null, + "en_name": "One Hundred Thousand Years Of Qi Refining", + "year": "2023", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 381 + }, + "names": ["One Hundred Thousand Years Of Qi Refining"], + "match": { + "by": "One Hundred Thousand Years Of Qi Refining", + "tmdbId": 220850, + "type": "tv", + "title": "炼气十万年", + "year": 2023 + } + }, + "H-079": { + "meta": { + "name": "Peerless Battle Spirit", + "cn_name": null, + "en_name": "Peerless Battle Spirit", + "year": "2024", + "type": "电视剧", + "begin_season": 2, + "begin_episode": 28 + }, + "names": ["Peerless Battle Spirit"], + "match": { + "by": "Peerless Battle Spirit", + "tmdbId": 252788, + "type": "tv", + "title": "绝世战魂", + "year": 2024 + } + }, + "H-080": { + "meta": { + "name": "Peerless Battle Spirit", + "cn_name": null, + "en_name": "Peerless Battle Spirit", + "year": "2024", + "type": "电视剧", + "begin_season": 2, + "begin_episode": 28 + }, + "names": ["Peerless Battle Spirit"], + "match": { + "by": "Peerless Battle Spirit", + "tmdbId": 252788, + "type": "tv", + "title": "绝世战魂", + "year": 2024 + } + }, + "H-081": { + "meta": { + "name": "Peerless Battle Spirit", + "cn_name": null, + "en_name": "Peerless Battle Spirit", + "year": "2024", + "type": "电视剧", + "begin_season": 2, + "begin_episode": 28 + }, + "names": ["Peerless Battle Spirit"], + "match": { + "by": "Peerless Battle Spirit", + "tmdbId": 252788, + "type": "tv", + "title": "绝世战魂", + "year": 2024 + } + }, + "H-082": { + "meta": { + "name": "Shaque Trust No One", + "cn_name": null, + "en_name": "Shaque Trust No One", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Shaque Trust No One"], + "match": { + "by": "Shaque Trust No One", + "tmdbId": 285147, + "type": "tv", + "title": "寻女无归途", + "year": 2026 + } + }, + "H-083": { + "meta": { + "name": "Shaque Trust No One", + "cn_name": null, + "en_name": "Shaque Trust No One", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Shaque Trust No One"], + "match": { + "by": "Shaque Trust No One", + "tmdbId": 285147, + "type": "tv", + "title": "寻女无归途", + "year": 2026 + } + }, + "H-084": { + "meta": { + "name": "Shaque Trust No One", + "cn_name": null, + "en_name": "Shaque Trust No One", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["Shaque Trust No One"], + "match": { + "by": "Shaque Trust No One", + "tmdbId": 285147, + "type": "tv", + "title": "寻女无归途", + "year": 2026 + } + }, + "H-085": { + "meta": { + "name": "Spark Of The Long March", + "cn_name": null, + "en_name": "Spark Of The Long March", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 7 + }, + "names": ["Spark Of The Long March"], + "match": { + "by": "Spark Of The Long March", + "tmdbId": 336207, + "type": "tv", + "title": "征途", + "year": 2026 + } + }, + "H-086": { + "meta": { + "name": "Spark Of The Long March", + "cn_name": null, + "en_name": "Spark Of The Long March", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 7 + }, + "names": ["Spark Of The Long March"], + "match": { + "by": "Spark Of The Long March", + "tmdbId": 336207, + "type": "tv", + "title": "征途", + "year": 2026 + } + }, + "H-087": { + "meta": { + "name": "Spark Of The Long March", + "cn_name": null, + "en_name": "Spark Of The Long March", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 7 + }, + "names": ["Spark Of The Long March"], + "match": { + "by": "Spark Of The Long March", + "tmdbId": 336207, + "type": "tv", + "title": "征途", + "year": 2026 + } + }, + "H-088": { + "meta": { + "name": "Spring Of The Blade", + "cn_name": null, + "en_name": "Spring Of The Blade", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 20 + }, + "names": ["Spring Of The Blade"], + "match": { + "by": "Spring Of The Blade", + "tmdbId": 294990, + "type": "tv", + "title": "一瓯春", + "year": 2026 + } + }, + "H-089": { + "meta": { + "name": "Stay Low Profile", + "cn_name": null, + "en_name": "Stay Low Profile", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 32 + }, + "names": ["Stay Low Profile"], + "match": { + "by": "Stay Low Profile", + "tmdbId": 331064, + "type": "tv", + "title": "掌门低调点", + "year": 2026 + } + }, + "H-090": { + "meta": { + "name": "Stay Low Profile", + "cn_name": null, + "en_name": "Stay Low Profile", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 32 + }, + "names": ["Stay Low Profile"], + "match": { + "by": "Stay Low Profile", + "tmdbId": 331064, + "type": "tv", + "title": "掌门低调点", + "year": 2026 + } + }, + "H-091": { + "meta": { + "name": "Ten Thousand Worlds", + "cn_name": null, + "en_name": "Ten Thousand Worlds", + "year": "2021", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 468 + }, + "names": ["Ten Thousand Worlds"], + "match": { + "by": "Ten Thousand Worlds", + "tmdbId": 122612, + "type": "tv", + "title": "万界独尊", + "year": 2021 + } + }, + "H-092": { + "meta": { + "name": "Ten Thousand Worlds", + "cn_name": null, + "en_name": "Ten Thousand Worlds", + "year": "2021", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 468 + }, + "names": ["Ten Thousand Worlds"], + "match": { + "by": "Ten Thousand Worlds", + "tmdbId": 122612, + "type": "tv", + "title": "万界独尊", + "year": 2021 + } + }, + "H-093": { + "meta": { + "name": "The Crow Club", + "cn_name": null, + "en_name": "The Crow Club", + "year": "2026", + "type": "电视剧", + "begin_season": 1, + "begin_episode": 1 + }, + "names": ["The Crow Club"], + "match": { + "by": "The Crow Club", + "tmdbId": 312585, + "type": "tv", + "title": "乌鸦俱乐部", + "year": 2026 + } + }, + "H-094": { + "meta": { + "name": "The Science Of Interstellar", + "cn_name": null, + "en_name": "The Science Of Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["The Science Of Interstellar"], + "match": { + "by": "The Science Of Interstellar", + "tmdbId": 336592, + "type": "movie", + "title": "星际穿越中的科学", + "year": 2014 + } + }, + "H-095": { + "meta": { + "name": "Unabomber", + "cn_name": null, + "en_name": "Unabomber", + "year": "2026", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Unabomber"], + "match": { + "by": "Unabomber", + "tmdbId": 1492640, + "type": "movie", + "title": "大学炸弹客", + "year": 2026 + } + }, + "H-096": { + "meta": { + "name": "Unabomber", + "cn_name": null, + "en_name": "Unabomber", + "year": "2026", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Unabomber"], + "match": { + "by": "Unabomber", + "tmdbId": 1492640, + "type": "movie", + "title": "大学炸弹客", + "year": 2026 + } + }, + "H-097": { + "meta": { + "name": "Unabomber", + "cn_name": null, + "en_name": "Unabomber", + "year": "2026", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["Unabomber"], + "match": { + "by": "Unabomber", + "tmdbId": 1492640, + "type": "movie", + "title": "大学炸弹客", + "year": 2026 + } + }, + "H-098": { + "meta": { + "name": "星际穿越", + "cn_name": "星际穿越", + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "begin_episode": null + }, + "names": ["星际穿越", "Interstellar"], + "match": { + "by": "星际穿越", + "tmdbId": 157336, + "type": "movie", + "title": "星际穿越", + "year": 2014 + } + }, + "H-099": { + "meta": { + "name": "一纸报告,看穿人心", + "cn_name": "一纸报告,看穿人心", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["一纸报告,看穿人心"], + "match": null + }, + "H-100": { + "meta": { + "name": "丈夫的温柔陷阱", + "cn_name": "丈夫的温柔陷阱", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["丈夫的温柔陷阱"], + "match": null + }, + "H-101": { + "meta": { + "name": "不好意思,我开挂了", + "cn_name": "不好意思,我开挂了", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["不好意思,我开挂了"], + "match": null + }, + "H-102": { + "meta": { + "name": "不婚主义", + "cn_name": "不婚主义", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["不婚主义"], + "match": null + }, + "H-103": { + "meta": { + "name": "京夜喜你", + "cn_name": "京夜喜你", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["京夜喜你"], + "match": null + }, + "H-104": { + "meta": { + "name": "人中之龙", + "cn_name": "人中之龙", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 1, + "begin_episode": null + }, + "names": ["人中之龙"], + "match": { + "by": "人中之龙", + "tmdbId": 256116, + "type": "tv", + "title": "如龙", + "year": 2024 + } + }, + "H-105": { + "meta": { + "name": "今天有朵云爱我", + "cn_name": "今天有朵云爱我", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["今天有朵云爱我"], + "match": null + }, + "H-106": { + "meta": { + "name": "他的温柔蓄谋已久", + "cn_name": "他的温柔蓄谋已久", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["他的温柔蓄谋已久"], + "match": null + }, + "H-107": { + "meta": { + "name": "儿媳房间的秘密", + "cn_name": "儿媳房间的秘密", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["儿媳房间的秘密"], + "match": null + }, + "H-108": { + "meta": { + "name": "全府偷听我和闺蜜心声被带飞", + "cn_name": "全府偷听我和闺蜜心声被带飞", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["全府偷听我和闺蜜心声被带飞"], + "match": null + }, + "H-109": { + "meta": { + "name": "全村都在看,影帝下地狂追前女友", + "cn_name": "全村都在看,影帝下地狂追前女友", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["全村都在看,影帝下地狂追前女友"], + "match": null + }, + "H-110": { + "meta": { + "name": "公公甩资让我离婚,前夫婚礼上我惊艳全场", + "cn_name": "公公甩资让我离婚,前夫婚礼上我惊艳全场", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["公公甩资让我离婚,前夫婚礼上我惊艳全场"], + "match": null + }, + "H-111": { + "meta": { + "name": "再造宋骨", + "cn_name": "再造宋骨", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["再造宋骨"], + "match": null + }, + "H-112": { + "meta": { + "name": "冥王归来,专治大小姐不服", + "cn_name": "冥王归来,专治大小姐不服", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["冥王归来,专治大小姐不服"], + "match": null + }, + "H-113": { + "meta": { + "name": "凡人无惧之躯", + "cn_name": "凡人无惧之躯", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "begin_episode": null + }, + "names": ["凡人无惧之躯"], + "match": null + } + } +} diff --git a/packages/domain/test/differential/identity/ours.json b/packages/domain/test/differential/identity/ours.json new file mode 100644 index 00000000..eafd055e --- /dev/null +++ b/packages/domain/test/differential/identity/ours.json @@ -0,0 +1,1943 @@ +{ + "summary": { + "samples": 113, + "works": 50, + "consistent": 112, + "oursMissed": 1, + "oursWrong": 0, + "oursExtra": 0, + "intentional": 0, + "mpDefect": 1, + "rate": 1 + }, + "rows": [ + { + "id": "H-001", + "title": "[动漫]Martial Master S01 2020 1080p WEB-DL H.264 AAC2.0-HHWEB[武神主宰 / 武神主宰 第一季 / The God of War Dominates | 第685集 | 1080p | 类型: 动画/奇幻/冒险 | 导演: 老鹰 | 主演: 许子尧/唐泽宗/陈帅/吴凡/孙科][180.86 MB]", + "parsed": { + "titleCn": "武神主宰", + "titleEn": "Martial Master", + "altTitles": ["武神主宰 第一季", "The God of War Dominates"], + "year": 2020, + "season": 1 + }, + "mp": "tv:110181", + "ours": "tv:110181", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:110181 武神主宰 2020", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-002", + "title": "[动漫]Martial Master S01 2020 1080p WEB-DL H.265 AAC2.0-HHWEB[武神主宰 / 武神主宰 第一季 / The God of War Dominates | 第685集 | 1080p | 类型: 动画/奇幻/冒险 | 导演: 老鹰 | 主演: 许子尧/唐泽宗/陈帅/吴凡/孙科][480.41 MB]", + "parsed": { + "titleCn": "武神主宰", + "titleEn": "Martial Master", + "altTitles": ["武神主宰 第一季", "The God of War Dominates"], + "year": 2020, + "season": 1 + }, + "mp": "tv:110181", + "ours": "tv:110181", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:110181 武神主宰 2020", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-003", + "title": "[动漫]Martial Master S01 2020 2160p WEB-DL H.265 AAC2.0-HHWEB[武神主宰 / 武神主宰 第一季 / The God of War Dominates | 第685集 | 4K | 类型: 动画/奇幻/冒险 | 导演: 老鹰 | 主演: 许子尧/唐泽宗/陈帅/吴凡/孙科][450.29 MB]", + "parsed": { + "titleCn": "武神主宰", + "titleEn": "Martial Master", + "altTitles": ["武神主宰 第一季", "The God of War Dominates"], + "year": 2020, + "season": 1 + }, + "mp": "tv:110181", + "ours": "tv:110181", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:110181 武神主宰 2020", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-004", + "title": "Mononoke The Movie Chapter III The Curse of the Serpent 2026 1080p NF WEB-DL H.264 DDP5.1-HHWEB", + "parsed": { + "titleCn": "怪化猫:蛇神", + "titleEn": "Mononoke The Movie Chapter III The Curse of the Serpent", + "altTitles": ["怪化猫第3章:蛇神"], + "year": 2026 + }, + "mp": "movie:1322562", + "ours": "movie:1322562", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1322562 剧场版物怪:第 3 章:蛇神 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "sequel:match"], + "verdict": "consistent" + }, + { + "id": "H-005", + "title": "Archives S01 2009 1080p WEB-DL H.264 AAC-HHWEB", + "parsed": { + "titleCn": "档案", + "titleEn": "Archives", + "altTitles": ["档案解密"], + "year": 2009, + "season": 1 + }, + "mp": "tv:201401", + "ours": "tv:201401", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:201401 档案 2009", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-006", + "title": "A Different World S01 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "别样世界", + "titleEn": "A Different World", + "altTitles": ["别样世界重启版", "新别样世界"], + "year": 2026, + "season": 1 + }, + "mp": "tv:305357", + "ours": "tv:305357", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:305357 别样世界 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-007", + "title": "A Different World S01 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "别样世界", + "titleEn": "A Different World", + "altTitles": ["别样世界重启版", "新别样世界"], + "year": 2026, + "season": 1 + }, + "mp": "tv:305357", + "ours": "tv:305357", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:305357 别样世界 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-008", + "title": "A Prophet S01 2026 2160p TX WEB-DL H.265 HDR HFR DDP5.1-HHWEB", + "parsed": { + "titleCn": "我不是大师", + "titleEn": "A Prophet", + "altTitles": ["长风起", "将相", "江相", "我是个算命先生"], + "year": 2026, + "season": 1 + }, + "mp": "tv:289078", + "ours": "tv:289078", + "status": "auto", + "reason": "rule_confirmed:tie_break", + "best": "tv:289078 我不是大师 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-009", + "title": "Baby Do Die Do 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "贝比毙咚", + "titleEn": "Baby Do Die Do", + "altTitles": ["死亡童谣"], + "year": 2026 + }, + "mp": "movie:1512084", + "ours": "movie:1512084", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1512084 贝比毙咚 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-010", + "title": "Baby Do Die Do 2026 2160p NF WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "贝比毙咚", + "titleEn": "Baby Do Die Do", + "altTitles": ["死亡童谣"], + "year": 2026 + }, + "mp": "movie:1512084", + "ours": "movie:1512084", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1512084 贝比毙咚 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-011", + "title": "Baby Do Die Do 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "贝比毙咚", + "titleEn": "Baby Do Die Do", + "altTitles": ["死亡童谣"], + "year": 2026 + }, + "mp": "movie:1512084", + "ours": "movie:1512084", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1512084 贝比毙咚 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-012", + "title": "Chef on Fire S01 2026 2160p NF WEB-DL H.265 AAC2.0-HHWEB", + "parsed": { + "titleCn": "开火开伙", + "titleEn": "Chef on Fire", + "year": 2026, + "season": 1 + }, + "mp": "tv:333167", + "ours": "tv:333167", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:333167 开火开伙 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-013", + "title": "China Now S01 2019 1080p WEB-DL H.264 AAC-HHWEB", + "parsed": { + "titleCn": "这就是中国", + "titleEn": "China Now", + "year": 2019, + "season": 1 + }, + "mp": "tv:206367", + "ours": "tv:206367", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:206367 这就是中国 2019", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-014", + "title": "[动漫]Delta Force_ The Creator S01 2026 1080p WEB-DL H.264 AAC2.0-HHWEB[三角洲:造物主玩家 | 第25集 | 1080p | 类型: 科幻/动画 | 导演: 段文兴][105.45 MB]", + "parsed": { + "titleCn": "三角洲:造物主玩家", + "titleEn": "Delta Force The Creator", + "year": 2026, + "season": 1 + }, + "mp": "tv:331320", + "ours": "tv:331320", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:331320 三角洲:造物主玩家 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-015", + "title": "Dongbei's Back S01 2026 1080p WEB-DL H.264 AAC2.0-HHWEB", + "parsed": { + "titleCn": "东北有个周东北", + "titleEn": "Dongbeis Back", + "year": 2026, + "season": 1 + }, + "mp": "tv:312027", + "ours": "tv:312027", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:312027 东北有个周东北 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-016", + "title": "Dongbei's Back S01 2026 2160p IQ WEB-DL H.265 DDP5.1 2Audios-HHWEB", + "parsed": { + "titleCn": "东北有个周东北", + "titleEn": "Dongbeis Back", + "year": 2026, + "season": 1 + }, + "mp": "tv:312027", + "ours": "tv:312027", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:312027 东北有个周东北 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-017", + "title": "Dongbei's Back S01 2026 2160p IQ WEB-DL H.265 DDP5.1 3Audios-HHWEB", + "parsed": { + "titleCn": "东北有个周东北", + "titleEn": "Dongbeis Back", + "year": 2026, + "season": 1 + }, + "mp": "tv:312027", + "ours": "tv:312027", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:312027 东北有个周东北 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-018", + "title": "Dongbei's Back S01 2026 2160p WEB-DL H.265 EDR AAC2.0-HHWEB", + "parsed": { + "titleCn": "东北有个周东北", + "titleEn": "Dongbeis Back", + "year": 2026, + "season": 1 + }, + "mp": "tv:312027", + "ours": "tv:312027", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:312027 东北有个周东北 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-019", + "title": "Dongbei's Back S01 2026 2160p WEB-DL H.265 HDR AAC2.0-HHWEB", + "parsed": { + "titleCn": "东北有个周东北", + "titleEn": "Dongbeis Back", + "year": 2026, + "season": 1 + }, + "mp": "tv:312027", + "ours": "tv:312027", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:312027 东北有个周东北 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-020", + "title": "[电视剧]Dongbei's Back S01 2026 2160p IQ WEB-DL H.265 DDP5.1 2Audios-HHWEB[东北有个周东北 | 第04集 | 4K+多规格音轨 | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙][422.03 MB]", + "parsed": { + "titleCn": "东北有个周东北", + "titleEn": "Dongbeis Back", + "year": 2026, + "season": 1 + }, + "mp": "tv:312027", + "ours": "tv:312027", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:312027 东北有个周东北 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-021", + "title": "False Memory S01 2026 1080p WEB-DL H.264 AAC-HHWEB", + "parsed": { + "titleCn": "记忆管理局", + "titleEn": "False Memory", + "altTitles": ["Memory Management Bureau"], + "year": 2026, + "season": 1 + }, + "mp": "tv:280564", + "ours": "tv:280564", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:280564 记忆管理局 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-022", + "title": "False Memory S01 2026 2160p WEB-DL H.265 AAC-HHWEB", + "parsed": { + "titleCn": "记忆管理局", + "titleEn": "False Memory", + "altTitles": ["Memory Management Bureau"], + "year": 2026, + "season": 1 + }, + "mp": "tv:280564", + "ours": "tv:280564", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:280564 记忆管理局 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-023", + "title": "False Memory S01 2026 2160p WEB-DL H.265 HDR AAC-HHWEB", + "parsed": { + "titleCn": "记忆管理局", + "titleEn": "False Memory", + "altTitles": ["Memory Management Bureau"], + "year": 2026, + "season": 1 + }, + "mp": "tv:280564", + "ours": "tv:280564", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:280564 记忆管理局 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-024", + "title": "GG Bond Interstellar Mission 2024 1080p WEB-DL H264 AAC-HHWEB", + "parsed": { + "titleCn": "猪猪侠大电影·星际行动", + "titleEn": "GG Bond Interstellar Mission", + "year": 2024 + }, + "mp": "movie:1260260", + "ours": "movie:1260260", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1260260 猪猪侠大电影·星际行动 2024", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-025", + "title": "GG Bond Interstellar Mission 2024 2160p WEB-DL H265 DDP5.1-HHWEB", + "parsed": { + "titleCn": "猪猪侠大电影·星际行动", + "titleEn": "GG Bond Interstellar Mission", + "year": 2024 + }, + "mp": "movie:1260260", + "ours": "movie:1260260", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1260260 猪猪侠大电影·星际行动 2024", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-026", + "title": "GG Bond Interstellar Mission 2024 2160p WEB-DL H265 EDR DDP5.1-HHWEB", + "parsed": { + "titleCn": "猪猪侠大电影·星际行动", + "titleEn": "GG Bond Interstellar Mission", + "year": 2024 + }, + "mp": "movie:1260260", + "ours": "movie:1260260", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1260260 猪猪侠大电影·星际行动 2024", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-027", + "title": "GG Bond Interstellar Mission 2024 2160p WEB-DL H265 HDR DDP5.1-HHWEB", + "parsed": { + "titleCn": "猪猪侠大电影·星际行动", + "titleEn": "GG Bond Interstellar Mission", + "year": 2024 + }, + "mp": "movie:1260260", + "ours": "movie:1260260", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1260260 猪猪侠大电影·星际行动 2024", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-028", + "title": "Gladiator in the Theater S01 2026 1080p WEB-DL H.264 AAC2.0-HHWEB", + "parsed": { + "titleCn": "云雀叫天录", + "titleEn": "Gladiator in the Theater", + "year": 2026, + "season": 1 + }, + "mp": "tv:288873", + "ours": "tv:288873", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:288873 云雀叫天录 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-029", + "title": "Gladiator in the Theater S01 2026 2160p WEB-DL H.264 AAC2.0-HHWEB", + "parsed": { + "titleCn": "云雀叫天录", + "titleEn": "Gladiator in the Theater", + "year": 2026, + "season": 1 + }, + "mp": "tv:288873", + "ours": "tv:288873", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:288873 云雀叫天录 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-030", + "title": "GuAn S01 2026 1080p WEB-DL H.264 AAC2.0-HHWEB", + "parsed": { + "titleCn": "一斩苍穹", + "titleEn": "GuAn", + "altTitles": ["一斩苍穹之起于劫火+魔渊浮沉+归心证道+倾天覆难+遗迹灾变", "Gu An"], + "year": 2026, + "season": 1 + }, + "mp": "tv:303287", + "ours": "tv:303287", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:303287 一斩苍穹 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-031", + "title": "GuAn S01 2026 2160p WEB-DL H.265 AAC2.0-HHWEB", + "parsed": { + "titleCn": "一斩苍穹", + "titleEn": "GuAn", + "altTitles": ["一斩苍穹之起于劫火+魔渊浮沉+归心证道+倾天覆难+遗迹灾变", "Gu An"], + "year": 2026, + "season": 1 + }, + "mp": "tv:303287", + "ours": "tv:303287", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:303287 一斩苍穹 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-032", + "title": "GuAn S01 2026 2160p WEB-DL H.265 HQ AAC2.0-HHWEB", + "parsed": { + "titleCn": "一斩苍穹", + "titleEn": "GuAn", + "altTitles": ["一斩苍穹之起于劫火+魔渊浮沉+归心证道+倾天覆难+遗迹灾变", "Gu An"], + "year": 2026, + "season": 1 + }, + "mp": "tv:303287", + "ours": "tv:303287", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:303287 一斩苍穹 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-033", + "title": "Habeas Corpus S01 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "人身保护令", + "titleEn": "Habeas Corpus", + "year": 2026, + "season": 1 + }, + "mp": "tv:308963", + "ours": "tv:308963", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:308963 人身保护令 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-034", + "title": "Habeas Corpus S01 2026 2160p NF WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "人身保护令", + "titleEn": "Habeas Corpus", + "year": 2026, + "season": 1 + }, + "mp": "tv:308963", + "ours": "tv:308963", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:308963 人身保护令 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-035", + "title": "Habeas Corpus S01 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "人身保护令", + "titleEn": "Habeas Corpus", + "year": 2026, + "season": 1 + }, + "mp": "tv:308963", + "ours": "tv:308963", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:308963 人身保护令 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-036", + "title": "[综艺]Heart Signal S09 2018 1080p WEB-DL H.264 AAC2.0-HHWEB[心动的信号 / 心动的信号9 第九季 | 第29-30集(第09期上+中) | 1080p | 类型: 爱情/真人秀 | 主演: 代旭/杜海涛/薛凯琪/杨超越/张纯烨][1.36 GB]", + "parsed": { + "titleCn": "心动的信号", + "titleEn": "Heart Signal", + "altTitles": ["心动的信号9 第九季"], + "year": 2018, + "season": 9 + }, + "mp": "tv:103147", + "ours": "tv:103147", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:103147 心动的信号 2018", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-037", + "title": "[综艺]Heart Signal S09 2018 2160p WEB-DL H.265 AAC2.0-HHWEB[心动的信号 / 心动的信号9 第九季 | 第29-30集(第09期上+中) | 4K | 类型: 爱情/真人秀 | 主演: 代旭/杜海涛/薛凯琪/杨超越/张纯烨][3.48 GB]", + "parsed": { + "titleCn": "心动的信号", + "titleEn": "Heart Signal", + "altTitles": ["心动的信号9 第九季"], + "year": 2018, + "season": 9 + }, + "mp": "tv:103147", + "ours": "tv:103147", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:103147 心动的信号 2018", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-038", + "title": "Hi Come In S07 2022 2160p NF WEB-DL H.265 AAC2.0-HHWEB", + "parsed": { + "titleCn": "嗨!营业中", + "titleEn": "Hi Come In", + "altTitles": ["Hi, Come in 第七季"], + "year": 2022, + "season": 7 + }, + "mp": "tv:211849", + "ours": "tv:211849", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:211849 嗨!营业中 2022", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-039", + "title": "Interstellar IMAX 2014 Bluray 1080p x264 DTS 2Audios-CMCT", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "altTitles": ["星际空间", "星际之间", "星際啟示錄"], + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-040", + "title": "Interstellar 2014 1080p NF WEB-DL DDP5.1 H264-HHWEB", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-041", + "title": "Interstellar 2014 1080p iTunes WEB-DL DD5 1 H264-HHWEB", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-042", + "title": "Interstellar 2014 2160p HDR UHD BluRay DTS-HD MA 5.1 2Audio x265 10bit-HDS", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "altTitles": ["Flora‘s Letter", "星际", "星际之间", "星际启示录", "星际效应", "星际空间"], + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-043", + "title": "Interstellar 2014 2160p PROPER IMAX REMUX DV HDR10+ TrueHD 7 1 Atmos-jennaortegaUHD", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "altTitles": ["星际启示录", "星际效应", "星际空间", "星际之间", "星际远航", "星际"], + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-044", + "title": "Interstellar 2014 2160p UHD Blu-ray Remux HEVC DTS-HD MA 5.1-PTer", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-045", + "title": "Interstellar 2014 2160p iTunes WEB-DL DD5 1 DV HDR H 265-HHWEB", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-046", + "title": "Interstellar 2014 2160p iTunes WEB-DL DD5 1 H 265-HHWEB", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-047", + "title": "Interstellar 2014 3Disc 2160p UHD Blu-ray HEVC DTS-HD MA 5.1-CMCT", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "altTitles": ["星际启示录", "星际效应"], + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-048", + "title": "Interstellar 2014 IMAX UHD BluRay 2160p 10bit HDR 2Audio DTS-HD MA 5.1 x265-beAst", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "altTitles": ["星際啟示錄", "星際效應"], + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-049", + "title": "Interstellar 2014 UHD Blu-ray 2016p HEVC DTS-HD MA 7 1-Pete@HDSky", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "altTitles": ["Flora's Letter", "星际", "星际之间", "星际启示录", "星际效应", "星际空间"], + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-050", + "title": "Interstellar 2014 UHD Blu-ray 2016p REMUX HEVC DTS-HD MA 5.1-HDH", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "altTitles": ["星际启示录"], + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-051", + "title": "Interstellar 2014 UHD Blu-ray 2160p HEVC DTS-HD MA 5.1-CMCT", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-052", + "title": "Irreplaceable S01 2026 1080p YK WEB-DL H.264 DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-053", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-054", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 DV HFR HQ DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-055", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 DV HQ DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-056", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-057", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HFR DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-058", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HFR HQ DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-059", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HQ DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-060", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HFR DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-061", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HFR HQ DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-062", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HQ DTS5.1-HHWEB", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-063", + "title": "[电视剧]Irreplaceable S01 2026 1080p YK WEB-DL H.264 DTS5.1-HHWEB[无可替代 | 第03集 | 1080p | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][510.37 MB]", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-064", + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 DTS5.1-HHWEB[无可替代 | 第03集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][883.42 MB]", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-065", + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR DTS5.1-HHWEB[无可替代 | 第03集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][851.20 MB]", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-066", + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HFR DTS5.1-HHWEB[无可替代 | 第03集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][1.01 GB]", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-067", + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 HFR DTS5.1-HHWEB[无可替代 | 第03集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][1.06 GB]", + "parsed": { + "titleCn": "无可替代", + "titleEn": "Irreplaceable", + "year": 2026, + "season": 1 + }, + "mp": "tv:297982", + "ours": "tv:297982", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:297982 无可替代 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-068", + "title": "LEGO ONE PIECE S01 2026 1080p NF WEB-DL H.264 DDP5.1.Atmos-HHWEB[新]", + "parsed": { + "titleCn": "乐高航海王", + "titleEn": "LEGO ONE PIECE", + "altTitles": ["乐高海贼王"], + "year": 2026, + "season": 1 + }, + "mp": "tv:318918", + "ours": "tv:318918", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:318918 乐高航海王 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-069", + "title": "Lanterns S01 2026 1080p HMAX WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "绿灯军团", + "titleEn": "Lanterns", + "altTitles": ["绿光军团", "灯侠", "灯团", "绿灯侠", "Green Lantern", "Lantern"], + "year": 2026, + "season": 1 + }, + "mp": "tv:95350", + "ours": "tv:95350", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:95350 绿灯军团 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-070", + "title": "Lanterns S01 2026 2160p HMAX WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "绿灯军团", + "titleEn": "Lanterns", + "altTitles": ["绿光军团", "灯侠", "灯团", "绿灯侠", "Green Lantern", "Lantern"], + "year": 2026, + "season": 1 + }, + "mp": "tv:95350", + "ours": "tv:95350", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:95350 绿灯军团 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-071", + "title": "Lanterns S01 2026 2160p HMAX WEB-DL H.265 DV HDR DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "绿灯军团", + "titleEn": "Lanterns", + "altTitles": ["绿光军团", "灯侠", "灯团", "绿灯侠", "Green Lantern", "Lantern"], + "year": 2026, + "season": 1 + }, + "mp": "tv:95350", + "ours": "tv:95350", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:95350 绿灯军团 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-072", + "title": "Live Forever S01 2026 1080p WEB-DL H.264 AAC-HHWEB", + "parsed": { + "titleCn": "长生契", + "titleEn": "Live Forever", + "altTitles": ["长生"], + "year": 2026, + "season": 1 + }, + "mp": "tv:318884", + "ours": "tv:318884", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:318884 长生契 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-073", + "title": "Live Forever S01 2026 2160p WEB-DL H.264 AAC-HHWEB", + "parsed": { + "titleCn": "长生契", + "titleEn": "Live Forever", + "altTitles": ["长生"], + "year": 2026, + "season": 1 + }, + "mp": "tv:318884", + "ours": "tv:318884", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:318884 长生契 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-074", + "title": "Not a Stranger S01 2026 2160p NF WEB-DL H.265 DDP5.1-HHWEB", + "parsed": { + "titleCn": "不识陌生人", + "titleEn": "Not a Stranger", + "altTitles": ["I Know You"], + "year": 2026, + "season": 1 + }, + "mp": "tv:320760", + "ours": "tv:320760", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:320760 不识陌生人 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-075", + "title": "Not a Stranger S01 2026 2160p NF WEB-DL H.265 DV DDP5.1-HHWEB", + "parsed": { + "titleCn": "不识陌生人", + "titleEn": "Not a Stranger", + "altTitles": ["I Know You"], + "year": 2026, + "season": 1 + }, + "mp": "tv:320760", + "ours": "tv:320760", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:320760 不识陌生人 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-076", + "title": "Not a Stranger S01 2026 2160p NF WEB-DL H.265 HDR DDP5.1-HHWEB", + "parsed": { + "titleCn": "不识陌生人", + "titleEn": "Not a Stranger", + "altTitles": ["I Know You"], + "year": 2026, + "season": 1 + }, + "mp": "tv:320760", + "ours": "tv:320760", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:320760 不识陌生人 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-077", + "title": "One Hundred Thousand Years Of Qi Refining S01 2023 2160p WEB-DL H.265 AAC2.0-HHWEB", + "parsed": { + "titleCn": "炼气十万年", + "titleEn": "One Hundred Thousand Years Of Qi Refining", + "altTitles": ["100,000 Years of Qi Refining"], + "year": 2023, + "season": 1 + }, + "mp": "tv:220850", + "ours": "tv:220850", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:220850 炼气十万年 2023", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-078", + "title": "[动漫]One Hundred Thousand Years Of Qi Refining S01 2023 1080p WEB-DL H.264 AAC2.0-HHWEB[炼气十万年 / One Hundred Thousand Years of Qi Refining / 100,000 Years of Qi Refining | 第381集 | 1080p | 类型: 动作/动画/奇幻 | 导演: 李廷赫 | 主演: 袁铭喆/朱蓉蓉/夜渡于野/孙睿扬/王曼诗][213.58 MB]", + "parsed": { + "titleCn": "炼气十万年", + "titleEn": "One Hundred Thousand Years Of Qi Refining", + "altTitles": ["100,000 Years of Qi Refining"], + "year": 2023, + "season": 1 + }, + "mp": "tv:220850", + "ours": "tv:220850", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:220850 炼气十万年 2023", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-079", + "title": "Peerless Battle Spirit S02 2024 1080p WEB-DL H.264 AAC2.0-HHWEB", + "parsed": { + "titleCn": "绝世战魂", + "titleEn": "Peerless Battle Spirit", + "altTitles": ["Super Heroic Spirit 2 第二季"], + "year": 2024, + "season": 2 + }, + "mp": "tv:252788", + "ours": "tv:252788", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:252788 绝世战魂 2024", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-080", + "title": "Peerless Battle Spirit S02 2024 2160p WEB-DL H.265 EDR AAC2.0-HHWEB", + "parsed": { + "titleCn": "绝世战魂", + "titleEn": "Peerless Battle Spirit", + "altTitles": ["Super Heroic Spirit 2 第二季"], + "year": 2024, + "season": 2 + }, + "mp": "tv:252788", + "ours": "tv:252788", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:252788 绝世战魂 2024", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-081", + "title": "Peerless Battle Spirit S02 2024 2160p WEB-DL H.265 HDR AAC2.0-HHWEB", + "parsed": { + "titleCn": "绝世战魂", + "titleEn": "Peerless Battle Spirit", + "altTitles": ["Super Heroic Spirit 2 第二季"], + "year": 2024, + "season": 2 + }, + "mp": "tv:252788", + "ours": "tv:252788", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:252788 绝世战魂 2024", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-082", + "title": "Shaque Trust No One S01 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "寻女无归途", + "titleEn": "Shaque Trust No One", + "altTitles": ["Shaque: Trust No One"], + "year": 2026, + "season": 1 + }, + "mp": "tv:285147", + "ours": "tv:285147", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:285147 寻女无归途 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-083", + "title": "Shaque Trust No One S01 2026 2160p NF WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "寻女无归途", + "titleEn": "Shaque Trust No One", + "altTitles": ["Shaque: Trust No One"], + "year": 2026, + "season": 1 + }, + "mp": "tv:285147", + "ours": "tv:285147", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:285147 寻女无归途 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-084", + "title": "Shaque Trust No One S01 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "寻女无归途", + "titleEn": "Shaque Trust No One", + "altTitles": ["Shaque: Trust No One"], + "year": 2026, + "season": 1 + }, + "mp": "tv:285147", + "ours": "tv:285147", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:285147 寻女无归途 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-085", + "title": "[电视剧]Spark of the Long March S01 2026 2160p IQ WEB-DL H.265 DDP5.1 2Audios-HHWEB[征途 / 星火征途 / 多杰的长征 | 第07-08集 | 4K+多规格音轨 | 类型: 历史 | 导演: 王伟民 | 主演: 李健/张宁江/吴其江/林江国/侯京健][2.76 GB]", + "parsed": { + "titleCn": "征途", + "titleEn": "Spark of the Long March", + "altTitles": ["星火征途", "多杰的长征"], + "year": 2026, + "season": 1 + }, + "mp": "tv:336207", + "ours": "tv:336207", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:336207 征途 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-086", + "title": "[电视剧]Spark of the Long March S01 2026 2160p WEB-DL H.265 EDR AAC2.0-HHWEB[征途 / 星火征途 / 多杰的长征 | 第07-08集 | 4K 高码 | 类型: 历史 | 导演: 王伟民 | 主演: 李健/张宁江/吴其江/林江国/侯京健][2.48 GB]", + "parsed": { + "titleCn": "征途", + "titleEn": "Spark of the Long March", + "altTitles": ["星火征途", "多杰的长征"], + "year": 2026, + "season": 1 + }, + "mp": "tv:336207", + "ours": "tv:336207", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:336207 征途 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-087", + "title": "[电视剧]Spark of the Long March S01 2026 2160p WEB-DL H.265 HDR AAC2.0-HHWEB[征途 / 星火征途 / 多杰的长征 | 第07-08集 | 4K HDR | 类型: 历史 | 导演: 王伟民 | 主演: 李健/张宁江/吴其江/林江国/侯京健][9.27 GB]", + "parsed": { + "titleCn": "征途", + "titleEn": "Spark of the Long March", + "altTitles": ["星火征途", "多杰的长征"], + "year": 2026, + "season": 1 + }, + "mp": "tv:336207", + "ours": "tv:336207", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:336207 征途 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-088", + "title": "[电视剧]Spring of the Blade S01 2026 2160p YK WEB-DL H.265 DV HFR HQ AAC2.0-HHWEB[一瓯春 | 第20-24集 | 4K 高码 杜比视界 | 类型: 爱情/古装 | 导演: 潘安子 | 主演: 许凯/周也/白澍/闵春晓/柯颖][26.37 GB]", + "parsed": { + "titleCn": "一瓯春", + "titleEn": "Spring of the Blade", + "year": 2026, + "season": 1 + }, + "mp": "tv:294990", + "ours": "tv:294990", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:294990 一瓯春 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-089", + "title": "[动漫]Stay Low Profile S01 2026 1080p WEB-DL H.264 AAC-HHWEB[掌门低调点 / Stay Low Profile, Sect Chief | 第32集 | 1080p | 类型: 喜剧/动作/动画 | 主演: 宁冀荣/子兮/三方方 [内嵌中字]][191.56 MB]", + "parsed": { + "titleCn": "掌门低调点", + "titleEn": "Stay Low Profile", + "altTitles": ["Stay Low Profile, Sect Chief"], + "year": 2026, + "season": 1 + }, + "mp": "tv:331064", + "ours": "tv:331064", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:331064 掌门低调点 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-090", + "title": "[动漫]Stay Low Profile S01 2026 1080p WEB-DL H.265 HDR AAC-HHWEB[掌门低调点 / Stay Low Profile, Sect Chief | 第32集 | 1080p HDR | 类型: 喜剧/动作/动画 | 主演: 宁冀荣/子兮/三方方 [内嵌中字]][136.33 MB]", + "parsed": { + "titleCn": "掌门低调点", + "titleEn": "Stay Low Profile", + "altTitles": ["Stay Low Profile, Sect Chief"], + "year": 2026, + "season": 1 + }, + "mp": "tv:331064", + "ours": "tv:331064", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:331064 掌门低调点 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-091", + "title": "[动漫]Ten Thousand Worlds S01 2021 1080p WEB-DL H.264 AAC2.0-HHWEB[万界独尊 | 第468集 | 1080p | 类型: 动画 | 导演: 叶老酒/酱紫 | 主演: 王大伟/柳知萧/陆敏悦 Minyue Lu/黄骥/关帅][213.89 MB]", + "parsed": { + "titleCn": "万界独尊", + "titleEn": "Ten Thousand Worlds", + "year": 2021, + "season": 1 + }, + "mp": "tv:122612", + "ours": "tv:122612", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:122612 万界独尊 2021", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-092", + "title": "[动漫]Ten Thousand Worlds S01 2021 2160p WEB-DL H.265 AAC2.0-HHWEB[万界独尊 | 第468集 | 4K | 类型: 动画 | 导演: 叶老酒/酱紫 | 主演: 王大伟/柳知萧/陆敏悦 Minyue Lu/黄骥/关帅][459.44 MB]", + "parsed": { + "titleCn": "万界独尊", + "titleEn": "Ten Thousand Worlds", + "year": 2021, + "season": 1 + }, + "mp": "tv:122612", + "ours": "tv:122612", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:122612 万界独尊 2021", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-093", + "title": "The Crow Club S01 2026 2160p NF WEB-DL H.265 AAC2.0-HHWEB", + "parsed": { + "titleCn": "乌鸦俱乐部", + "titleEn": "The Crow Club", + "year": 2026, + "season": 1 + }, + "mp": "tv:312585", + "ours": "tv:312585", + "status": "auto", + "reason": "rule_confirmed", + "best": "tv:312585 乌鸦俱乐部 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:match", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-094", + "title": "The Science of Interstellar 2014 BluRay 720p x264 AC3-CMCT", + "parsed": { + "titleCn": "星际穿越中的科学", + "titleEn": "The Science of Interstellar", + "year": 2014 + }, + "mp": "movie:336592", + "ours": "movie:336592", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:336592 星际穿越中的科学 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-095", + "title": "UNABOMBER 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "大学炸弹客", + "titleEn": "UNABOMBER", + "altTitles": ["追踪炸弹客", "炸弹客"], + "year": 2026 + }, + "mp": "movie:1492640", + "ours": "movie:1492640", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1492640 大学炸弹客 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-096", + "title": "UNABOMBER 2026 2160p NF WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "大学炸弹客", + "titleEn": "UNABOMBER", + "altTitles": ["追踪炸弹客", "炸弹客"], + "year": 2026 + }, + "mp": "movie:1492640", + "ours": "movie:1492640", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1492640 大学炸弹客 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-097", + "title": "UNABOMBER 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "parsed": { + "titleCn": "大学炸弹客", + "titleEn": "UNABOMBER", + "altTitles": ["追踪炸弹客", "炸弹客"], + "year": 2026 + }, + "mp": "movie:1492640", + "ours": "movie:1492640", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:1492640 大学炸弹客 2026", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-098", + "title": "星际穿越 Interstellar 2014 BluRay 2160p x265.10bit 4Audio mUHD-FRDS", + "parsed": { + "titleCn": "星际穿越", + "titleEn": "Interstellar", + "year": 2014 + }, + "mp": "movie:157336", + "ours": "movie:157336", + "status": "auto", + "reason": "rule_confirmed", + "best": "movie:157336 星际穿越 2014", + "bestEvidence": ["level:rule_confirmed", "title:exact", "year:exact", "type:unknown", "name_langs:2"], + "verdict": "consistent" + }, + { + "id": "H-099", + "title": "一纸报告,看穿人心 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "一纸报告 看穿人心", + "altTitles": ["一纸报告,看穿人心"], + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-100", + "title": "丈夫的温柔陷阱 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "丈夫的温柔陷阱", + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-101", + "title": "不好意思,我开挂了 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "不好意思 我开挂了", + "altTitles": ["不好意思,我开挂了"], + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-102", + "title": "不婚主义 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "不婚主义", + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-103", + "title": "京夜喜你 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "京夜喜你", + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-104", + "title": "人中之龙第一季 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "人中之龙", + "altTitles": ["人中之龙第一季"], + "season": 1 + }, + "mp": "tv:256116", + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "ours_missed", + "deviation": { + "kind": "mp_defect", + "expect": null, + "note": "短剧《人中之龙第一季》(全98集,无年份):MP 用中文名搜 tv 无直达标题,逐个拉详情后按译名「人中之龙」命中《如龙》(Like a Dragon: Yakuza,2024)。我们:别名命中既无年份也无第二种文字的名称佐证 → 不自动绑定" + } + }, + { + "id": "H-105", + "title": "今天有朵云爱我 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "今天有朵云爱我", + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-106", + "title": "他的温柔蓄谋已久 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "他的温柔蓄谋已久", + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-107", + "title": "儿媳房间的秘密 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "儿媳房间的秘密", + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-108", + "title": "全府偷听我和闺蜜心声被带飞 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "全府偷听我和闺蜜心声被带飞", + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-109", + "title": "全村都在看,影帝下地狂追前女友 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "全村都在看 影帝下地狂追前女友", + "altTitles": ["全村都在看,影帝下地狂追前女友"], + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-110", + "title": "公公甩资让我离婚,前夫婚礼上我惊艳全场 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "公公甩资让我离婚 前夫婚礼上我惊艳全场", + "altTitles": ["公公甩资让我离婚,前夫婚礼上我惊艳全场"], + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-111", + "title": "再造宋骨 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "再造宋骨", + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-112", + "title": "冥王归来,专治大小姐不服 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "冥王归来 专治大小姐不服", + "altTitles": ["冥王归来,专治大小姐不服"], + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + }, + { + "id": "H-113", + "title": "凡人无惧之躯 1080p WEB-DL H265 AAC-HHWEB", + "parsed": { + "titleCn": "凡人无惧之躯", + "season": 1 + }, + "mp": null, + "ours": null, + "status": "no_match", + "reason": "no_viable_candidate", + "best": null, + "bestEvidence": [], + "verdict": "consistent" + } + ] +} diff --git a/packages/domain/test/differential/identity/poisoned-local.json b/packages/domain/test/differential/identity/poisoned-local.json new file mode 100644 index 00000000..0eb94940 --- /dev/null +++ b/packages/domain/test/differential/identity/poisoned-local.json @@ -0,0 +1,191 @@ +{ + "note": "真机误识别回归(2026-09-29 用户栈):憨憨 RSS 标题「[电视剧]…」前缀被解析成中文名「电视剧」,登记为《东北有个周东北》的站点别名后,经别名召回把其他剧的资源并入该剧,并继续登记它们的英文名为别名(链式扩散)。entity/aliases 为当时的本地作品状态;cases 为被误并入的资源(标题/副标题原样),expect=正确的 TMDB 身份,not_local=不得自动并入该本地作品。", + "entity": { + "id": "844d02c5-706f-4948-8ae5-70080e8d5bbf", + "kind": "series", + "title": "东北有个周东北", + "originalTitle": "东北有个周东北", + "year": 2026 + }, + "aliases": [ + "东北有个周东北", + "Dongbei's Back", + "重回1985:东北往事", + "Dong Bei You Ge Zhou Dong Bei", + "Zhou Dongbei in the Northeast", + "电视剧", + "Spark of the Long March", + "Irreplaceable", + "A Prophet", + "Spring of the Blade" + ], + "identities": [ + { + "provider": "tmdb", + "externalId": "312027", + "status": "accepted" + } + ], + "cases": [ + { + "title": "A Prophet S01 2026 2160p TX WEB-DL H.265 HDR HFR DDP5.1-HHWEB", + "subtitle": "我不是大师 / 长风起 / 将相 / 江相 / 我是个算命先生 | 第05集 | 4K HDR | 类型: 剧情/悬疑 | 导演: 杨磊 | 主演: 李现/李一桐/吴刚/刘冠麟/果靖霖", + "expect": "tv:289078" + }, + { + "title": "A Prophet S01 2026 2160p TX WEB-DL H.265 HDR HFR DDP5.1-HHWEB", + "subtitle": "我不是大师 / 长风起 / 将相 / 江相 / 我是个算命先生 | 第09-12集 | 4K HDR | 类型: 剧情/悬疑 | 导演: 杨磊 | 主演: 李现/李一桐/吴刚/刘冠麟/果靖霖", + "expect": "tv:289078" + }, + { + "title": "Dongbei's Back S01 2026 1080p WEB-DL H.264 AAC2.0-HHWEB", + "subtitle": "东北有个周东北 | 第09-12集 | 1080p | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙", + "expect": "tv:312027" + }, + { + "title": "Dongbei's Back S01 2026 2160p IQ WEB-DL H.265 DDP5.1 2Audios-HHWEB", + "subtitle": "东北有个周东北 | 第10-12集 | 4K+多规格音轨 | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙", + "expect": "tv:312027" + }, + { + "title": "Dongbei's Back S01 2026 2160p IQ WEB-DL H.265 DDP5.1 3Audios-HHWEB", + "subtitle": "东北有个周东北 | 第09集 | 4K+多规格音轨 | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙", + "expect": "tv:312027" + }, + { + "title": "Dongbei's Back S01 2026 2160p WEB-DL H.265 EDR AAC2.0-HHWEB", + "subtitle": "东北有个周东北 | 第09-12集 | 4K 高码 | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙", + "expect": "tv:312027" + }, + { + "title": "Dongbei's Back S01 2026 2160p WEB-DL H.265 HDR AAC2.0-HHWEB", + "subtitle": "东北有个周东北 | 第09-12集 | 4K HDR | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙", + "expect": "tv:312027" + }, + { + "title": "Irreplaceable S01 2026 1080p YK WEB-DL H.264 DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 1080p | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 DV HFR HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K 高码 杜比视界 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 DV HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K 高码 杜比视界 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HFR DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HFR HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K HDR 高码 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K HDR 高码 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HFR DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HFR HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K 高码 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K 高码 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋", + "expect": "tv:297982" + }, + { + "title": "Spring of the Blade S01 2026 2160p YK WEB-DL H.265 DV HFR HQ AAC2.0-HHWEB", + "subtitle": "一瓯春 | 第20-24集 | 4K 高码 杜比视界 | 类型: 爱情/古装 | 导演: 潘安子 | 主演: 许凯/周也/白澍/闵春晓/柯颖", + "expect": "tv:294990" + }, + { + "title": "Spring of the Blade S01 2026 2160p YK WEB-DL H.265 DV HQ AAC2.0-HHWEB", + "subtitle": "一瓯春 | 第18-24集 | 4K 高码 杜比视界 | 类型: 爱情/古装 | 导演: 潘安子 | 主演: 许凯/周也/白澍/闵春晓/柯颖", + "expect": "tv:294990" + }, + { + "title": "[电视剧]Dongbei's Back S01 2026 2160p IQ WEB-DL H.265 DDP5.1 2Audios-HHWEB[东北有个周东北 | 第04集 | 4K+多规格音轨 | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙][422.03 MB]", + "subtitle": null, + "expect": "tv:312027" + }, + { + "title": "[电视剧]Irreplaceable S01 2026 1080p YK WEB-DL H.264 DTS5.1-HHWEB[无可替代 | 第03集 | 1080p | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][510.37 MB]", + "subtitle": null, + "expect": "tv:297982" + }, + { + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 DTS5.1-HHWEB[无可替代 | 第03集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][883.42 MB]", + "subtitle": null, + "expect": "tv:297982" + }, + { + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR DTS5.1-HHWEB[无可替代 | 第03集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][851.20 MB]", + "subtitle": null, + "expect": "tv:297982" + }, + { + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HFR DTS5.1-HHWEB[无可替代 | 第03集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][1.01 GB]", + "subtitle": null, + "expect": "tv:297982" + }, + { + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 HFR DTS5.1-HHWEB[无可替代 | 第03集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][1.06 GB]", + "subtitle": null, + "expect": "tv:297982" + }, + { + "title": "[电视剧]Spark of the Long March S01 2026 2160p IQ WEB-DL H.265 DDP5.1 2Audios-HHWEB[征途 / 星火征途 / 多杰的长征 | 第07-08集 | 4K+多规格音轨 | 类型: 历史 | 导演: 王伟民 | 主演: 李健/张宁江/吴其江/林江国/侯京健][2.76 GB]", + "subtitle": null, + "expect": "tv:336207" + }, + { + "title": "[电视剧]Spark of the Long March S01 2026 2160p WEB-DL H.265 EDR AAC2.0-HHWEB[征途 / 星火征途 / 多杰的长征 | 第07-08集 | 4K 高码 | 类型: 历史 | 导演: 王伟民 | 主演: 李健/张宁江/吴其江/林江国/侯京健][2.48 GB]", + "subtitle": null, + "expect": "tv:336207" + }, + { + "title": "[电视剧]Spark of the Long March S01 2026 2160p WEB-DL H.265 HDR AAC2.0-HHWEB[征途 / 星火征途 / 多杰的长征 | 第07-08集 | 4K HDR | 类型: 历史 | 导演: 王伟民 | 主演: 李健/张宁江/吴其江/林江国/侯京健][9.27 GB]", + "subtitle": null, + "expect": "tv:336207" + }, + { + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR DTS5.1-HHWEB", + "subtitle": null, + "expect": "not_local" + }, + { + "title": "Spring of the Blade S01 2026 2160p YK WEB-DL H.265 DV HQ AAC2.0-HHWEB", + "subtitle": null, + "expect": "not_local" + }, + { + "title": "A Prophet S01 2026 2160p TX WEB-DL H.265 HDR HFR DDP5.1-HHWEB", + "subtitle": null, + "expect": "not_local" + } + ] +} diff --git a/packages/domain/test/differential/identity/samples.json b/packages/domain/test/differential/identity/samples.json new file mode 100644 index 00000000..4d45bfb0 --- /dev/null +++ b/packages/domain/test/differential/identity/samples.json @@ -0,0 +1,909 @@ +{ + "note": "憨憨(HHClub)真实 RSS/列表标题,2026-09-29 从用户栈 source_release 只读导出;同标题去重。非短剧全部收录(98 条标题 / 35 部作品),短剧取前 15 部(TMDB 请求预算 ≤200)。标题与副标题为站点公开数据,不含账号信息。", + "samples": [ + { + "id": "H-001", + "work": "Martial Master S01 2020", + "kind": "rss_bracket", + "category": null, + "title": "[动漫]Martial Master S01 2020 1080p WEB-DL H.264 AAC2.0-HHWEB[武神主宰 / 武神主宰 第一季 / The God of War Dominates | 第685集 | 1080p | 类型: 动画/奇幻/冒险 | 导演: 老鹰 | 主演: 许子尧/唐泽宗/陈帅/吴凡/孙科][180.86 MB]", + "subtitle": null + }, + { + "id": "H-002", + "work": "Martial Master S01 2020", + "kind": "rss_bracket", + "category": null, + "title": "[动漫]Martial Master S01 2020 1080p WEB-DL H.265 AAC2.0-HHWEB[武神主宰 / 武神主宰 第一季 / The God of War Dominates | 第685集 | 1080p | 类型: 动画/奇幻/冒险 | 导演: 老鹰 | 主演: 许子尧/唐泽宗/陈帅/吴凡/孙科][480.41 MB]", + "subtitle": null + }, + { + "id": "H-003", + "work": "Martial Master S01 2020", + "kind": "rss_bracket", + "category": null, + "title": "[动漫]Martial Master S01 2020 2160p WEB-DL H.265 AAC2.0-HHWEB[武神主宰 / 武神主宰 第一季 / The God of War Dominates | 第685集 | 4K | 类型: 动画/奇幻/冒险 | 导演: 老鹰 | 主演: 许子尧/唐泽宗/陈帅/吴凡/孙科][450.29 MB]", + "subtitle": null + }, + { + "id": "H-004", + "work": "Mononoke The Movie Chapter III The Curse of the Serpent 2026", + "kind": "title_subtitle", + "category": "401", + "title": "Mononoke The Movie Chapter III The Curse of the Serpent 2026 1080p NF WEB-DL H.264 DDP5.1-HHWEB", + "subtitle": "怪化猫:蛇神 / 怪化猫第3章:蛇神 / Mononoke the Movie: Chapter Ⅲ - The Curse of the Serpent | 1080p | 类型: 动画/悬疑/恐怖 | 导演: 越田知明/中村健治 | 主演: 日笠阳子/平野文/本多真梨子/入野自由/甲斐田裕子" + }, + { + "id": "H-005", + "work": "Archives S01 2009", + "kind": "title_subtitle", + "category": "404", + "title": "Archives S01 2009 1080p WEB-DL H.264 AAC-HHWEB", + "subtitle": "档案 / 档案解密 | 第152集 | 1080p | 类型: 纪录片/历史 | 主演: 石凉/赵立新/曹炳琨 [内嵌中字]" + }, + { + "id": "H-006", + "work": "A Different World S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "A Different World S01 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "subtitle": "别样世界 / 别样世界重启版 / 新别样世界 | 全10集 | 4K | 类型: 剧情/喜剧 | 导演: 蒂凡妮·约翰逊/安吉拉·巴恩斯 | 主演: 克里·萨莫/卡丹·哈迪森/杰斯米·盖/Darryl M. Bell/Maleah Joi Moon" + }, + { + "id": "H-007", + "work": "A Different World S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "A Different World S01 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "subtitle": "别样世界 / 别样世界重启版 / 新别样世界 | 全10集 | 4K HDR | 类型: 剧情/喜剧 | 导演: 蒂凡妮·约翰逊/安吉拉·巴恩斯 | 主演: 克里·萨莫/卡丹·哈迪森/杰斯米·盖/Darryl M. Bell/Maleah Joi Moon" + }, + { + "id": "H-008", + "work": "A Prophet S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "A Prophet S01 2026 2160p TX WEB-DL H.265 HDR HFR DDP5.1-HHWEB", + "subtitle": "我不是大师 / 长风起 / 将相 / 江相 / 我是个算命先生 | 第05集 | 4K HDR | 类型: 剧情/悬疑 | 导演: 杨磊 | 主演: 李现/李一桐/吴刚/刘冠麟/果靖霖" + }, + { + "id": "H-009", + "work": "Baby Do Die Do 2026", + "kind": "title_subtitle", + "category": "401", + "title": "Baby Do Die Do 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "subtitle": "贝比毙咚 / 死亡童谣 | 4K | 类型: 动作/犯罪 | 导演: Nachiket Samant | 主演: 胡玛·库雷希/Chunky Pandey/Dheeraj Sharma/西卡德尔·基尔/Vidya Malvade" + }, + { + "id": "H-010", + "work": "Baby Do Die Do 2026", + "kind": "title_subtitle", + "category": "401", + "title": "Baby Do Die Do 2026 2160p NF WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "subtitle": "贝比毙咚 / 死亡童谣 | 4K 杜比视界 | 类型: 动作/犯罪 | 导演: Nachiket Samant | 主演: 胡玛·库雷希/Chunky Pandey/Dheeraj Sharma/西卡德尔·基尔/Vidya Malvade" + }, + { + "id": "H-011", + "work": "Baby Do Die Do 2026", + "kind": "title_subtitle", + "category": "401", + "title": "Baby Do Die Do 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "subtitle": "贝比毙咚 / 死亡童谣 | 4K HDR | 类型: 动作/犯罪 | 导演: Nachiket Samant | 主演: 胡玛·库雷希/Chunky Pandey/Dheeraj Sharma/西卡德尔·基尔/Vidya Malvade" + }, + { + "id": "H-012", + "work": "Chef on Fire S01 2026", + "kind": "title_subtitle", + "category": "403", + "title": "Chef on Fire S01 2026 2160p NF WEB-DL H.265 AAC2.0-HHWEB", + "subtitle": "开火开伙 | 第04集 | 4K | 类型: 真人秀 | 主演: 杨铭威/李玉玺/谢雨芝/郑智善/川越达也" + }, + { + "id": "H-013", + "work": "China Now S01 2019", + "kind": "title_subtitle", + "category": "404", + "title": "China Now S01 2019 1080p WEB-DL H.264 AAC-HHWEB", + "subtitle": "这就是中国 | 第350集 | 1080p | 类型: 脱口秀 | 主演: 张维为 [内嵌中字]" + }, + { + "id": "H-014", + "work": "Delta Force_ The Creator S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[动漫]Delta Force_ The Creator S01 2026 1080p WEB-DL H.264 AAC2.0-HHWEB[三角洲:造物主玩家 | 第25集 | 1080p | 类型: 科幻/动画 | 导演: 段文兴][105.45 MB]", + "subtitle": null + }, + { + "id": "H-015", + "work": "Dongbei's Back S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Dongbei's Back S01 2026 1080p WEB-DL H.264 AAC2.0-HHWEB", + "subtitle": "东北有个周东北 | 第09-12集 | 1080p | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙" + }, + { + "id": "H-016", + "work": "Dongbei's Back S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Dongbei's Back S01 2026 2160p IQ WEB-DL H.265 DDP5.1 2Audios-HHWEB", + "subtitle": "东北有个周东北 | 第10-12集 | 4K+多规格音轨 | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙" + }, + { + "id": "H-017", + "work": "Dongbei's Back S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Dongbei's Back S01 2026 2160p IQ WEB-DL H.265 DDP5.1 3Audios-HHWEB", + "subtitle": "东北有个周东北 | 第09集 | 4K+多规格音轨 | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙" + }, + { + "id": "H-018", + "work": "Dongbei's Back S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Dongbei's Back S01 2026 2160p WEB-DL H.265 EDR AAC2.0-HHWEB", + "subtitle": "东北有个周东北 | 第09-12集 | 4K 高码 | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙" + }, + { + "id": "H-019", + "work": "Dongbei's Back S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Dongbei's Back S01 2026 2160p WEB-DL H.265 HDR AAC2.0-HHWEB", + "subtitle": "东北有个周东北 | 第09-12集 | 4K HDR | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙" + }, + { + "id": "H-020", + "work": "Dongbei's Back S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Dongbei's Back S01 2026 2160p IQ WEB-DL H.265 DDP5.1 2Audios-HHWEB[东北有个周东北 | 第04集 | 4K+多规格音轨 | 类型: 剧情/喜剧 | 导演: 郭大雷 | 主演: 李佳航/吴佳怡/史元庭/刘頔/陈奕龙][422.03 MB]", + "subtitle": null + }, + { + "id": "H-021", + "work": "False Memory S01 2026", + "kind": "title_subtitle", + "category": "405", + "title": "False Memory S01 2026 1080p WEB-DL H.264 AAC-HHWEB", + "subtitle": "记忆管理局 / Memory Management Bureau | 全7集 | 1080p | 类型: 动作/科幻/动画 | 主演: 大猴/染兔/默伶 [内嵌中字]" + }, + { + "id": "H-022", + "work": "False Memory S01 2026", + "kind": "title_subtitle", + "category": "405", + "title": "False Memory S01 2026 2160p WEB-DL H.265 AAC-HHWEB", + "subtitle": "记忆管理局 / Memory Management Bureau | 全7集 | 4K | 类型: 动作/科幻/动画 | 主演: 大猴/染兔/默伶 [内嵌中字]" + }, + { + "id": "H-023", + "work": "False Memory S01 2026", + "kind": "title_subtitle", + "category": "405", + "title": "False Memory S01 2026 2160p WEB-DL H.265 HDR AAC-HHWEB", + "subtitle": "记忆管理局 / Memory Management Bureau | 全7集 | 4K HDR | 类型: 动作/科幻/动画 | 主演: 大猴/染兔/默伶 [内嵌中字]" + }, + { + "id": "H-024", + "work": "GG Bond Interstellar Mission 2024", + "kind": "title_subtitle", + "category": "401", + "title": "GG Bond Interstellar Mission 2024 1080p WEB-DL H264 AAC-HHWEB", + "subtitle": "猪猪侠大电影·星际行动 | 1080p | 类型: 喜剧/科幻/动画 | 导演: 李腾栋 | 主演: 陆双/徐经纬/梁晶晶/刘青扬/陈志荣" + }, + { + "id": "H-025", + "work": "GG Bond Interstellar Mission 2024", + "kind": "title_subtitle", + "category": "401", + "title": "GG Bond Interstellar Mission 2024 2160p WEB-DL H265 DDP5.1-HHWEB", + "subtitle": "猪猪侠大电影·星际行动 | 4K | 类型: 喜剧/科幻/动画 | 导演: 李腾栋 | 主演: 陆双/徐经纬/梁晶晶/刘青扬/陈志荣" + }, + { + "id": "H-026", + "work": "GG Bond Interstellar Mission 2024", + "kind": "title_subtitle", + "category": "401", + "title": "GG Bond Interstellar Mission 2024 2160p WEB-DL H265 EDR DDP5.1-HHWEB", + "subtitle": "猪猪侠大电影·星际行动 | 4K 高码 | 类型: 喜剧/科幻/动画 | 导演: 李腾栋 | 主演: 陆双/徐经纬/梁晶晶/刘青扬/陈志荣" + }, + { + "id": "H-027", + "work": "GG Bond Interstellar Mission 2024", + "kind": "title_subtitle", + "category": "401", + "title": "GG Bond Interstellar Mission 2024 2160p WEB-DL H265 HDR DDP5.1-HHWEB", + "subtitle": "猪猪侠大电影·星际行动 | 4K HDR | 类型: 喜剧/科幻/动画 | 导演: 李腾栋 | 主演: 陆双/徐经纬/梁晶晶/刘青扬/陈志荣" + }, + { + "id": "H-028", + "work": "Gladiator in the Theater S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Gladiator in the Theater S01 2026 1080p WEB-DL H.264 AAC2.0-HHWEB", + "subtitle": "云雀叫天录 | 第32-33集 | 1080p | 类型: 剧情/古装 | 导演: 郑大圣 | 主演: 张一山/谭卓/曹磊/杨立新/刘威" + }, + { + "id": "H-029", + "work": "Gladiator in the Theater S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Gladiator in the Theater S01 2026 2160p WEB-DL H.264 AAC2.0-HHWEB", + "subtitle": "云雀叫天录 | 第32-33集 | 4K | 类型: 剧情/古装 | 导演: 郑大圣 | 主演: 张一山/谭卓/曹磊/杨立新/刘威" + }, + { + "id": "H-030", + "work": "GuAn S01 2026", + "kind": "title_subtitle", + "category": "405", + "title": "GuAn S01 2026 1080p WEB-DL H.264 AAC2.0-HHWEB", + "subtitle": "一斩苍穹 / 一斩苍穹 3D动画版 / 一斩苍穹之起于劫火+魔渊浮沉+归心证道+倾天覆难+遗迹灾变 / Gu An | 第11集 | 1080p | 类型: 喜剧/动作/动画 | 导演: 大田/阿干 | 主演: 李翰林/李雨桐/邓宥希/阎么么/黑特" + }, + { + "id": "H-031", + "work": "GuAn S01 2026", + "kind": "title_subtitle", + "category": "405", + "title": "GuAn S01 2026 2160p WEB-DL H.265 AAC2.0-HHWEB", + "subtitle": "一斩苍穹 / 一斩苍穹 3D动画版 / 一斩苍穹之起于劫火+魔渊浮沉+归心证道+倾天覆难+遗迹灾变 / Gu An | 第11集 | 4K | 类型: 喜剧/动作/动画 | 导演: 大田/阿干 | 主演: 李翰林/李雨桐/邓宥希/阎么么/黑特" + }, + { + "id": "H-032", + "work": "GuAn S01 2026", + "kind": "title_subtitle", + "category": "405", + "title": "GuAn S01 2026 2160p WEB-DL H.265 HQ AAC2.0-HHWEB", + "subtitle": "一斩苍穹 / 一斩苍穹 3D动画版 / 一斩苍穹之起于劫火+魔渊浮沉+归心证道+倾天覆难+遗迹灾变 / Gu An | 第11集 | 4K 高码 | 类型: 喜剧/动作/动画 | 导演: 大田/阿干 | 主演: 李翰林/李雨桐/邓宥希/阎么么/黑特" + }, + { + "id": "H-033", + "work": "Habeas Corpus S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Habeas Corpus S01 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "subtitle": "人身保护令 | 全8集 | 4K | 类型: 剧情 | 导演: Luiz Villaça | 主演: 玛乔丽·埃斯蒂亚诺/Any Gabrielly/Donna Oliveira" + }, + { + "id": "H-034", + "work": "Habeas Corpus S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Habeas Corpus S01 2026 2160p NF WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "subtitle": "人身保护令 | 全8集 | 4K 杜比视界 | 类型: 剧情 | 导演: Luiz Villaça | 主演: 玛乔丽·埃斯蒂亚诺/Any Gabrielly/Donna Oliveira" + }, + { + "id": "H-035", + "work": "Habeas Corpus S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Habeas Corpus S01 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "subtitle": "人身保护令 | 全8集 | 4K HDR | 类型: 剧情 | 导演: Luiz Villaça | 主演: 玛乔丽·埃斯蒂亚诺/Any Gabrielly/Donna Oliveira" + }, + { + "id": "H-036", + "work": "Heart Signal S09 2018", + "kind": "rss_bracket", + "category": null, + "title": "[综艺]Heart Signal S09 2018 1080p WEB-DL H.264 AAC2.0-HHWEB[心动的信号 / 心动的信号9 第九季 | 第29-30集(第09期上+中) | 1080p | 类型: 爱情/真人秀 | 主演: 代旭/杜海涛/薛凯琪/杨超越/张纯烨][1.36 GB]", + "subtitle": null + }, + { + "id": "H-037", + "work": "Heart Signal S09 2018", + "kind": "rss_bracket", + "category": null, + "title": "[综艺]Heart Signal S09 2018 2160p WEB-DL H.265 AAC2.0-HHWEB[心动的信号 / 心动的信号9 第九季 | 第29-30集(第09期上+中) | 4K | 类型: 爱情/真人秀 | 主演: 代旭/杜海涛/薛凯琪/杨超越/张纯烨][3.48 GB]", + "subtitle": null + }, + { + "id": "H-038", + "work": "Hi Come In S07 2022", + "kind": "title_subtitle", + "category": "403", + "title": "Hi Come In S07 2022 2160p NF WEB-DL H.265 AAC2.0-HHWEB", + "subtitle": "嗨!营业中 / Hi, Come in 第七季 | 第11集 | 4K | 类型: 真人秀 | 主演: 庹宗康/姚元浩/炎亚纶/吴映洁/谢炘昊" + }, + { + "id": "H-039", + "work": "Interstellar", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar IMAX 2014 Bluray 1080p x264 DTS 2Audios-CMCT", + "subtitle": "星际穿越/星际空间/星际之间/星際啟示錄(港)/星際效應(台) [IMAX版] [国英双语] [中英特效字幕] *第87届奥斯卡最佳视觉效果* Top 250 # 22" + }, + { + "id": "H-040", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 1080p NF WEB-DL DDP5.1 H264-HHWEB", + "subtitle": "星际穿越 | 类型:剧情/科幻/冒险 | 主演:马修麦康纳/安妮海瑟薇/杰西卡查斯坦/麦肯吉弗依" + }, + { + "id": "H-041", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 1080p iTunes WEB-DL DD5 1 H264-HHWEB", + "subtitle": "星际穿越 | 1080p | 类型: 剧情/科幻/冒险 | 导演: 克里斯托弗·诺兰 | 主演: 马修·麦康纳/安妮·海瑟薇/杰西卡·查斯坦/麦肯吉·弗依/卡西·阿弗莱克" + }, + { + "id": "H-042", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 2160p HDR UHD BluRay DTS-HD MA 5.1 2Audio x265 10bit-HDS", + "subtitle": "星际穿越/Flora‘s Letter/星际/星际之间/星际启示录(港)/星际效应(台)/星际空间/星际远航 国英双语简繁/双语/原盘中字" + }, + { + "id": "H-043", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 2160p PROPER IMAX REMUX DV HDR10+ TrueHD 7 1 Atmos-jennaortegaUHD", + "subtitle": "星际穿越 / 星际启示录(港) / 星际效应(台) / 星际空间 / 星际之间 / 星际远航 / 星际 / Flora's Letter / jennaortegaUHD作品 4k HDR10版本" + }, + { + "id": "H-044", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 2160p UHD Blu-ray Remux HEVC DTS-HD MA 5.1-PTer", + "subtitle": "星际穿越 | 导演:克里斯托弗·诺兰 | 主演:马修·麦康纳 安妮·海瑟薇 [简+繁+英+章节]" + }, + { + "id": "H-045", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 2160p iTunes WEB-DL DD5 1 DV HDR H 265-HHWEB", + "subtitle": "星际穿越 | 4K HDR+杜比视界 | 类型: 剧情/科幻/冒险 | 导演: 克里斯托弗·诺兰 | 主演: 马修·麦康纳/安妮·海瑟薇/杰西卡·查斯坦/麦肯吉·弗依/卡西·阿弗莱克" + }, + { + "id": "H-046", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 2160p iTunes WEB-DL DD5 1 H 265-HHWEB", + "subtitle": "星际穿越 | 4K | 类型: 剧情/科幻/冒险 | 导演: 克里斯托弗·诺兰 | 主演: 马修·麦康纳/安妮·海瑟薇/杰西卡·查斯坦/麦肯吉·弗依/卡西·阿弗莱克" + }, + { + "id": "H-047", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 3Disc 2160p UHD Blu-ray HEVC DTS-HD MA 5.1-CMCT", + "subtitle": "星际穿越/星际启示录(港)/星际效应(台)/星际空间 台版uhd三碟版 自带国配中文字幕" + }, + { + "id": "H-048", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 IMAX UHD BluRay 2160p 10bit HDR 2Audio DTS-HD MA 5.1 x265-beAst", + "subtitle": "星际穿越 IMAX版/星際啟示錄(港)/星際效應(台)/英语DTS-HD MA5.1/国语TrueHD5.1/原盘英简繁&双语特效SUP字幕/章节" + }, + { + "id": "H-049", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 UHD Blu-ray 2016p HEVC DTS-HD MA 7 1-Pete@HDSky", + "subtitle": "星际穿越 / Flora's Letter / 星际 / 星际之间 / 星际启示录(港) / 星际效应(台) / 星际空间 / 星际远航" + }, + { + "id": "H-050", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 UHD Blu-ray 2016p REMUX HEVC DTS-HD MA 5.1-HDH", + "subtitle": "星际穿越/星际启示录(港)/星际效应(台)内封次世代国配音轨/国配特效简繁+双语国配字幕" + }, + { + "id": "H-051", + "work": "Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "Interstellar 2014 UHD Blu-ray 2160p HEVC DTS-HD MA 5.1-CMCT", + "subtitle": "星际穿越 [次时代国语] [简/繁/双语特效字幕] | 类型:剧情 / 科幻 / 冒险 | 主演: 马修·麦康纳 / 安妮·海瑟薇 / 杰西卡·查斯坦" + }, + { + "id": "H-052", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 1080p YK WEB-DL H.264 DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 1080p | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-053", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-054", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 DV HFR HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K 高码 杜比视界 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-055", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 DV HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K 高码 杜比视界 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-056", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-057", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HFR DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-058", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HFR HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K HDR 高码 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-059", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K HDR 高码 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-060", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HFR DTS5.1-HHWEB", + "subtitle": "无可替代 | 第04集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-061", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HFR HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K 高码 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-062", + "work": "Irreplaceable S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Irreplaceable S01 2026 2160p YK WEB-DL H.265 HQ DTS5.1-HHWEB", + "subtitle": "无可替代 | 第03-04集 | 4K 高码 | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋" + }, + { + "id": "H-063", + "work": "Irreplaceable S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Irreplaceable S01 2026 1080p YK WEB-DL H.264 DTS5.1-HHWEB[无可替代 | 第03集 | 1080p | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][510.37 MB]", + "subtitle": null + }, + { + "id": "H-064", + "work": "Irreplaceable S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 DTS5.1-HHWEB[无可替代 | 第03集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][883.42 MB]", + "subtitle": null + }, + { + "id": "H-065", + "work": "Irreplaceable S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR DTS5.1-HHWEB[无可替代 | 第03集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][851.20 MB]", + "subtitle": null + }, + { + "id": "H-066", + "work": "Irreplaceable S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 HDR HFR DTS5.1-HHWEB[无可替代 | 第03集 | 4K HDR | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][1.01 GB]", + "subtitle": null + }, + { + "id": "H-067", + "work": "Irreplaceable S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Irreplaceable S01 2026 2160p YK WEB-DL H.265 HFR DTS5.1-HHWEB[无可替代 | 第03集 | 4K | 类型: 剧情 | 导演: 陈铭章/陈世峄 | 主演: 赵今麦/魏大勋/周奇/白冰/胡意旋][1.06 GB]", + "subtitle": null + }, + { + "id": "H-068", + "work": "LEGO ONE PIECE S01 2026", + "kind": "title_subtitle", + "category": "405", + "title": "LEGO ONE PIECE S01 2026 1080p NF WEB-DL H.264 DDP5.1.Atmos-HHWEB[新]", + "subtitle": "乐高航海王 / 乐高海贼王 | 全2集 | 1080p | 类型: 剧情/喜剧/动作" + }, + { + "id": "H-069", + "work": "Lanterns S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Lanterns S01 2026 1080p HMAX WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "subtitle": "绿灯军团 / 绿光军团(台) / 灯侠 / 灯团 / 绿灯侠 / Green Lantern / Lantern | 第07集 | 1080p | 类型: 剧情/动作/科幻 | 导演: 詹姆斯·霍斯/斯蒂芬·威廉姆斯 | 主演: 凯尔·钱德勒/亚伦·皮埃尔/凯莉·麦克唐纳/加瑞特·迪拉胡特/普娜·贾甘纳坦" + }, + { + "id": "H-070", + "work": "Lanterns S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Lanterns S01 2026 2160p HMAX WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "subtitle": "绿灯军团 / 绿光军团(台) / 灯侠 / 灯团 / 绿灯侠 / Green Lantern / Lantern | 第07集 | 4K 杜比视界 | 类型: 剧情/动作/科幻 | 导演: 詹姆斯·霍斯/斯蒂芬·威廉姆斯 | 主演: 凯尔·钱德勒/亚伦·皮埃尔/凯莉·麦克唐纳/加瑞特·迪拉胡特/普娜·贾甘纳坦" + }, + { + "id": "H-071", + "work": "Lanterns S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Lanterns S01 2026 2160p HMAX WEB-DL H.265 DV HDR DDP5.1.Atmos-HHWEB", + "subtitle": "绿灯军团 / 绿光军团(台) / 灯侠 / 灯团 / 绿灯侠 / Green Lantern / Lantern | 第07集 | 4K HDR+杜比视界 | 类型: 剧情/动作/科幻 | 导演: 詹姆斯·霍斯/斯蒂芬·威廉姆斯 | 主演: 凯尔·钱德勒/亚伦·皮埃尔/凯莉·麦克唐纳/加瑞特·迪拉胡特/普娜·贾甘纳坦" + }, + { + "id": "H-072", + "work": "Live Forever S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Live Forever S01 2026 1080p WEB-DL H.264 AAC-HHWEB", + "subtitle": "长生契 / 长生 | 第12集 | 1080p | 类型: 奇幻 | 主演: 方逸伦/谢可寅/姚弛 [内嵌中字]" + }, + { + "id": "H-073", + "work": "Live Forever S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Live Forever S01 2026 2160p WEB-DL H.264 AAC-HHWEB", + "subtitle": "长生契 / 长生 | 第12集 | 4K | 类型: 奇幻 | 主演: 方逸伦/谢可寅/姚弛 [内嵌中字]" + }, + { + "id": "H-074", + "work": "Not a Stranger S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Not a Stranger S01 2026 2160p NF WEB-DL H.265 DDP5.1-HHWEB", + "subtitle": "不识陌生人 / I Know You | 全8集 | 4K | 类型: 剧情/惊悚 | 导演: 默特·贝卡尔 | 主演: 梅丽斯·塞森/奥赞·多卢奈/艾尔钦·桑古/埃布鲁·沙欣" + }, + { + "id": "H-075", + "work": "Not a Stranger S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Not a Stranger S01 2026 2160p NF WEB-DL H.265 DV DDP5.1-HHWEB", + "subtitle": "不识陌生人 / I Know You | 全8集 | 4K 杜比视界 | 类型: 剧情/惊悚 | 导演: 默特·贝卡尔 | 主演: 梅丽斯·塞森/奥赞·多卢奈/艾尔钦·桑古/埃布鲁·沙欣" + }, + { + "id": "H-076", + "work": "Not a Stranger S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Not a Stranger S01 2026 2160p NF WEB-DL H.265 HDR DDP5.1-HHWEB", + "subtitle": "不识陌生人 / I Know You | 全8集 | 4K HDR | 类型: 剧情/惊悚 | 导演: 默特·贝卡尔 | 主演: 梅丽斯·塞森/奥赞·多卢奈/艾尔钦·桑古/埃布鲁·沙欣" + }, + { + "id": "H-077", + "work": "One Hundred Thousand Years Of Qi Refining S01 2023", + "kind": "title_subtitle", + "category": "405", + "title": "One Hundred Thousand Years Of Qi Refining S01 2023 2160p WEB-DL H.265 AAC2.0-HHWEB", + "subtitle": "炼气十万年 / One Hundred Thousand Years of Qi Refining / 100,000 Years of Qi Refining | 第381集 | 4K | 类型: 动作/动画/奇幻 | 导演: 李廷赫 | 主演: 袁铭喆/朱蓉蓉/夜渡于野/孙睿扬/王曼诗" + }, + { + "id": "H-078", + "work": "One Hundred Thousand Years Of Qi Refining S01 2023", + "kind": "rss_bracket", + "category": null, + "title": "[动漫]One Hundred Thousand Years Of Qi Refining S01 2023 1080p WEB-DL H.264 AAC2.0-HHWEB[炼气十万年 / One Hundred Thousand Years of Qi Refining / 100,000 Years of Qi Refining | 第381集 | 1080p | 类型: 动作/动画/奇幻 | 导演: 李廷赫 | 主演: 袁铭喆/朱蓉蓉/夜渡于野/孙睿扬/王曼诗][213.58 MB]", + "subtitle": null + }, + { + "id": "H-079", + "work": "Peerless Battle Spirit S02 2024", + "kind": "title_subtitle", + "category": "405", + "title": "Peerless Battle Spirit S02 2024 1080p WEB-DL H.264 AAC2.0-HHWEB", + "subtitle": "绝世战魂 / Super Heroic Spirit 2 第二季 | 第28集 | 1080p | 类型: 动作/动画/奇幻 | 导演: 刘樟/陈凌超 | 主演: 依晨/九华/赵致羽/子兮/徐阿木" + }, + { + "id": "H-080", + "work": "Peerless Battle Spirit S02 2024", + "kind": "title_subtitle", + "category": "405", + "title": "Peerless Battle Spirit S02 2024 2160p WEB-DL H.265 EDR AAC2.0-HHWEB", + "subtitle": "绝世战魂 / Super Heroic Spirit 2 第二季 | 第28集 | 4K 高码 | 类型: 动作/动画/奇幻 | 导演: 刘樟/陈凌超 | 主演: 依晨/九华/赵致羽/子兮/徐阿木" + }, + { + "id": "H-081", + "work": "Peerless Battle Spirit S02 2024", + "kind": "title_subtitle", + "category": "405", + "title": "Peerless Battle Spirit S02 2024 2160p WEB-DL H.265 HDR AAC2.0-HHWEB", + "subtitle": "绝世战魂 / Super Heroic Spirit 2 第二季 | 第28集 | 4K HDR | 类型: 动作/动画/奇幻 | 导演: 刘樟/陈凌超 | 主演: 依晨/九华/赵致羽/子兮/徐阿木" + }, + { + "id": "H-082", + "work": "Shaque Trust No One S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Shaque Trust No One S01 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "subtitle": "寻女无归途 / शक: ट्रस्ट नो वन / Shaque: Trust No One | 全7集 | 4K | 类型: 电视剧 | 导演: 伦齐尔·达席尔瓦 | 主演: 帕丽莱蒂·曹帕拉/萨米特·维亚斯/Jennifer Winget/塔希尔·拉吉·巴辛/Harleen Sethi" + }, + { + "id": "H-083", + "work": "Shaque Trust No One S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Shaque Trust No One S01 2026 2160p NF WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "subtitle": "寻女无归途 / शक: ट्रस्ट नो वन / Shaque: Trust No One | 全7集 | 4K 杜比视界 | 类型: 电视剧 | 导演: 伦齐尔·达席尔瓦 | 主演: 帕丽莱蒂·曹帕拉/萨米特·维亚斯/Jennifer Winget/塔希尔·拉吉·巴辛/Harleen Sethi" + }, + { + "id": "H-084", + "work": "Shaque Trust No One S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "Shaque Trust No One S01 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "subtitle": "寻女无归途 / शक: ट्रस्ट नो वन / Shaque: Trust No One | 全7集 | 4K HDR | 类型: 电视剧 | 导演: 伦齐尔·达席尔瓦 | 主演: 帕丽莱蒂·曹帕拉/萨米特·维亚斯/Jennifer Winget/塔希尔·拉吉·巴辛/Harleen Sethi" + }, + { + "id": "H-085", + "work": "Spark of the Long March S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Spark of the Long March S01 2026 2160p IQ WEB-DL H.265 DDP5.1 2Audios-HHWEB[征途 / 星火征途 / 多杰的长征 | 第07-08集 | 4K+多规格音轨 | 类型: 历史 | 导演: 王伟民 | 主演: 李健/张宁江/吴其江/林江国/侯京健][2.76 GB]", + "subtitle": null + }, + { + "id": "H-086", + "work": "Spark of the Long March S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Spark of the Long March S01 2026 2160p WEB-DL H.265 EDR AAC2.0-HHWEB[征途 / 星火征途 / 多杰的长征 | 第07-08集 | 4K 高码 | 类型: 历史 | 导演: 王伟民 | 主演: 李健/张宁江/吴其江/林江国/侯京健][2.48 GB]", + "subtitle": null + }, + { + "id": "H-087", + "work": "Spark of the Long March S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Spark of the Long March S01 2026 2160p WEB-DL H.265 HDR AAC2.0-HHWEB[征途 / 星火征途 / 多杰的长征 | 第07-08集 | 4K HDR | 类型: 历史 | 导演: 王伟民 | 主演: 李健/张宁江/吴其江/林江国/侯京健][9.27 GB]", + "subtitle": null + }, + { + "id": "H-088", + "work": "Spring of the Blade S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[电视剧]Spring of the Blade S01 2026 2160p YK WEB-DL H.265 DV HFR HQ AAC2.0-HHWEB[一瓯春 | 第20-24集 | 4K 高码 杜比视界 | 类型: 爱情/古装 | 导演: 潘安子 | 主演: 许凯/周也/白澍/闵春晓/柯颖][26.37 GB]", + "subtitle": null + }, + { + "id": "H-089", + "work": "Stay Low Profile S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[动漫]Stay Low Profile S01 2026 1080p WEB-DL H.264 AAC-HHWEB[掌门低调点 / Stay Low Profile, Sect Chief | 第32集 | 1080p | 类型: 喜剧/动作/动画 | 主演: 宁冀荣/子兮/三方方 [内嵌中字]][191.56 MB]", + "subtitle": null + }, + { + "id": "H-090", + "work": "Stay Low Profile S01 2026", + "kind": "rss_bracket", + "category": null, + "title": "[动漫]Stay Low Profile S01 2026 1080p WEB-DL H.265 HDR AAC-HHWEB[掌门低调点 / Stay Low Profile, Sect Chief | 第32集 | 1080p HDR | 类型: 喜剧/动作/动画 | 主演: 宁冀荣/子兮/三方方 [内嵌中字]][136.33 MB]", + "subtitle": null + }, + { + "id": "H-091", + "work": "Ten Thousand Worlds S01 2021", + "kind": "rss_bracket", + "category": null, + "title": "[动漫]Ten Thousand Worlds S01 2021 1080p WEB-DL H.264 AAC2.0-HHWEB[万界独尊 | 第468集 | 1080p | 类型: 动画 | 导演: 叶老酒/酱紫 | 主演: 王大伟/柳知萧/陆敏悦 Minyue Lu/黄骥/关帅][213.89 MB]", + "subtitle": null + }, + { + "id": "H-092", + "work": "Ten Thousand Worlds S01 2021", + "kind": "rss_bracket", + "category": null, + "title": "[动漫]Ten Thousand Worlds S01 2021 2160p WEB-DL H.265 AAC2.0-HHWEB[万界独尊 | 第468集 | 4K | 类型: 动画 | 导演: 叶老酒/酱紫 | 主演: 王大伟/柳知萧/陆敏悦 Minyue Lu/黄骥/关帅][459.44 MB]", + "subtitle": null + }, + { + "id": "H-093", + "work": "The Crow Club S01 2026", + "kind": "title_subtitle", + "category": "402", + "title": "The Crow Club S01 2026 2160p NF WEB-DL H.265 AAC2.0-HHWEB", + "subtitle": "乌鸦俱乐部 | 第01集 | 4K | 类型: 剧情/爱情/奇幻 | 导演: 诺帕奇·贾亚纳玛 | 主演: 赫马维奇·卡皖纳姆派潘/塔纳朋·艾恩坤柴/帕塔拉菲尔·万洛普西里" + }, + { + "id": "H-094", + "work": "The Science of Interstellar 2014", + "kind": "title_subtitle", + "category": "404", + "title": "The Science of Interstellar 2014 BluRay 720p x264 AC3-CMCT", + "subtitle": "星际穿越中的科学 [中英字幕]" + }, + { + "id": "H-095", + "work": "UNABOMBER 2026", + "kind": "title_subtitle", + "category": "401", + "title": "UNABOMBER 2026 2160p NF WEB-DL H.265 DDP5.1.Atmos-HHWEB", + "subtitle": "大学炸弹客 / 追踪炸弹客 / 炸弹客 | 4K | 类型: 剧情/惊悚/犯罪 | 导演: 雅努斯·梅兹 | 主演: 罗素·克劳/雅各布·特伦布莱/谢琳·伍德蕾/安娜贝拉·沃丽丝/马克·门查卡" + }, + { + "id": "H-096", + "work": "UNABOMBER 2026", + "kind": "title_subtitle", + "category": "401", + "title": "UNABOMBER 2026 2160p NF WEB-DL H.265 DV DDP5.1.Atmos-HHWEB", + "subtitle": "大学炸弹客 / 追踪炸弹客 / 炸弹客 | 4K 杜比视界 | 类型: 剧情/惊悚/犯罪 | 导演: 雅努斯·梅兹 | 主演: 罗素·克劳/雅各布·特伦布莱/谢琳·伍德蕾/安娜贝拉·沃丽丝/马克·门查卡" + }, + { + "id": "H-097", + "work": "UNABOMBER 2026", + "kind": "title_subtitle", + "category": "401", + "title": "UNABOMBER 2026 2160p NF WEB-DL H.265 HDR DDP5.1.Atmos-HHWEB", + "subtitle": "大学炸弹客 / 追踪炸弹客 / 炸弹客 | 4K HDR | 类型: 剧情/惊悚/犯罪 | 导演: 雅努斯·梅兹 | 主演: 罗素·克劳/雅各布·特伦布莱/谢琳·伍德蕾/安娜贝拉·沃丽丝/马克·门查卡" + }, + { + "id": "H-098", + "work": "星际穿越 Interstellar 2014", + "kind": "title_subtitle", + "category": "401", + "title": "星际穿越 Interstellar 2014 BluRay 2160p x265.10bit 4Audio mUHD-FRDS", + "subtitle": null + }, + { + "id": "H-099", + "work": "一纸报告,看穿人心", + "kind": "short_drama", + "category": "412", + "title": "一纸报告,看穿人心 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "一纸报告,看穿人心 | 全60集 | 1080p" + }, + { + "id": "H-100", + "work": "丈夫的温柔陷阱", + "kind": "short_drama", + "category": "412", + "title": "丈夫的温柔陷阱 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "丈夫的温柔陷阱 | 全30集 | 1080p" + }, + { + "id": "H-101", + "work": "不好意思,我开挂了", + "kind": "short_drama", + "category": "412", + "title": "不好意思,我开挂了 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "不好意思,我开挂了 | 全96集 | 1080p" + }, + { + "id": "H-102", + "work": "不婚主义", + "kind": "short_drama", + "category": "412", + "title": "不婚主义 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "不婚主义 | 全47集 | 1080p" + }, + { + "id": "H-103", + "work": "京夜喜你", + "kind": "short_drama", + "category": "412", + "title": "京夜喜你 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "京夜喜你 | 全41集 | 1080p" + }, + { + "id": "H-104", + "work": "人中之龙第一季", + "kind": "short_drama", + "category": "412", + "title": "人中之龙第一季 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "人中之龙第一季 | 全98集 | 1080p" + }, + { + "id": "H-105", + "work": "今天有朵云爱我", + "kind": "short_drama", + "category": "412", + "title": "今天有朵云爱我 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "今天有朵云爱我 | 全66集 | 1080p" + }, + { + "id": "H-106", + "work": "他的温柔蓄谋已久", + "kind": "short_drama", + "category": "412", + "title": "他的温柔蓄谋已久 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "他的温柔蓄谋已久 | 全60集 | 1080p" + }, + { + "id": "H-107", + "work": "儿媳房间的秘密", + "kind": "short_drama", + "category": "412", + "title": "儿媳房间的秘密 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "儿媳房间的秘密 | 全60集 | 1080p" + }, + { + "id": "H-108", + "work": "全府偷听我和闺蜜心声被带飞", + "kind": "short_drama", + "category": "412", + "title": "全府偷听我和闺蜜心声被带飞 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "全府偷听我和闺蜜心声被带飞 | 全72集 | 1080p" + }, + { + "id": "H-109", + "work": "全村都在看,影帝下地狂追前女友", + "kind": "short_drama", + "category": "412", + "title": "全村都在看,影帝下地狂追前女友 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "全村都在看,影帝下地狂追前女友 | 全45集 | 1080p" + }, + { + "id": "H-110", + "work": "公公甩资让我离婚,前夫婚礼上我惊艳全场", + "kind": "short_drama", + "category": "412", + "title": "公公甩资让我离婚,前夫婚礼上我惊艳全场 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "公公甩资让我离婚,前夫婚礼上我惊艳全场 | 全57集 | 1080p" + }, + { + "id": "H-111", + "work": "再造宋骨", + "kind": "short_drama", + "category": "412", + "title": "再造宋骨 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "再造宋骨 | 全93集 | 1080p" + }, + { + "id": "H-112", + "work": "冥王归来,专治大小姐不服", + "kind": "short_drama", + "category": "412", + "title": "冥王归来,专治大小姐不服 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "冥王归来,专治大小姐不服 | 全98集 | 1080p" + }, + { + "id": "H-113", + "work": "凡人无惧之躯", + "kind": "short_drama", + "category": "412", + "title": "凡人无惧之躯 1080p WEB-DL H265 AAC-HHWEB", + "subtitle": "凡人无惧之躯 | 全87集 | 1080p" + } + ] +} diff --git a/packages/domain/test/differential/identity/tmdb-fixtures.json b/packages/domain/test/differential/identity/tmdb-fixtures.json new file mode 100644 index 00000000..4b55d554 --- /dev/null +++ b/packages/domain/test/differential/identity/tmdb-fixtures.json @@ -0,0 +1,6703 @@ +{ + "/movie/1260260?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 1260260, + "title": "猪猪侠大电影·星际行动", + "original_title": "猪猪侠大电影·星际行动", + "original_language": "zh", + "release_date": "2024-05-01", + "popularity": 0.9291, + "origin_country": ["CN"], + "alternative_titles": { + "titles": [ + { "title": "猪猪侠之星际行动", "iso_3166_1": "CN" }, + { "title": "Zhu Zhu Xia Da Dianying: Xingji Xingdong", "iso_3166_1": "US" }, + { "title": "GG Bond Interstellar Mission", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "title": "豬豬俠大電影·星際行動" } } + ] + }, + "external_ids": {} + }, + "/movie/1260260?language=en-US": { + "id": 1260260, + "title": "猪猪侠大电影·星际行动", + "original_title": "猪猪侠大电影·星际行动", + "original_language": "zh", + "release_date": "2024-05-01", + "popularity": 0.9291, + "origin_country": ["CN"], + "alternative_titles": { + "titles": [ + { "title": "猪猪侠之星际行动", "iso_3166_1": "CN" }, + { "title": "Zhu Zhu Xia Da Dianying: Xingji Xingdong", "iso_3166_1": "US" }, + { "title": "GG Bond Interstellar Mission", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "title": "豬豬俠大電影·星際行動" } } + ] + }, + "external_ids": {} + }, + "/movie/1322562?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 1322562, + "title": "剧场版物怪:第 3 章:蛇神", + "original_title": "劇場版モノノ怪 第三章 蛇神", + "original_language": "ja", + "release_date": "2026-05-29", + "popularity": 4.6403, + "origin_country": ["JP"], + "alternative_titles": { + "titles": [ + { "title": "Gekijōban Mononoke Dai San Shō: Hebigami", "iso_3166_1": "JP" }, + { "title": "Gekijouban Mononoke Dai San Shō: Hebigami", "iso_3166_1": "JP" }, + { "title": "Mononoke the Movie Third Chapter: Snake God", "iso_3166_1": "US" }, + { "title": "Mononoke the Movie Third Chapter", "iso_3166_1": "US" }, + { "title": "Mononoke the Movie: Chapter Ⅲ - The Curse of the Serpent", "iso_3166_1": "US" }, + { "title": "Mononoke Il Film 3 La Maledizione Del Serpente", "iso_3166_1": "IT" } + ] + }, + "translations": { + "translations": [ + { + "iso_639_1": "en", + "iso_3166_1": "US", + "data": { "title": "Mononoke the Movie: Chapter III - The Curse of the Serpent" } + }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "剧场版物怪:第 3 章:蛇神" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "title": "劇場版物怪:第 3 章:蛇神" } }, + { + "iso_639_1": "it", + "iso_3166_1": "IT", + "data": { "title": "Mononoke the Movie: Chapter III - The Curse of the Serpent" } + }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "title": "Mononoke — film: rozdział 3 — Klątwa węża" } }, + { + "iso_639_1": "pt", + "iso_3166_1": "BR", + "data": { "title": "Mononoke - O Filme: Capítulo 3 - A Maldição da Serpente" } + }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "title": "극장판 모노노케 제3장: 뱀의 저주" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "title": "劇場版物怪第3章:蛇神" } }, + { + "iso_639_1": "fr", + "iso_3166_1": "FR", + "data": { "title": "Mononoke, le film : Chapitre 3 — La Malédiction du serpent" } + } + ] + }, + "external_ids": { "imdb_id": "tt36282134" } + }, + "/movie/1322562?language=en-US": { + "id": 1322562, + "title": "Mononoke the Movie: Chapter III - The Curse of the Serpent", + "original_title": "劇場版モノノ怪 第三章 蛇神", + "original_language": "ja", + "release_date": "2026-05-29", + "popularity": 4.6403, + "origin_country": ["JP"], + "alternative_titles": { + "titles": [ + { "title": "Gekijōban Mononoke Dai San Shō: Hebigami", "iso_3166_1": "JP" }, + { "title": "Gekijouban Mononoke Dai San Shō: Hebigami", "iso_3166_1": "JP" }, + { "title": "Mononoke the Movie Third Chapter: Snake God", "iso_3166_1": "US" }, + { "title": "Mononoke the Movie Third Chapter", "iso_3166_1": "US" }, + { "title": "Mononoke the Movie: Chapter Ⅲ - The Curse of the Serpent", "iso_3166_1": "US" }, + { "title": "Mononoke Il Film 3 La Maledizione Del Serpente", "iso_3166_1": "IT" } + ] + }, + "translations": { + "translations": [ + { + "iso_639_1": "en", + "iso_3166_1": "US", + "data": { "title": "Mononoke the Movie: Chapter III - The Curse of the Serpent" } + }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "剧场版物怪:第 3 章:蛇神" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "title": "劇場版物怪:第 3 章:蛇神" } }, + { + "iso_639_1": "it", + "iso_3166_1": "IT", + "data": { "title": "Mononoke the Movie: Chapter III - The Curse of the Serpent" } + }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "title": "Mononoke — film: rozdział 3 — Klątwa węża" } }, + { + "iso_639_1": "pt", + "iso_3166_1": "BR", + "data": { "title": "Mononoke - O Filme: Capítulo 3 - A Maldição da Serpente" } + }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "title": "극장판 모노노케 제3장: 뱀의 저주" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "title": "劇場版物怪第3章:蛇神" } }, + { + "iso_639_1": "fr", + "iso_3166_1": "FR", + "data": { "title": "Mononoke, le film : Chapitre 3 — La Malédiction du serpent" } + } + ] + }, + "external_ids": { "imdb_id": "tt36282134" } + }, + "/movie/1492640?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "__status": 404 + }, + "/movie/1492640?language=en-US": { "__status": 404 }, + "/movie/1512084?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "__status": 404 + }, + "/movie/1512084?language=en-US": { "__status": 404 }, + "/movie/157336?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "__status": 404 + }, + "/movie/157336?language=en-US": { "__status": 404 }, + "/movie/287954?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 287954, + "title": "洛丽塔", + "original_title": "Lolita from Interstellar Space", + "original_language": "en", + "release_date": "2014-03-08", + "popularity": 2.3293, + "origin_country": ["US"], + "alternative_titles": { "titles": [{ "title": "穿越星际的洛丽塔", "iso_3166_1": "HK" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "title": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "洛丽塔" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "title": "Лоліта з Міжзоряного космосу" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "title": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "title": "" } } + ] + }, + "external_ids": { "imdb_id": "tt3506492" } + }, + "/movie/287954?language=en-US": { + "id": 287954, + "title": "Lolita from Interstellar Space", + "original_title": "Lolita from Interstellar Space", + "original_language": "en", + "release_date": "2014-03-08", + "popularity": 2.3293, + "origin_country": ["US"], + "alternative_titles": { "titles": [{ "title": "穿越星际的洛丽塔", "iso_3166_1": "HK" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "title": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "洛丽塔" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "title": "Лоліта з Міжзоряного космосу" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "title": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "title": "" } } + ] + }, + "external_ids": { "imdb_id": "tt3506492" } + }, + "/movie/301959?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 301959, + "title": "星际穿越:诺兰的奥德赛", + "original_title": "Interstellar: Nolan's Odyssey", + "original_language": "en", + "release_date": "2014-11-05", + "popularity": 3.3288, + "origin_country": ["GB"], + "alternative_titles": { "titles": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "title": "" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "title": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "title": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "星际穿越:诺兰的奥德赛" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "title": "星際穿越:諾蘭的奧德賽" } } + ] + }, + "external_ids": { "imdb_id": "tt4172224" } + }, + "/movie/301959?language=en-US": { + "id": 301959, + "title": "Interstellar: Nolan's Odyssey", + "original_title": "Interstellar: Nolan's Odyssey", + "original_language": "en", + "release_date": "2014-11-05", + "popularity": 3.3288, + "origin_country": ["GB"], + "alternative_titles": { "titles": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "title": "" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "title": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "title": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "星际穿越:诺兰的奥德赛" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "title": "星際穿越:諾蘭的奧德賽" } } + ] + }, + "external_ids": { "imdb_id": "tt4172224" } + }, + "/movie/336592?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 336592, + "title": "星际穿越中的科学", + "original_title": "The Science of Interstellar", + "original_language": "en", + "release_date": "2014-11-13", + "popularity": 3.062, + "origin_country": ["US"], + "alternative_titles": { "titles": [{ "title": "《星际穿越》中的科学", "iso_3166_1": "CN" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "title": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "title": "La Science d'Interstellar" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "星际穿越中的科学" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "title": "La ciencia de Interstellar" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "title": "Изучение «Интерстеллар»" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "title": "인터스텔라의 과학" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "title": "星際穿越中的科學" } } + ] + }, + "external_ids": { "imdb_id": "tt4415360" } + }, + "/movie/336592?language=en-US": { + "id": 336592, + "title": "The Science of Interstellar", + "original_title": "The Science of Interstellar", + "original_language": "en", + "release_date": "2014-11-13", + "popularity": 3.062, + "origin_country": ["US"], + "alternative_titles": { "titles": [{ "title": "《星际穿越》中的科学", "iso_3166_1": "CN" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "title": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "title": "La Science d'Interstellar" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "title": "星际穿越中的科学" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "title": "La ciencia de Interstellar" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "title": "Изучение «Интерстеллар»" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "title": "인터스텔라의 과학" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "title": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "title": "星際穿越中的科學" } } + ] + }, + "external_ids": { "imdb_id": "tt4415360" } + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=%E5%A4%A7%E5%AD%A6%E7%82%B8%E5%BC%B9%E5%AE%A2": { + "results": [ + { + "id": 1492640, + "title": "大学炸弹客", + "original_title": "UNABOMBER", + "original_language": "en", + "release_date": "2026-09-25", + "popularity": 177.9249 + }, + { + "id": 660353, + "title": "大学航空炸弹客", + "original_title": "Ted K", + "original_language": "en", + "release_date": "2021-10-29", + "popularity": 5.2572 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=%E6%80%AA%E5%8C%96%E7%8C%AB%EF%BC%9A%E8%9B%87%E7%A5%9E": { + "results": [] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=%E6%98%9F%E9%99%85%E7%A9%BF%E8%B6%8A": { + "results": [ + { + "id": 157336, + "title": "星际穿越", + "original_title": "Interstellar", + "original_language": "en", + "release_date": "2014-11-05", + "popularity": 70.85 + }, + { + "id": 529107, + "title": "走进《星际穿越》", + "original_title": "Inside 'Interstellar'", + "original_language": "en", + "release_date": "2015-03-31", + "popularity": 2.6739 + }, + { + "id": 301959, + "title": "星际穿越:诺兰的奥德赛", + "original_title": "Interstellar: Nolan's Odyssey", + "original_language": "en", + "release_date": "2014-11-05", + "popularity": 3.3288 + }, + { + "id": 336592, + "title": "星际穿越中的科学", + "original_title": "The Science of Interstellar", + "original_language": "en", + "release_date": "2014-11-13", + "popularity": 3.062 + }, + { + "id": 287954, + "title": "洛丽塔", + "original_title": "Lolita from Interstellar Space", + "original_language": "en", + "release_date": "2014-03-08", + "popularity": 2.3293 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=%E6%98%9F%E9%99%85%E7%A9%BF%E8%B6%8A%E4%B8%AD%E7%9A%84%E7%A7%91%E5%AD%A6": { + "results": [ + { + "id": 336592, + "title": "星际穿越中的科学", + "original_title": "The Science of Interstellar", + "original_language": "en", + "release_date": "2014-11-13", + "popularity": 3.062 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=%E7%8C%AA%E7%8C%AA%E4%BE%A0%E5%A4%A7%E7%94%B5%E5%BD%B1%C2%B7%E6%98%9F%E9%99%85%E8%A1%8C%E5%8A%A8": { + "results": [ + { + "id": 1260260, + "title": "猪猪侠大电影·星际行动", + "original_title": "猪猪侠大电影·星际行动", + "original_language": "zh", + "release_date": "2024-05-01", + "popularity": 0.9291 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=%E8%B4%9D%E6%AF%94%E6%AF%99%E5%92%9A": { + "results": [ + { + "id": 1512084, + "title": "贝比毙咚", + "original_title": "Baby Do Die Do", + "original_language": "hi", + "release_date": "2026-07-03", + "popularity": 9.5527 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=Baby+Do+Die+Do": { + "results": [ + { + "id": 1512084, + "title": "贝比毙咚", + "original_title": "Baby Do Die Do", + "original_language": "hi", + "release_date": "2026-07-03", + "popularity": 9.5527 + }, + { + "id": 17824, + "title": "私人手段", + "original_title": "Private Resort", + "original_language": "en", + "release_date": "1985-05-03", + "popularity": 6.0454 + }, + { + "id": 95548, + "title": "蓬斗碧玉泪", + "original_title": "Baby the Rain Must Fall", + "original_language": "en", + "release_date": "1965-01-12", + "popularity": 2.4967 + }, + { + "id": 28049, + "title": "驱魔任务", + "original_title": "Operazione paura", + "original_language": "it", + "release_date": "1966-07-08", + "popularity": 2.2448 + }, + { + "id": 49684, + "title": "它是活尸3:活尸岛", + "original_title": "It's Alive III: Island of the Alive", + "original_language": "en", + "release_date": "1987-05-27", + "popularity": 3.0299 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=GG+Bond+Interstellar+Mission": { + "results": [ + { + "id": 1260260, + "title": "猪猪侠大电影·星际行动", + "original_title": "猪猪侠大电影·星际行动", + "original_language": "zh", + "release_date": "2024-05-01", + "popularity": 0.9291 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=Interstellar": { + "results": [ + { + "id": 157336, + "title": "星际穿越", + "original_title": "Interstellar", + "original_language": "en", + "release_date": "2014-11-05", + "popularity": 70.85 + }, + { + "id": 529107, + "title": "走进《星际穿越》", + "original_title": "Inside 'Interstellar'", + "original_language": "en", + "release_date": "2015-03-31", + "popularity": 2.6739 + }, + { + "id": 287954, + "title": "洛丽塔", + "original_title": "Lolita from Interstellar Space", + "original_language": "en", + "release_date": "2014-03-08", + "popularity": 2.3293 + }, + { + "id": 398188, + "title": "星际大战", + "original_title": "Interstellar Wars", + "original_language": "en", + "release_date": "2016-06-09", + "popularity": 1.4452 + }, + { + "id": 301959, + "title": "星际穿越:诺兰的奥德赛", + "original_title": "Interstellar: Nolan's Odyssey", + "original_language": "en", + "release_date": "2014-11-05", + "popularity": 3.3288 + }, + { + "id": 336592, + "title": "星际穿越中的科学", + "original_title": "The Science of Interstellar", + "original_language": "en", + "release_date": "2014-11-13", + "popularity": 3.062 + }, + { + "id": 1443305, + "title": "Container Interstellar", + "original_title": "Container Interstellar", + "original_language": "de", + "release_date": "2001-01-01", + "popularity": 0.6955 + }, + { + "id": 1391726, + "title": "Interstellar Stella", + "original_title": "Interstellar Stella", + "original_language": "en", + "release_date": "2006-12-11", + "popularity": 0.5541 + }, + { + "id": 1282990, + "title": "Interstellar Interference", + "original_title": "Interstellar Interference", + "original_language": "en", + "release_date": "2023-04-22", + "popularity": 0.5866 + }, + { + "id": 1450827, + "title": "Interstellar Political Prisoner", + "original_title": "Interstellar Political Prisoner", + "original_language": "en", + "release_date": "2016-09-25", + "popularity": 0.5451 + }, + { + "id": 1642987, + "title": "Primus Interstellar Drum Derby", + "original_title": "Primus Interstellar Drum Derby", + "original_language": "en", + "release_date": "2025-02-20", + "popularity": 1.0478 + }, + { + "id": 660698, + "title": "Faster Than Light: the Dream of Interstellar Flight", + "original_title": "Faster Than Light: the Dream of Interstellar Flight", + "original_language": "en", + "release_date": "2017-06-07", + "popularity": 1.2416 + }, + { + "id": 460616, + "title": "Interstellar Civil War: Shadows of the Empire", + "original_title": "Interstellar Civil War: Shadows of the Empire", + "original_language": "en", + "release_date": "2017-03-18", + "popularity": 1.584 + }, + { + "id": 716603, + "title": "Only Interstellar Pinball Lives Forever", + "original_title": "Only Interstellar Pinball Lives Forever", + "original_language": "en", + "release_date": "2010-06-28", + "popularity": 0.7586 + }, + { + "id": 552531, + "title": "The Prom Goer's Interstellar Excursion", + "original_title": "The Prom Goer's Interstellar Excursion", + "original_language": "en", + "release_date": "", + "popularity": 0.7598 + }, + { + "id": 763179, + "title": "Cosmic Journey: The Voyager Interstellar Mission and Message", + "original_title": "Cosmic Journey: The Voyager Interstellar Mission and Message", + "original_language": "en", + "release_date": "2003-01-16", + "popularity": 0.9778 + }, + { + "id": 1501040, + "title": "The Future is Now: A Look Back at Interstellar", + "original_title": "The Future is Now: A Look Back at Interstellar", + "original_language": "en", + "release_date": "2024-12-10", + "popularity": 0.5649 + }, + { + "id": 986255, + "title": "How to Colonize the Stars: The Challenge of Interstellar Flight", + "original_title": "How to Colonize the Stars: The Challenge of Interstellar Flight", + "original_language": "en", + "release_date": "2009-06-09", + "popularity": 0.4526 + }, + { + "id": 649745, + "title": "星际流浪", + "original_title": "星际流浪", + "original_language": "zh", + "release_date": "2019-08-02", + "popularity": 1.1721 + }, + { + "id": 261443, + "title": "Angry Planet", + "original_title": "Angry Planet", + "original_language": "en", + "release_date": "2008-01-01", + "popularity": 2.552 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=Mononoke+The+Movie+Chapter+III+The+Curse+of+the+Serpent": { + "results": [ + { + "id": 1322562, + "title": "剧场版物怪:第 3 章:蛇神", + "original_title": "劇場版モノノ怪 第三章 蛇神", + "original_language": "ja", + "release_date": "2026-05-29", + "popularity": 4.6403 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=The+Science+of+Interstellar": { + "results": [ + { + "id": 336592, + "title": "星际穿越中的科学", + "original_title": "The Science of Interstellar", + "original_language": "en", + "release_date": "2014-11-13", + "popularity": 3.062 + } + ] + }, + "/search/movie?include_adult=false&language=zh-CN&page=1&query=UNABOMBER": { + "results": [ + { + "id": 1492640, + "title": "大学炸弹客", + "original_title": "UNABOMBER", + "original_language": "en", + "release_date": "2026-09-25", + "popularity": 177.9249 + }, + { + "id": 300532, + "title": "Unabomber: The True Story", + "original_title": "Unabomber: The True Story", + "original_language": "en", + "release_date": "1996-09-11", + "popularity": 2.6243 + }, + { + "id": 1043074, + "title": "Unabomber", + "original_title": "Unabomber", + "original_language": "it", + "release_date": "2022-10-14", + "popularity": 1.3647 + }, + { + "id": 495964, + "title": "Unabomber: The Secret History", + "original_title": "Unabomber: The Secret History", + "original_language": "en", + "release_date": "2008-01-14", + "popularity": 1.4795 + }, + { + "id": 77786, + "title": "Das Netz", + "original_title": "Das Netz", + "original_language": "de", + "release_date": "2003-10-01", + "popularity": 1.5337 + }, + { + "id": 660353, + "title": "大学航空炸弹客", + "original_title": "Ted K", + "original_language": "en", + "release_date": "2021-10-29", + "popularity": 5.2572 + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%80%E6%96%A9%E8%8B%8D%E7%A9%B9": { + "results": [ + { + "id": 303287, + "name": "一斩苍穹", + "original_name": "一斩苍穹", + "original_language": "zh", + "first_air_date": "2026-07-28", + "popularity": 9.7396, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%80%E7%93%AF%E6%98%A5": { + "results": [ + { + "id": 294990, + "name": "一瓯春", + "original_name": "一瓯春", + "original_language": "zh", + "first_air_date": "2026-09-17", + "popularity": 25.4305, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%80%E7%BA%B8%E6%8A%A5%E5%91%8A+%E7%9C%8B%E7%A9%BF%E4%BA%BA%E5%BF%83": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%87%E7%95%8C%E7%8B%AC%E5%B0%8A": { + "results": [ + { + "id": 122612, + "name": "万界独尊", + "original_name": "万界独尊", + "original_language": "zh", + "first_air_date": "2021-04-06", + "popularity": 14.7534, + "origin_country": ["CN"] + }, + { + "id": 247201, + "name": "万界独尊", + "original_name": "万界独尊", + "original_language": "zh", + "first_air_date": "2023-09-28", + "popularity": 1.0752, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%88%E5%A4%AB%E7%9A%84%E6%B8%A9%E6%9F%94%E9%99%B7%E9%98%B1": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%89%E8%A7%92%E6%B4%B2%EF%BC%9A%E9%80%A0%E7%89%A9%E4%B8%BB%E7%8E%A9%E5%AE%B6": { + "results": [ + { + "id": 331320, + "name": "三角洲:造物主玩家", + "original_name": "三角洲:造物主玩家", + "original_language": "zh", + "first_air_date": "2026-08-10", + "popularity": 1.3132, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%8D%E5%A5%BD%E6%84%8F%E6%80%9D+%E6%88%91%E5%BC%80%E6%8C%82%E4%BA%86": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%8D%E5%A9%9A%E4%B8%BB%E4%B9%89": { "results": [] }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%8D%E8%AF%86%E9%99%8C%E7%94%9F%E4%BA%BA": { + "results": [ + { + "id": 320760, + "name": "不识陌生人", + "original_name": "Seni Tanıyorum", + "original_language": "tr", + "first_air_date": "2026-09-17", + "popularity": 46.861, + "origin_country": ["TR"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B8%9C%E5%8C%97%E6%9C%89%E4%B8%AA%E5%91%A8%E4%B8%9C%E5%8C%97": { + "results": [ + { + "id": 312027, + "name": "东北有个周东北", + "original_name": "东北有个周东北", + "original_language": "zh", + "first_air_date": "2026-09-28", + "popularity": 4.3313, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B9%8C%E9%B8%A6%E4%BF%B1%E4%B9%90%E9%83%A8": { + "results": [ + { + "id": 312585, + "name": "乌鸦俱乐部", + "original_name": "อีกาสมาคม", + "original_language": "th", + "first_air_date": "2026-09-18", + "popularity": 10.9979, + "origin_country": ["TH"] + }, + { + "id": 63314, + "name": "乌鸦足球队", + "original_name": "Club de Cuervos", + "original_language": "en", + "first_air_date": "2015-08-07", + "popularity": 10.4934, + "origin_country": ["US"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%B9%90%E9%AB%98%E8%88%AA%E6%B5%B7%E7%8E%8B": { + "results": [ + { + "id": 318918, + "name": "乐高航海王", + "original_name": "LEGO ONE PIECE", + "original_language": "en", + "first_air_date": "2026-09-29", + "popularity": 3.9733, + "origin_country": ["CA", "US", "JP"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%BA%91%E9%9B%80%E5%8F%AB%E5%A4%A9%E5%BD%95": { + "results": [ + { + "id": 288873, + "name": "云雀叫天录", + "original_name": "云雀叫天录", + "original_language": "zh", + "first_air_date": "2026-09-14", + "popularity": 5.9637, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%BA%AC%E5%A4%9C%E5%96%9C%E4%BD%A0": { "results": [] }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%BA%BA%E4%B8%AD%E4%B9%8B%E9%BE%99": { + "results": [ + { + "id": 313635, + "name": "如龙 Powered by 日本统一", + "original_name": "龍が如く Powered by 日本統一", + "original_language": "ja", + "first_air_date": "2026-02-10", + "popularity": 3.0893, + "origin_country": ["JP"] + }, + { + "id": 256116, + "name": "如龙", + "original_name": "Like a Dragon: Yakuza", + "original_language": "en", + "first_air_date": "2024-10-24", + "popularity": 7.1985, + "origin_country": ["US"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%BA%BA%E8%BA%AB%E4%BF%9D%E6%8A%A4%E4%BB%A4": { + "results": [ + { + "id": 308963, + "name": "人身保护令", + "original_name": "Habeas Corpus", + "original_language": "pt", + "first_air_date": "2026-09-23", + "popularity": 32.4819, + "origin_country": ["BR"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%BB%8A%E5%A4%A9%E6%9C%89%E6%9C%B5%E4%BA%91%E7%88%B1%E6%88%91": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E4%BB%96%E7%9A%84%E6%B8%A9%E6%9F%94%E8%93%84%E8%B0%8B%E5%B7%B2%E4%B9%85": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%84%BF%E5%AA%B3%E6%88%BF%E9%97%B4%E7%9A%84%E7%A7%98%E5%AF%86": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%85%A8%E5%BA%9C%E5%81%B7%E5%90%AC%E6%88%91%E5%92%8C%E9%97%BA%E8%9C%9C%E5%BF%83%E5%A3%B0%E8%A2%AB%E5%B8%A6%E9%A3%9E": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%85%A8%E6%9D%91%E9%83%BD%E5%9C%A8%E7%9C%8B+%E5%BD%B1%E5%B8%9D%E4%B8%8B%E5%9C%B0%E7%8B%82%E8%BF%BD%E5%89%8D%E5%A5%B3%E5%8F%8B": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%85%AC%E5%85%AC%E7%94%A9%E8%B5%84%E8%AE%A9%E6%88%91%E7%A6%BB%E5%A9%9A+%E5%89%8D%E5%A4%AB%E5%A9%9A%E7%A4%BC%E4%B8%8A%E6%88%91%E6%83%8A%E8%89%B3%E5%85%A8%E5%9C%BA": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%86%8D%E9%80%A0%E5%AE%8B%E9%AA%A8": { "results": [] }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%86%A5%E7%8E%8B%E5%BD%92%E6%9D%A5+%E4%B8%93%E6%B2%BB%E5%A4%A7%E5%B0%8F%E5%A7%90%E4%B8%8D%E6%9C%8D": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%87%A1%E4%BA%BA%E6%97%A0%E6%83%A7%E4%B9%8B%E8%BA%AF": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%88%AB%E6%A0%B7%E4%B8%96%E7%95%8C": { + "results": [ + { + "id": 305357, + "name": "别样世界", + "original_name": "A Different World", + "original_language": "en", + "first_air_date": "2026-09-24", + "popularity": 34.2343, + "origin_country": ["US"] + }, + { + "id": 19628, + "name": "BBC-大象的别样世界", + "original_name": "The Secret Life of Elephants", + "original_language": "en", + "first_air_date": "2009-01-14", + "popularity": 0.8107, + "origin_country": ["GB"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%97%A8%EF%BC%81%E8%90%A5%E4%B8%9A%E4%B8%AD": { + "results": [ + { + "id": 211849, + "name": "嗨!营业中", + "original_name": "嗨! 營業中", + "original_language": "zh", + "first_air_date": "2022-10-01", + "popularity": 3.8453, + "origin_country": ["TW"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%A4%A7%E5%AD%A6%E7%82%B8%E5%BC%B9%E5%AE%A2": { + "results": [ + { + "id": 99954, + "name": "大学炸弹客:自述", + "original_name": "Unabomber: In His Own Words", + "original_language": "en", + "first_air_date": "2020-02-22", + "popularity": 2.768, + "origin_country": ["US"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%AF%BB%E5%A5%B3%E6%97%A0%E5%BD%92%E9%80%94": { + "results": [ + { + "id": 285147, + "name": "寻女无归途", + "original_name": "शक: Trust No One", + "original_language": "hi", + "first_air_date": "2026-09-24", + "popularity": 18.157, + "origin_country": ["IN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%BC%80%E7%81%AB%E5%BC%80%E4%BC%99": { + "results": [ + { + "id": 333167, + "name": "开火开伙", + "original_name": "開火開伙", + "original_language": "zh", + "first_air_date": "2026-08-29", + "popularity": 2.2743, + "origin_country": ["TW"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%BE%81%E9%80%94": { + "results": [ + { + "id": 336207, + "name": "征途", + "original_name": "征途", + "original_language": "zh", + "first_air_date": "2026-09-26", + "popularity": 3.6766, + "origin_country": ["CN"] + }, + { + "id": 102355, + "name": "岚日志:征途", + "original_name": "ARASHI's Diary -Voyage-", + "original_language": "ja", + "first_air_date": "2019-12-31", + "popularity": 4.7988, + "origin_country": ["JP"] + }, + { + "id": 285416, + "name": "少年征途", + "original_name": "Boys' Journey", + "original_language": "th", + "first_air_date": "2023-03-09", + "popularity": 2.6404, + "origin_country": ["TH"] + }, + { + "id": 317594, + "name": "星月征途", + "original_name": "星月征途", + "original_language": "zh", + "first_air_date": "2026-06-09", + "popularity": 2.9792, + "origin_country": ["CN"] + }, + { + "id": 212026, + "name": "红旗·征途", + "original_name": "红旗·征途", + "original_language": "zh", + "first_air_date": "2022-10-10", + "popularity": 0.4125, + "origin_country": ["CN"] + }, + { + "id": 202080, + "name": "螃蟹的征途", + "original_name": "螃蟹的征途", + "original_language": "zh", + "first_air_date": "2020-07-10", + "popularity": 1.4499, + "origin_country": ["CN"] + }, + { + "id": 301220, + "name": "太空星征途", + "original_name": "太空星征途", + "original_language": "zh", + "first_air_date": "2022-01-03", + "popularity": 1.3064, + "origin_country": ["CN"] + }, + { + "id": 210206, + "name": "辣椒的征途", + "original_name": "辣椒的征途", + "original_language": "zh", + "first_air_date": "2022-02-01", + "popularity": 2.1441, + "origin_country": ["CN"] + }, + { + "id": 207338, + "name": "我们的征途", + "original_name": "我们的征途", + "original_language": "zh", + "first_air_date": "2021-12-24", + "popularity": 0.7718, + "origin_country": ["CN"] + }, + { + "id": 278434, + "name": "踏上征途", + "original_name": "踏上征途", + "original_language": "zh", + "first_air_date": "1986-01-01", + "popularity": 0.5165, + "origin_country": ["CN"] + }, + { + "id": 310160, + "name": "创新的征途", + "original_name": "创新的征途", + "original_language": "zh", + "first_air_date": "2025-10-01", + "popularity": 0.4314, + "origin_country": ["CN"] + }, + { + "id": 104897, + "name": "壮士出川", + "original_name": "壮士出川", + "original_language": "zh", + "first_air_date": "2013-10-03", + "popularity": 3.3281, + "origin_country": ["CN"] + }, + { + "id": 213375, + "name": "幻视任务", + "original_name": "VisionQuest", + "original_language": "en", + "first_air_date": "2026-10-14", + "popularity": 19.298, + "origin_country": ["US"] + }, + { + "id": 130163, + "name": "我们的法则", + "original_name": "我们的法则", + "original_language": "zh", + "first_air_date": "2016-06-11", + "popularity": 3.2951, + "origin_country": ["CN"] + }, + { + "id": 81309, + "name": "世界冠军养成记", + "original_name": "Becoming Champions", + "original_language": "en", + "first_air_date": "2018-08-01", + "popularity": 1.6138, + "origin_country": ["US"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E5%BF%83%E5%8A%A8%E7%9A%84%E4%BF%A1%E5%8F%B7": { + "results": [ + { + "id": 103147, + "name": "心动的信号", + "original_name": "心动的信号", + "original_language": "zh", + "first_air_date": "2018-08-26", + "popularity": 41.9862, + "origin_country": ["CN"] + }, + { + "id": 72976, + "name": "心脏信号", + "original_name": "하트시그널", + "original_language": "ko", + "first_air_date": "2017-06-02", + "popularity": 10.2, + "origin_country": ["KR"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E6%80%AA%E5%8C%96%E7%8C%AB%EF%BC%9A%E8%9B%87%E7%A5%9E": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E6%88%91%E4%B8%8D%E6%98%AF%E5%A4%A7%E5%B8%88": { + "results": [ + { + "id": 289078, + "name": "我不是大师", + "original_name": "我不是大师", + "original_language": "zh", + "first_air_date": "2026-09-24", + "popularity": 16.712, + "origin_country": ["CN"] + }, + { + "id": 236094, + "name": "王者大师兄", + "original_name": "王者大师兄", + "original_language": "zh", + "first_air_date": "2023-09-30", + "popularity": 1.1138, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E6%8E%8C%E9%97%A8%E4%BD%8E%E8%B0%83%E7%82%B9": { + "results": [ + { + "id": 331064, + "name": "掌门低调点", + "original_name": "掌门低调点", + "original_language": "zh", + "first_air_date": "2026-08-07", + "popularity": 0.7322, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E6%97%A0%E5%8F%AF%E6%9B%BF%E4%BB%A3": { + "results": [ + { + "id": 297982, + "name": "无可替代", + "original_name": "无可替代", + "original_language": "zh", + "first_air_date": "2026-09-28", + "popularity": 14.5938, + "origin_country": ["CN"] + }, + { + "id": 106820, + "name": "无可替代", + "original_name": "คนละทีเดียวกัน", + "original_language": "th", + "first_air_date": "2020-09-18", + "popularity": 3.0844, + "origin_country": ["TH"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E6%98%9F%E9%99%85%E7%A9%BF%E8%B6%8A": { "results": [] }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E6%98%9F%E9%99%85%E7%A9%BF%E8%B6%8A%E4%B8%AD%E7%9A%84%E7%A7%91%E5%AD%A6": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E6%A1%A3%E6%A1%88": { + "results": [ + { + "id": 4087, + "name": "X档案", + "original_name": "The X-Files", + "original_language": "en", + "first_air_date": "1993-09-10", + "popularity": 153.905, + "origin_country": ["US"] + }, + { + "id": 201401, + "name": "档案", + "original_name": "档案", + "original_language": "zh", + "first_air_date": "2009-02-04", + "popularity": 10.5526, + "origin_country": ["CN"] + }, + { + "id": 278605, + "name": "南部档案", + "original_name": "南部档案", + "original_language": "zh", + "first_air_date": "2026-06-11", + "popularity": 11.049, + "origin_country": ["CN"] + }, + { + "id": 21561, + "name": "迷离档案", + "original_name": "The Outer Limits", + "original_language": "en", + "first_air_date": "1995-03-26", + "popularity": 127.9027, + "origin_country": ["US"] + }, + { + "id": 21567, + "name": "迷离档案", + "original_name": "The Outer Limits", + "original_language": "en", + "first_air_date": "1963-09-16", + "popularity": 39.9812, + "origin_country": ["US"] + }, + { + "id": 122845, + "name": "龙年档案", + "original_name": "龙年档案", + "original_language": "zh", + "first_air_date": "2003-08-25", + "popularity": 1.9411, + "origin_country": ["CN"] + }, + { + "id": 330024, + "name": "档案(bilibili连载)", + "original_name": "档案(bilibili连载)", + "original_language": "zh", + "first_air_date": "2009-02-04", + "popularity": 1.8961, + "origin_country": ["CN"] + }, + { + "id": 202001, + "name": "蓝色档案", + "original_name": "蓝色档案", + "original_language": "zh", + "first_air_date": "2008-07-27", + "popularity": 3.5954, + "origin_country": ["CN"] + }, + { + "id": 71971, + "name": "刑事侦缉档案", + "original_name": "刑事偵緝檔案", + "original_language": "cn", + "first_air_date": "1995-03-13", + "popularity": 36.1558, + "origin_country": ["HK"] + }, + { + "id": 99962, + "name": "探案拍档", + "original_name": "McDonald & Dodds", + "original_language": "en", + "first_air_date": "2020-03-01", + "popularity": 22.7092, + "origin_country": ["GB"] + }, + { + "id": 115452, + "name": "探灵档案", + "original_name": "探灵档案", + "original_language": "zh", + "first_air_date": "2014-03-07", + "popularity": 2.2483, + "origin_country": ["CN"] + }, + { + "id": 95825, + "name": "马略卡档案", + "original_name": "The Mallorca Files", + "original_language": "en", + "first_air_date": "2019-11-25", + "popularity": 8.885, + "origin_country": ["GB"] + }, + { + "id": 218833, + "name": "蔚蓝档案 The Animation", + "original_name": "ブルーアーカイブ The Animation", + "original_language": "ja", + "first_air_date": "2024-04-07", + "popularity": 13.3179, + "origin_country": ["JP"] + }, + { + "id": 86312, + "name": "梅花档案", + "original_name": "梅花档案", + "original_language": "zh", + "first_air_date": "2003-10-24", + "popularity": 3.8512, + "origin_country": ["CN"] + }, + { + "id": 112314, + "name": "81号档案", + "original_name": "Archive 81", + "original_language": "en", + "first_air_date": "2022-01-14", + "popularity": 8.8031, + "origin_country": ["US"] + }, + { + "id": 106911, + "name": "迷离档案", + "original_name": "迷離檔案", + "original_language": "cn", + "first_air_date": "1997-05-12", + "popularity": 3.7657, + "origin_country": ["HK"] + }, + { + "id": 123611, + "name": "寻人档案", + "original_name": "寻人档案", + "original_language": "zh", + "first_air_date": "2002-01-01", + "popularity": 1.1078, + "origin_country": ["CN"] + }, + { + "id": 80475, + "name": "惠灵顿灵异档案", + "original_name": "Wellington Paranormal", + "original_language": "en", + "first_air_date": "2018-07-11", + "popularity": 10.485, + "origin_country": ["NZ"] + }, + { + "id": 4955, + "name": "灵异档案", + "original_name": "The Dresden Files", + "original_language": "en", + "first_air_date": "2007-01-21", + "popularity": 10.7279, + "origin_country": ["US"] + }, + { + "id": 221931, + "name": "刑事侦缉档案2", + "original_name": "刑事侦缉档案2", + "original_language": "cn", + "first_air_date": "1995-12-11", + "popularity": 1.8381, + "origin_country": ["HK"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E6%AD%A6%E7%A5%9E%E4%B8%BB%E5%AE%B0": { + "results": [ + { + "id": 110181, + "name": "武神主宰", + "original_name": "武神主宰", + "original_language": "zh", + "first_air_date": "2020-03-07", + "popularity": 32.9671, + "origin_country": ["CN"] + }, + { + "id": 228707, + "name": "武神主宰", + "original_name": "武神主宰", + "original_language": "zh", + "first_air_date": "2023-06-14", + "popularity": 3.7671, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E7%82%BC%E6%B0%94%E5%8D%81%E4%B8%87%E5%B9%B4": { + "results": [ + { + "id": 220850, + "name": "炼气十万年", + "original_name": "炼气十万年", + "original_language": "zh", + "first_air_date": "2023-02-18", + "popularity": 32.4193, + "origin_country": ["CN"] + }, + { + "id": 328778, + "name": "炼气十万年特别篇 阳极天下", + "original_name": "炼气十万年特别篇 阳极天下", + "original_language": "zh", + "first_air_date": "2026-07-18", + "popularity": 0.7526, + "origin_country": ["CN"] + }, + { + "id": 246649, + "name": "炼气十万年", + "original_name": "练气十万年", + "original_language": "zh", + "first_air_date": "2024-01-22", + "popularity": 1.0822, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E7%8C%AA%E7%8C%AA%E4%BE%A0%E5%A4%A7%E7%94%B5%E5%BD%B1%C2%B7%E6%98%9F%E9%99%85%E8%A1%8C%E5%8A%A8": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E7%BB%9D%E4%B8%96%E6%88%98%E9%AD%82": { + "results": [ + { + "id": 252788, + "name": "绝世战魂", + "original_name": "绝世战魂", + "original_language": "zh", + "first_air_date": "2024-04-27", + "popularity": 6.9387, + "origin_country": ["CN"] + }, + { + "id": 250817, + "name": "绝世战魂", + "original_name": "绝世战魂", + "original_language": "zh", + "first_air_date": "2021-05-12", + "popularity": 0.5624, + "origin_country": ["CN"] + }, + { + "id": 255200, + "name": "绝世战魂", + "original_name": "绝世战魂", + "original_language": "zh", + "first_air_date": "2023-04-07", + "popularity": 0.456, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E7%BB%BF%E7%81%AF%E5%86%9B%E5%9B%A2": { + "results": [ + { + "id": 95350, + "name": "绿灯军团", + "original_name": "Lanterns", + "original_language": "en", + "first_air_date": "2026-08-16", + "popularity": 340.3226, + "origin_country": ["US"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E8%AE%B0%E5%BF%86%E7%AE%A1%E7%90%86%E5%B1%80": { + "results": [ + { + "id": 280564, + "name": "记忆管理局", + "original_name": "记忆管理局", + "original_language": "zh", + "first_air_date": "2026-08-02", + "popularity": 12.2033, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E8%B4%9D%E6%AF%94%E6%AF%99%E5%92%9A": { "results": [] }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E8%BF%99%E5%B0%B1%E6%98%AF%E4%B8%AD%E5%9B%BD": { + "results": [ + { + "id": 206367, + "name": "这就是中国", + "original_name": "这就是中国", + "original_language": "zh", + "first_air_date": "2019-01-07", + "popularity": 2.7888, + "origin_country": ["CN"] + }, + { + "id": 314456, + "name": "这就是中国", + "original_name": "这就是中国", + "original_language": "zh", + "first_air_date": "2025-12-11", + "popularity": 0.4993, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=%E9%95%BF%E7%94%9F%E5%A5%91": { + "results": [ + { + "id": 318884, + "name": "长生契", + "original_name": "长生契", + "original_language": "zh", + "first_air_date": "2026-09-24", + "popularity": 4.634, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=A+Different+World": { + "results": [ + { + "id": 305357, + "name": "别样世界", + "original_name": "A Different World", + "original_language": "en", + "first_air_date": "2026-09-24", + "popularity": 34.2343, + "origin_country": ["US"] + }, + { + "id": 115, + "name": "不同的世界", + "original_name": "A Different World", + "original_language": "en", + "first_air_date": "1987-09-24", + "popularity": 63.085, + "origin_country": ["US"] + }, + { + "id": 65942, + "name": "Re:从零开始的异世界生活", + "original_name": "Re:ゼロから始める異世界生活", + "original_language": "ja", + "first_air_date": "2016-04-04", + "popularity": 247.7138, + "origin_country": ["JP"] + }, + { + "id": 259558, + "name": "独自一人的异世界攻略", + "original_name": "ひとりぼっちの異世界攻略", + "original_language": "ja", + "first_air_date": "2024-09-27", + "popularity": 10.7829, + "origin_country": ["JP"] + }, + { + "id": 208493, + "name": "在异世界获得超强能力的我,在现实世界照样无敌~等级提升改变人生命运~", + "original_name": "異世界でチート能力を手にした俺は、現実世界をも無双する ~レベルアップは人生を変えた~", + "original_language": "ja", + "first_air_date": "2023-04-07", + "popularity": 16.5072, + "origin_country": ["JP"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=A+Prophet": { + "results": [ + { + "id": 289078, + "name": "我不是大师", + "original_name": "我不是大师", + "original_language": "zh", + "first_air_date": "2026-09-24", + "popularity": 16.712, + "origin_country": ["CN"] + }, + { + "id": 70802, + "name": "یوسف پیامبر", + "original_name": "یوسف پیامبر", + "original_language": "fa", + "first_air_date": "2009-08-22", + "popularity": 8.8702, + "origin_country": ["IR"] + }, + { + "id": 224006, + "name": "预言者", + "original_name": "Un prophète", + "original_language": "fr", + "first_air_date": "2026-03-02", + "popularity": 3.5543, + "origin_country": ["FR"] + }, + { + "id": 334465, + "name": "Professeur Raoult vs le gang des Cerises", + "original_name": "Professeur Raoult vs le gang des Cerises", + "original_language": "fr", + "first_air_date": "2026-09-11", + "popularity": 2.7795, + "origin_country": ["FR"] + }, + { + "id": 316898, + "name": "相信我:假先知真面目", + "original_name": "Trust Me: The False Prophet", + "original_language": "en", + "first_air_date": "2026-04-08", + "popularity": 6.725, + "origin_country": ["US"] + }, + { + "id": 90228, + "name": "沙丘:预言", + "original_name": "Dune: Prophecy", + "original_language": "en", + "first_air_date": "2024-11-17", + "popularity": 27.7309, + "origin_country": ["US"] + }, + { + "id": 72188, + "name": "La prophétie d'Avignon", + "original_name": "La prophétie d'Avignon", + "original_language": "fr", + "first_air_date": "2007-08-28", + "popularity": 3.3372, + "origin_country": ["FR"] + }, + { + "id": 58708, + "name": "科幻小说预言家", + "original_name": "Prophets of Science Fiction", + "original_language": "en", + "first_air_date": "2011-11-09", + "popularity": 2.9789, + "origin_country": ["US"] + }, + { + "id": 242181, + "name": "外星先知雷尔", + "original_name": "Raël : Le prophète des extraterrestres", + "original_language": "fr", + "first_air_date": "2024-02-07", + "popularity": 3.067, + "origin_country": ["FR"] + }, + { + "id": 73691, + "name": "Dans la tête d'Alan Moore", + "original_name": "Dans la tête d'Alan Moore", + "original_language": "fr", + "first_air_date": "2017-07-31", + "popularity": 2.564, + "origin_country": ["FR"] + }, + { + "id": 67302, + "name": "Countdown to Apocalypse", + "original_name": "Countdown to Apocalypse", + "original_language": "en", + "first_air_date": "2012-11-09", + "popularity": 1.5598, + "origin_country": [] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Archives": { + "results": [ + { + "id": 237050, + "name": "Archives secrètes", + "original_name": "Archives secrètes", + "original_language": "fr", + "first_air_date": "2021-09-09", + "popularity": 2.7427, + "origin_country": ["FR"] + }, + { + "id": 114375, + "name": "RBO - The Archives", + "original_name": "RBO - The Archives", + "original_language": "fr", + "first_air_date": "2020-12-08", + "popularity": 2.93, + "origin_country": ["CA"] + }, + { + "id": 70250, + "name": "Phenomenon: The Lost Archives", + "original_name": "Phenomenon: The Lost Archives", + "original_language": "en", + "first_air_date": "1998-01-01", + "popularity": 2.6707, + "origin_country": ["US"] + }, + { + "id": 75339, + "name": "Mystères d'archives", + "original_name": "Mystères d'archives", + "original_language": "fr", + "first_air_date": "2009-07-10", + "popularity": 1.9237, + "origin_country": ["FR"] + }, + { + "id": 57505, + "name": "WWII: The Lost Color Archives", + "original_name": "WWII: The Lost Color Archives", + "original_language": "en", + "first_air_date": "2000-07-05", + "popularity": 2.3745, + "origin_country": [] + }, + { + "id": 98171, + "name": "Analog Archives", + "original_name": "Analog Archives", + "original_language": "en", + "first_air_date": "2019-06-05", + "popularity": 0.5402, + "origin_country": [] + }, + { + "id": 327068, + "name": "The Magnus Archives", + "original_name": "The Magnus Archives", + "original_language": "en", + "first_air_date": "2016-03-24", + "popularity": 1.2493, + "origin_country": ["GB"] + }, + { + "id": 43655, + "name": "Archives of Death", + "original_name": "Archives of Death", + "original_language": "en", + "first_air_date": "1980-01-04", + "popularity": 1.1738, + "origin_country": [] + }, + { + "id": 82163, + "name": "UFOs: The Footage Archives", + "original_name": "UFOs: The Footage Archives", + "original_language": "en", + "first_air_date": "1999-06-03", + "popularity": 0.5829, + "origin_country": [] + }, + { + "id": 294047, + "name": "Evil in The Archives", + "original_name": "Evil in The Archives", + "original_language": "en", + "first_air_date": "2024-11-20", + "popularity": 0.435, + "origin_country": ["US"] + }, + { + "id": 261092, + "name": "Singapour, les archives retrouvées", + "original_name": "Singapour, les archives retrouvées", + "original_language": "fr", + "first_air_date": "2024-07-14", + "popularity": 0.4193, + "origin_country": ["FR"] + }, + { + "id": 237942, + "name": "Inside Hitler's Bunker: The Last Archives", + "original_name": "Inside Hitler's Bunker: The Last Archives", + "original_language": "en", + "first_air_date": "2019-01-02", + "popularity": 0.4445, + "origin_country": ["US"] + }, + { + "id": 249866, + "name": "Les Archives d'après minuit", + "original_name": "Les Archives d'après minuit", + "original_language": "fr", + "first_air_date": "2023-01-23", + "popularity": 0.5645, + "origin_country": ["FR"] + }, + { + "id": 201401, + "name": "档案", + "original_name": "档案", + "original_language": "zh", + "first_air_date": "2009-02-04", + "popularity": 10.5526, + "origin_country": ["CN"] + }, + { + "id": 134764, + "name": "The World of Hammer", + "original_name": "The World of Hammer", + "original_language": "en", + "first_air_date": "1994-08-12", + "popularity": 13.3535, + "origin_country": ["GB"] + }, + { + "id": 204305, + "name": "香港奇案", + "original_name": "香港奇案", + "original_language": "cn", + "first_air_date": "1991-07-03", + "popularity": 2.8875, + "origin_country": ["HK"] + }, + { + "id": 202549, + "name": "新香港奇案", + "original_name": "新香港奇案", + "original_language": "cn", + "first_air_date": "1993-01-01", + "popularity": 3.9122, + "origin_country": ["HK"] + }, + { + "id": 278605, + "name": "南部档案", + "original_name": "南部档案", + "original_language": "zh", + "first_air_date": "2026-06-11", + "popularity": 11.049, + "origin_country": ["CN"] + }, + { + "id": 42506, + "name": "丹特丽安的书架", + "original_name": "ダンタリアンの書架", + "original_language": "ja", + "first_air_date": "2011-07-16", + "popularity": 8.3394, + "origin_country": ["JP"] + }, + { + "id": 243369, + "name": "天然素材NHK", + "original_name": "天然素材NHK", + "original_language": "ja", + "first_air_date": "2020-05-16", + "popularity": 1.4963, + "origin_country": ["JP"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Baby+Do+Die+Do": { "results": [] }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Chef+on+Fire": { + "results": [ + { + "id": 333167, + "name": "开火开伙", + "original_name": "開火開伙", + "original_language": "zh", + "first_air_date": "2026-08-29", + "popularity": 2.2743, + "origin_country": ["TW"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=China+Now": { + "results": [ + { + "id": 138123, + "name": "China Trending Now", + "original_name": "China Trending Now", + "original_language": "zh", + "first_air_date": "2021-11-08", + "popularity": 0.8443, + "origin_country": [] + }, + { + "id": 134804, + "name": "위클리 차이나우", + "original_name": "위클리 차이나우", + "original_language": "ko", + "first_air_date": "2016-10-02", + "popularity": 1.041, + "origin_country": ["KR"] + }, + { + "id": 206367, + "name": "这就是中国", + "original_name": "这就是中国", + "original_language": "zh", + "first_air_date": "2019-01-07", + "popularity": 2.7888, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Delta+Force+The+Creator": { + "results": [ + { + "id": 331320, + "name": "三角洲:造物主玩家", + "original_name": "三角洲:造物主玩家", + "original_language": "zh", + "first_air_date": "2026-08-10", + "popularity": 1.3132, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Dongbeis+Back": { + "results": [ + { + "id": 312027, + "name": "东北有个周东北", + "original_name": "东北有个周东北", + "original_language": "zh", + "first_air_date": "2026-09-28", + "popularity": 4.3313, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=False+Memory": { + "results": [ + { + "id": 280564, + "name": "记忆管理局", + "original_name": "记忆管理局", + "original_language": "zh", + "first_air_date": "2026-08-02", + "popularity": 12.2033, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=GG+Bond+Interstellar+Mission": { "results": [] }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Gladiator+in+the+Theater": { + "results": [ + { + "id": 288873, + "name": "云雀叫天录", + "original_name": "云雀叫天录", + "original_language": "zh", + "first_air_date": "2026-09-14", + "popularity": 5.9637, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=GuAn": { + "results": [ + { + "id": 41862, + "name": "Zhen Guan Zhi Zhi", + "original_name": "Zhen Guan Zhi Zhi", + "original_language": "en", + "first_air_date": "", + "popularity": 0.5038, + "origin_country": ["CN"] + }, + { + "id": 32685, + "name": "The Legend of Guan Gong", + "original_name": "The Legend of Guan Gong", + "original_language": "en", + "first_air_date": "", + "popularity": 0.5403, + "origin_country": ["CN"] + }, + { + "id": 136128, + "name": "Chuang Guan Dong Zhong Pian", + "original_name": "Chuang Guan Dong Zhong Pian", + "original_language": "zh", + "first_air_date": "2009-10-11", + "popularity": 0.4301, + "origin_country": [] + }, + { + "id": 195310, + "name": "关中唐十八陵", + "original_name": "Guan Zhong Tang Shi Ba Ling", + "original_language": "zh", + "first_air_date": "2019-12-06", + "popularity": 0.8109, + "origin_country": ["CN"] + }, + { + "id": 303287, + "name": "一斩苍穹", + "original_name": "一斩苍穹", + "original_language": "zh", + "first_air_date": "2026-07-28", + "popularity": 9.7396, + "origin_country": ["CN"] + }, + { + "id": 126761, + "name": "女管家", + "original_name": "女管家", + "original_language": "zh", + "first_air_date": "2017-05-07", + "popularity": 5.7728, + "origin_country": ["CN"] + }, + { + "id": 153320, + "name": "冠军VS冠军", + "original_name": "冠军VS冠军", + "original_language": "zh", + "first_air_date": "2021-12-10", + "popularity": 3.0707, + "origin_country": ["CN"] + }, + { + "id": 156643, + "name": "出关", + "original_name": "出关", + "original_language": "zh", + "first_air_date": "2014-01-01", + "popularity": 2.1919, + "origin_country": ["CN"] + }, + { + "id": 78989, + "name": "贞观之治", + "original_name": "贞观之治", + "original_language": "zh", + "first_air_date": "2006-12-26", + "popularity": 29.7285, + "origin_country": ["CN"] + }, + { + "id": 108517, + "name": "大叔小馆", + "original_name": "大叔小馆", + "original_language": "zh", + "first_air_date": "2019-05-17", + "popularity": 2.2656, + "origin_country": ["CN"] + }, + { + "id": 78535, + "name": "玉观音", + "original_name": "玉观音", + "original_language": "zh", + "first_air_date": "2003-05-27", + "popularity": 4.6061, + "origin_country": ["CN"] + }, + { + "id": 109173, + "name": "贞观长歌", + "original_name": "贞观长歌", + "original_language": "zh", + "first_air_date": "2007-01-27", + "popularity": 6.8721, + "origin_country": ["CN"] + }, + { + "id": 274223, + "name": "昭阳花馆", + "original_name": "昭阳花馆", + "original_language": "zh", + "first_air_date": "", + "popularity": 0.7848, + "origin_country": ["CN"] + }, + { + "id": 82186, + "name": "大宋提刑官", + "original_name": "大宋提刑官", + "original_language": "zh", + "first_air_date": "2005-03-20", + "popularity": 9.0818, + "origin_country": ["CN"] + }, + { + "id": 328798, + "name": "互相关注", + "original_name": "互相关注", + "original_language": "zh", + "first_air_date": "2026-07-17", + "popularity": 1.303, + "origin_country": ["CN"] + }, + { + "id": 130019, + "name": "吉星高照", + "original_name": "吉星高照", + "original_language": "zh", + "first_air_date": "", + "popularity": 5.8163, + "origin_country": ["CN"] + }, + { + "id": 99996, + "name": "关西无极刀", + "original_name": "关西无极刀", + "original_language": "zh", + "first_air_date": "2003-10-29", + "popularity": 2.5337, + "origin_country": ["CN"] + }, + { + "id": 79277, + "name": "闯关东", + "original_name": "闯关东", + "original_language": "zh", + "first_air_date": "2008-01-02", + "popularity": 9.941, + "origin_country": ["CN"] + }, + { + "id": 210191, + "name": "一念关山", + "original_name": "一念关山", + "original_language": "zh", + "first_air_date": "2023-11-28", + "popularity": 9.2278, + "origin_country": ["CN"] + }, + { + "id": 121846, + "name": "关中匪事", + "original_name": "关中匪事", + "original_language": "zh", + "first_air_date": "2003-06-28", + "popularity": 2.3005, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Habeas+Corpus": { + "results": [ + { + "id": 308963, + "name": "人身保护令", + "original_name": "Habeas Corpus", + "original_language": "pt", + "first_air_date": "2026-09-23", + "popularity": 32.4819, + "origin_country": ["BR"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Heart+Signal": { + "results": [ + { + "id": 230155, + "name": "心脏信号 日版", + "original_name": "Heart Signal Japan", + "original_language": "ja", + "first_air_date": "2022-08-24", + "popularity": 1.4282, + "origin_country": ["JP"] + }, + { + "id": 103147, + "name": "心动的信号", + "original_name": "心动的信号", + "original_language": "zh", + "first_air_date": "2018-08-26", + "popularity": 41.9862, + "origin_country": ["CN"] + }, + { + "id": 72976, + "name": "心脏信号", + "original_name": "하트시그널", + "original_language": "ko", + "first_air_date": "2017-06-02", + "popularity": 10.2, + "origin_country": ["KR"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Hi+Come+In": { + "results": [ + { + "id": 211849, + "name": "嗨!营业中", + "original_name": "嗨! 營業中", + "original_language": "zh", + "first_air_date": "2022-10-01", + "popularity": 3.8453, + "origin_country": ["TW"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Interstellar": { + "results": [ + { + "id": 212171, + "name": "星际艾拉", + "original_name": "Interstellar Ella", + "original_language": "nl", + "first_air_date": "2022-10-31", + "popularity": 3.9399, + "origin_country": ["BE"] + }, + { + "id": 198237, + "name": "星际一游", + "original_name": "星际一游", + "original_language": "zh", + "first_air_date": "2022-04-18", + "popularity": 1.5411, + "origin_country": ["CN"] + }, + { + "id": 274737, + "name": "我是星际国家的恶德领主!", + "original_name": "俺は星間国家の悪徳領主!", + "original_language": "ja", + "first_air_date": "2025-04-06", + "popularity": 9.1315, + "origin_country": ["JP"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Irreplaceable": { + "results": [ + { + "id": 3849, + "name": "Walang Kapalit", + "original_name": "Walang Kapalit", + "original_language": "tl", + "first_air_date": "2007-04-23", + "popularity": 4.3457, + "origin_country": ["PH"] + }, + { + "id": 297982, + "name": "无可替代", + "original_name": "无可替代", + "original_language": "zh", + "first_air_date": "2026-09-28", + "popularity": 14.5938, + "origin_country": ["CN"] + }, + { + "id": 105640, + "name": "Walang Hanggang Paalam", + "original_name": "Walang Hanggang Paalam", + "original_language": "tl", + "first_air_date": "2020-09-28", + "popularity": 8.19, + "origin_country": ["PH"] + }, + { + "id": 113784, + "name": "与晨同光", + "original_name": "与晨同光", + "original_language": "zh", + "first_air_date": "2020-11-27", + "popularity": 4.7933, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Lanterns": { + "results": [ + { + "id": 95350, + "name": "绿灯军团", + "original_name": "Lanterns", + "original_language": "en", + "first_air_date": "2026-08-16", + "popularity": 340.3226, + "origin_country": ["US"] + }, + { + "id": 331555, + "name": "Lanterns: The Official Podcast", + "original_name": "Lanterns: The Official Podcast", + "original_language": "en", + "first_air_date": "2026-08-16", + "popularity": 4.7424, + "origin_country": ["US"] + }, + { + "id": 48002, + "name": "قناديل العشاق", + "original_name": "قناديل العشاق", + "original_language": "ar", + "first_air_date": "2017-05-27", + "popularity": 0.9842, + "origin_country": ["SY"] + }, + { + "id": 123323, + "name": "قنديل الحكايات", + "original_name": "قنديل الحكايات", + "original_language": "ar", + "first_air_date": "2021-03-04", + "popularity": 0.5549, + "origin_country": ["EG"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=LEGO+ONE+PIECE": { + "results": [ + { + "id": 318918, + "name": "乐高航海王", + "original_name": "LEGO ONE PIECE", + "original_language": "en", + "first_air_date": "2026-09-29", + "popularity": 3.9733, + "origin_country": ["CA", "US", "JP"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Live+Forever": { + "results": [ + { + "id": 318133, + "name": "Kara Swisher Wants to Live Forever", + "original_name": "Kara Swisher Wants to Live Forever", + "original_language": "en", + "first_air_date": "2026-04-11", + "popularity": 1.634, + "origin_country": ["US"] + }, + { + "id": 257758, + "name": "Do You Want To Live Forever?", + "original_name": "Do You Want To Live Forever?", + "original_language": "en", + "first_air_date": "2024-06-17", + "popularity": 0.5307, + "origin_country": ["AU"] + }, + { + "id": 318884, + "name": "长生契", + "original_name": "长生契", + "original_language": "zh", + "first_air_date": "2026-09-24", + "popularity": 4.634, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Martial+Master": { + "results": [ + { + "id": 110181, + "name": "武神主宰", + "original_name": "武神主宰", + "original_language": "zh", + "first_air_date": "2020-03-07", + "popularity": 32.5077, + "origin_country": ["CN"] + }, + { + "id": 109862, + "name": "铁胆梁宽", + "original_name": "鐵膽梁寬", + "original_language": "cn", + "first_air_date": "1994-06-06", + "popularity": 3.899, + "origin_country": ["HK"] + }, + { + "id": 87852, + "name": "绝对冲激 ~柏拉图之心~", + "original_name": "絶対衝激 ~PLATONIC HEART~", + "original_language": "ja", + "first_air_date": "2008-10-09", + "popularity": 2.8121, + "origin_country": ["JP"] + }, + { + "id": 194718, + "name": "英雄王,为了穷尽武道而转生 ~而后成为世界最强见习骑士♀~", + "original_name": "英雄王、武を極めるため転生す ~そして、世界最強の見習い騎士♀~", + "original_language": "ja", + "first_air_date": "2023-01-10", + "popularity": 16.694, + "origin_country": ["JP"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Mononoke+The+Movie+Chapter+III+The+Curse+of+the+Serpent": { + "results": [] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Not+a+Stranger": { + "results": [ + { + "id": 320760, + "name": "不识陌生人", + "original_name": "Seni Tanıyorum", + "original_language": "tr", + "first_air_date": "2026-09-17", + "popularity": 46.861, + "origin_country": ["TR"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=One+Hundred+Thousand+Years+Of+Qi+Refining": { + "results": [ + { + "id": 220850, + "name": "炼气十万年", + "original_name": "炼气十万年", + "original_language": "zh", + "first_air_date": "2023-02-18", + "popularity": 32.4193, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Peerless+Battle+Spirit": { + "results": [ + { + "id": 252788, + "name": "绝世战魂", + "original_name": "绝世战魂", + "original_language": "zh", + "first_air_date": "2024-04-27", + "popularity": 6.9387, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Shaque+Trust+No+One": { + "results": [ + { + "id": 285147, + "name": "寻女无归途", + "original_name": "शक: Trust No One", + "original_language": "hi", + "first_air_date": "2026-09-24", + "popularity": 18.157, + "origin_country": ["IN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Spark+of+the+Long+March": { + "results": [ + { + "id": 336647, + "name": "Spark of the Long March", + "original_name": "Spark of the Long March", + "original_language": "en", + "first_air_date": "", + "popularity": 0.0357, + "origin_country": ["US"] + }, + { + "id": 336207, + "name": "征途", + "original_name": "征途", + "original_language": "zh", + "first_air_date": "2026-09-26", + "popularity": 3.6766, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Spring+of+the+Blade": { + "results": [ + { + "id": 294990, + "name": "一瓯春", + "original_name": "一瓯春", + "original_language": "zh", + "first_air_date": "2026-09-17", + "popularity": 25.4305, + "origin_country": ["CN"] + }, + { + "id": 305450, + "name": "绣春刀之永乐风云", + "original_name": "绣春刀之永乐风云", + "original_language": "zh", + "first_air_date": "2025-11-14", + "popularity": 1.1454, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Stay+Low+Profile": { + "results": [ + { + "id": 331064, + "name": "掌门低调点", + "original_name": "掌门低调点", + "original_language": "zh", + "first_air_date": "2026-08-07", + "popularity": 0.7322, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=Ten+Thousand+Worlds": { + "results": [ + { + "id": 122612, + "name": "万界独尊", + "original_name": "万界独尊", + "original_language": "zh", + "first_air_date": "2021-04-06", + "popularity": 14.7534, + "origin_country": ["CN"] + }, + { + "id": 89364, + "name": "万界仙踪", + "original_name": "万界仙踪", + "original_language": "zh", + "first_air_date": "2018-03-21", + "popularity": 27.2599, + "origin_country": ["CN"] + }, + { + "id": 275885, + "name": "万界仙踪", + "original_name": "万界仙踪", + "original_language": "zh", + "first_air_date": "2020-06-26", + "popularity": 1.1013, + "origin_country": ["CN"] + }, + { + "id": 115713, + "name": "万界法神", + "original_name": "万界法神", + "original_language": "zh", + "first_air_date": "2020-12-21", + "popularity": 2.9153, + "origin_country": ["CN"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=The+Crow+Club": { + "results": [ + { + "id": 312585, + "name": "乌鸦俱乐部", + "original_name": "อีกาสมาคม", + "original_language": "th", + "first_air_date": "2026-09-18", + "popularity": 10.9979, + "origin_country": ["TH"] + } + ] + }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=The+Science+of+Interstellar": { "results": [] }, + "/search/tv?include_adult=false&language=zh-CN&page=1&query=UNABOMBER": { + "results": [ + { + "id": 99954, + "name": "大学炸弹客:自述", + "original_name": "Unabomber: In His Own Words", + "original_language": "en", + "first_air_date": "2020-02-22", + "popularity": 2.768, + "origin_country": ["US"] + }, + { + "id": 301903, + "name": "Fantasma - Il caso Unabomber", + "original_name": "Fantasma - Il caso Unabomber", + "original_language": "it", + "first_air_date": "2025-09-30", + "popularity": 0.4567, + "origin_country": ["IT"] + }, + { + "id": 279106, + "name": "The Lost Unabomber Tapes", + "original_name": "The Lost Unabomber Tapes", + "original_language": "en", + "first_air_date": "2020-01-26", + "popularity": 0.5507, + "origin_country": ["US"] + }, + { + "id": 72597, + "name": "追缉", + "original_name": "Manhunt", + "original_language": "en", + "first_air_date": "2017-08-01", + "popularity": 28.5152, + "origin_country": ["US"] + } + ] + }, + "/tv/103147?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 103147, + "name": "心动的信号", + "original_name": "心动的信号", + "original_language": "zh", + "first_air_date": "2018-08-26", + "popularity": 41.9862, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "Heart Signal", "iso_3166_1": "CN" }] }, + "translations": { + "translations": [ + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Heart Signal Chinese Version" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "心动的信号" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Heart Signal" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Heart Signal" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "心動的信號" } } + ] + }, + "external_ids": { "imdb_id": "tt11285912", "tvdb_id": 352673 }, + "seasons": [ + { "season_number": 0, "air_date": "2018-08-28", "episode_count": 342, "name": "特别篇" }, + { "season_number": 1, "air_date": "2018-08-26", "episode_count": 10, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2019-06-19", "episode_count": 10, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2020-09-08", "episode_count": 13, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2021-06-23", "episode_count": 20, "name": "第 4 季" }, + { "season_number": 5, "air_date": "2022-08-30", "episode_count": 21, "name": "第 5 季" }, + { "season_number": 6, "air_date": "2023-07-25", "episode_count": 25, "name": "第 6 季" }, + { "season_number": 7, "air_date": "2024-09-02", "episode_count": 27, "name": "第 7 季" }, + { "season_number": 8, "air_date": "2025-08-04", "episode_count": 30, "name": "第 8 季" }, + { "season_number": 9, "air_date": "2026-08-03", "episode_count": 31, "name": "第 9 季" } + ] + }, + "/tv/103147?language=en-US": { + "id": 103147, + "name": "Heart Signal", + "original_name": "心动的信号", + "original_language": "zh", + "first_air_date": "2018-08-26", + "popularity": 41.9862, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "Heart Signal", "iso_3166_1": "CN" }] }, + "translations": { + "translations": [ + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Heart Signal Chinese Version" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "心动的信号" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Heart Signal" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Heart Signal" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "心動的信號" } } + ] + }, + "external_ids": { "imdb_id": "tt11285912", "tvdb_id": 352673 }, + "seasons": [ + { "season_number": 0, "air_date": "2018-08-28", "episode_count": 342, "name": "特别篇" }, + { "season_number": 1, "air_date": "2018-08-26", "episode_count": 10, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2019-06-19", "episode_count": 10, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2020-09-08", "episode_count": 13, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2021-06-23", "episode_count": 20, "name": "第 4 季" }, + { "season_number": 5, "air_date": "2022-08-30", "episode_count": 21, "name": "第 5 季" }, + { "season_number": 6, "air_date": "2023-07-25", "episode_count": 25, "name": "第 6 季" }, + { "season_number": 7, "air_date": "2024-09-02", "episode_count": 27, "name": "第 7 季" }, + { "season_number": 8, "air_date": "2025-08-04", "episode_count": 30, "name": "第 8 季" }, + { "season_number": 9, "air_date": "2026-08-03", "episode_count": 31, "name": "第 9 季" } + ] + }, + "/tv/105640?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 105640, + "name": "Walang Hanggang Paalam", + "original_name": "Walang Hanggang Paalam", + "original_language": "tl", + "first_air_date": "2020-09-28", + "popularity": 8.19, + "origin_country": ["PH"], + "alternative_titles": { "results": [{ "title": "Never Ending Goodbye", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Irreplaceable" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "", "tvdb_id": 439797 }, + "seasons": [{ "season_number": 1, "air_date": "2020-09-28", "episode_count": 143, "name": "第 1 季" }] + }, + "/tv/105640?language=en-US": { + "id": 105640, + "name": "Walang Hanggang Paalam", + "original_name": "Walang Hanggang Paalam", + "original_language": "tl", + "first_air_date": "2020-09-28", + "popularity": 8.19, + "origin_country": ["PH"], + "alternative_titles": { "results": [{ "title": "Never Ending Goodbye", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Irreplaceable" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "", "tvdb_id": 439797 }, + "seasons": [{ "season_number": 1, "air_date": "2020-09-28", "episode_count": 143, "name": "第 1 季" }] + }, + "/tv/106820?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/106820?language=en-US": { "__status": 404 }, + "/tv/109862?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 109862, + "name": "铁胆梁宽", + "original_name": "鐵膽梁寬", + "original_language": "cn", + "first_air_date": "1994-06-06", + "popularity": 5.1328, + "origin_country": ["HK"], + "alternative_titles": { + "results": [ + { "title": "黄飞鸿系列之铁胆梁宽", "iso_3166_1": "CN" }, + { "title": "鐵膽梁寬", "iso_3166_1": "HK" }, + { "title": "黃飛鴻系列之鐵膽梁寬", "iso_3166_1": "HK" }, + { "title": "Master of Martial Arts", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "铁胆梁宽" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Master of Martial Arts" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "鐵膽梁寬" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "鐵膽梁寬" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "เหลียงควนจอมยุทธใจเพชร" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "1994-06-06", "episode_count": 20, "name": "Season 1" }] + }, + "/tv/109862?language=en-US": { + "id": 109862, + "name": "Master of Martial Arts", + "original_name": "鐵膽梁寬", + "original_language": "cn", + "first_air_date": "1994-06-06", + "popularity": 5.1328, + "origin_country": ["HK"], + "alternative_titles": { + "results": [ + { "title": "黄飞鸿系列之铁胆梁宽", "iso_3166_1": "CN" }, + { "title": "鐵膽梁寬", "iso_3166_1": "HK" }, + { "title": "黃飛鴻系列之鐵膽梁寬", "iso_3166_1": "HK" }, + { "title": "Master of Martial Arts", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "铁胆梁宽" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Master of Martial Arts" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "鐵膽梁寬" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "鐵膽梁寬" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "เหลียงควนจอมยุทธใจเพชร" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "1994-06-06", "episode_count": 20, "name": "Season 1" }] + }, + "/tv/110181?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 110181, + "name": "武神主宰", + "original_name": "武神主宰", + "original_language": "zh", + "first_air_date": "2020-03-07", + "popularity": 32.9671, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Martial Master", "iso_3166_1": "CL" }, + { "title": "Wu Shen Zhu Zai", "iso_3166_1": "CN" }, + { "title": "Martial Master", "iso_3166_1": "ES" }, + { "title": "Martial Master", "iso_3166_1": "FR" }, + { "title": "Повелитель бесстрашного духа", "iso_3166_1": "RU" }, + { "title": "Martial Master", "iso_3166_1": "US" }, + { "title": "The God of War Dominates", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Martial Master" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "The God of War Dominates" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The God of War Dominates" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Боевой мастер" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "武神主宰" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Martial Master" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Võ Thần Chúa Tể" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Martial Master" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "武神主宰" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "มหาศึกเทพสงคราม" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "武神主宰" } } + ] + }, + "external_ids": { "imdb_id": "tt20769560", "tvdb_id": 379070 }, + "seasons": [{ "season_number": 1, "air_date": "2020-03-07", "episode_count": 702, "name": "第 1 季" }] + }, + "/tv/110181?language=en-US": { + "id": 110181, + "name": "The God of War Dominates", + "original_name": "武神主宰", + "original_language": "zh", + "first_air_date": "2020-03-07", + "popularity": 32.9671, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Martial Master", "iso_3166_1": "CL" }, + { "title": "Wu Shen Zhu Zai", "iso_3166_1": "CN" }, + { "title": "Martial Master", "iso_3166_1": "ES" }, + { "title": "Martial Master", "iso_3166_1": "FR" }, + { "title": "Повелитель бесстрашного духа", "iso_3166_1": "RU" }, + { "title": "Martial Master", "iso_3166_1": "US" }, + { "title": "The God of War Dominates", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Martial Master" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "The God of War Dominates" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The God of War Dominates" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Боевой мастер" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "武神主宰" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Martial Master" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Võ Thần Chúa Tể" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Martial Master" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "武神主宰" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "มหาศึกเทพสงคราม" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "武神主宰" } } + ] + }, + "external_ids": { "imdb_id": "tt20769560", "tvdb_id": 379070 }, + "seasons": [{ "season_number": 1, "air_date": "2020-03-07", "episode_count": 702, "name": "第 1 季" }] + }, + "/tv/113784?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 113784, + "name": "与晨同光", + "original_name": "与晨同光", + "original_language": "zh", + "first_air_date": "2020-11-27", + "popularity": 4.7933, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Irreplaceable Love" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "与晨同光" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Irreplaceable Love" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Sơ Thần, Là Em Cố Ý Quên Anh" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "與晨同光" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "與晨同光" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Amor Insubstituível" } } + ] + }, + "external_ids": { "imdb_id": "tt13539698", "tvdb_id": 392463 }, + "seasons": [{ "season_number": 1, "air_date": "2020-11-27", "episode_count": 44, "name": "第 1 季" }] + }, + "/tv/113784?language=en-US": { + "id": 113784, + "name": "Irreplaceable Love", + "original_name": "与晨同光", + "original_language": "zh", + "first_air_date": "2020-11-27", + "popularity": 4.7933, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Irreplaceable Love" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "与晨同光" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Irreplaceable Love" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Sơ Thần, Là Em Cố Ý Quên Anh" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "與晨同光" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "與晨同光" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Amor Insubstituível" } } + ] + }, + "external_ids": { "imdb_id": "tt13539698", "tvdb_id": 392463 }, + "seasons": [{ "season_number": 1, "air_date": "2020-11-27", "episode_count": 44, "name": "第 1 季" }] + }, + "/tv/115?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/115?language=en-US": { "__status": 404 }, + "/tv/115713?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 115713, + "name": "万界法神", + "original_name": "万界法神", + "original_language": "zh", + "first_air_date": "2020-12-21", + "popularity": 2.9153, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Wan Jie Fa Shen", "iso_3166_1": "CN" }, + { "title": "Wàn Jiè Fǎ Shén", "iso_3166_1": "CN" }, + { "title": "Wanjie Fashen", "iso_3166_1": "CN" }, + { "title": "The God of All Realms", "iso_3166_1": "US" }, + { "title": "The God of Law", "iso_3166_1": "US" }, + { "title": "God of Magical World", "iso_3166_1": "US" }, + { "title": "God Of Magical Word", "iso_3166_1": "US" }, + { "title": "God of All World", "iso_3166_1": "US" }, + { "title": "The God of Laws in All Worlds", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "萬界法神" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Законный бог десяти тысяч миров" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Wan Jie Fa Shen" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "万界法神" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "God of Ten Thousand Realms" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Vạn Giới Pháp Thần" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "God of Ten Thousand Realms" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "萬界法神" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt28863606", "tvdb_id": 393861 }, + "seasons": [{ "season_number": 1, "air_date": "2020-12-21", "episode_count": 54, "name": "第 1 季" }] + }, + "/tv/115713?language=en-US": { + "id": 115713, + "name": "God of Ten Thousand Realms", + "original_name": "万界法神", + "original_language": "zh", + "first_air_date": "2020-12-21", + "popularity": 2.9153, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Wan Jie Fa Shen", "iso_3166_1": "CN" }, + { "title": "Wàn Jiè Fǎ Shén", "iso_3166_1": "CN" }, + { "title": "Wanjie Fashen", "iso_3166_1": "CN" }, + { "title": "The God of All Realms", "iso_3166_1": "US" }, + { "title": "The God of Law", "iso_3166_1": "US" }, + { "title": "God of Magical World", "iso_3166_1": "US" }, + { "title": "God Of Magical Word", "iso_3166_1": "US" }, + { "title": "God of All World", "iso_3166_1": "US" }, + { "title": "The God of Laws in All Worlds", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "萬界法神" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Законный бог десяти тысяч миров" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Wan Jie Fa Shen" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "万界法神" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "God of Ten Thousand Realms" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Vạn Giới Pháp Thần" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "God of Ten Thousand Realms" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "萬界法神" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt28863606", "tvdb_id": 393861 }, + "seasons": [{ "season_number": 1, "air_date": "2020-12-21", "episode_count": 54, "name": "第 1 季" }] + }, + "/tv/122612?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 122612, + "name": "万界独尊", + "original_name": "万界独尊", + "original_language": "zh", + "first_air_date": "2021-04-06", + "popularity": 14.7534, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Ten Thousand Worlds", "iso_3166_1": "CN" }, + { "title": "Wan Jie Du Zun", "iso_3166_1": "CN" }, + { "title": "Wan Jie Duzun", "iso_3166_1": "CN" }, + { "title": "萬界獨尊", "iso_3166_1": "TW" }, + { "title": "Lord of The Ancient God Grave", "iso_3166_1": "US" }, + { "title": "The Sovereign of All Realms", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Dez Mil Mundos" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "万界独尊" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Ten Thousand Worlds" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Владыка множества миров" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Diez Mil Mundos" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "萬界獨尊" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "หมื่นอาณาจักรจอมราชันย์" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Vạn Giới Độc Tôn" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "Sepuluh Ribu Dunia" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Ten Thousand Worlds" } }, + { "iso_639_1": "hi", "iso_3166_1": "IN", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Diez Mil Mundos" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "만계독존" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt34882755", "tvdb_id": 403310 }, + "seasons": [{ "season_number": 1, "air_date": "2021-04-06", "episode_count": 500, "name": "第 1 季" }] + }, + "/tv/122612?language=en-US": { + "id": 122612, + "name": "Ten Thousand Worlds", + "original_name": "万界独尊", + "original_language": "zh", + "first_air_date": "2021-04-06", + "popularity": 14.7534, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Ten Thousand Worlds", "iso_3166_1": "CN" }, + { "title": "Wan Jie Du Zun", "iso_3166_1": "CN" }, + { "title": "Wan Jie Duzun", "iso_3166_1": "CN" }, + { "title": "萬界獨尊", "iso_3166_1": "TW" }, + { "title": "Lord of The Ancient God Grave", "iso_3166_1": "US" }, + { "title": "The Sovereign of All Realms", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Dez Mil Mundos" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "万界独尊" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Ten Thousand Worlds" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Владыка множества миров" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Diez Mil Mundos" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "萬界獨尊" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "หมื่นอาณาจักรจอมราชันย์" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Vạn Giới Độc Tôn" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "Sepuluh Ribu Dunia" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Ten Thousand Worlds" } }, + { "iso_639_1": "hi", "iso_3166_1": "IN", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Diez Mil Mundos" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "만계독존" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt34882755", "tvdb_id": 403310 }, + "seasons": [{ "season_number": 1, "air_date": "2021-04-06", "episode_count": 500, "name": "第 1 季" }] + }, + "/tv/123323?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 123323, + "name": "قنديل الحكايات", + "original_name": "قنديل الحكايات", + "original_language": "ar", + "first_air_date": "2021-03-04", + "popularity": 0.5549, + "origin_country": ["EG"], + "alternative_titles": { "results": [{ "title": "Lantern's Tales", "iso_3166_1": "EG" }] }, + "translations": { + "translations": [ + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "قنديل الحكايات" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Lantern's Tales" } }, + { "iso_639_1": "ar", "iso_3166_1": "AE", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2021-03-04", "episode_count": 1, "name": "第 1 季" }] + }, + "/tv/123323?language=en-US": { + "id": 123323, + "name": "Lantern's Tales", + "original_name": "قنديل الحكايات", + "original_language": "ar", + "first_air_date": "2021-03-04", + "popularity": 0.5549, + "origin_country": ["EG"], + "alternative_titles": { "results": [{ "title": "Lantern's Tales", "iso_3166_1": "EG" }] }, + "translations": { + "translations": [ + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "قنديل الحكايات" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Lantern's Tales" } }, + { "iso_639_1": "ar", "iso_3166_1": "AE", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2021-03-04", "episode_count": 1, "name": "第 1 季" }] + }, + "/tv/134804?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 134804, + "name": "위클리 차이나우", + "original_name": "위클리 차이나우", + "original_language": "ko", + "first_air_date": "2016-10-02", + "popularity": 1.041, + "origin_country": ["KR"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Weekly China Now" } } + ] + }, + "external_ids": {}, + "seasons": [ + { "season_number": 1, "air_date": "2016-10-02", "episode_count": 1, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2018-05-04", "episode_count": 1, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2019-07-14", "episode_count": 1, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2021-01-03", "episode_count": 1, "name": "第 4 季" }, + { "season_number": 5, "episode_count": 0, "name": "第 5 季" }, + { "season_number": 6, "air_date": "2022-07-24", "episode_count": 1, "name": "第 6 季" }, + { "season_number": 7, "air_date": "2023-08-06", "episode_count": 1, "name": "第 7 季" } + ] + }, + "/tv/134804?language=en-US": { + "id": 134804, + "name": "Weekly China Now", + "original_name": "위클리 차이나우", + "original_language": "ko", + "first_air_date": "2016-10-02", + "popularity": 1.041, + "origin_country": ["KR"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Weekly China Now" } } + ] + }, + "external_ids": {}, + "seasons": [ + { "season_number": 1, "air_date": "2016-10-02", "episode_count": 1, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2018-05-04", "episode_count": 1, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2019-07-14", "episode_count": 1, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2021-01-03", "episode_count": 1, "name": "第 4 季" }, + { "season_number": 5, "episode_count": 0, "name": "第 5 季" }, + { "season_number": 6, "air_date": "2022-07-24", "episode_count": 1, "name": "第 6 季" }, + { "season_number": 7, "air_date": "2023-08-06", "episode_count": 1, "name": "第 7 季" } + ] + }, + "/tv/136128?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 136128, + "name": "Chuang Guan Dong Zhong Pian", + "original_name": "Chuang Guan Dong Zhong Pian", + "original_language": "zh", + "first_air_date": "2009-10-11", + "popularity": 0.4301, + "origin_country": [], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2009-10-11", "episode_count": 55, "name": "第 1 季" }] + }, + "/tv/136128?language=en-US": { + "id": 136128, + "name": "Chuang Guan Dong Zhong Pian", + "original_name": "Chuang Guan Dong Zhong Pian", + "original_language": "zh", + "first_air_date": "2009-10-11", + "popularity": 0.4301, + "origin_country": [], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2009-10-11", "episode_count": 55, "name": "第 1 季" }] + }, + "/tv/138123?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 138123, + "name": "China Trending Now", + "original_name": "China Trending Now", + "original_language": "zh", + "first_air_date": "2021-11-08", + "popularity": 0.8443, + "origin_country": [], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2021-11-08", "episode_count": 10, "name": "第 1 季" }] + }, + "/tv/138123?language=en-US": { + "id": 138123, + "name": "China Trending Now", + "original_name": "China Trending Now", + "original_language": "zh", + "first_air_date": "2021-11-08", + "popularity": 0.8443, + "origin_country": [], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2021-11-08", "episode_count": 10, "name": "第 1 季" }] + }, + "/tv/194718?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 194718, + "name": "英雄王,为了穷尽武道而转生 ~而后成为世界最强见习骑士♀~", + "original_name": "英雄王、武を極めるため転生す ~そして、世界最強の見習い騎士♀~", + "original_language": "ja", + "first_air_date": "2023-01-10", + "popularity": 16.1616, + "origin_country": ["JP"], + "alternative_titles": { + "results": [ + { "title": "从英雄王到最强见习骑士", "iso_3166_1": "CN" }, + { "title": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士♀~", "iso_3166_1": "CN" }, + { "title": "英雄王,为了穷尽武道而转生~然后,成为世界最强的见习骑士~", "iso_3166_1": "CN" }, + { "title": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士~", "iso_3166_1": "CN" }, + { "title": "Eiyū-Ō, Bu o Kiwameru Tame Tensei-Su: Soshite, Sekai Saikyō no Minarai Kishi", "iso_3166_1": "JP" }, + { + "title": "Eiyuu-Ou, Bu o Kiwameru Tame Tensei-Su: Soshite, Sekai Saikyou no Minarai Kishi", + "iso_3166_1": "JP" + }, + { "title": "Eiyuu Ou Bu o Kiwameru Tame Tenseisu Soshite Sekai Saikyou no Minarai Kishi", "iso_3166_1": "JP" }, + { "title": "英雄王、武を極めるため転生す", "iso_3166_1": "JP" }, + { "title": "Eiyuuou, Bu wo Kiwameru Tame Tenseisu", "iso_3166_1": "JP" }, + { "title": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士♀~", "iso_3166_1": "TW" }, + { "title": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire", "iso_3166_1": "US" }, + { + "title": "The Hero King, Reincarnated to Master Martial Arts—Thus Becoming the World's Strongest Female Knight-in-Training", + "iso_3166_1": "US" + }, + { "title": "Hiệp Sĩ Chuyển Sinh", "iso_3166_1": "VN" } + ] + }, + "translations": { + "translations": [ + { + "iso_639_1": "es", + "iso_3166_1": "MX", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire ♀" } + }, + { + "iso_639_1": "ja", + "iso_3166_1": "JP", + "data": { "name": "英雄王、武を極めるため転生す ~そして、世界最強の見習い騎士♀~" } + }, + { + "iso_639_1": "en", + "iso_3166_1": "US", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire ♀" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "CN", + "data": { "name": "英雄王,为了穷尽武道而转生 ~而后成为世界最强见习骑士♀~" } + }, + { + "iso_639_1": "es", + "iso_3166_1": "ES", + "data": { "name": "Eiyuu-ou, Bu wo Kiwameru tame Tensei su - Soshite, Sekai Saikyou no Minarai Kishi ♀" } + }, + { + "iso_639_1": "de", + "iso_3166_1": "DE", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire" } + }, + { + "iso_639_1": "ko", + "iso_3166_1": "KR", + "data": { "name": "영웅왕, 극한의 무를 위해 전생하다 ~그리고 세계 최강의 견습 기사가 되다♀~" } + }, + { + "iso_639_1": "it", + "iso_3166_1": "IT", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire ♀" } + }, + { + "iso_639_1": "pt", + "iso_3166_1": "BR", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "TW", + "data": { "name": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士♀~" } + }, + { + "iso_639_1": "fr", + "iso_3166_1": "FR", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire" } + }, + { + "iso_639_1": "th", + "iso_3166_1": "TH", + "data": { "name": "ราชาวีรชน เกิดใหม่เพื่อขัดเกลาวิถีต่อสู้ และกลายเป็นอัศวินฝึกหัดที่แกร่งสุดในโลก" } + }, + { + "iso_639_1": "vi", + "iso_3166_1": "VN", + "data": { + "name": "Chuyển Sinh Để Nâng Cao Kỹ Năng: Vua Anh Hùng Trở Thành Kỵ Sĩ Học Việc Mạnh Nhất Thế Giới" + } + }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Переродження Короля Героя у Майстриню Меча" } }, + { + "iso_639_1": "ru", + "iso_3166_1": "RU", + "data": { "name": "Перевоплотившийся король-герой, ставший самой сильной ученицей рыцаря" } + }, + { + "iso_639_1": "pl", + "iso_3166_1": "PL", + "data": { "name": "Eiyuu-ou, Bu wo Kiwameru Tame Tenseisu: Soshite, Sekai Saikyou no Minarai Kishi" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "HK", + "data": { "name": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士♀~" } + }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { + "iso_639_1": "pt", + "iso_3166_1": "PT", + "data": { "name": "Eiyuu Ou, Bu o Kiwameru Tame Tenseisu - Soshite, Sekai Saikyou no Minarai Kishi" } + }, + { + "iso_639_1": "hi", + "iso_3166_1": "IN", + "data": { "name": "तलवारबाजी में महारत हासिल करने के लिए पुनर्जन्म: वीर-राजा से असाधारण सहायक तक" } + } + ] + }, + "external_ids": { "imdb_id": "tt25971150", "tvdb_id": 412957 }, + "seasons": [ + { "season_number": 0, "air_date": "2020-11-07", "episode_count": 26, "name": "特别篇" }, + { + "season_number": 1, + "air_date": "2023-01-10", + "episode_count": 12, + "name": "英雄王,为了穷尽武道而转生 ~然后,成为世界最强的见习骑士♀~" + } + ] + }, + "/tv/194718?language=en-US": { + "id": 194718, + "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire ♀", + "original_name": "英雄王、武を極めるため転生す ~そして、世界最強の見習い騎士♀~", + "original_language": "ja", + "first_air_date": "2023-01-10", + "popularity": 16.1616, + "origin_country": ["JP"], + "alternative_titles": { + "results": [ + { "title": "从英雄王到最强见习骑士", "iso_3166_1": "CN" }, + { "title": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士♀~", "iso_3166_1": "CN" }, + { "title": "英雄王,为了穷尽武道而转生~然后,成为世界最强的见习骑士~", "iso_3166_1": "CN" }, + { "title": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士~", "iso_3166_1": "CN" }, + { "title": "Eiyū-Ō, Bu o Kiwameru Tame Tensei-Su: Soshite, Sekai Saikyō no Minarai Kishi", "iso_3166_1": "JP" }, + { + "title": "Eiyuu-Ou, Bu o Kiwameru Tame Tensei-Su: Soshite, Sekai Saikyou no Minarai Kishi", + "iso_3166_1": "JP" + }, + { "title": "Eiyuu Ou Bu o Kiwameru Tame Tenseisu Soshite Sekai Saikyou no Minarai Kishi", "iso_3166_1": "JP" }, + { "title": "英雄王、武を極めるため転生す", "iso_3166_1": "JP" }, + { "title": "Eiyuuou, Bu wo Kiwameru Tame Tenseisu", "iso_3166_1": "JP" }, + { "title": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士♀~", "iso_3166_1": "TW" }, + { "title": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire", "iso_3166_1": "US" }, + { + "title": "The Hero King, Reincarnated to Master Martial Arts—Thus Becoming the World's Strongest Female Knight-in-Training", + "iso_3166_1": "US" + }, + { "title": "Hiệp Sĩ Chuyển Sinh", "iso_3166_1": "VN" } + ] + }, + "translations": { + "translations": [ + { + "iso_639_1": "es", + "iso_3166_1": "MX", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire ♀" } + }, + { + "iso_639_1": "ja", + "iso_3166_1": "JP", + "data": { "name": "英雄王、武を極めるため転生す ~そして、世界最強の見習い騎士♀~" } + }, + { + "iso_639_1": "en", + "iso_3166_1": "US", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire ♀" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "CN", + "data": { "name": "英雄王,为了穷尽武道而转生 ~而后成为世界最强见习骑士♀~" } + }, + { + "iso_639_1": "es", + "iso_3166_1": "ES", + "data": { "name": "Eiyuu-ou, Bu wo Kiwameru tame Tensei su - Soshite, Sekai Saikyou no Minarai Kishi ♀" } + }, + { + "iso_639_1": "de", + "iso_3166_1": "DE", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire" } + }, + { + "iso_639_1": "ko", + "iso_3166_1": "KR", + "data": { "name": "영웅왕, 극한의 무를 위해 전생하다 ~그리고 세계 최강의 견습 기사가 되다♀~" } + }, + { + "iso_639_1": "it", + "iso_3166_1": "IT", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire ♀" } + }, + { + "iso_639_1": "pt", + "iso_3166_1": "BR", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "TW", + "data": { "name": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士♀~" } + }, + { + "iso_639_1": "fr", + "iso_3166_1": "FR", + "data": { "name": "Reborn to Master the Blade: From Hero-King to Extraordinary Squire" } + }, + { + "iso_639_1": "th", + "iso_3166_1": "TH", + "data": { "name": "ราชาวีรชน เกิดใหม่เพื่อขัดเกลาวิถีต่อสู้ และกลายเป็นอัศวินฝึกหัดที่แกร่งสุดในโลก" } + }, + { + "iso_639_1": "vi", + "iso_3166_1": "VN", + "data": { + "name": "Chuyển Sinh Để Nâng Cao Kỹ Năng: Vua Anh Hùng Trở Thành Kỵ Sĩ Học Việc Mạnh Nhất Thế Giới" + } + }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Переродження Короля Героя у Майстриню Меча" } }, + { + "iso_639_1": "ru", + "iso_3166_1": "RU", + "data": { "name": "Перевоплотившийся король-герой, ставший самой сильной ученицей рыцаря" } + }, + { + "iso_639_1": "pl", + "iso_3166_1": "PL", + "data": { "name": "Eiyuu-ou, Bu wo Kiwameru Tame Tenseisu: Soshite, Sekai Saikyou no Minarai Kishi" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "HK", + "data": { "name": "英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士♀~" } + }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { + "iso_639_1": "pt", + "iso_3166_1": "PT", + "data": { "name": "Eiyuu Ou, Bu o Kiwameru Tame Tenseisu - Soshite, Sekai Saikyou no Minarai Kishi" } + }, + { + "iso_639_1": "hi", + "iso_3166_1": "IN", + "data": { "name": "तलवारबाजी में महारत हासिल करने के लिए पुनर्जन्म: वीर-राजा से असाधारण सहायक तक" } + } + ] + }, + "external_ids": { "imdb_id": "tt25971150", "tvdb_id": 412957 }, + "seasons": [ + { "season_number": 0, "air_date": "2020-11-07", "episode_count": 26, "name": "特别篇" }, + { + "season_number": 1, + "air_date": "2023-01-10", + "episode_count": 12, + "name": "英雄王,为了穷尽武道而转生 ~然后,成为世界最强的见习骑士♀~" + } + ] + }, + "/tv/19628?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 19628, + "name": "BBC-大象的别样世界", + "original_name": "The Secret Life of Elephants", + "original_language": "en", + "first_air_date": "2009-01-14", + "popularity": 0.8107, + "origin_country": ["GB"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "BBC-大象的别样世界" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "Tajemství slonů" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "La vie secrète des éléphants" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt3149940", "tvdb_id": 84650 }, + "seasons": [{ "season_number": 1, "air_date": "2009-01-14", "episode_count": 3, "name": "第 1 季" }] + }, + "/tv/19628?language=en-US": { + "id": 19628, + "name": "The Secret Life of Elephants", + "original_name": "The Secret Life of Elephants", + "original_language": "en", + "first_air_date": "2009-01-14", + "popularity": 0.8107, + "origin_country": ["GB"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "BBC-大象的别样世界" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "Tajemství slonů" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "La vie secrète des éléphants" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt3149940", "tvdb_id": 84650 }, + "seasons": [{ "season_number": 1, "air_date": "2009-01-14", "episode_count": 3, "name": "第 1 季" }] + }, + "/tv/201401?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 201401, + "name": "档案", + "original_name": "档案", + "original_language": "zh", + "first_air_date": "2009-02-04", + "popularity": 10.5526, + "origin_country": ["CN"], + "alternative_titles": { + "results": [{ "title": "档案解密", "iso_3166_1": "CN" }, { "title": "Archives", "iso_3166_1": "US" }] + }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "档案" } }] }, + "external_ids": {}, + "seasons": [ + { "season_number": 1, "air_date": "2009-02-04", "episode_count": 42, "name": "2009年" }, + { "season_number": 2, "air_date": "2010-01-06", "episode_count": 32, "name": "2010年" }, + { "season_number": 3, "air_date": "2011-01-01", "episode_count": 179, "name": "2011年" }, + { "season_number": 4, "air_date": "2012-01-04", "episode_count": 152, "name": "2012年" }, + { "season_number": 5, "air_date": "2013-01-01", "episode_count": 240, "name": "2013年" }, + { "season_number": 6, "air_date": "2014-01-02", "episode_count": 192, "name": "2014年" }, + { "season_number": 7, "air_date": "2015-01-05", "episode_count": 170, "name": "2015年" }, + { "season_number": 8, "air_date": "2016-01-04", "episode_count": 105, "name": "2016年" }, + { "season_number": 9, "episode_count": 0, "name": "2017年" }, + { "season_number": 10, "episode_count": 0, "name": "2018年" }, + { "season_number": 11, "air_date": "2019-01-15", "episode_count": 35, "name": "2019年" }, + { "season_number": 12, "air_date": "2020-01-06", "episode_count": 62, "name": "2020年" }, + { "season_number": 13, "episode_count": 0, "name": "2021年" }, + { "season_number": 14, "episode_count": 0, "name": "2022年" }, + { "season_number": 15, "episode_count": 0, "name": "2023年" }, + { "season_number": 16, "episode_count": 0, "name": "2024年" } + ] + }, + "/tv/201401?language=en-US": { + "id": 201401, + "name": "档案", + "original_name": "档案", + "original_language": "zh", + "first_air_date": "2009-02-04", + "popularity": 10.5526, + "origin_country": ["CN"], + "alternative_titles": { + "results": [{ "title": "档案解密", "iso_3166_1": "CN" }, { "title": "Archives", "iso_3166_1": "US" }] + }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "档案" } }] }, + "external_ids": {}, + "seasons": [ + { "season_number": 1, "air_date": "2009-02-04", "episode_count": 42, "name": "2009年" }, + { "season_number": 2, "air_date": "2010-01-06", "episode_count": 32, "name": "2010年" }, + { "season_number": 3, "air_date": "2011-01-01", "episode_count": 179, "name": "2011年" }, + { "season_number": 4, "air_date": "2012-01-04", "episode_count": 152, "name": "2012年" }, + { "season_number": 5, "air_date": "2013-01-01", "episode_count": 240, "name": "2013年" }, + { "season_number": 6, "air_date": "2014-01-02", "episode_count": 192, "name": "2014年" }, + { "season_number": 7, "air_date": "2015-01-05", "episode_count": 170, "name": "2015年" }, + { "season_number": 8, "air_date": "2016-01-04", "episode_count": 105, "name": "2016年" }, + { "season_number": 9, "episode_count": 0, "name": "2017年" }, + { "season_number": 10, "episode_count": 0, "name": "2018年" }, + { "season_number": 11, "air_date": "2019-01-15", "episode_count": 35, "name": "2019年" }, + { "season_number": 12, "air_date": "2020-01-06", "episode_count": 62, "name": "2020年" }, + { "season_number": 13, "episode_count": 0, "name": "2021年" }, + { "season_number": 14, "episode_count": 0, "name": "2022年" }, + { "season_number": 15, "episode_count": 0, "name": "2023年" }, + { "season_number": 16, "episode_count": 0, "name": "2024年" } + ] + }, + "/tv/202001?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 202001, + "name": "蓝色档案", + "original_name": "蓝色档案", + "original_language": "zh", + "first_air_date": "2008-07-27", + "popularity": 3.5954, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "Lan Se Dang An", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "蓝色档案" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Lan Se Dang An" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "藍色檔案" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2008-07-27", "episode_count": 33, "name": "Season 1" }] + }, + "/tv/202001?language=en-US": { + "id": 202001, + "name": "Lan Se Dang An", + "original_name": "蓝色档案", + "original_language": "zh", + "first_air_date": "2008-07-27", + "popularity": 3.5954, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "Lan Se Dang An", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "蓝色档案" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Lan Se Dang An" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "藍色檔案" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2008-07-27", "episode_count": 33, "name": "Season 1" }] + }, + "/tv/206367?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 206367, + "name": "这就是中国", + "original_name": "这就是中国", + "original_language": "zh", + "first_air_date": "2019-01-07", + "popularity": 2.7888, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "China Now", "iso_3166_1": "US" }] }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "这就是中国" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2019-01-07", "episode_count": 329, "name": "第 1 季" }] + }, + "/tv/206367?language=en-US": { + "id": 206367, + "name": "这就是中国", + "original_name": "这就是中国", + "original_language": "zh", + "first_air_date": "2019-01-07", + "popularity": 2.7888, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "China Now", "iso_3166_1": "US" }] }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "这就是中国" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2019-01-07", "episode_count": 329, "name": "第 1 季" }] + }, + "/tv/208493?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 208493, + "name": "在异世界获得超强能力的我,在现实世界照样无敌~等级提升改变人生命运~", + "original_name": "異世界でチート能力を手にした俺は、現実世界をも無双する ~レベルアップは人生を変えた~", + "original_language": "ja", + "first_air_date": "2023-04-07", + "popularity": 16.5072, + "origin_country": ["JP"], + "alternative_titles": { + "results": [ + { + "title": "I Got a Cheat Ability in a Different World, and Became Extraordinary Even in the Real World", + "iso_3166_1": "AU" + }, + { "title": "在异世界获得超强能力的我,在现实世界照样无敌~等级提升改变人生命运~", "iso_3166_1": "CN" }, + { "title": "异界强者,现世无敌。等级提升,改变命运。", "iso_3166_1": "CN" }, + { + "title": "Yo, que obtuve poderes de trampa en otro mundo, puedo volverme incomparable incluso en el mundo real ~ Subir de nivel cambió mi vida ~", + "iso_3166_1": "ES" + }, + { "title": "Iseleve", "iso_3166_1": "ES" }, + { "title": "Cheat Skill Level Up", "iso_3166_1": "FR" }, + { "title": "iseleve", "iso_3166_1": "IT" }, + { + "title": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too", + "iso_3166_1": "IT" + }, + { + "title": "Isekai de Cheat Skill wo Te ni Shita Ore wa, Genjitsu Sekai wo mo Musou Suru : Level Up wa Jinsei wo Kaeta", + "iso_3166_1": "JP" + }, + { + "title": "Isekai de Cheat Skill o Te ni Shita Ore wa, Genjitsu Sekai o mo Musou Suru: Level Up wa Jinsei o Kaeta", + "iso_3166_1": "JP" + }, + { "title": "Iseleve", "iso_3166_1": "JP" }, + { + "title": "Isekai de Cheat Skill wo Te ni Shita Ore wa, Genjitsu Sekai wo mo Musou Suru - Level Up wa Jinsei wo Kaeta", + "iso_3166_1": "JP" + }, + { "title": "いせれべ", "iso_3166_1": "JP" }, + { + "title": "이세계에서 치트 스킬을 얻은 나는 현실 세계에서도 무쌍한다~레벨업이 인생을 바꿨다~", + "iso_3166_1": "KR" + }, + { + "title": "이세계에서 치트 능력을 손에 넣은 나는, 현실세계에서도 무쌍한다 ~레벨 업은 인생을 바꿨다~", + "iso_3166_1": "KR" + }, + { "title": "Isekai de Cheat Skill", "iso_3166_1": "US" }, + { "title": "Tôi Trở Nên Phi Thường Ngay Cả Ở Thế Giới Thật", "iso_3166_1": "VN" }, + { "title": "Có Được Năng Lực Bá Đạo Ở Dị Giới, Tôi Vô Đối Ở Thế Giới Thực", "iso_3166_1": "VN" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { + "iso_639_1": "es", + "iso_3166_1": "ES", + "data": { + "name": "Isekai de Cheat Skill wo Te ni Shita Ore wa, Genjitsu Sekai wo mo Musou Suru - Level Up wa Jinsei wo Kaeta" + } + }, + { + "iso_639_1": "en", + "iso_3166_1": "US", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in the Real World, Too" } + }, + { + "iso_639_1": "es", + "iso_3166_1": "MX", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too" } + }, + { + "iso_639_1": "it", + "iso_3166_1": "IT", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too" } + }, + { + "iso_639_1": "de", + "iso_3166_1": "DE", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "CN", + "data": { "name": "在异世界获得超强能力的我,在现实世界照样无敌~等级提升改变人生命运~" } + }, + { + "iso_639_1": "pt", + "iso_3166_1": "BR", + "data": { "name": "Ganhei um Poder Apelão em Outro Mundo e Agora Sou Imbatível no Mundo Real" } + }, + { + "iso_639_1": "ru", + "iso_3166_1": "RU", + "data": { + "name": "Я получил читерские способности в другом мире и стал экстраординарным в реальном мире: История о том, как повышение уровня изменило мою жизнь" + } + }, + { + "iso_639_1": "uk", + "iso_3166_1": "UA", + "data": { "name": "Читерські скіли в ісекаї зробили мене імбою в реалі" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "TW", + "data": { "name": "在異世界獲得超強能力的我,在現實世界照樣無敵~等級提升改變人生命運~" } + }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Cheat Skill Level Up" } }, + { + "iso_639_1": "ko", + "iso_3166_1": "KR", + "data": { "name": "이세계에서 치트 스킬을 얻은 나는 현실 세계에서도 무쌍한다~레벨업이 인생을 바꿨다~" } + }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { + "iso_639_1": "vi", + "iso_3166_1": "VN", + "data": { + "name": "Sau Khi Có Được Năng Lực Bá Đạo Ở Dị Giới, Tôi Cũng Vô Đối Ở Thế Giới Thực ~Thăng Cấp Xong Thì Cuộc Đời Cũng Thay Đổi~" + } + }, + { + "iso_639_1": "th", + "iso_3166_1": "TH", + "data": { "name": "สกิลโกงไร้เทียมทาน สร้างตำนานในสองโลก ~ชีวิตพลิกผันด้วยการอัปเลเวล~" } + }, + { + "iso_639_1": "tr", + "iso_3166_1": "TR", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in the Real World, Too" } + }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "איסלבה" } }, + { + "iso_639_1": "zh", + "iso_3166_1": "HK", + "data": { "name": "在異世界獲得超強能力的我,在現實世界照樣無敵:等級提升改變人生命運" } + }, + { + "iso_639_1": "ro", + "iso_3166_1": "RO", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in the Real World, Too" } + }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { + "iso_639_1": "pl", + "iso_3166_1": "PL", + "data": { + "name": "Isekai de Cheat Skill wo Te ni Shita Ore wa, Genjitsu Sekai wo mo Musou Suru: Level Up wa Jinsei wo Kaeta" + } + }, + { + "iso_639_1": "pt", + "iso_3166_1": "PT", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too" } + }, + { + "iso_639_1": "ar", + "iso_3166_1": "SA", + "data": { "name": "حصلت على مهارة غش في عالم آخر، وأصبحت لا مثيل لي في العالم الحقيقي أيضًا." } + } + ] + }, + "external_ids": { "imdb_id": "tt27417996", "tvdb_id": 423653 }, + "seasons": [ + { "season_number": 0, "air_date": "2026-03-29", "episode_count": 1, "name": "特别篇" }, + { "season_number": 1, "air_date": "2023-04-07", "episode_count": 13, "name": "第 1 季" }, + { "season_number": 2, "episode_count": 0, "name": "第 2 季" } + ] + }, + "/tv/208493?language=en-US": { + "id": 208493, + "name": "I Got a Cheat Skill in Another World and Became Unrivaled in the Real World, Too", + "original_name": "異世界でチート能力を手にした俺は、現実世界をも無双する ~レベルアップは人生を変えた~", + "original_language": "ja", + "first_air_date": "2023-04-07", + "popularity": 16.5072, + "origin_country": ["JP"], + "alternative_titles": { + "results": [ + { + "title": "I Got a Cheat Ability in a Different World, and Became Extraordinary Even in the Real World", + "iso_3166_1": "AU" + }, + { "title": "在异世界获得超强能力的我,在现实世界照样无敌~等级提升改变人生命运~", "iso_3166_1": "CN" }, + { "title": "异界强者,现世无敌。等级提升,改变命运。", "iso_3166_1": "CN" }, + { + "title": "Yo, que obtuve poderes de trampa en otro mundo, puedo volverme incomparable incluso en el mundo real ~ Subir de nivel cambió mi vida ~", + "iso_3166_1": "ES" + }, + { "title": "Iseleve", "iso_3166_1": "ES" }, + { "title": "Cheat Skill Level Up", "iso_3166_1": "FR" }, + { "title": "iseleve", "iso_3166_1": "IT" }, + { + "title": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too", + "iso_3166_1": "IT" + }, + { + "title": "Isekai de Cheat Skill wo Te ni Shita Ore wa, Genjitsu Sekai wo mo Musou Suru : Level Up wa Jinsei wo Kaeta", + "iso_3166_1": "JP" + }, + { + "title": "Isekai de Cheat Skill o Te ni Shita Ore wa, Genjitsu Sekai o mo Musou Suru: Level Up wa Jinsei o Kaeta", + "iso_3166_1": "JP" + }, + { "title": "Iseleve", "iso_3166_1": "JP" }, + { + "title": "Isekai de Cheat Skill wo Te ni Shita Ore wa, Genjitsu Sekai wo mo Musou Suru - Level Up wa Jinsei wo Kaeta", + "iso_3166_1": "JP" + }, + { "title": "いせれべ", "iso_3166_1": "JP" }, + { + "title": "이세계에서 치트 스킬을 얻은 나는 현실 세계에서도 무쌍한다~레벨업이 인생을 바꿨다~", + "iso_3166_1": "KR" + }, + { + "title": "이세계에서 치트 능력을 손에 넣은 나는, 현실세계에서도 무쌍한다 ~레벨 업은 인생을 바꿨다~", + "iso_3166_1": "KR" + }, + { "title": "Isekai de Cheat Skill", "iso_3166_1": "US" }, + { "title": "Tôi Trở Nên Phi Thường Ngay Cả Ở Thế Giới Thật", "iso_3166_1": "VN" }, + { "title": "Có Được Năng Lực Bá Đạo Ở Dị Giới, Tôi Vô Đối Ở Thế Giới Thực", "iso_3166_1": "VN" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { + "iso_639_1": "es", + "iso_3166_1": "ES", + "data": { + "name": "Isekai de Cheat Skill wo Te ni Shita Ore wa, Genjitsu Sekai wo mo Musou Suru - Level Up wa Jinsei wo Kaeta" + } + }, + { + "iso_639_1": "en", + "iso_3166_1": "US", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in the Real World, Too" } + }, + { + "iso_639_1": "es", + "iso_3166_1": "MX", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too" } + }, + { + "iso_639_1": "it", + "iso_3166_1": "IT", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too" } + }, + { + "iso_639_1": "de", + "iso_3166_1": "DE", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "CN", + "data": { "name": "在异世界获得超强能力的我,在现实世界照样无敌~等级提升改变人生命运~" } + }, + { + "iso_639_1": "pt", + "iso_3166_1": "BR", + "data": { "name": "Ganhei um Poder Apelão em Outro Mundo e Agora Sou Imbatível no Mundo Real" } + }, + { + "iso_639_1": "ru", + "iso_3166_1": "RU", + "data": { + "name": "Я получил читерские способности в другом мире и стал экстраординарным в реальном мире: История о том, как повышение уровня изменило мою жизнь" + } + }, + { + "iso_639_1": "uk", + "iso_3166_1": "UA", + "data": { "name": "Читерські скіли в ісекаї зробили мене імбою в реалі" } + }, + { + "iso_639_1": "zh", + "iso_3166_1": "TW", + "data": { "name": "在異世界獲得超強能力的我,在現實世界照樣無敵~等級提升改變人生命運~" } + }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Cheat Skill Level Up" } }, + { + "iso_639_1": "ko", + "iso_3166_1": "KR", + "data": { "name": "이세계에서 치트 스킬을 얻은 나는 현실 세계에서도 무쌍한다~레벨업이 인생을 바꿨다~" } + }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { + "iso_639_1": "vi", + "iso_3166_1": "VN", + "data": { + "name": "Sau Khi Có Được Năng Lực Bá Đạo Ở Dị Giới, Tôi Cũng Vô Đối Ở Thế Giới Thực ~Thăng Cấp Xong Thì Cuộc Đời Cũng Thay Đổi~" + } + }, + { + "iso_639_1": "th", + "iso_3166_1": "TH", + "data": { "name": "สกิลโกงไร้เทียมทาน สร้างตำนานในสองโลก ~ชีวิตพลิกผันด้วยการอัปเลเวล~" } + }, + { + "iso_639_1": "tr", + "iso_3166_1": "TR", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in the Real World, Too" } + }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "איסלבה" } }, + { + "iso_639_1": "zh", + "iso_3166_1": "HK", + "data": { "name": "在異世界獲得超強能力的我,在現實世界照樣無敵:等級提升改變人生命運" } + }, + { + "iso_639_1": "ro", + "iso_3166_1": "RO", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in the Real World, Too" } + }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { + "iso_639_1": "pl", + "iso_3166_1": "PL", + "data": { + "name": "Isekai de Cheat Skill wo Te ni Shita Ore wa, Genjitsu Sekai wo mo Musou Suru: Level Up wa Jinsei wo Kaeta" + } + }, + { + "iso_639_1": "pt", + "iso_3166_1": "PT", + "data": { "name": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too" } + }, + { + "iso_639_1": "ar", + "iso_3166_1": "SA", + "data": { "name": "حصلت على مهارة غش في عالم آخر، وأصبحت لا مثيل لي في العالم الحقيقي أيضًا." } + } + ] + }, + "external_ids": { "imdb_id": "tt27417996", "tvdb_id": 423653 }, + "seasons": [ + { "season_number": 0, "air_date": "2026-03-29", "episode_count": 1, "name": "特别篇" }, + { "season_number": 1, "air_date": "2023-04-07", "episode_count": 13, "name": "第 1 季" }, + { "season_number": 2, "episode_count": 0, "name": "第 2 季" } + ] + }, + "/tv/210191?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 210191, + "name": "一念关山", + "original_name": "一念关山", + "original_language": "zh", + "first_air_date": "2023-11-28", + "popularity": 9.2278, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Yi Nian Guan Shan", "iso_3166_1": "CN" }, + { "title": "一念关山", "iso_3166_1": "CN" }, + { "title": "ข้ามภูผาหาญท้าลิขิตรัก", "iso_3166_1": "TH" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "A Journey to Love" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "一念關山" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "一念關山" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "一念关山" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Nhất Niệm Quan Sơn" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "ข้ามภูผาหาญท้าลิขิตรัก" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Uma jornada para o amor" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "일념관산" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Путешествие к любви" } } + ] + }, + "external_ids": { "imdb_id": "tt28182389", "tvdb_id": 430047 }, + "seasons": [ + { "season_number": 0, "air_date": "2023-12-18", "episode_count": 6, "name": "特别篇" }, + { "season_number": 1, "air_date": "2023-11-28", "episode_count": 40, "name": "第 1 季" } + ] + }, + "/tv/210191?language=en-US": { + "id": 210191, + "name": "A Journey to Love", + "original_name": "一念关山", + "original_language": "zh", + "first_air_date": "2023-11-28", + "popularity": 9.2278, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Yi Nian Guan Shan", "iso_3166_1": "CN" }, + { "title": "一念关山", "iso_3166_1": "CN" }, + { "title": "ข้ามภูผาหาญท้าลิขิตรัก", "iso_3166_1": "TH" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "A Journey to Love" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "一念關山" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "一念關山" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "一念关山" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Nhất Niệm Quan Sơn" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "ข้ามภูผาหาญท้าลิขิตรัก" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Uma jornada para o amor" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "일념관산" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Путешествие к любви" } } + ] + }, + "external_ids": { "imdb_id": "tt28182389", "tvdb_id": 430047 }, + "seasons": [ + { "season_number": 0, "air_date": "2023-12-18", "episode_count": 6, "name": "特别篇" }, + { "season_number": 1, "air_date": "2023-11-28", "episode_count": 40, "name": "第 1 季" } + ] + }, + "/tv/211849?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 211849, + "name": "嗨!营业中", + "original_name": "嗨! 營業中", + "original_language": "zh", + "first_air_date": "2022-10-01", + "popularity": 3.8453, + "origin_country": ["TW"], + "alternative_titles": { "results": [{ "title": "Hi ! Open for Business", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Hi, Come In" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "嗨!营业中" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "嗨! 營業中" } } + ] + }, + "external_ids": {}, + "seasons": [ + { "season_number": 1, "air_date": "2022-10-01", "episode_count": 15, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2023-05-20", "episode_count": 15, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2023-12-23", "episode_count": 17, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2024-08-17", "episode_count": 16, "name": "第 4 季" }, + { "season_number": 5, "air_date": "2025-03-29", "episode_count": 17, "name": "第 5 季" }, + { "season_number": 6, "air_date": "2025-11-06", "episode_count": 1, "name": "第 6 季" }, + { "season_number": 7, "episode_count": 1, "name": "第 7 季" } + ] + }, + "/tv/211849?language=en-US": { + "id": 211849, + "name": "Hi, Come In", + "original_name": "嗨! 營業中", + "original_language": "zh", + "first_air_date": "2022-10-01", + "popularity": 3.8453, + "origin_country": ["TW"], + "alternative_titles": { "results": [{ "title": "Hi ! Open for Business", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Hi, Come In" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "嗨!营业中" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "嗨! 營業中" } } + ] + }, + "external_ids": {}, + "seasons": [ + { "season_number": 1, "air_date": "2022-10-01", "episode_count": 15, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2023-05-20", "episode_count": 15, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2023-12-23", "episode_count": 17, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2024-08-17", "episode_count": 16, "name": "第 4 季" }, + { "season_number": 5, "air_date": "2025-03-29", "episode_count": 17, "name": "第 5 季" }, + { "season_number": 6, "air_date": "2025-11-06", "episode_count": 1, "name": "第 6 季" }, + { "season_number": 7, "episode_count": 1, "name": "第 7 季" } + ] + }, + "/tv/213375?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 213375, + "name": "幻视任务", + "original_name": "VisionQuest", + "original_language": "en", + "first_air_date": "2026-10-14", + "popularity": 19.298, + "origin_country": ["US"], + "alternative_titles": { + "results": [ + { "title": "幻视任务", "iso_3166_1": "CN" }, + { "title": "Вижн в поиске себя", "iso_3166_1": "RU" }, + { "title": "Квест Віжена", "iso_3166_1": "UA" }, + { "title": "Vision Quest", "iso_3166_1": "US" }, + { "title": "Marvel Television's VisionQuest", "iso_3166_1": "US" }, + { "title": "Marvel's VisionQuest", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "비전 퀘스트" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Квест Вижна" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "幻视任务" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Завдання Віжена" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "幻視征途" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "رحلة ڤيجن" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "วิกฤตวิชั่น" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "ויז'ן-קווסט" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "幻視任務" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } }, + { "iso_639_1": "hr", "iso_3166_1": "HR", "data": { "name": "" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "ヴィジョンクエスト" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Вижън: В търсене на себе си" } } + ] + }, + "external_ids": { "imdb_id": "tt23112594", "tvdb_id": 426606 }, + "seasons": [{ "season_number": 1, "air_date": "2026-10-14", "episode_count": 8, "name": "第 1 季" }] + }, + "/tv/213375?language=en-US": { + "id": 213375, + "name": "VisionQuest", + "original_name": "VisionQuest", + "original_language": "en", + "first_air_date": "2026-10-14", + "popularity": 19.298, + "origin_country": ["US"], + "alternative_titles": { + "results": [ + { "title": "幻视任务", "iso_3166_1": "CN" }, + { "title": "Вижн в поиске себя", "iso_3166_1": "RU" }, + { "title": "Квест Віжена", "iso_3166_1": "UA" }, + { "title": "Vision Quest", "iso_3166_1": "US" }, + { "title": "Marvel Television's VisionQuest", "iso_3166_1": "US" }, + { "title": "Marvel's VisionQuest", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "비전 퀘스트" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Квест Вижна" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "幻视任务" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Завдання Віжена" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "幻視征途" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "رحلة ڤيجن" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "วิกฤตวิชั่น" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "ויז'ן-קווסט" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "幻視任務" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } }, + { "iso_639_1": "hr", "iso_3166_1": "HR", "data": { "name": "" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "ヴィジョンクエスト" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Вижън: В търсене на себе си" } } + ] + }, + "external_ids": { "imdb_id": "tt23112594", "tvdb_id": 426606 }, + "seasons": [{ "season_number": 1, "air_date": "2026-10-14", "episode_count": 8, "name": "第 1 季" }] + }, + "/tv/220850?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 220850, + "name": "炼气十万年", + "original_name": "炼气十万年", + "original_language": "zh", + "first_air_date": "2023-02-18", + "popularity": 32.4193, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Lian Qi Shi Wan Nian", "iso_3166_1": "CN" }, + { "title": "练气十万年", "iso_3166_1": "CN" }, + { "title": "One Hundred Thousand Years Of Qi Training", "iso_3166_1": "CN" }, + { "title": "Lian Qi Shiwan Nian", "iso_3166_1": "CN" }, + { "title": "One Hundred Thousand Years of Qi Refining", "iso_3166_1": "CN" }, + { "title": "Cien mil años en refinación de Qi", "iso_3166_1": "ES" }, + { "title": "煉氣十萬年", "iso_3166_1": "TW" }, + { "title": "One Thousand Years of Refining Qi", "iso_3166_1": "US" }, + { "title": "100.000 Years of Refining Qi", "iso_3166_1": "US" }, + { "title": "One Hundred Thousand Years Of Qi Training", "iso_3166_1": "US" }, + { "title": "100,000 Years of Refining Qi", "iso_3166_1": "US" }, + { "title": "Luyện Khí 10 Vạn Năm", "iso_3166_1": "VN" }, + { "title": "Luyện Khí Mười Vạn Năm", "iso_3166_1": "VN" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Cien mil años en refinación de Qi" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "One Hundred Thousand Years of Qi Refining" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "炼气十万年" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "煉氣十萬年" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "ข้าก็แค่ฝึกวิชาหนึ่งแสนปี" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Практикуя ци сто тысяч лет" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Luyện Khí Mười Vạn Năm" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "100.000 Years of Refining Qi" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "煉氣十萬年" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "One Hundred Thousand Years of Qi Refining" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt28210907", "tvdb_id": 431294 }, + "seasons": [ + { "season_number": 0, "air_date": "2026-07-18", "episode_count": 1, "name": "特别篇" }, + { "season_number": 1, "air_date": "2023-02-18", "episode_count": 420, "name": "第 1 季" } + ] + }, + "/tv/220850?language=en-US": { + "id": 220850, + "name": "One Hundred Thousand Years of Qi Refining", + "original_name": "炼气十万年", + "original_language": "zh", + "first_air_date": "2023-02-18", + "popularity": 32.4193, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Lian Qi Shi Wan Nian", "iso_3166_1": "CN" }, + { "title": "练气十万年", "iso_3166_1": "CN" }, + { "title": "One Hundred Thousand Years Of Qi Training", "iso_3166_1": "CN" }, + { "title": "Lian Qi Shiwan Nian", "iso_3166_1": "CN" }, + { "title": "One Hundred Thousand Years of Qi Refining", "iso_3166_1": "CN" }, + { "title": "Cien mil años en refinación de Qi", "iso_3166_1": "ES" }, + { "title": "煉氣十萬年", "iso_3166_1": "TW" }, + { "title": "One Thousand Years of Refining Qi", "iso_3166_1": "US" }, + { "title": "100.000 Years of Refining Qi", "iso_3166_1": "US" }, + { "title": "One Hundred Thousand Years Of Qi Training", "iso_3166_1": "US" }, + { "title": "100,000 Years of Refining Qi", "iso_3166_1": "US" }, + { "title": "Luyện Khí 10 Vạn Năm", "iso_3166_1": "VN" }, + { "title": "Luyện Khí Mười Vạn Năm", "iso_3166_1": "VN" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Cien mil años en refinación de Qi" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "One Hundred Thousand Years of Qi Refining" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "炼气十万年" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "煉氣十萬年" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "ข้าก็แค่ฝึกวิชาหนึ่งแสนปี" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Практикуя ци сто тысяч лет" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Luyện Khí Mười Vạn Năm" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "100.000 Years of Refining Qi" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "煉氣十萬年" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "One Hundred Thousand Years of Qi Refining" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt28210907", "tvdb_id": 431294 }, + "seasons": [ + { "season_number": 0, "air_date": "2026-07-18", "episode_count": 1, "name": "特别篇" }, + { "season_number": 1, "air_date": "2023-02-18", "episode_count": 420, "name": "第 1 季" } + ] + }, + "/tv/224006?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 224006, + "name": "预言者", + "original_name": "Un prophète", + "original_language": "fr", + "first_air_date": "2026-03-02", + "popularity": 3.5543, + "origin_country": ["FR"], + "alternative_titles": { "results": [{ "title": "Un Prophète, la série", "iso_3166_1": "FR" }] }, + "translations": { + "translations": [ + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Un prophète" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "A Prophet" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "预言者" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt9174852", "tvdb_id": 467992 }, + "seasons": [{ "season_number": 1, "air_date": "2026-03-02", "episode_count": 8, "name": "第 1 季" }] + }, + "/tv/224006?language=en-US": { + "id": 224006, + "name": "A Prophet", + "original_name": "Un prophète", + "original_language": "fr", + "first_air_date": "2026-03-02", + "popularity": 3.5543, + "origin_country": ["FR"], + "alternative_titles": { "results": [{ "title": "Un Prophète, la série", "iso_3166_1": "FR" }] }, + "translations": { + "translations": [ + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Un prophète" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "A Prophet" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "预言者" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt9174852", "tvdb_id": 467992 }, + "seasons": [{ "season_number": 1, "air_date": "2026-03-02", "episode_count": 8, "name": "第 1 季" }] + }, + "/tv/228707?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/228707?language=en-US": { "__status": 404 }, + "/tv/230155?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 230155, + "name": "心脏信号 日版", + "original_name": "Heart Signal Japan", + "original_language": "ja", + "first_air_date": "2022-08-24", + "popularity": 1.4282, + "origin_country": ["JP"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "HEART SIGNAL JAPAN" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "心脏信号 日版" } } + ] + }, + "external_ids": {}, + "seasons": [ + { "season_number": 0, "air_date": "2022-08-16", "episode_count": 4, "name": "特别篇" }, + { "season_number": 1, "air_date": "2022-08-24", "episode_count": 9, "name": "第 1 季" } + ] + }, + "/tv/230155?language=en-US": { + "id": 230155, + "name": "Heart Signal Japan", + "original_name": "Heart Signal Japan", + "original_language": "ja", + "first_air_date": "2022-08-24", + "popularity": 1.4282, + "origin_country": ["JP"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "HEART SIGNAL JAPAN" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "心脏信号 日版" } } + ] + }, + "external_ids": {}, + "seasons": [ + { "season_number": 0, "air_date": "2022-08-16", "episode_count": 4, "name": "特别篇" }, + { "season_number": 1, "air_date": "2022-08-24", "episode_count": 9, "name": "第 1 季" } + ] + }, + "/tv/246649?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/246649?language=en-US": { "__status": 404 }, + "/tv/247201?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/247201?language=en-US": { "__status": 404 }, + "/tv/252788?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 252788, + "name": "绝世战魂", + "original_name": "绝世战魂", + "original_language": "zh", + "first_air_date": "2024-04-27", + "popularity": 6.9387, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Jueshi Zhan Hun", "iso_3166_1": "CN" }, + { "title": "Jue Shi Zhan Hun", "iso_3166_1": "CN" }, + { "title": "Jueshi Zhanhun", "iso_3166_1": "CN" }, + { "title": "Peerless Battle Spirit (2024)", "iso_3166_1": "US" }, + { "title": "Peerless Soul", "iso_3166_1": "US" }, + { "title": "Super Heroic", "iso_3166_1": "US" }, + { "title": "Superheroic", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "绝世战魂" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Peerless Battle Spirit" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Peerless Battle Spirit" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Peerless Battle Spirit" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Tuyệt Thế Chiến Hồn" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "絕世戰魂" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "絕世戰魂" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Бесподобная душа воина" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Peerless Battle Spirit" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } } + ] + }, + "external_ids": { "tvdb_id": 449165 }, + "seasons": [ + { "season_number": 1, "air_date": "2024-04-27", "episode_count": 180, "name": "第1季" }, + { "season_number": 2, "air_date": "2026-06-09", "episode_count": 60, "name": "第2季" } + ] + }, + "/tv/252788?language=en-US": { + "id": 252788, + "name": "Peerless Battle Spirit", + "original_name": "绝世战魂", + "original_language": "zh", + "first_air_date": "2024-04-27", + "popularity": 6.9387, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Jueshi Zhan Hun", "iso_3166_1": "CN" }, + { "title": "Jue Shi Zhan Hun", "iso_3166_1": "CN" }, + { "title": "Jueshi Zhanhun", "iso_3166_1": "CN" }, + { "title": "Peerless Battle Spirit (2024)", "iso_3166_1": "US" }, + { "title": "Peerless Soul", "iso_3166_1": "US" }, + { "title": "Super Heroic", "iso_3166_1": "US" }, + { "title": "Superheroic", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "绝世战魂" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Peerless Battle Spirit" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Peerless Battle Spirit" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Peerless Battle Spirit" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Tuyệt Thế Chiến Hồn" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "絕世戰魂" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "絕世戰魂" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Бесподобная душа воина" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Peerless Battle Spirit" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } } + ] + }, + "external_ids": { "tvdb_id": 449165 }, + "seasons": [ + { "season_number": 1, "air_date": "2024-04-27", "episode_count": 180, "name": "第1季" }, + { "season_number": 2, "air_date": "2026-06-09", "episode_count": 60, "name": "第2季" } + ] + }, + "/tv/255200?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/255200?language=en-US": { "__status": 404 }, + "/tv/257758?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 257758, + "name": "Do You Want To Live Forever?", + "original_name": "Do You Want To Live Forever?", + "original_language": "en", + "first_air_date": "2024-06-17", + "popularity": 0.5307, + "origin_country": ["AU"], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2024-06-17", "episode_count": 4, "name": "第 1 季" }] + }, + "/tv/257758?language=en-US": { + "id": 257758, + "name": "Do You Want To Live Forever?", + "original_name": "Do You Want To Live Forever?", + "original_language": "en", + "first_air_date": "2024-06-17", + "popularity": 0.5307, + "origin_country": ["AU"], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2024-06-17", "episode_count": 4, "name": "第 1 季" }] + }, + "/tv/259558?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 259558, + "name": "独自一人的异世界攻略", + "original_name": "ひとりぼっちの異世界攻略", + "original_language": "ja", + "first_air_date": "2024-09-27", + "popularity": 10.7829, + "origin_country": ["JP"], + "alternative_titles": { + "results": [ + { "title": "Hitoribocchi no Isekai Kouryaku", "iso_3166_1": "CL" }, + { "title": "独自一人的异世界攻略", "iso_3166_1": "CN" }, + { "title": "孤单一人的异世界攻略", "iso_3166_1": "CN" }, + { "title": "Hitoribocchi no Isekai Kouryaku", "iso_3166_1": "ES" }, + { "title": "تنها در جهانی دیگر", "iso_3166_1": "IR" }, + { "title": "زندگی یک منزوی در دنیایی دیگر", "iso_3166_1": "IR" }, + { + "title": "Tutto solo alla conquista di un altro mondo - IsekaiBocchi (Loner Life in Another World)", + "iso_3166_1": "IT" + }, + { "title": "Hitoribotchi no Isekai Koryaku", "iso_3166_1": "JP" }, + { "title": "Bocchi Kouryaku", "iso_3166_1": "JP" }, + { "title": "Hitoribotchi no Isekai Kōryaku", "iso_3166_1": "JP" }, + { "title": "Hitoribocchi no Isekai Kouryaku", "iso_3166_1": "JP" }, + { "title": "Hitoribocchi no Isekai Kouryaku", "iso_3166_1": "MX" }, + { "title": "حياة منعزلة في عالم آخر", "iso_3166_1": "SA" }, + { "title": "Lonely Attack on a Different World", "iso_3166_1": "US" }, + { "title": "Loner Life in Another World", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Loner Life in Another World" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Loner Life in Another World" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "独自一人的异世界攻略" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Loner Life in Another World" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "นายโดดเดี่ยวพิชิตต่างโลก" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "孤單一人的異世界攻略" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "孤單一人的異世界攻略" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Loner Life in Another World" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "외톨이의 이세계 공략" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Підкорення іншого світу самітником" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Hitoribocchi no Isekai Kouryaku" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Hitoribocchi no Isekai Kouryaku" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Нападение одиночки на иной мир" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Tutto solo alla conquista di un altro mondo" } }, + { "iso_639_1": "fa", "iso_3166_1": "IR", "data": { "name": "تنها در جهانی دیگر" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Hành trình cô độc nơi dị giới" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "Strategi Hidup Seorang Diri di Dunia Lain" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Hitoribocchi no Isekai Kouryaku" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "חיי מתבודד בעולם אחר" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "حياة منعزلة في عالم آخر" } } + ] + }, + "external_ids": { "imdb_id": "tt32512773", "tvdb_id": 445009 }, + "seasons": [{ "season_number": 1, "air_date": "2024-09-27", "episode_count": 12, "name": "第 1 季" }] + }, + "/tv/259558?language=en-US": { + "id": 259558, + "name": "Loner Life in Another World", + "original_name": "ひとりぼっちの異世界攻略", + "original_language": "ja", + "first_air_date": "2024-09-27", + "popularity": 10.7829, + "origin_country": ["JP"], + "alternative_titles": { + "results": [ + { "title": "Hitoribocchi no Isekai Kouryaku", "iso_3166_1": "CL" }, + { "title": "独自一人的异世界攻略", "iso_3166_1": "CN" }, + { "title": "孤单一人的异世界攻略", "iso_3166_1": "CN" }, + { "title": "Hitoribocchi no Isekai Kouryaku", "iso_3166_1": "ES" }, + { "title": "تنها در جهانی دیگر", "iso_3166_1": "IR" }, + { "title": "زندگی یک منزوی در دنیایی دیگر", "iso_3166_1": "IR" }, + { + "title": "Tutto solo alla conquista di un altro mondo - IsekaiBocchi (Loner Life in Another World)", + "iso_3166_1": "IT" + }, + { "title": "Hitoribotchi no Isekai Koryaku", "iso_3166_1": "JP" }, + { "title": "Bocchi Kouryaku", "iso_3166_1": "JP" }, + { "title": "Hitoribotchi no Isekai Kōryaku", "iso_3166_1": "JP" }, + { "title": "Hitoribocchi no Isekai Kouryaku", "iso_3166_1": "JP" }, + { "title": "Hitoribocchi no Isekai Kouryaku", "iso_3166_1": "MX" }, + { "title": "حياة منعزلة في عالم آخر", "iso_3166_1": "SA" }, + { "title": "Lonely Attack on a Different World", "iso_3166_1": "US" }, + { "title": "Loner Life in Another World", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Loner Life in Another World" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Loner Life in Another World" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "独自一人的异世界攻略" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Loner Life in Another World" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "นายโดดเดี่ยวพิชิตต่างโลก" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "孤單一人的異世界攻略" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "孤單一人的異世界攻略" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Loner Life in Another World" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "외톨이의 이세계 공략" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Підкорення іншого світу самітником" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Hitoribocchi no Isekai Kouryaku" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Hitoribocchi no Isekai Kouryaku" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Нападение одиночки на иной мир" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Tutto solo alla conquista di un altro mondo" } }, + { "iso_639_1": "fa", "iso_3166_1": "IR", "data": { "name": "تنها در جهانی دیگر" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Hành trình cô độc nơi dị giới" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "Strategi Hidup Seorang Diri di Dunia Lain" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Hitoribocchi no Isekai Kouryaku" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "חיי מתבודד בעולם אחר" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "حياة منعزلة في عالم آخر" } } + ] + }, + "external_ids": { "imdb_id": "tt32512773", "tvdb_id": 445009 }, + "seasons": [{ "season_number": 1, "air_date": "2024-09-27", "episode_count": 12, "name": "第 1 季" }] + }, + "/tv/275885?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 275885, + "name": "万界仙踪", + "original_name": "万界仙踪", + "original_language": "zh", + "first_air_date": "2020-06-26", + "popularity": 1.1013, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The Wizard of Ten Thousand Worlds" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "萬界仙蹤" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "jv", "iso_3166_1": "JV", "data": { "name": "" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "CA", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "CH", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "AT", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt32832173" }, + "seasons": [{ "season_number": 1, "air_date": "2020-06-26", "episode_count": 1, "name": "Season 1" }] + }, + "/tv/275885?language=en-US": { + "id": 275885, + "name": "The Wizard of Ten Thousand Worlds", + "original_name": "万界仙踪", + "original_language": "zh", + "first_air_date": "2020-06-26", + "popularity": 1.1013, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The Wizard of Ten Thousand Worlds" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "萬界仙蹤" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "jv", "iso_3166_1": "JV", "data": { "name": "" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "CA", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "CH", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "AT", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt32832173" }, + "seasons": [{ "season_number": 1, "air_date": "2020-06-26", "episode_count": 1, "name": "Season 1" }] + }, + "/tv/279106?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 279106, + "name": "The Lost Unabomber Tapes", + "original_name": "The Lost Unabomber Tapes", + "original_language": "en", + "first_air_date": "2020-01-26", + "popularity": 0.5507, + "origin_country": ["US"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt11639898", "tvdb_id": 376006 }, + "seasons": [{ "season_number": 1, "air_date": "2020-01-26", "episode_count": 1, "name": "第 1 季" }] + }, + "/tv/279106?language=en-US": { + "id": 279106, + "name": "The Lost Unabomber Tapes", + "original_name": "The Lost Unabomber Tapes", + "original_language": "en", + "first_air_date": "2020-01-26", + "popularity": 0.5507, + "origin_country": ["US"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt11639898", "tvdb_id": 376006 }, + "seasons": [{ "season_number": 1, "air_date": "2020-01-26", "episode_count": 1, "name": "第 1 季" }] + }, + "/tv/280564?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 280564, + "name": "记忆管理局", + "original_name": "记忆管理局", + "original_language": "zh", + "first_air_date": "2026-08-02", + "popularity": 12.2033, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Jiyi Guanli Ju", "iso_3166_1": "CN" }, + { "title": "The Memory Bureau", "iso_3166_1": "US" }, + { "title": "False Memory", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "False Memory" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "記憶管理局" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "记忆管理局" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Управление воспоминаниями" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Jiyi Guanli Ju" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Cục Quản Lý Ký Ức" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "False Memory" } } + ] + }, + "external_ids": { "imdb_id": "tt38754770", "tvdb_id": 461549 }, + "seasons": [{ "season_number": 1, "air_date": "2026-08-02", "episode_count": 7, "name": "第 1 季" }] + }, + "/tv/280564?language=en-US": { + "id": 280564, + "name": "False Memory", + "original_name": "记忆管理局", + "original_language": "zh", + "first_air_date": "2026-08-02", + "popularity": 12.2033, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Jiyi Guanli Ju", "iso_3166_1": "CN" }, + { "title": "The Memory Bureau", "iso_3166_1": "US" }, + { "title": "False Memory", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "False Memory" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "記憶管理局" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "记忆管理局" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Управление воспоминаниями" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Jiyi Guanli Ju" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Cục Quản Lý Ký Ức" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "False Memory" } } + ] + }, + "external_ids": { "imdb_id": "tt38754770", "tvdb_id": 461549 }, + "seasons": [{ "season_number": 1, "air_date": "2026-08-02", "episode_count": 7, "name": "第 1 季" }] + }, + "/tv/285147?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 285147, + "name": "寻女无归途", + "original_name": "शक: Trust No One", + "original_language": "hi", + "first_air_date": "2026-09-24", + "popularity": 18.157, + "origin_country": ["IN"], + "alternative_titles": { + "results": [ + { "title": "寻女无归途", "iso_3166_1": "CN" }, + { "title": "Shaque: No confíes en nadie", "iso_3166_1": "ES" }, + { "title": "Duvida: Nunca Confies", "iso_3166_1": "PT" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Shaque: Trust No One" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "Duvida: Nunca Confies" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Instinto de Mãe" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "寻女无归途" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Shaque: No confíes en nadie" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Shaque : Tous suspects" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "ספק: אסור לבטוח באף אחד" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Wątpliwości: Nie ufaj nikomu" } }, + { "iso_639_1": "hi", "iso_3166_1": "IN", "data": { "name": "" } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "Anyai megérzés" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Шак: Не вярвай на никого" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Shaque - No Confies En Nadie" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "샤크: 그 누구도 믿지 마" } } + ] + }, + "external_ids": { "imdb_id": "tt35929525", "tvdb_id": 473584 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-24", "episode_count": 7, "name": "第 1 季" }] + }, + "/tv/285147?language=en-US": { + "id": 285147, + "name": "Shaque: Trust No One", + "original_name": "शक: Trust No One", + "original_language": "hi", + "first_air_date": "2026-09-24", + "popularity": 18.157, + "origin_country": ["IN"], + "alternative_titles": { + "results": [ + { "title": "寻女无归途", "iso_3166_1": "CN" }, + { "title": "Shaque: No confíes en nadie", "iso_3166_1": "ES" }, + { "title": "Duvida: Nunca Confies", "iso_3166_1": "PT" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Shaque: Trust No One" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "Duvida: Nunca Confies" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Instinto de Mãe" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "寻女无归途" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Shaque: No confíes en nadie" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Shaque : Tous suspects" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "ספק: אסור לבטוח באף אחד" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Wątpliwości: Nie ufaj nikomu" } }, + { "iso_639_1": "hi", "iso_3166_1": "IN", "data": { "name": "" } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "Anyai megérzés" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Шак: Не вярвай на никого" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Shaque - No Confies En Nadie" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "샤크: 그 누구도 믿지 마" } } + ] + }, + "external_ids": { "imdb_id": "tt35929525", "tvdb_id": 473584 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-24", "episode_count": 7, "name": "第 1 季" }] + }, + "/tv/288873?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 288873, + "name": "云雀叫天录", + "original_name": "云雀叫天录", + "original_language": "zh", + "first_air_date": "2026-09-14", + "popularity": 5.9637, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Yun Que Jiao Tian Lu", "iso_3166_1": "CN" }, + { "title": "Beyond the Clouds", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Gladiator in the Theater" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "雲雀叫天錄" } } + ] + }, + "external_ids": { "imdb_id": "tt32046615" }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-14", "episode_count": 40, "name": "第 1 季" }] + }, + "/tv/288873?language=en-US": { + "id": 288873, + "name": "Gladiator in the Theater", + "original_name": "云雀叫天录", + "original_language": "zh", + "first_air_date": "2026-09-14", + "popularity": 5.9637, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Yun Que Jiao Tian Lu", "iso_3166_1": "CN" }, + { "title": "Beyond the Clouds", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Gladiator in the Theater" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "雲雀叫天錄" } } + ] + }, + "external_ids": { "imdb_id": "tt32046615" }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-14", "episode_count": 40, "name": "第 1 季" }] + }, + "/tv/289078?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 289078, + "name": "我不是大师", + "original_name": "我不是大师", + "original_language": "zh", + "first_air_date": "2026-09-24", + "popularity": 16.712, + "origin_country": ["CN"], + "alternative_titles": { + "results": [{ "title": "长风起", "iso_3166_1": "CN" }, { "title": "A Prophet", "iso_3166_1": "US" }] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "我不是大师" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "A Prophet" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "長風起" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "我不是大師" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Пророк" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "แผนการพยากรณ์" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Tôi Không Phải Là Đại Sư" } } + ] + }, + "external_ids": { "imdb_id": "tt36758489", "tvdb_id": 466045 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-24", "episode_count": 24, "name": "第 1 季" }] + }, + "/tv/289078?language=en-US": { + "id": 289078, + "name": "A Prophet", + "original_name": "我不是大师", + "original_language": "zh", + "first_air_date": "2026-09-24", + "popularity": 16.712, + "origin_country": ["CN"], + "alternative_titles": { + "results": [{ "title": "长风起", "iso_3166_1": "CN" }, { "title": "A Prophet", "iso_3166_1": "US" }] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "我不是大师" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "A Prophet" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "長風起" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "我不是大師" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Пророк" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "แผนการพยากรณ์" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Tôi Không Phải Là Đại Sư" } } + ] + }, + "external_ids": { "imdb_id": "tt36758489", "tvdb_id": 466045 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-24", "episode_count": 24, "name": "第 1 季" }] + }, + "/tv/294990?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 294990, + "name": "一瓯春", + "original_name": "一瓯春", + "original_language": "zh", + "first_air_date": "2026-09-17", + "popularity": 25.4305, + "origin_country": ["CN"], + "alternative_titles": { + "results": [{ "title": "Yi Ou Chun", "iso_3166_1": "CN" }, { "title": "A Cup of Love", "iso_3166_1": "US" }] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Spring of the Blade" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "一甌春" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "คมวสันต์ซ่อนรัก" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "一甌春" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Nhất Âu Xuân" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "La Primavera de la Espada" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "一甌春" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "일구춘" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "A Primavera da Lâmina" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Spring of the Blade" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Чаша весны" } } + ] + }, + "external_ids": { "imdb_id": "tt45956347", "tvdb_id": 476903 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-17", "episode_count": 30, "name": "第 1 季" }] + }, + "/tv/294990?language=en-US": { + "id": 294990, + "name": "Spring of the Blade", + "original_name": "一瓯春", + "original_language": "zh", + "first_air_date": "2026-09-17", + "popularity": 25.4305, + "origin_country": ["CN"], + "alternative_titles": { + "results": [{ "title": "Yi Ou Chun", "iso_3166_1": "CN" }, { "title": "A Cup of Love", "iso_3166_1": "US" }] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Spring of the Blade" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "一甌春" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "คมวสันต์ซ่อนรัก" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "一甌春" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Nhất Âu Xuân" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "La Primavera de la Espada" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "一甌春" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "일구춘" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "A Primavera da Lâmina" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Spring of the Blade" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Чаша весны" } } + ] + }, + "external_ids": { "imdb_id": "tt45956347", "tvdb_id": 476903 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-17", "episode_count": 30, "name": "第 1 季" }] + }, + "/tv/297982?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 297982, + "name": "无可替代", + "original_name": "无可替代", + "original_language": "zh", + "first_air_date": "2026-09-28", + "popularity": 14.5938, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Irreplaceable" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Незаменимая" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Không Thể Thay Thế" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "กลเกมเหนือโชคชะตา" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "Tidak Tergantikan" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "무가체대" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Insustituible" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "無可替代" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "Tak Tergantikan" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "Insubstituível" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Insubstituível" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Незаменим" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Irreplaceable" } } + ] + }, + "external_ids": { "imdb_id": "tt37819415", "tvdb_id": 466921 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-28", "episode_count": 20, "name": "第 1 季" }] + }, + "/tv/297982?language=en-US": { + "id": 297982, + "name": "Irreplaceable", + "original_name": "无可替代", + "original_language": "zh", + "first_air_date": "2026-09-28", + "popularity": 14.5938, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Irreplaceable" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Незаменимая" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Không Thể Thay Thế" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "กลเกมเหนือโชคชะตา" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "Tidak Tergantikan" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "무가체대" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Insustituible" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "無可替代" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "Tak Tergantikan" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "Insubstituível" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Insubstituível" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Незаменим" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Irreplaceable" } } + ] + }, + "external_ids": { "imdb_id": "tt37819415", "tvdb_id": 466921 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-28", "episode_count": 20, "name": "第 1 季" }] + }, + "/tv/301903?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 301903, + "name": "Fantasma - Il caso Unabomber", + "original_name": "Fantasma - Il caso Unabomber", + "original_language": "it", + "first_air_date": "2025-09-30", + "popularity": 0.4567, + "origin_country": ["IT"], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2025-09-30", "episode_count": 2, "name": "第 1 季" }] + }, + "/tv/301903?language=en-US": { + "id": 301903, + "name": "Fantasma - Il caso Unabomber", + "original_name": "Fantasma - Il caso Unabomber", + "original_language": "it", + "first_air_date": "2025-09-30", + "popularity": 0.4567, + "origin_country": ["IT"], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2025-09-30", "episode_count": 2, "name": "第 1 季" }] + }, + "/tv/303287?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 303287, + "name": "一斩苍穹", + "original_name": "一斩苍穹", + "original_language": "zh", + "first_air_date": "2026-07-28", + "popularity": 9.7396, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "GuAn", "iso_3166_1": "CN" }, + { "title": "Gu An", "iso_3166_1": "US" }, + { "title": "One Slash to The Heavens", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "GuAn" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Рассекая небосвод" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Nhất Trảm Thương Khung" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Gu An" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "หนึ่งคมดาบทะลุฟ้า" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "A Heaven-Cleaving Sword" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "一斬蒼穹" } } + ] + }, + "external_ids": { "imdb_id": "tt44687828", "tvdb_id": 480748 }, + "seasons": [{ "season_number": 1, "air_date": "2026-07-28", "episode_count": 26, "name": "第 1 季" }] + }, + "/tv/303287?language=en-US": { + "id": 303287, + "name": "GuAn", + "original_name": "一斩苍穹", + "original_language": "zh", + "first_air_date": "2026-07-28", + "popularity": 9.7396, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "GuAn", "iso_3166_1": "CN" }, + { "title": "Gu An", "iso_3166_1": "US" }, + { "title": "One Slash to The Heavens", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "GuAn" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Рассекая небосвод" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Nhất Trảm Thương Khung" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Gu An" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "หนึ่งคมดาบทะลุฟ้า" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "A Heaven-Cleaving Sword" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "一斬蒼穹" } } + ] + }, + "external_ids": { "imdb_id": "tt44687828", "tvdb_id": 480748 }, + "seasons": [{ "season_number": 1, "air_date": "2026-07-28", "episode_count": 26, "name": "第 1 季" }] + }, + "/tv/305357?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/305357?language=en-US": { "__status": 404 }, + "/tv/305450?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 305450, + "name": "绣春刀之永乐风云", + "original_name": "绣春刀之永乐风云", + "original_language": "zh", + "first_air_date": "2025-11-14", + "popularity": 1.1454, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Xiu Chun Dao Zhi Yong Le Feng Yun", "iso_3166_1": "CN" }, + { "title": "Brotherhood of Blades II: The Yongle Era", "iso_3166_1": "US" }, + { "title": "The Legend of Yongle", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Horrible Spring Festival" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Tú Xuân Đao: Vĩnh Lạc Phong Vân" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "綉春刀之永樂風雲" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2025-11-14", "episode_count": 24, "name": "第 1 季" }] + }, + "/tv/305450?language=en-US": { + "id": 305450, + "name": "Horrible Spring Festival", + "original_name": "绣春刀之永乐风云", + "original_language": "zh", + "first_air_date": "2025-11-14", + "popularity": 1.1454, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Xiu Chun Dao Zhi Yong Le Feng Yun", "iso_3166_1": "CN" }, + { "title": "Brotherhood of Blades II: The Yongle Era", "iso_3166_1": "US" }, + { "title": "The Legend of Yongle", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Horrible Spring Festival" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Tú Xuân Đao: Vĩnh Lạc Phong Vân" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "綉春刀之永樂風雲" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2025-11-14", "episode_count": 24, "name": "第 1 季" }] + }, + "/tv/308963?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/308963?language=en-US": { "__status": 404 }, + "/tv/310160?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 310160, + "name": "创新的征途", + "original_name": "创新的征途", + "original_language": "zh", + "first_air_date": "2025-10-01", + "popularity": 0.4314, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2025-10-01", "episode_count": 6, "name": "第1季" }] + }, + "/tv/310160?language=en-US": { + "id": 310160, + "name": "创新的征途", + "original_name": "创新的征途", + "original_language": "zh", + "first_air_date": "2025-10-01", + "popularity": 0.4314, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2025-10-01", "episode_count": 6, "name": "第1季" }] + }, + "/tv/312027?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 312027, + "name": "东北有个周东北", + "original_name": "东北有个周东北", + "original_language": "zh", + "first_air_date": "2026-09-28", + "popularity": 4.3313, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "重回1985:东北往事", "iso_3166_1": "CN" }, + { "title": "Dong Bei You Ge Zhou Dong Bei", "iso_3166_1": "CN" }, + { "title": "Zhou Dongbei in the Northeast", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Dongbei's Back" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-09-28", "episode_count": 24, "name": "第 1 季" }] + }, + "/tv/312027?language=en-US": { + "id": 312027, + "name": "Dongbei's Back", + "original_name": "东北有个周东北", + "original_language": "zh", + "first_air_date": "2026-09-28", + "popularity": 4.3313, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "重回1985:东北往事", "iso_3166_1": "CN" }, + { "title": "Dong Bei You Ge Zhou Dong Bei", "iso_3166_1": "CN" }, + { "title": "Zhou Dongbei in the Northeast", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Dongbei's Back" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-09-28", "episode_count": 24, "name": "第 1 季" }] + }, + "/tv/312585?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 312585, + "name": "乌鸦俱乐部", + "original_name": "อีกาสมาคม", + "original_language": "th", + "first_air_date": "2026-09-18", + "popularity": 10.9979, + "origin_country": ["TH"], + "alternative_titles": { + "results": [ + { "title": "The Crow Club อีกาสมาคม", "iso_3166_1": "TH" }, + { "title": "Ika Samakhom", "iso_3166_1": "TH" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The Crow Club" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "乌鸦俱乐部" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "El Club del Cuervo" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "The Crow Club" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "烏鴉俱樂部" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "크로우 클럽" } } + ] + }, + "external_ids": { "imdb_id": "tt39443739", "tvdb_id": 474606 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-18", "episode_count": 16, "name": "第 1 季" }] + }, + "/tv/312585?language=en-US": { + "id": 312585, + "name": "The Crow Club", + "original_name": "อีกาสมาคม", + "original_language": "th", + "first_air_date": "2026-09-18", + "popularity": 10.9979, + "origin_country": ["TH"], + "alternative_titles": { + "results": [ + { "title": "The Crow Club อีกาสมาคม", "iso_3166_1": "TH" }, + { "title": "Ika Samakhom", "iso_3166_1": "TH" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The Crow Club" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "乌鸦俱乐部" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "El Club del Cuervo" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "The Crow Club" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "烏鴉俱樂部" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "크로우 클럽" } } + ] + }, + "external_ids": { "imdb_id": "tt39443739", "tvdb_id": 474606 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-18", "episode_count": 16, "name": "第 1 季" }] + }, + "/tv/316898?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 316898, + "name": "相信我:假先知真面目", + "original_name": "Trust Me: The False Prophet", + "original_language": "en", + "first_air_date": "2026-04-08", + "popularity": 6.725, + "origin_country": ["US"], + "alternative_titles": { "results": [{ "title": "相信我:假先知真面目", "iso_3166_1": "CN" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Confie em Mim: O Falso Profeta" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Confía en mí: El falso profeta" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Confía en mí: El falso profeta" } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "Bízz bennem: A hamis próféta" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Trust Me : Le faux prophète" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "나를 믿으라: 가짜 예언자" } }, + { "iso_639_1": "ro", "iso_3166_1": "RO", "data": { "name": "Credeți-mă: Falsul profet" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "相信我:假先知真面目" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Vertrau mir: Der falsche Prophet" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "נביא השקר" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Повярвай ми: Лъжепророкът" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Zaufaj mi: Fałszywy prorok" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "相信我:假先知真面目" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "Věř mi: Falešný prorok" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Вір мені: Лжепророк" } }, + { "iso_639_1": "da", "iso_3166_1": "DK", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "ศรัทธาเสื่อม ศาสดาลวงโลก" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Trust Me: Il falso profeta" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "Sahte Peygamber" } }, + { "iso_639_1": "sv", "iso_3166_1": "SE", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "相信我:假先知真面目" } }, + { "iso_639_1": "ar", "iso_3166_1": "AE", "data": { "name": "حكاية صامويل بيتمان" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "حكاية صامويل بيتمان" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "相信我:假先知真面目" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "Väärä profeetta" } }, + { "iso_639_1": "hr", "iso_3166_1": "HR", "data": { "name": "Lažni prorok" } }, + { "iso_639_1": "fr", "iso_3166_1": "CA", "data": { "name": "Trust Me : Le faux prophète" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Εμπιστέψου Με: Ο Ψευδοπροφήτης" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { + "iso_639_1": "ja", + "iso_3166_1": "JP", + "data": { "name": "サミュエル・ベイトマンの狂気: 一夫多妻制カルト教団の闇" } + }, + { "iso_639_1": "hi", "iso_3166_1": "IN", "data": { "name": "The False Prophet: पाखंडी धर्मगुरू" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "no", "iso_3166_1": "NO", "data": { "name": "Stol på meg: Den falske profet" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Доверьтесь мне: лжепророк" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "Confiança Cega: O Falso Profeta" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Hãy tin tôi: Nhà tiên tri giả mạo" } } + ] + }, + "external_ids": { "imdb_id": "tt40826311", "tvdb_id": 475706 }, + "seasons": [{ "season_number": 1, "air_date": "2026-04-08", "episode_count": 4, "name": "第 1 季" }] + }, + "/tv/316898?language=en-US": { + "id": 316898, + "name": "Trust Me: The False Prophet", + "original_name": "Trust Me: The False Prophet", + "original_language": "en", + "first_air_date": "2026-04-08", + "popularity": 6.725, + "origin_country": ["US"], + "alternative_titles": { "results": [{ "title": "相信我:假先知真面目", "iso_3166_1": "CN" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Confie em Mim: O Falso Profeta" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Confía en mí: El falso profeta" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Confía en mí: El falso profeta" } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "Bízz bennem: A hamis próféta" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Trust Me : Le faux prophète" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "나를 믿으라: 가짜 예언자" } }, + { "iso_639_1": "ro", "iso_3166_1": "RO", "data": { "name": "Credeți-mă: Falsul profet" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "相信我:假先知真面目" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Vertrau mir: Der falsche Prophet" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "נביא השקר" } }, + { "iso_639_1": "bg", "iso_3166_1": "BG", "data": { "name": "Повярвай ми: Лъжепророкът" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Zaufaj mi: Fałszywy prorok" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "相信我:假先知真面目" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "Věř mi: Falešný prorok" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Вір мені: Лжепророк" } }, + { "iso_639_1": "da", "iso_3166_1": "DK", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "ศรัทธาเสื่อม ศาสดาลวงโลก" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Trust Me: Il falso profeta" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "Sahte Peygamber" } }, + { "iso_639_1": "sv", "iso_3166_1": "SE", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "相信我:假先知真面目" } }, + { "iso_639_1": "ar", "iso_3166_1": "AE", "data": { "name": "حكاية صامويل بيتمان" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "حكاية صامويل بيتمان" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "相信我:假先知真面目" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "Väärä profeetta" } }, + { "iso_639_1": "hr", "iso_3166_1": "HR", "data": { "name": "Lažni prorok" } }, + { "iso_639_1": "fr", "iso_3166_1": "CA", "data": { "name": "Trust Me : Le faux prophète" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Εμπιστέψου Με: Ο Ψευδοπροφήτης" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { + "iso_639_1": "ja", + "iso_3166_1": "JP", + "data": { "name": "サミュエル・ベイトマンの狂気: 一夫多妻制カルト教団の闇" } + }, + { "iso_639_1": "hi", "iso_3166_1": "IN", "data": { "name": "The False Prophet: पाखंडी धर्मगुरू" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "no", "iso_3166_1": "NO", "data": { "name": "Stol på meg: Den falske profet" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Доверьтесь мне: лжепророк" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "Confiança Cega: O Falso Profeta" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Hãy tin tôi: Nhà tiên tri giả mạo" } } + ] + }, + "external_ids": { "imdb_id": "tt40826311", "tvdb_id": 475706 }, + "seasons": [{ "season_number": 1, "air_date": "2026-04-08", "episode_count": 4, "name": "第 1 季" }] + }, + "/tv/317594?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 317594, + "name": "星月征途", + "original_name": "星月征途", + "original_language": "zh", + "first_air_date": "2026-06-09", + "popularity": 2.9792, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "皓月当空—牧星战队", "iso_3166_1": "CN" }, + { "title": "皓月当空", "iso_3166_1": "CN" }, + { "title": "牧星战队", "iso_3166_1": "CN" }, + { "title": "Xing Yue Zheng Tu", "iso_3166_1": "CN" }, + { "title": "皓月当空之牧星战队", "iso_3166_1": "CN" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "To the Stars" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Tinh Nguyệt Chinh Đồ" } } + ] + }, + "external_ids": { "imdb_id": "tt43615274" }, + "seasons": [{ "season_number": 1, "air_date": "2026-06-09", "episode_count": 20, "name": "第 1 季" }] + }, + "/tv/317594?language=en-US": { + "id": 317594, + "name": "To the Stars", + "original_name": "星月征途", + "original_language": "zh", + "first_air_date": "2026-06-09", + "popularity": 2.9792, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "皓月当空—牧星战队", "iso_3166_1": "CN" }, + { "title": "皓月当空", "iso_3166_1": "CN" }, + { "title": "牧星战队", "iso_3166_1": "CN" }, + { "title": "Xing Yue Zheng Tu", "iso_3166_1": "CN" }, + { "title": "皓月当空之牧星战队", "iso_3166_1": "CN" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "To the Stars" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Tinh Nguyệt Chinh Đồ" } } + ] + }, + "external_ids": { "imdb_id": "tt43615274" }, + "seasons": [{ "season_number": 1, "air_date": "2026-06-09", "episode_count": 20, "name": "第 1 季" }] + }, + "/tv/318133?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 318133, + "name": "Kara Swisher Wants to Live Forever", + "original_name": "Kara Swisher Wants to Live Forever", + "original_language": "en", + "first_air_date": "2026-04-11", + "popularity": 1.634, + "origin_country": ["US"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt40620455", "tvdb_id": 473332 }, + "seasons": [{ "season_number": 1, "air_date": "2026-04-11", "episode_count": 6, "name": "第 1 季" }] + }, + "/tv/318133?language=en-US": { + "id": 318133, + "name": "Kara Swisher Wants to Live Forever", + "original_name": "Kara Swisher Wants to Live Forever", + "original_language": "en", + "first_air_date": "2026-04-11", + "popularity": 1.634, + "origin_country": ["US"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt40620455", "tvdb_id": 473332 }, + "seasons": [{ "season_number": 1, "air_date": "2026-04-11", "episode_count": 6, "name": "第 1 季" }] + }, + "/tv/318884?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 318884, + "name": "长生契", + "original_name": "长生契", + "original_language": "zh", + "first_air_date": "2026-09-24", + "popularity": 4.634, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Live Forever" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "長生契" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "สัญญารักเกินกาล" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Trường Sinh Khế" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "El Pacto de la Eternidad" } } + ] + }, + "external_ids": { "imdb_id": "tt41522393" }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-24", "episode_count": 20, "name": "第 1 季" }] + }, + "/tv/318884?language=en-US": { + "id": 318884, + "name": "Live Forever", + "original_name": "长生契", + "original_language": "zh", + "first_air_date": "2026-09-24", + "popularity": 4.634, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Live Forever" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "長生契" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "สัญญารักเกินกาล" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Trường Sinh Khế" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "El Pacto de la Eternidad" } } + ] + }, + "external_ids": { "imdb_id": "tt41522393" }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-24", "episode_count": 20, "name": "第 1 季" }] + }, + "/tv/318918?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/318918?language=en-US": { "__status": 404 }, + "/tv/320760?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 320760, + "name": "不识陌生人", + "original_name": "Seni Tanıyorum", + "original_language": "tr", + "first_air_date": "2026-09-17", + "popularity": 46.861, + "origin_country": ["TR"], + "alternative_titles": { + "results": [{ "title": "Sei Quem És", "iso_3166_1": "PT" }, { "title": "Tutku Oyunları", "iso_3166_1": "TR" }] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Not a Stranger" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Conheço Você" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "انا اعرفك" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Znam cię" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Keine Fremde" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Я тебя знаю" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Я знаю тебе" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "Sei Quem És" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Je te Connais" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "不识陌生人" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "Znám tě" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Te conozco" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "나는 너를 알고 있다" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "So chi sei" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "לא בדיוק זרה" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Te conozco" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Σε Ξέρω" } }, + { "iso_639_1": "fr", "iso_3166_1": "CA", "data": { "name": "Je te Connais" } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "Ismerlek" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "あなたを知ってる" } }, + { "iso_639_1": "ro", "iso_3166_1": "RO", "data": { "name": "Te cunosc" } } + ] + }, + "external_ids": { "imdb_id": "tt39397536", "tvdb_id": 482025 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-17", "episode_count": 8, "name": "第 1 季" }] + }, + "/tv/320760?language=en-US": { + "id": 320760, + "name": "Not a Stranger", + "original_name": "Seni Tanıyorum", + "original_language": "tr", + "first_air_date": "2026-09-17", + "popularity": 46.861, + "origin_country": ["TR"], + "alternative_titles": { + "results": [{ "title": "Sei Quem És", "iso_3166_1": "PT" }, { "title": "Tutku Oyunları", "iso_3166_1": "TR" }] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Not a Stranger" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Conheço Você" } }, + { "iso_639_1": "ar", "iso_3166_1": "SA", "data": { "name": "انا اعرفك" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Znam cię" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Keine Fremde" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Я тебя знаю" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "Я знаю тебе" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "Sei Quem És" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Je te Connais" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "不识陌生人" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "Znám tě" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Te conozco" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "나는 너를 알고 있다" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "So chi sei" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "לא בדיוק זרה" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Te conozco" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Σε Ξέρω" } }, + { "iso_639_1": "fr", "iso_3166_1": "CA", "data": { "name": "Je te Connais" } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "Ismerlek" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "あなたを知ってる" } }, + { "iso_639_1": "ro", "iso_3166_1": "RO", "data": { "name": "Te cunosc" } } + ] + }, + "external_ids": { "imdb_id": "tt39397536", "tvdb_id": 482025 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-17", "episode_count": 8, "name": "第 1 季" }] + }, + "/tv/328778?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 328778, + "name": "炼气十万年特别篇 阳极天下", + "original_name": "炼气十万年特别篇 阳极天下", + "original_language": "zh", + "first_air_date": "2026-07-18", + "popularity": 0.7526, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Luyện Khí Mười Vạn Năm: Dương Cực Thiên Hạ" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-07-18", "episode_count": 1, "name": "Season 1" }] + }, + "/tv/328778?language=en-US": { + "id": 328778, + "name": "炼气十万年特别篇 阳极天下", + "original_name": "炼气十万年特别篇 阳极天下", + "original_language": "zh", + "first_air_date": "2026-07-18", + "popularity": 0.7526, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Luyện Khí Mười Vạn Năm: Dương Cực Thiên Hạ" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-07-18", "episode_count": 1, "name": "Season 1" }] + }, + "/tv/328798?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 328798, + "name": "互相关注", + "original_name": "互相关注", + "original_language": "zh", + "first_air_date": "2026-07-17", + "popularity": 1.303, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "Hu Xiang Guan Zhu", "iso_3166_1": "CN" }] }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "互相关注" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-07-17", "episode_count": 5, "name": "第 1 季" }] + }, + "/tv/328798?language=en-US": { + "id": 328798, + "name": "互相关注", + "original_name": "互相关注", + "original_language": "zh", + "first_air_date": "2026-07-17", + "popularity": 1.303, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "Hu Xiang Guan Zhu", "iso_3166_1": "CN" }] }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "互相关注" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-07-17", "episode_count": 5, "name": "第 1 季" }] + }, + "/tv/330024?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 330024, + "name": "档案(bilibili连载)", + "original_name": "档案(bilibili连载)", + "original_language": "zh", + "first_air_date": "2009-02-04", + "popularity": 1.8961, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "档案(bilibili连载)" } }] + }, + "external_ids": {}, + "seasons": [ + { "season_number": 1, "air_date": "2009-02-04", "episode_count": 21, "name": "第1季" }, + { "season_number": 2, "episode_count": 0, "name": "战争历史" }, + { "season_number": 3, "episode_count": 0, "name": "国内揭秘" }, + { "season_number": 4, "episode_count": 0, "name": "国外揭秘" }, + { "season_number": 5, "episode_count": 114, "name": "谭江海播讲系列" } + ] + }, + "/tv/330024?language=en-US": { + "id": 330024, + "name": "档案(bilibili连载)", + "original_name": "档案(bilibili连载)", + "original_language": "zh", + "first_air_date": "2009-02-04", + "popularity": 1.8961, + "origin_country": ["CN"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "档案(bilibili连载)" } }] + }, + "external_ids": {}, + "seasons": [ + { "season_number": 1, "air_date": "2009-02-04", "episode_count": 21, "name": "第1季" }, + { "season_number": 2, "episode_count": 0, "name": "战争历史" }, + { "season_number": 3, "episode_count": 0, "name": "国内揭秘" }, + { "season_number": 4, "episode_count": 0, "name": "国外揭秘" }, + { "season_number": 5, "episode_count": 114, "name": "谭江海播讲系列" } + ] + }, + "/tv/331064?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 331064, + "name": "掌门低调点", + "original_name": "掌门低调点", + "original_language": "zh", + "first_air_date": "2026-08-07", + "popularity": 0.7322, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "掌门低调点 3D动画版", "iso_3166_1": "CN" }, + { "title": "Stay Low Profile", "iso_3166_1": "US" }, + { "title": "Stay Low Profile Sect Chief", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Stay Low Profile, Sect Chief" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-08-07", "episode_count": 32, "name": "Season 1" }] + }, + "/tv/331064?language=en-US": { + "id": 331064, + "name": "掌门低调点", + "original_name": "掌门低调点", + "original_language": "zh", + "first_air_date": "2026-08-07", + "popularity": 0.7322, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "掌门低调点 3D动画版", "iso_3166_1": "CN" }, + { "title": "Stay Low Profile", "iso_3166_1": "US" }, + { "title": "Stay Low Profile Sect Chief", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Stay Low Profile, Sect Chief" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-08-07", "episode_count": 32, "name": "Season 1" }] + }, + "/tv/331320?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 331320, + "name": "三角洲:造物主玩家", + "original_name": "三角洲:造物主玩家", + "original_language": "zh", + "first_air_date": "2026-08-10", + "popularity": 1.3132, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Delta Force: The Creator", "iso_3166_1": "CN" }, + { "title": "San Jiao Zhou Zao Wu Zhu Wan Jia", "iso_3166_1": "CN" } + ] + }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-08-10", "episode_count": 28, "name": "Season 1" }] + }, + "/tv/331320?language=en-US": { + "id": 331320, + "name": "三角洲:造物主玩家", + "original_name": "三角洲:造物主玩家", + "original_language": "zh", + "first_air_date": "2026-08-10", + "popularity": 1.3132, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Delta Force: The Creator", "iso_3166_1": "CN" }, + { "title": "San Jiao Zhou Zao Wu Zhu Wan Jia", "iso_3166_1": "CN" } + ] + }, + "translations": { "translations": [{ "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } }] }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-08-10", "episode_count": 28, "name": "Season 1" }] + }, + "/tv/331555?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 331555, + "name": "Lanterns: The Official Podcast", + "original_name": "Lanterns: The Official Podcast", + "original_language": "en", + "first_air_date": "2026-08-16", + "popularity": 4.7424, + "origin_country": ["US"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "ro", "iso_3166_1": "RO", "data": { "name": "Lanterns: Podcastul oficial" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Lanternas: O Podcast Oficial" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "綠燈軍團官方Podcast" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-08-16", "episode_count": 8, "name": "第 1 季" }] + }, + "/tv/331555?language=en-US": { + "id": 331555, + "name": "Lanterns: The Official Podcast", + "original_name": "Lanterns: The Official Podcast", + "original_language": "en", + "first_air_date": "2026-08-16", + "popularity": 4.7424, + "origin_country": ["US"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "ro", "iso_3166_1": "RO", "data": { "name": "Lanterns: Podcastul oficial" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Lanternas: O Podcast Oficial" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "綠燈軍團官方Podcast" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-08-16", "episode_count": 8, "name": "第 1 季" }] + }, + "/tv/333167?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 333167, + "name": "开火开伙", + "original_name": "開火開伙", + "original_language": "zh", + "first_air_date": "2026-08-29", + "popularity": 2.2743, + "origin_country": ["TW"], + "alternative_titles": { "results": [{ "title": "Hot Chef On Fire", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "开火开伙" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Chef on Fire" } } + ] + }, + "external_ids": { "tvdb_id": 482778 }, + "seasons": [{ "season_number": 1, "air_date": "2026-08-29", "episode_count": 6, "name": "第 1 季" }] + }, + "/tv/333167?language=en-US": { + "id": 333167, + "name": "Chef on Fire", + "original_name": "開火開伙", + "original_language": "zh", + "first_air_date": "2026-08-29", + "popularity": 2.2743, + "origin_country": ["TW"], + "alternative_titles": { "results": [{ "title": "Hot Chef On Fire", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "开火开伙" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Chef on Fire" } } + ] + }, + "external_ids": { "tvdb_id": 482778 }, + "seasons": [{ "season_number": 1, "air_date": "2026-08-29", "episode_count": 6, "name": "第 1 季" }] + }, + "/tv/334465?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 334465, + "name": "Professeur Raoult vs le gang des Cerises", + "original_name": "Professeur Raoult vs le gang des Cerises", + "original_language": "fr", + "first_air_date": "2026-09-11", + "popularity": 2.7795, + "origin_country": ["FR"], + "alternative_titles": { "results": [{ "title": "The Pandemic Prophet", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The Pandemic Prophet" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "O Profeta da Pandemia" } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "A járvány prófétája" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "El profeta de la pandemia" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "נביא המגיפה" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Prorok z czasów pandemii" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "The Pandemic Prophet" } } + ] + }, + "external_ids": { "imdb_id": "tt45658470", "tvdb_id": 482395 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-11", "episode_count": 4, "name": "第 1 季" }] + }, + "/tv/334465?language=en-US": { + "id": 334465, + "name": "The Pandemic Prophet", + "original_name": "Professeur Raoult vs le gang des Cerises", + "original_language": "fr", + "first_air_date": "2026-09-11", + "popularity": 2.7795, + "origin_country": ["FR"], + "alternative_titles": { "results": [{ "title": "The Pandemic Prophet", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } }, + { "iso_639_1": "nl", "iso_3166_1": "BE", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The Pandemic Prophet" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "O Profeta da Pandemia" } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "A járvány prófétája" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "El profeta de la pandemia" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "נביא המגיפה" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Prorok z czasów pandemii" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "The Pandemic Prophet" } } + ] + }, + "external_ids": { "imdb_id": "tt45658470", "tvdb_id": 482395 }, + "seasons": [{ "season_number": 1, "air_date": "2026-09-11", "episode_count": 4, "name": "第 1 季" }] + }, + "/tv/336207?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 336207, + "name": "征途", + "original_name": "征途", + "original_language": "zh", + "first_air_date": "2026-09-26", + "popularity": 3.6766, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "The Journey", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Spark of the Long March" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-09-26", "episode_count": 28, "name": "第 1 季" }] + }, + "/tv/336207?language=en-US": { + "id": 336207, + "name": "Spark of the Long March", + "original_name": "征途", + "original_language": "zh", + "first_air_date": "2026-09-26", + "popularity": 3.6766, + "origin_country": ["CN"], + "alternative_titles": { "results": [{ "title": "The Journey", "iso_3166_1": "US" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Spark of the Long March" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2026-09-26", "episode_count": 28, "name": "第 1 季" }] + }, + "/tv/3849?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 3849, + "name": "Walang Kapalit", + "original_name": "Walang Kapalit", + "original_language": "tl", + "first_air_date": "2007-04-23", + "popularity": 4.3457, + "origin_country": ["PH"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Irreplaceable" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "Walang Kapalit" } } + ] + }, + "external_ids": { "imdb_id": "tt1010368" }, + "seasons": [{ "season_number": 1, "air_date": "2007-04-23", "episode_count": 95, "name": "第 1 季" }] + }, + "/tv/3849?language=en-US": { + "id": 3849, + "name": "Walang Kapalit", + "original_name": "Walang Kapalit", + "original_language": "tl", + "first_air_date": "2007-04-23", + "popularity": 4.3457, + "origin_country": ["PH"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Irreplaceable" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "Walang Kapalit" } } + ] + }, + "external_ids": { "imdb_id": "tt1010368" }, + "seasons": [{ "season_number": 1, "air_date": "2007-04-23", "episode_count": 95, "name": "第 1 季" }] + }, + "/tv/48002?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 48002, + "name": "قناديل العشاق", + "original_name": "قناديل العشاق", + "original_language": "ar", + "first_air_date": "2017-05-27", + "popularity": 0.9842, + "origin_country": ["SY"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Lovers' Lanterns" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2017-05-27", "episode_count": 30, "name": "第 1 季" }] + }, + "/tv/48002?language=en-US": { + "id": 48002, + "name": "Lovers' Lanterns", + "original_name": "قناديل العشاق", + "original_language": "ar", + "first_air_date": "2017-05-27", + "popularity": 0.9842, + "origin_country": ["SY"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Lovers' Lanterns" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } } + ] + }, + "external_ids": {}, + "seasons": [{ "season_number": 1, "air_date": "2017-05-27", "episode_count": 30, "name": "第 1 季" }] + }, + "/tv/63314?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 63314, + "name": "乌鸦足球队", + "original_name": "Club de Cuervos", + "original_language": "en", + "first_air_date": "2015-08-07", + "popularity": 10.4934, + "origin_country": ["US"], + "alternative_titles": { "results": [{ "title": "乌鸦俱乐部", "iso_3166_1": "CN" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Club de Cuervos" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Клуб Воронов" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "클럽 디 쿠에르보스" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Club de Cuervos" } }, + { "iso_639_1": "sv", "iso_3166_1": "SE", "data": { "name": "Club de Cuervos" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "מועדון העורבים" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "クラブ・デ・クエルボス" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Κουέρβος F.C." } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "Toledói Varjak" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Klub Cuervos" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "乌鸦足球队" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Club de Cuervos" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Clube dos Corvos" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "คลับ ดิ คูเอร์วอส" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "烏鴉足球隊" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt4680240", "tvdb_id": 299045 }, + "seasons": [ + { "season_number": 1, "air_date": "2015-08-07", "episode_count": 13, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2016-12-09", "episode_count": 10, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2017-09-29", "episode_count": 10, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2019-01-25", "episode_count": 12, "name": "第 4 季" } + ] + }, + "/tv/63314?language=en-US": { + "id": 63314, + "name": "Club de Cuervos", + "original_name": "Club de Cuervos", + "original_language": "en", + "first_air_date": "2015-08-07", + "popularity": 10.4934, + "origin_country": ["US"], + "alternative_titles": { "results": [{ "title": "乌鸦俱乐部", "iso_3166_1": "CN" }] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Club de Cuervos" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Клуб Воронов" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "클럽 디 쿠에르보스" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Club de Cuervos" } }, + { "iso_639_1": "sv", "iso_3166_1": "SE", "data": { "name": "Club de Cuervos" } }, + { "iso_639_1": "he", "iso_3166_1": "IL", "data": { "name": "מועדון העורבים" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "クラブ・デ・クエルボス" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Κουέρβος F.C." } }, + { "iso_639_1": "hu", "iso_3166_1": "HU", "data": { "name": "Toledói Varjak" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Klub Cuervos" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "乌鸦足球队" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Club de Cuervos" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Clube dos Corvos" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "คลับ ดิ คูเอร์วอส" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "烏鴉足球隊" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt4680240", "tvdb_id": 299045 }, + "seasons": [ + { "season_number": 1, "air_date": "2015-08-07", "episode_count": 13, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2016-12-09", "episode_count": 10, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2017-09-29", "episode_count": 10, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2019-01-25", "episode_count": 12, "name": "第 4 季" } + ] + }, + "/tv/72976?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 72976, + "name": "心脏信号", + "original_name": "하트시그널", + "original_language": "ko", + "first_air_date": "2017-06-02", + "popularity": 10.2, + "origin_country": ["KR"], + "alternative_titles": { + "results": [ + { "title": "心脏信号", "iso_3166_1": "CN" }, + { "title": "心动的信号", "iso_3166_1": "CN" }, + { "title": "Signal du coeur", "iso_3166_1": "FR" }, + { "title": "하트 시그널", "iso_3166_1": "KR" }, + { "title": "Heart Signal", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Heart Signal" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Heart Signal" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "心脏信号" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Sinal do Coração" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "心臟信號" } } + ] + }, + "external_ids": { "imdb_id": "tt16444020", "tvdb_id": 330464 }, + "seasons": [ + { "season_number": 1, "air_date": "2017-06-02", "episode_count": 15, "name": "心脏信号" }, + { "season_number": 2, "air_date": "2018-03-16", "episode_count": 16, "name": "心脏信号 2" }, + { "season_number": 3, "air_date": "2020-03-25", "episode_count": 16, "name": "心脏信号 3" }, + { "season_number": 4, "air_date": "2023-05-17", "episode_count": 20, "name": "心脏信号 4" }, + { "season_number": 5, "air_date": "2026-04-14", "episode_count": 15, "name": "第 5 季" } + ] + }, + "/tv/72976?language=en-US": { + "id": 72976, + "name": "Heart Signal", + "original_name": "하트시그널", + "original_language": "ko", + "first_air_date": "2017-06-02", + "popularity": 10.2, + "origin_country": ["KR"], + "alternative_titles": { + "results": [ + { "title": "心脏信号", "iso_3166_1": "CN" }, + { "title": "心动的信号", "iso_3166_1": "CN" }, + { "title": "Signal du coeur", "iso_3166_1": "FR" }, + { "title": "하트 시그널", "iso_3166_1": "KR" }, + { "title": "Heart Signal", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Heart Signal" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Heart Signal" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "心脏信号" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Sinal do Coração" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "心臟信號" } } + ] + }, + "external_ids": { "imdb_id": "tt16444020", "tvdb_id": 330464 }, + "seasons": [ + { "season_number": 1, "air_date": "2017-06-02", "episode_count": 15, "name": "心脏信号" }, + { "season_number": 2, "air_date": "2018-03-16", "episode_count": 16, "name": "心脏信号 2" }, + { "season_number": 3, "air_date": "2020-03-25", "episode_count": 16, "name": "心脏信号 3" }, + { "season_number": 4, "air_date": "2023-05-17", "episode_count": 20, "name": "心脏信号 4" }, + { "season_number": 5, "air_date": "2026-04-14", "episode_count": 15, "name": "第 5 季" } + ] + }, + "/tv/75339?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 75339, + "name": "Mystères d'archives", + "original_name": "Mystères d'archives", + "original_language": "fr", + "first_air_date": "2009-07-10", + "popularity": 1.9237, + "origin_country": ["FR"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Verschollene Filmschätze" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "Arkistojen salat" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Mistérios do Arquivo" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Archivi segreti" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt3088600", "tvdb_id": 266815 }, + "seasons": [ + { "season_number": 1, "air_date": "2009-07-10", "episode_count": 10, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2010-04-28", "episode_count": 10, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2012-09-15", "episode_count": 10, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2015-11-02", "episode_count": 10, "name": "第 4 季" }, + { "season_number": 5, "air_date": "2017-10-14", "episode_count": 10, "name": "第 5 季" }, + { "season_number": 6, "air_date": "2019-10-27", "episode_count": 5, "name": "第 6 季" }, + { "season_number": 7, "air_date": "2021-06-19", "episode_count": 5, "name": "第 7 季" }, + { "season_number": 8, "air_date": "2023-03-03", "episode_count": 5, "name": "第 8 季" } + ] + }, + "/tv/75339?language=en-US": { + "id": 75339, + "name": "Mystères d'archives", + "original_name": "Mystères d'archives", + "original_language": "fr", + "first_air_date": "2009-07-10", + "popularity": 1.9237, + "origin_country": ["FR"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Verschollene Filmschätze" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "Arkistojen salat" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Mistérios do Arquivo" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Archivi segreti" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt3088600", "tvdb_id": 266815 }, + "seasons": [ + { "season_number": 1, "air_date": "2009-07-10", "episode_count": 10, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2010-04-28", "episode_count": 10, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2012-09-15", "episode_count": 10, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2015-11-02", "episode_count": 10, "name": "第 4 季" }, + { "season_number": 5, "air_date": "2017-10-14", "episode_count": 10, "name": "第 5 季" }, + { "season_number": 6, "air_date": "2019-10-27", "episode_count": 5, "name": "第 6 季" }, + { "season_number": 7, "air_date": "2021-06-19", "episode_count": 5, "name": "第 7 季" }, + { "season_number": 8, "air_date": "2023-03-03", "episode_count": 5, "name": "第 8 季" } + ] + }, + "/tv/87852?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 87852, + "name": "绝对冲激 ~柏拉图之心~", + "original_name": "絶対衝激 ~PLATONIC HEART~", + "original_language": "ja", + "first_air_date": "2008-10-09", + "popularity": 2.9075, + "origin_country": ["JP"], + "alternative_titles": { + "results": [ + { "title": "绝对冲击", "iso_3166_1": "CN" }, + { "title": "绝对冲击~PLATONIC HEART~", "iso_3166_1": "CN" }, + { "title": "Zettai Shougeki: Platonic Heart", "iso_3166_1": "ES" }, + { "title": "絶対衝激 ~PLATONIC HEART~", "iso_3166_1": "JP" }, + { "title": "Zettai Shougeki: Platonic Heart", "iso_3166_1": "JP" }, + { "title": "Zettai Shogeki ~Platonic Heart~", "iso_3166_1": "JP" }, + { "title": "Master of Martial Hearts", "iso_3166_1": "MX" }, + { "title": "Zettai Shougeki: Platonic Heart", "iso_3166_1": "MX" }, + { "title": "Zettai Shougeki: Platonic Heart", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Master of Martial Hearts" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "绝对冲激 ~柏拉图之心~" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Zettai Shougeki: Platonic Heart" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Master of Martial Hearts" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Master of Martial Hearts" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Zettai Shougeki: Platonic Heart" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Master of Martial Hearts" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "절대충격 ~PLATONIC HEART~" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Zettai Shougeki: Platonic Heart" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "絕對衝激 ~PLATONIC HEART~" } } + ] + }, + "external_ids": { "imdb_id": "tt1339394", "tvdb_id": 87961 }, + "seasons": [{ "season_number": 1, "air_date": "2008-10-09", "episode_count": 5, "name": "第 1 季" }] + }, + "/tv/87852?language=en-US": { + "id": 87852, + "name": "Master of Martial Hearts", + "original_name": "絶対衝激 ~PLATONIC HEART~", + "original_language": "ja", + "first_air_date": "2008-10-09", + "popularity": 2.9075, + "origin_country": ["JP"], + "alternative_titles": { + "results": [ + { "title": "绝对冲击", "iso_3166_1": "CN" }, + { "title": "绝对冲击~PLATONIC HEART~", "iso_3166_1": "CN" }, + { "title": "Zettai Shougeki: Platonic Heart", "iso_3166_1": "ES" }, + { "title": "絶対衝激 ~PLATONIC HEART~", "iso_3166_1": "JP" }, + { "title": "Zettai Shougeki: Platonic Heart", "iso_3166_1": "JP" }, + { "title": "Zettai Shogeki ~Platonic Heart~", "iso_3166_1": "JP" }, + { "title": "Master of Martial Hearts", "iso_3166_1": "MX" }, + { "title": "Zettai Shougeki: Platonic Heart", "iso_3166_1": "MX" }, + { "title": "Zettai Shougeki: Platonic Heart", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "Master of Martial Hearts" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "绝对冲激 ~柏拉图之心~" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "Zettai Shougeki: Platonic Heart" } }, + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "Master of Martial Hearts" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Master of Martial Hearts" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "Zettai Shougeki: Platonic Heart" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Master of Martial Hearts" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "절대충격 ~PLATONIC HEART~" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Zettai Shougeki: Platonic Heart" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "絕對衝激 ~PLATONIC HEART~" } } + ] + }, + "external_ids": { "imdb_id": "tt1339394", "tvdb_id": 87961 }, + "seasons": [{ "season_number": 1, "air_date": "2008-10-09", "episode_count": 5, "name": "第 1 季" }] + }, + "/tv/89364?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 89364, + "name": "万界仙踪", + "original_name": "万界仙踪", + "original_language": "zh", + "first_air_date": "2018-03-21", + "popularity": 27.2599, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Wan Jie Xian Zong", "iso_3166_1": "CN" }, + { "title": "Wanjie Xianzong", "iso_3166_1": "CN" }, + { "title": "Wonderland", "iso_3166_1": "US" }, + { "title": "The Wizard of Ten Thousand Worlds", "iso_3166_1": "US" }, + { "title": "Fairy Legends", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The Wonderland of Ten Thousands" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Wan Jie Xian Zong" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "万界仙踪" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Страна десяти тысяч чудес" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Vạn Giới Tiên Tung" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "" } }, + { "iso_639_1": "nb", "iso_3166_1": "NO", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "CH", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "" } }, + { "iso_639_1": "jv", "iso_3166_1": "JV", "data": { "name": "" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "รอยเซียนหมื่นโลกา" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "AT", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "CA", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "The Wonderland of Ten Thousands" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "" } }, + { "iso_639_1": "ml", "iso_3166_1": "IN", "data": { "name": "" } }, + { "iso_639_1": "hi", "iso_3166_1": "IN", "data": { "name": "" } }, + { "iso_639_1": "sv", "iso_3166_1": "SE", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt12923874", "tvdb_id": 347112 }, + "seasons": [ + { "season_number": 1, "air_date": "2018-03-21", "episode_count": 480, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2019-04-25", "episode_count": 40, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2019-10-17", "episode_count": 48, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2020-09-14", "episode_count": 48, "name": "第 4 季" }, + { "season_number": 5, "air_date": "2021-06-26", "episode_count": 288, "name": "第 5 季" } + ] + }, + "/tv/89364?language=en-US": { + "id": 89364, + "name": "The Wonderland of Ten Thousands", + "original_name": "万界仙踪", + "original_language": "zh", + "first_air_date": "2018-03-21", + "popularity": 27.2599, + "origin_country": ["CN"], + "alternative_titles": { + "results": [ + { "title": "Wan Jie Xian Zong", "iso_3166_1": "CN" }, + { "title": "Wanjie Xianzong", "iso_3166_1": "CN" }, + { "title": "Wonderland", "iso_3166_1": "US" }, + { "title": "The Wizard of Ten Thousand Worlds", "iso_3166_1": "US" }, + { "title": "Fairy Legends", "iso_3166_1": "US" } + ] + }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "The Wonderland of Ten Thousands" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Wan Jie Xian Zong" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "万界仙踪" } }, + { "iso_639_1": "ru", "iso_3166_1": "RU", "data": { "name": "Страна десяти тысяч чудес" } }, + { "iso_639_1": "nl", "iso_3166_1": "NL", "data": { "name": "" } }, + { "iso_639_1": "vi", "iso_3166_1": "VN", "data": { "name": "Vạn Giới Tiên Tung" } }, + { "iso_639_1": "zh", "iso_3166_1": "TW", "data": { "name": "" } }, + { "iso_639_1": "nb", "iso_3166_1": "NO", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "CH", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "SG", "data": { "name": "" } }, + { "iso_639_1": "ms", "iso_3166_1": "MY", "data": { "name": "" } }, + { "iso_639_1": "pt", "iso_3166_1": "PT", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "MX", "data": { "name": "" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "" } }, + { "iso_639_1": "jv", "iso_3166_1": "JV", "data": { "name": "" } }, + { "iso_639_1": "id", "iso_3166_1": "ID", "data": { "name": "" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "รอยเซียนหมื่นโลกา" } }, + { "iso_639_1": "it", "iso_3166_1": "IT", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "AT", "data": { "name": "" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "CA", "data": { "name": "" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "The Wonderland of Ten Thousands" } }, + { "iso_639_1": "tl", "iso_3166_1": "PH", "data": { "name": "" } }, + { "iso_639_1": "tr", "iso_3166_1": "TR", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "" } }, + { "iso_639_1": "ja", "iso_3166_1": "JP", "data": { "name": "" } }, + { "iso_639_1": "uk", "iso_3166_1": "UA", "data": { "name": "" } }, + { "iso_639_1": "ml", "iso_3166_1": "IN", "data": { "name": "" } }, + { "iso_639_1": "hi", "iso_3166_1": "IN", "data": { "name": "" } }, + { "iso_639_1": "sv", "iso_3166_1": "SE", "data": { "name": "" } } + ] + }, + "external_ids": { "imdb_id": "tt12923874", "tvdb_id": 347112 }, + "seasons": [ + { "season_number": 1, "air_date": "2018-03-21", "episode_count": 480, "name": "第 1 季" }, + { "season_number": 2, "air_date": "2019-04-25", "episode_count": 40, "name": "第 2 季" }, + { "season_number": 3, "air_date": "2019-10-17", "episode_count": 48, "name": "第 3 季" }, + { "season_number": 4, "air_date": "2020-09-14", "episode_count": 48, "name": "第 4 季" }, + { "season_number": 5, "air_date": "2021-06-26", "episode_count": 288, "name": "第 5 季" } + ] + }, + "/tv/95350?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { "__status": 404 }, + "/tv/95350?language=en-US": { "__status": 404 }, + "/tv/99954?append_to_response=alternative_titles%2Cexternal_ids%2Ctranslations&language=zh-CN": { + "id": 99954, + "name": "大学炸弹客:自述", + "original_name": "Unabomber: In His Own Words", + "original_language": "en", + "first_air_date": "2020-02-22", + "popularity": 2.768, + "origin_country": ["US"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "유나바머: 그가 입을 열다" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Γιουναμπόμπερ: Με τα Δικά του Λόγια" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Unabomber : Sa vérité" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "Unabomber – Jak to vidí on sám" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Die verrückte Wahrheit über den Unabomber" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "大学炸弹客:自述" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Unabomber - Suas próprias palavras" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "En palabras del Unabomber" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Unabomber: Jego własnymi słowami" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "Unabomber - Omin sanoin" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "飛機炸彈客:自述" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "ยูนาบอมเบอร์: จากปากอาชญากร" } } + ] + }, + "external_ids": { "imdb_id": "tt11833494", "tvdb_id": 377519 }, + "seasons": [{ "season_number": 1, "air_date": "2020-02-22", "episode_count": 4, "name": "第 1 季" }] + }, + "/tv/99954?language=en-US": { + "id": 99954, + "name": "Unabomber: In His Own Words", + "original_name": "Unabomber: In His Own Words", + "original_language": "en", + "first_air_date": "2020-02-22", + "popularity": 2.768, + "origin_country": ["US"], + "alternative_titles": { "results": [] }, + "translations": { + "translations": [ + { "iso_639_1": "en", "iso_3166_1": "US", "data": { "name": "" } }, + { "iso_639_1": "ko", "iso_3166_1": "KR", "data": { "name": "유나바머: 그가 입을 열다" } }, + { "iso_639_1": "el", "iso_3166_1": "GR", "data": { "name": "Γιουναμπόμπερ: Με τα Δικά του Λόγια" } }, + { "iso_639_1": "fr", "iso_3166_1": "FR", "data": { "name": "Unabomber : Sa vérité" } }, + { "iso_639_1": "cs", "iso_3166_1": "CZ", "data": { "name": "Unabomber – Jak to vidí on sám" } }, + { "iso_639_1": "de", "iso_3166_1": "DE", "data": { "name": "Die verrückte Wahrheit über den Unabomber" } }, + { "iso_639_1": "zh", "iso_3166_1": "CN", "data": { "name": "大学炸弹客:自述" } }, + { "iso_639_1": "pt", "iso_3166_1": "BR", "data": { "name": "Unabomber - Suas próprias palavras" } }, + { "iso_639_1": "es", "iso_3166_1": "ES", "data": { "name": "En palabras del Unabomber" } }, + { "iso_639_1": "pl", "iso_3166_1": "PL", "data": { "name": "Unabomber: Jego własnymi słowami" } }, + { "iso_639_1": "fi", "iso_3166_1": "FI", "data": { "name": "Unabomber - Omin sanoin" } }, + { "iso_639_1": "zh", "iso_3166_1": "HK", "data": { "name": "飛機炸彈客:自述" } }, + { "iso_639_1": "th", "iso_3166_1": "TH", "data": { "name": "ยูนาบอมเบอร์: จากปากอาชญากร" } } + ] + }, + "external_ids": { "imdb_id": "tt11833494", "tvdb_id": 377519 }, + "seasons": [{ "season_number": 1, "air_date": "2020-02-22", "episode_count": 4, "name": "第 1 季" }] + } +} diff --git a/packages/domain/test/differential/meta-deviations.json b/packages/domain/test/differential/meta-deviations.json index 44a9c226..df314240 100644 --- a/packages/domain/test/differential/meta-deviations.json +++ b/packages/domain/test/differential/meta-deviations.json @@ -1467,6 +1467,18 @@ "mp": null, "ours": "swtyblz", "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + }, + "name": { + "kind": "intentional", + "mp": "thematrix", + "ours": "黑客帝国", + "note": "ID-2:副标题第一段的中文片名补作中文名(MP 副标题只取季集),见 docs/porting/moviepilot-identity-match.md" + }, + "cn_name": { + "kind": "intentional", + "mp": null, + "ours": "黑客帝国", + "note": "ID-2:副标题第一段的中文片名补作中文名(MP 副标题只取季集),见 docs/porting/moviepilot-identity-match.md" } }, "Z-17": { @@ -1554,6 +1566,48 @@ "ours": "douban:35593344", "note": "MP 不认 {doubanid=..} 花括号写法,我们认" } + }, + "MP-61": { + "name": { + "kind": "intentional", + "mp": "iwokeupavampire", + "ours": "醒来变成吸血鬼", + "note": "ID-2:副标题第一段的中文片名补作中文名(MP 副标题只取季集),见 docs/porting/moviepilot-identity-match.md" + }, + "cn_name": { + "kind": "intentional", + "mp": null, + "ours": "醒来变成吸血鬼", + "note": "ID-2:副标题第一段的中文片名补作中文名(MP 副标题只取季集),见 docs/porting/moviepilot-identity-match.md" + } + }, + "MP-62": { + "name": { + "kind": "intentional", + "mp": "shadowsofthevoid", + "ours": "虚无边境", + "note": "ID-2:副标题第一段的中文片名补作中文名(MP 副标题只取季集),见 docs/porting/moviepilot-identity-match.md" + }, + "cn_name": { + "kind": "intentional", + "mp": null, + "ours": "虚无边境", + "note": "ID-2:副标题第一段的中文片名补作中文名(MP 副标题只取季集),见 docs/porting/moviepilot-identity-match.md" + } + }, + "Z-15": { + "name": { + "kind": "intentional", + "mp": "duneparttwo", + "ours": "沙丘2", + "note": "ID-2:副标题第一段的中文片名补作中文名(MP 副标题只取季集),见 docs/porting/moviepilot-identity-match.md" + }, + "cn_name": { + "kind": "intentional", + "mp": null, + "ours": "沙丘2", + "note": "ID-2:副标题第一段的中文片名补作中文名(MP 副标题只取季集),见 docs/porting/moviepilot-identity-match.md" + } } } } diff --git a/packages/domain/test/identity-id2.test.ts b/packages/domain/test/identity-id2.test.ts new file mode 100644 index 00000000..44ac946f --- /dev/null +++ b/packages/domain/test/identity-id2.test.ts @@ -0,0 +1,173 @@ +/** ID-2:副标题 / RSS 内嵌描述片名、分类前缀、续作序号、通用词守卫、评分权重与同级取舍 */ +import { describe, expect, it } from "vitest"; +import { + DEFAULT_MATCH_WEIGHTS, + type IdentityCandidate, + isGenericAliasName, + normalizeTitle, + parseRelease, + queryTitles, + resolveIdentity, + scoreCandidate, + sequelNumbers, +} from "../src/index.ts"; + +const tv = (id: string, titles: string[], year: number, over: Partial = {}): IdentityCandidate => ({ + provider: "tmdb", + entityType: "tv", + externalId: id, + titles, + year, + aliases: [], + ...over, +}); + +describe("解析:分类前缀、内嵌描述、副标题片名", () => { + it("RSS `[动漫]英文名 … -GRP[中文名 / 别名 | 第N集 | …][体积]`", () => { + const p = parseRelease( + "[动漫]Martial Master S01 2020 1080p WEB-DL H.264 AAC2.0-HHWEB[武神主宰 / 武神主宰 第一季 / The God of War Dominates | 第685集 | 1080p | 类型: 动画/奇幻/冒险 | 导演: 老鹰][180.86 MB]", + ); + expect(p).toMatchObject({ + category: "动漫", + titleCn: "武神主宰", + titleEn: "Martial Master", + year: 2020, + season: 1, + episodes: { start: 685, end: 685 }, + altTitles: ["武神主宰 第一季", "The God of War Dominates"], + }); + expect(p.evidence).toContain("subtitle:embedded"); + }); + it("分类词不当片名:[电视剧] / [音乐] / [综艺]", () => { + for (const c of ["电视剧", "音乐", "综艺", "纪录片", "短剧", "游戏", "软件", "学习", "其他"]) { + const p = parseRelease(`[${c}]Some Title S01 2026 1080p WEB-DL-GRP`); + expect(p.category, c).toBe(c); + expect(p.titleCn, c).toBeUndefined(); + } + }); + it("数字紧跟普通单词是片名的一部分,不是集号(`Travis - 12 Memories`)", () => { + const p = parseRelease("[音乐]Travis - 12 Memories (2003) - WEB-DL - 16bit ALAC-HHWEB"); + expect(p.episodes).toBeUndefined(); + expect(p.titleEn).toContain("12 Memories"); + expect(parseRelease("[Sub] Some Anime - 12 [1080p]").episodes).toEqual({ start: 12, end: 12 }); + expect(parseRelease("Some Anime - 05 END [1080p]").episodes).toEqual({ start: 5, end: 5 }); + }); + it("副标题第一段:主标题没有中文名时取第一个中文名,其余进 altTitles;字幕/简介字段不算片名", () => { + const p = parseRelease("Archives S01 2009 1080p WEB-DL H.264 AAC-HHWEB", { + subtitle: "档案 / 档案解密 | 第152集 | 1080p | 类型: 纪录片/历史 | 主演: 石凉 [内嵌中字]", + }); + expect(p).toMatchObject({ titleCn: "档案", titleEn: "Archives", altTitles: ["档案解密"], year: 2009 }); + const q = parseRelease("Interstellar 2014 2160p UHD Blu-ray-GRP", { + subtitle: "星际穿越 IMAX版/星際啟示錄(港)/英语DTS-HD MA5.1/原盘英简繁&双语特效SUP字幕/章节", + }); + expect(q.titleCn).toBe("星际穿越"); + expect(q.altTitles).toEqual(["星際啟示錄"]); + expect(parseRelease("Some Movie 2020 1080p-GRP", { subtitle: "官方中字 | 特效字幕" }).titleCn).toBeUndefined(); + }); + it("通用词不进比对名称", () => { + expect(isGenericAliasName(normalizeTitle("电视剧"))).toBe(true); + expect(isGenericAliasName("剧")).toBe(true); + expect(isGenericAliasName("tv")).toBe(true); + expect(isGenericAliasName(normalizeTitle("档案"))).toBe(false); + const p = parseRelease("Lanterns 2026 1080p-GRP"); + expect(queryTitles({ ...p, titleCn: "电视剧" })).toEqual(["lanterns"]); + }); +}); + +describe("续作 / 章节序号", () => { + it("Chapter / Part / 第N章 / 罗马数字符号", () => { + expect(sequelNumbers("Mononoke The Movie Chapter III The Curse of the Serpent")).toEqual([3]); + expect(sequelNumbers("剧场版物怪:第 3 章:蛇神")).toEqual([3]); + expect(sequelNumbers("劇場版モノノ怪 第三章 蛇神")).toEqual([3]); + expect(sequelNumbers("Mononoke the Movie: Chapter Ⅱ")).toEqual([2]); + expect(sequelNumbers("Dune Part Two")).toEqual([2]); + expect(sequelNumbers("Blade Runner 2049")).toEqual([]); + }); + it("序号冲突直接拒绝,一致加分", () => { + const p = parseRelease("Mononoke The Movie Chapter III The Curse of the Serpent 2026 1080p NF WEB-DL-HHWEB"); + const c3: IdentityCandidate = { + provider: "tmdb", + entityType: "movie", + externalId: "3", + titles: ["剧场版物怪:第 3 章:蛇神"], + aliases: ["Mononoke the Movie: Chapter III - The Curse of the Serpent"], + year: 2026, + }; + const c2 = { + ...c3, + externalId: "2", + titles: ["剧场版物怪:第 2 章:火鼠"], + aliases: ["Mononoke the Movie: Chapter II"], + }; + expect(scoreCandidate(p, c3).signals.sequel).toBe("match"); + expect(scoreCandidate(p, c2).level).toBe("rejected"); + expect(resolveIdentity(p, [c2, c3]).best?.candidate.externalId).toBe("3"); + }); +}); + +describe("证据:中英名、通用词、别名佐证、同级取舍", () => { + it("中文名精确 + 年份精确 → rule_confirmed;唯一候选 → auto", () => { + const p = parseRelease("Martial Master S01 2020 1080p WEB-DL-HHWEB", { subtitle: "武神主宰 | 第685集" }); + const r = resolveIdentity(p, [tv("110181", ["武神主宰"], 2020), tv("228707", ["武神主宰"], 2023)]); + expect(r).toMatchObject({ status: "auto", best: { level: "rule_confirmed" } }); + expect(r.best?.candidate.externalId).toBe("110181"); + }); + it("通用英文词只靠别名命中且池里撞名 → 封顶 needs_confirm;中文名命中则确认", () => { + const noCn = parseRelease("Archives S01 2009 1080p WEB-DL-HHWEB"); + const pool = [ + tv("201401", ["档案"], 2009, { aliases: ["Archives"] }), + tv("1", ["Archives secrètes"], 2021), + tv("2", ["Mystères d'archives"], 2009), + tv("3", ["The Magnus Archives"], 2016), + ]; + const r = resolveIdentity(noCn, pool); + expect(r.status).toBe("ambiguous"); + expect(r.best?.evidence).toContain("generic_name"); + const withCn = parseRelease("Archives S01 2009 1080p WEB-DL-HHWEB", { subtitle: "档案 | 第152集" }); + expect(resolveIdentity(withCn, pool)).toMatchObject({ + status: "auto", + best: { candidate: { externalId: "201401" } }, + }); + }); + it("别名命中需要年份或第二种文字的名称佐证", () => { + const p = parseRelease("人中之龙第一季 1080p WEB-DL H265 AAC-HHWEB", { + subtitle: "人中之龙第一季 | 全98集 | 1080p", + }); + const r = scoreCandidate(p, tv("256116", ["如龙", "龍が如く"], 2024, { aliases: ["人中之龙"] })); + expect(r.level).toBe("needs_confirm"); + expect(r.evidence).toContain("alias_uncorroborated"); + }); + it("同级多候选:年份精确优先,再按命中的名称文字种数", () => { + const p = parseRelease("A Prophet S01 2026 2160p TX WEB-DL-HHWEB", { subtitle: "我不是大师 / 长风起 | 第05集" }); + const right = tv("289078", ["我不是大师"], 2026, { aliases: ["A Prophet"] }); + const other = tv("224006", ["预言者", "Un prophète", "A Prophet"], 2026); + const r = resolveIdentity(p, [other, right]); + expect(r.status).toBe("auto"); + expect(r.best?.candidate.externalId).toBe("289078"); + expect(r.reason).toBe("rule_confirmed:tie_break"); + // 完全对称 → 仍进池 + expect(resolveIdentity(p, [tv("1", ["我不是大师"], 2026), tv("2", ["我不是大师"], 2026)]).status).toBe("ambiguous"); + }); + it("季号不在候选季列表里扣分", () => { + const p = parseRelease("Heart Signal S09 2018 1080p WEB-DL-HHWEB"); + const r = scoreCandidate(p, tv("72976", ["Heart Signal"], 2018, { seasonNumbers: [1, 2, 3, 4] })); + expect(r.evidence).toContain("season:missing"); + expect(r.level).toBe("needs_confirm"); + }); + it("权重表可覆盖", () => { + const p = parseRelease("Oppenheimer 2023 1080p-GRP"); + const c: IdentityCandidate = { + provider: "tmdb", + entityType: "movie", + externalId: "1", + titles: ["Oppenheimer"], + year: 2023, + aliases: [], + }; + expect(scoreCandidate(p, c).level).toBe("rule_confirmed"); + expect( + scoreCandidate(p, c, { weights: { thresholds: { ...DEFAULT_MATCH_WEIGHTS.thresholds, rule_confirmed: 9 } } }) + .level, + ).toBe("multi_evidence"); + }); +}); diff --git a/packages/domain/test/release-parser.test.ts b/packages/domain/test/release-parser.test.ts index 86b3adf0..0e2d4691 100644 --- a/packages/domain/test/release-parser.test.ts +++ b/packages/domain/test/release-parser.test.ts @@ -566,7 +566,13 @@ const MP_PARITY: Sample[] = [ subtitle: "麦香 | 全36集 | 4K", expect: { titleCn: "麦香", title: "麦香" }, }, - { id: "M4b", input: "Blade Runner 2017 1080p WEB-DL", subtitle: "银翼杀手 | 科幻", expect: { titleCn: undefined } }, + // ID-2:副标题第一段的中文片名补作中文名(M4b 原先断言不取) + { + id: "M4b", + input: "Blade Runner 2017 1080p WEB-DL", + subtitle: "银翼杀手 | 科幻", + expect: { titleCn: "银翼杀手", titleEn: "Blade Runner" }, + }, { id: "M5", input: "Thor Love and Thunder (2022) [1080p] [WEBRip] [5.1]", expect: { audio: ["5.1"] } }, { id: "M6", @@ -629,7 +635,7 @@ describe("parseRelease 样本表", () => { it(`${s.id} ${s.input}${s.deviation ? ` [deviation: ${s.deviation}]` : ""}`, () => { const r = parseRelease(s.input, s.subtitle ? { subtitle: s.subtitle } : {}); check(r, s.expect); - expect(r.parserVersion).toBe(1); + expect(r.parserVersion).toBe(2); expect(r.raw).toBe(s.input); }); } diff --git a/packages/mapping/test/convert.test.ts b/packages/mapping/test/convert.test.ts index ee6a8b97..5fc0ce8e 100644 --- a/packages/mapping/test/convert.test.ts +++ b/packages/mapping/test/convert.test.ts @@ -3,6 +3,7 @@ import { DEFAULT_TEMPLATES, evaluateCandidate, type IdentityCandidate, + PARSER_VERSION, parseRelease, planOrganize, resolveIdentity, @@ -237,7 +238,7 @@ describe("SiteRelease ↔ source_release", () => { expect(C.SourceReleaseCreate.safeParse(create).success).toBe(true); expect(create).toMatchObject({ siteId: U(40), infohashV1: "a".repeat(40), infohashV2: null, categoryRaw: "401" }); expect(JSON.stringify(create)).not.toContain("download.php"); - expect(create.parserVersion).toBe("1"); + expect(create.parserVersion).toBe(String(PARSER_VERSION)); }); it("source_release 行还原为 SiteReleaseLike(下载入口除外)", () => { diff --git a/scripts/identity-reevaluate.ts b/scripts/identity-reevaluate.ts new file mode 100644 index 00000000..d9673f69 --- /dev/null +++ b/scripts/identity-reevaluate.ts @@ -0,0 +1,236 @@ +// 身份识别重评(ID-2):匹配规则更新后,处理存量的待识别事项与错误映射。默认只读(dry-run),加 --apply 才改库。 +// +// 用法(DATABASE_URL 必须显式给出,脚本不带默认库): +// DATABASE_URL=postgres://umt:***@:5432/umt deno run -A scripts/identity-reevaluate.ts +// DATABASE_URL=… deno run -A scripts/identity-reevaluate.ts --rollback-wrong # 另查分类词别名造成的错误映射 +// DATABASE_URL=… deno run -A scripts/identity-reevaluate.ts --rollback-wrong --apply # 真正执行 +// +// 1. open 的 identity_ambiguous:按新解析规则重新解析每个成员资源并给出预估(只用池里存的候选,不查 TMDB); +// --apply 时把这些池条目的 next_review_at 置为现在、attempts 清零,由运行中的服务(已部署新规则)的池复查 +// 重新识别——能自动确认的会绑定作品、建映射,并从合并事项里摘除(组空即关闭)。脚本自己不查 TMDB、不建作品。 +// 2. --rollback-wrong:找出站点来源(source=site)且是分类词 / 停用词 / 单字的别名(例如 RSS 前缀「[电视剧]」被当成 +// 中文名登记的「电视剧」),对挂着这类别名的作品,用新解析 + 作品自身名称(主标题 / 原标题 / 非站点来源别名) +// 重新核对已绑定的资源:对不上的视为经错误别名误并入 → --apply 时解除绑定、退回待识别池(立即复查), +// 删除该错误别名以及由误并入资源登记的站点别名(链式扩散的那些),各记一条 resolution_attempt(manual)。 +// 内容单元(季 / 集)不删,只列出已无资源引用的单元。 + +import { + type IdentityCandidate, + isGenericAliasName, + normalizeTitle, + parseRelease, + queryTitles, + resolveIdentity, + scoreCandidate, +} from "@umt/domain"; +import pg from "pg"; + +const args = new Set(Deno.args); +const APPLY = args.has("--apply"); +const ROLLBACK = args.has("--rollback-wrong"); +const url = Deno.env.get("DATABASE_URL"); +if (!url) { + console.error("需要 DATABASE_URL(脚本不带默认库)"); + Deno.exit(2); +} +const db = new pg.Client({ connectionString: url }); +await db.connect(); +const q = async (text: string, values: unknown[] = []) => (await db.query(text, values)).rows as T[]; +const mode = APPLY ? "APPLY" : "DRY-RUN"; +console.log(`# identity-reevaluate (${mode})${ROLLBACK ? " + rollback-wrong" : ""}\n`); + +interface PoolRow { + pool_id: string; + decision_id: string; + decision_title: string; + source_release_id: string; + title: string; + subtitle: string | null; + candidates: { + provider: string; + entityType: "movie" | "tv"; + externalId: string; + title: string; + year: number | null; + }[]; +} + +// ---------------------------------------------------------------- 1. open identity_ambiguous +const pool = await q( + `select c.id as pool_id, d.id as decision_id, d.title as decision_title, r.id as source_release_id, r.title, r.subtitle, + c.candidates + from decision d + join identity_candidate c on c.decision_id = d.id and c.status = 'pending' + join source_release r on r.id = c.source_release_id + where d.kind = 'identity_ambiguous' and d.status in ('open', 'investigating', 'awaiting_user') + order by d.id, r.title`, +); +console.log( + `## open identity_ambiguous:${new Set(pool.map((p) => p.decision_id)).size} 条事项,${pool.length} 个成员资源`, +); +let predictedAuto = 0; +for (const p of pool) { + const parsed = parseRelease(p.title, p.subtitle ? { subtitle: p.subtitle } : {}); + const cands: IdentityCandidate[] = (p.candidates ?? []).map((c) => ({ + provider: c.provider, + entityType: c.entityType, + externalId: c.externalId, + titles: [c.title], + aliases: [], + ...(c.year != null ? { year: c.year } : {}), + })); + const res = resolveIdentity(parsed, cands); + if (res.status === "auto") predictedAuto++; + const best = res.best?.candidate; + console.log( + `- [${res.status}${res.status === "auto" ? ` → ${best?.provider}:${best?.entityType}/${best?.externalId} ${best?.titles[0]}` : ""}] ` + + `${p.title} (中文名 ${parsed.titleCn ?? "-"},英文名 ${parsed.titleEn ?? "-"},年份 ${parsed.year ?? "-"})`, + ); +} +console.log( + `\n预估(只用池里存的候选,服务复查时会按新规则重新查 TMDB 并比对别名,结果以复查为准):${predictedAuto}/${pool.length} 可自动确认`, +); +if (APPLY && pool.length) { + await q(`update identity_candidate set next_review_at = now(), attempts = 0 where id = any($1::uuid[])`, [ + pool.map((p) => p.pool_id), + ]); + console.log(`已把 ${pool.length} 个池条目排入立即复查(由运行中的服务处理)`); +} + +// ---------------------------------------------------------------- 2. rollback-wrong +if (ROLLBACK) { + interface AliasRow { + id: string; + media_entity_id: string; + alias: string; + normalized: string; + source: string; + } + const siteAliases = await q( + `select id, media_entity_id, alias, normalized, source from title_alias where source = 'site' and content_unit_id is null`, + ); + const poison = siteAliases.filter((a) => isGenericAliasName(a.normalized)); + const entities = [...new Set(poison.map((a) => a.media_entity_id))]; + console.log(`\n## rollback-wrong:${poison.length} 个分类词 / 通用词站点别名,涉及 ${entities.length} 部作品`); + const toUnbind: { id: string; title: string; subtitle: string | null; entityId: string }[] = []; + const aliasIdsToDelete = new Set(poison.map((a) => a.id)); + for (const entityId of entities) { + const [e] = await q<{ + id: string; + kind: string; + title: string; + original_title: string | null; + year: number | null; + }>(`select id, kind, title, original_title, year from media_entity where id = $1`, [entityId]); + if (!e) continue; + const all = await q( + `select id, media_entity_id, alias, normalized, source from title_alias where media_entity_id = $1`, + [entityId], + ); + // 作品自身名称:主标题 / 原标题 / 非站点来源的别名(TMDB 译名等) + const legit: IdentityCandidate = { + provider: "local", + entityType: e.kind === "movie" ? "movie" : "tv", + externalId: e.id, + titles: [e.title, ...(e.original_title ? [e.original_title] : [])], + aliases: all.filter((a) => a.source !== "site").map((a) => a.alias), + ...(e.year != null ? { year: e.year } : {}), + }; + const legitNorm = new Set([...legit.titles, ...legit.aliases].map(normalizeTitle)); + const releases = await q<{ id: string; title: string; subtitle: string | null; parsed: Record }>( + `select id, title, subtitle, parsed from source_release where media_entity_id = $1 and not resolution_locked`, + [entityId], + ); + const wrongNames = new Set(); + let kept = 0; + for (const r of releases) { + const parsed = parseRelease(r.title, r.subtitle ? { subtitle: r.subtitle } : {}); + const s = scoreCandidate(parsed, legit); + if (s.titleMatch === "exact" || s.titleMatch === "alias") { + kept++; + continue; + } + toUnbind.push({ id: r.id, title: r.title, subtitle: r.subtitle, entityId }); + for (const n of queryTitles(parsed)) wrongNames.add(n); + for (const k of ["titleCn", "titleEn", "title"]) { + const v = r.parsed?.[k]; + if (typeof v === "string" && v) wrongNames.add(normalizeTitle(v)); + } + } + const chain = all.filter( + (a) => a.source === "site" && !legitNorm.has(a.normalized) && wrongNames.has(a.normalized), + ); + for (const a of chain) aliasIdsToDelete.add(a.id); + console.log( + `\n### ${e.title}(${e.year ?? "-"}):已绑定 ${releases.length} 条,核对通过 ${kept} 条,误并入 ${releases.length - kept} 条`, + ); + console.log( + ` 删除别名:${[...new Set([...poison.filter((a) => a.media_entity_id === entityId), ...chain].map((a) => `「${a.alias}」`))].join(" ") || "-"}`, + ); + for (const r of toUnbind.filter((x) => x.entityId === entityId)) console.log(` - 解除:${r.title}`); + } + // 引用了这些资源的其他记录(只报告,不改) + if (toUnbind.length) { + const refs = await q<{ table_name: string }>( + `select table_name from information_schema.columns + where table_schema = 'public' and column_name = 'source_release_id' + and table_name not in ('identity_candidate', 'resolution_attempt', 'observation')`, + ); + for (const { table_name } of refs) { + const [c] = await q<{ n: number }>( + `select count(*)::int as n from "${table_name}" where source_release_id = any($1::uuid[])`, + [toUnbind.map((r) => r.id)], + ); + if (c && c.n > 0) console.log(` 注意:${table_name} 里有 ${c.n} 行引用了误并入的资源(不自动处理,请人工核对)`); + } + } + console.log(`\n合计:解除 ${toUnbind.length} 条资源绑定,删除 ${aliasIdsToDelete.size} 个站点别名`); + if (APPLY && (toUnbind.length || aliasIdsToDelete.size)) { + await db.query("begin"); + try { + await q(`delete from title_alias where id = any($1::uuid[])`, [[...aliasIdsToDelete]]); + for (const r of toUnbind) { + const parsed = parseRelease(r.title, r.subtitle ? { subtitle: r.subtitle } : {}); + await q( + `update source_release set media_entity_id = null, content_unit_id = null, resolution_status = 'unresolved', + resolution_evidence = $2::jsonb, updated_at = now() + where id = $1 and not resolution_locked`, + [r.id, JSON.stringify({ reason: "rollback_wrong_alias", previousEntityId: r.entityId })], + ); + const normalized = parsed.title ? normalizeTitle(parsed.title) || null : null; + await q( + `insert into identity_candidate (source_release_id, status, reason, query, normalized_title, candidates, + evidence_version, attempts, last_attempt_at, next_review_at) + values ($1, 'pending', 'no_match', $2::jsonb, $3, '[]'::jsonb, 'rollback', 0, now(), now()) + on conflict (source_release_id) do update set status = 'pending', reason = 'no_match', attempts = 0, + next_review_at = now(), resolved_media_entity_id = null, resolved_by = null, resolved_at = null`, + [r.id, JSON.stringify({ title: parsed.title ?? null, rollbackFrom: r.entityId }), normalized], + ); + await q( + `insert into resolution_attempt (source_release_id, outcome, reason, evidence_version, candidate_count, + media_entity_id, actor_type, actor_id) + values ($1, 'manual', 'rollback_wrong_alias', 'rollback', 0, null, 'system', 'identity-reevaluate')`, + [r.id], + ); + } + await db.query("commit"); + console.log("已执行:资源退回待识别池并排入立即复查(由运行中的服务按新规则重新识别)"); + } catch (e) { + await db.query("rollback"); + throw e; + } + } + const orphan = await q<{ n: number }>( + `select count(*)::int as n from content_unit u + where u.media_entity_id = any($1::uuid[]) + and not exists (select 1 from source_release r where r.content_unit_id = u.id)`, + [entities], + ).catch(() => [{ n: -1 }]); + if (orphan[0] && orphan[0].n > 0) + console.log( + `提示:这些作品下${APPLY ? "现在" : "当前"}有 ${orphan[0].n} 个内容单元没有资源引用(脚本不删除,需要时人工清理)`, + ); +} + +if (!APPLY) console.log("\n(dry-run:未改库;确认后加 --apply 执行)"); +await db.end();