feat: add manual video tagging

This commit is contained in:
2026-04-29 21:20:21 +08:00
parent 02d37f3953
commit eac6ad2343
17 changed files with 1066 additions and 418 deletions
+25 -10
View File
@@ -78,7 +78,10 @@ export async function GET(req: Request) {
'StartSel=<mark>,StopSel=</mark>,MaxFragments=2,MinWords=2,MaxWords=20'
)
END AS snippet,
COALESCE(vt.content_tags, ARRAY[]::text[]) AS "contentTags"
CASE
WHEN cardinality(v.manual_content_tags) > 0 THEN v.manual_content_tags
ELSE COALESCE(vt.content_tags, ARRAY[]::text[])
END AS "contentTags"
FROM "Video" v
LEFT JOIN "VideoTranscript" vt ON vt."videoId" = v.aweme_id,
tsq
@@ -86,7 +89,8 @@ export async function GET(req: Request) {
(vt.transcript_zh_tsv @@ tsq.query OR to_tsvector('zhcfg', v.desc) @@ tsq.query)
AND CASE
WHEN ${contentTag}::text IS NULL THEN TRUE
ELSE vt.content_tags @> ARRAY[${contentTag}]::text[]
WHEN cardinality(v.manual_content_tags) > 0 THEN v.manual_content_tags @> ARRAY[${contentTag}]::text[]
ELSE COALESCE(vt.content_tags, ARRAY[]::text[]) @> ARRAY[${contentTag}]::text[]
END
UNION ALL
@@ -114,7 +118,7 @@ export async function GET(req: Request) {
`
: await prisma.$queryRaw<SearchRow[]>`
SELECT
vt.id AS id,
COALESCE(vt.id, 'tag:' || v.aweme_id) AS id,
v.aweme_id AS "awemeId",
'video'::text AS type,
1.0::double precision AS rank,
@@ -124,10 +128,16 @@ export async function GET(req: Request) {
v.desc,
'标签匹配'
) AS snippet,
vt.content_tags AS "contentTags"
FROM "VideoTranscript" vt
JOIN "Video" v ON v.aweme_id = vt."videoId"
WHERE vt.content_tags @> ARRAY[${contentTag}]::text[]
CASE
WHEN cardinality(v.manual_content_tags) > 0 THEN v.manual_content_tags
ELSE COALESCE(vt.content_tags, ARRAY[]::text[])
END AS "contentTags"
FROM "Video" v
LEFT JOIN "VideoTranscript" vt ON vt."videoId" = v.aweme_id
WHERE CASE
WHEN cardinality(v.manual_content_tags) > 0 THEN v.manual_content_tags @> ARRAY[${contentTag}]::text[]
ELSE COALESCE(vt.content_tags, ARRAY[]::text[]) @> ARRAY[${contentTag}]::text[]
END
ORDER BY v.created_at DESC
OFFSET ${offset}
LIMIT ${limit};
@@ -145,7 +155,8 @@ export async function GET(req: Request) {
WHERE (vt.transcript_zh_tsv @@ tsq.query OR to_tsvector('zhcfg', v.desc) @@ tsq.query)
AND CASE
WHEN ${contentTag}::text IS NULL THEN TRUE
ELSE vt.content_tags @> ARRAY[${contentTag}]::text[]
WHEN cardinality(v.manual_content_tags) > 0 THEN v.manual_content_tags @> ARRAY[${contentTag}]::text[]
ELSE COALESCE(vt.content_tags, ARRAY[]::text[]) @> ARRAY[${contentTag}]::text[]
END)
+
(SELECT COUNT(*)::int FROM "ImagePost" ip
@@ -156,8 +167,12 @@ export async function GET(req: Request) {
`
: await prisma.$queryRaw<{ count: number }[]>`
SELECT COUNT(*)::int AS count
FROM "VideoTranscript" vt
WHERE vt.content_tags @> ARRAY[${contentTag}]::text[];
FROM "Video" v
LEFT JOIN "VideoTranscript" vt ON vt."videoId" = v.aweme_id
WHERE CASE
WHEN cardinality(v.manual_content_tags) > 0 THEN v.manual_content_tags @> ARRAY[${contentTag}]::text[]
ELSE COALESCE(vt.content_tags, ARRAY[]::text[]) @> ARRAY[${contentTag}]::text[]
END;
`;
// 分离视频和图文ID