cvsa/packages/crawler/db/bilibili_metadata.ts
alikia2x 1a20d5afe0
update: schedule archive snapshots to next Saturday midnight
fix: no expire when acquiring lock for classifyVideos
ref: format
2025-05-31 12:13:56 +08:00

78 lines
2.4 KiB
TypeScript

import type { Psql } from "@core/db/psql.d.ts";
import { AllDataType, BiliUserType } from "@core/db/schema";
import { AkariModelVersion } from "ml/const";
export async function videoExistsInAllData(sql: Psql, aid: number) {
const rows = await sql<{ exists: boolean }[]>`
SELECT EXISTS(SELECT 1 FROM bilibili_metadata WHERE aid = ${aid})
`;
return rows[0].exists;
}
export async function userExistsInBiliUsers(sql: Psql, uid: number) {
const rows = await sql<{ exists: boolean }[]>`
SELECT EXISTS(SELECT 1 FROM bilibili_user WHERE uid = ${uid})
`;
return rows[0].exists;
}
export async function getUnlabelledVideos(sql: Psql) {
const rows = await sql<{ aid: number }[]>`
SELECT a.aid FROM bilibili_metadata a LEFT JOIN labelling_result l ON a.aid = l.aid WHERE l.aid IS NULL
`;
return rows.map((row) => row.aid);
}
export async function insertVideoLabel(sql: Psql, aid: number, label: number) {
await sql`
INSERT INTO labelling_result (aid, label, model_version) VALUES (${aid}, ${label}, ${AkariModelVersion}) ON CONFLICT (aid, model_version) DO NOTHING
`;
}
export async function getVideoInfoFromAllData(sql: Psql, aid: number) {
const rows = await sql<AllDataType[]>`
SELECT * FROM bilibili_metadata WHERE aid = ${aid}
`;
const row = rows[0];
let authorInfo = "";
if (row.uid && (await userExistsInBiliUsers(sql, row.uid))) {
const userRows = await sql<BiliUserType[]>`
SELECT * FROM bilibili_user WHERE uid = ${row.uid}
`;
const userRow = userRows[0];
if (userRow) {
authorInfo = userRow.desc;
}
}
return {
title: row.title,
description: row.description,
tags: row.tags,
author_info: authorInfo
};
}
export async function getUnArchivedBiliUsers(sql: Psql) {
const rows = await sql<{ uid: number }[]>`
SELECT ad.uid
FROM bilibili_metadata ad
LEFT JOIN bilibili_user bu ON ad.uid = bu.uid
WHERE bu.uid IS NULL;
`;
return rows.map((row) => row.uid);
}
export async function setBiliVideoStatus(sql: Psql, aid: number, status: number) {
await sql`
UPDATE bilibili_metadata SET status = ${status} WHERE aid = ${aid}
`;
}
export async function getBiliVideoStatus(sql: Psql, aid: number) {
const rows = await sql<{ status: number }[]>`
SELECT status FROM bilibili_metadata WHERE aid = ${aid}
`;
if (rows.length === 0) return 0;
return rows[0].status;
}