Files
blitzkit/packages/scripts/src/reviews.ts
T

93 lines
2.5 KiB
TypeScript
Raw Normal View History

2024-09-07 21:45:00 -05:00
import {
asset,
2024-11-08 17:28:03 -06:00
fetchTankDefinitions,
2024-09-07 21:45:00 -05:00
Reviews,
Video,
youtubers,
2025-10-23 21:22:21 -05:00
} from "@blitzkit/core";
2026-03-23 22:13:29 -05:00
import locales from "@blitzkit/i18n/locales.json";
2025-10-23 21:22:21 -05:00
import { google } from "googleapis";
import { cloneDeep, uniqBy } from "lodash-es";
import { AssetUploader } from "./core/github/assetUploader";
2024-08-25 18:10:56 -05:00
2024-12-13 16:55:57 -06:00
const MAX_QUERIES = 64;
2024-08-25 18:10:56 -05:00
2025-10-23 21:22:21 -05:00
console.log("Finding reviews...");
2024-08-25 18:10:56 -05:00
2025-10-23 21:22:21 -05:00
const currentReviews = await fetch(asset("definitions/reviews.pb"))
2024-08-25 18:10:56 -05:00
.then((response) => response.arrayBuffer())
2024-10-09 21:04:49 -05:00
.then((buffer) => Reviews.decode(new Uint8Array(buffer)));
2024-08-25 18:10:56 -05:00
const auth = await google.auth.getClient({
2025-10-23 21:22:21 -05:00
scopes: ["https://www.googleapis.com/auth/youtube.readonly"],
2024-08-25 18:10:56 -05:00
});
2025-10-23 21:22:21 -05:00
const youtube = google.youtube({ version: "v3", auth });
2024-08-25 18:10:56 -05:00
2024-11-08 17:28:03 -06:00
const tankDefinitions = await fetchTankDefinitions();
const tanks = Object.values(tankDefinitions.tanks);
2024-08-25 18:10:56 -05:00
const tanksSanitized = tanks
.sort((a, b) => b.tier - a.tier)
.sort((a, b) => {
const lastUpdatedA = currentReviews.reviews[a.id]?.last_updated ?? 0;
const lastUpdatedB = currentReviews.reviews[b.id]?.last_updated ?? 0;
return lastUpdatedA - lastUpdatedB;
});
const reviews: Reviews = cloneDeep(currentReviews);
let done = 0;
2024-11-08 17:28:03 -06:00
2024-08-25 18:10:56 -05:00
for (const tank of tanksSanitized) {
if (done >= MAX_QUERIES) {
console.log(`Limit reached with ${done} queries; stopping...`);
break;
}
try {
2026-03-31 14:11:45 -05:00
const q = `World of Tanks Blitz ${tank.name!.locales[locales.default]}`;
2026-03-23 22:13:29 -05:00
2024-08-25 18:10:56 -05:00
const results = await youtube.search.list({
2025-10-23 21:22:21 -05:00
part: ["snippet"],
2026-03-23 22:13:29 -05:00
q,
2024-08-25 18:10:56 -05:00
});
if (!results.data.items || results.data.items.length === 0) continue;
const items = uniqBy(
results.data.items.filter(
(item) =>
item.snippet?.channelId &&
item.id?.videoId &&
2026-03-23 22:13:29 -05:00
youtubers.some(({ id }) => id === item.snippet?.channelId),
2024-08-25 18:10:56 -05:00
),
2026-03-23 22:13:29 -05:00
(item) => item.snippet!.channelId,
2024-08-25 18:10:56 -05:00
);
reviews.reviews[tank.id] = {
last_updated: Date.now(),
videos: items.map(
(item) =>
({
id: item.id!.videoId!,
author: item.snippet!.channelId!,
2026-03-23 22:13:29 -05:00
}) satisfies Video,
2024-08-25 18:10:56 -05:00
),
};
2026-03-23 22:13:29 -05:00
console.log(
2026-03-31 14:11:45 -05:00
`${++done} done; found ${items.length} for ${tank.name!.locales.en}`,
2026-03-23 22:13:29 -05:00
);
2024-08-25 18:10:56 -05:00
await new Promise((resolve) => setTimeout(resolve, 1000 / 5));
} catch (error) {
console.warn(`Limit reached with ${done} queries`);
break;
}
}
2025-10-23 21:22:21 -05:00
using uploader = new AssetUploader("reviews");
await uploader.add({
content: Reviews.encode(reviews).finish(),
path: "definitions/reviews.pb",
});
await uploader.flush();