fix: 合并服务器未推送改动并保留手动视频标签

This commit is contained in:
2026-10-03 22:09:09 +08:00
29 changed files with 1459 additions and 532 deletions
+56
View File
@@ -16,6 +16,9 @@ import {
} from "../lib/stt/tasks";
import { processTask } from "../lib/stt/worker";
import { POST as updateTags } from "../app/api/asr/tags/route";
import { GET as searchVideos } from "../app/api/search/route";
const database = process.env.TEST_DATABASE_URL;
const migration = readFileSync(
"prisma/migrations/20261003000000_plain_transcription/migration.sql",
@@ -67,6 +70,12 @@ describe("PostgreSQL transcription lifecycle", { skip: !database }, () => {
sql(
readFileSync("prisma/migrations/20251025_baseline/migration.sql", "utf8"),
);
sql(
readFileSync(
"prisma/migrations/20260429_add_manual_video_tags/migration.sql",
"utf8",
),
);
await prisma.author.create({
data: {
sec_uid: "test-author",
@@ -104,6 +113,9 @@ describe("PostgreSQL transcription lifecycle", { skip: !database }, () => {
CREATE TEXT SEARCH CONFIGURATION public.zhcfg (COPY = pg_catalog.simple);
CREATE FUNCTION public.vt_update_transcript_zh_tsv() RETURNS trigger AS $$ BEGIN RETURN NEW; END; $$ LANGUAGE plpgsql;
CREATE TRIGGER trg_vt_transcript_zh_tsv BEFORE INSERT OR UPDATE OF transcript ON "VideoTranscript" FOR EACH ROW EXECUTE FUNCTION public.vt_update_transcript_zh_tsv();`);
sql(
`UPDATE "Video" SET manual_content_tags = ARRAY['科技'] WHERE aweme_id = 'historical';`,
);
sql(migration);
sql(migration); // migration DDL is repeatable, historical text is unchanged
});
@@ -120,6 +132,14 @@ describe("PostgreSQL transcription lifecycle", { skip: !database }, () => {
await prisma.$disconnect();
});
test("migration preserves historical and empty text and rebuilds search", async () => {
assert.deepEqual(
(
await prisma.video.findUniqueOrThrow({
where: { aweme_id: "historical" },
})
).manual_content_tags,
["科技"],
);
assert.equal(
(await readTranscription("empty-history"))?.status,
"SUCCEEDED",
@@ -132,6 +152,42 @@ describe("PostgreSQL transcription lifecycle", { skip: !database }, () => {
>`SELECT COUNT(*) FROM "VideoTranscript" WHERE transcript_zh_tsv @@ websearch_to_tsquery('zhcfg', 'original')`;
assert.equal(Number(rows[0].count), 1);
});
test("manual tags survive migration and remain editable and searchable without ASR tags", async () => {
const result = await updateTags(
request("http://local/api/asr/tags", {
awemeId: "v1",
mode: "add",
contentTags: ["科技"],
}),
);
assert.equal(result.status, 200);
assert.deepEqual((await result.json()).updated[0].content_tags, ["科技"]);
const search = await searchVideos(
new Request("http://local/api/search?tag=" + encodeURIComponent("科技")),
);
assert.equal(search.status, 200);
const found = await search.json();
assert.ok(
found.results.some((r: { awemeId: string }) => r.awemeId === "v1"),
);
assert.ok(
found.results.some(
(r: { awemeId: string }) => r.awemeId === "historical",
),
);
await updateTags(
request("http://local/api/asr/tags", {
awemeId: "v1",
mode: "set",
contentTags: [],
}),
);
assert.deepEqual(
(await prisma.video.findUniqueOrThrow({ where: { aweme_id: "v1" } }))
.manual_content_tags,
[],
);
});
test("concurrent enqueue is idempotent; automatic enqueue never retranscribes history", async () => {
await Promise.all(
Array.from({ length: 10 }, () => enqueueTranscription("v1", true)),