feat(sites): sync MoviePilot v3.2.4 spiders and M-Team subtitle APIs

This commit is contained in:
root committed 2026-11-06 00:06:12 +08:00
1 parent 3b9376c75a
commit c38e7131f1
26 files changed
+775 -56

No files matched your search

@@ -1,11 +1,34 @@
import { createMockFetch, TNODE_HOME_HTML, TNODE_HOME_NO_TOKEN, TNODE_SEARCH_OK } from "@umt/testkit";
import { describe, expect, it } from "vitest";
import { createSiteRateLimiter } from "../rate-limit.ts";
import { createSpecializedSiteAdapter } from "./adapter.ts";
import { adapterWith, expectSiteError, testDef, withTorrent } from "./testing.ts";
import { parseTnodeToken, tnodeSearchParams, tnodeSpider } from "./tnode.ts";
const def = testDef("TNodeSpider", { domain: "https://tnode.example/" });
describe("TNodeSpider(MP tnode.py)", () => {
it("凭据变更后不复用旧CSRF令牌", async () => {
let cookie = "session=first";
const mock = createMockFetch({
"GET /": { body: TNODE_HOME_HTML },
"POST /api/torrent/advancedSearch": { body: TNODE_SEARCH_OK },
});
const adapter = createSpecializedSiteAdapter(def, tnodeSpider, {
fetch: mock.fetch,
secrets: {
async resolve() {
return cookie;
},
},
limiter: createSiteRateLimiter({ minIntervalMs: 0 }),
});
await adapter.list(1);
await adapter.list(1);
cookie = "session=second";
await adapter.list(1);
expect(mock.requests.filter((request) => request.url.pathname === "/")).toHaveLength(2);
});
it("__get_params / token 解析", () => {
expect(tnodeSearchParams("tt0923811", 1)).toMatchObject({
page: 2,