Run the title catch-up in its own YouTube lane
This commit is contained in:
@@ -21,6 +21,7 @@ import {
|
||||
import { ogImageFromHtml, resolveEmbedPreview } from "../src/embed-preview.js";
|
||||
import { ScrapeEngine, type FetchPage, type ScrapeBackend } from "../src/engine.js";
|
||||
import { BackfillQueue } from "../src/backfill.js";
|
||||
import { TitleLane } from "../src/titles.js";
|
||||
import { extractMedia, normalizeYouTubeUrl } from "../src/extract.js";
|
||||
import { PuppetBackend } from "../src/puppet-backend.js";
|
||||
import { betterCandidate, sortCandidates } from "../src/dedupe.js";
|
||||
@@ -1502,7 +1503,7 @@ void (async () => {
|
||||
store.close();
|
||||
});
|
||||
|
||||
await test("previewBatch resolves titles and gives up after the cap", async () => {
|
||||
await test("titleBatch resolves titles and gives up after the cap", async () => {
|
||||
const embed = {
|
||||
type: "video",
|
||||
url: "https://www.youtube.com/watch?v=titlepass",
|
||||
@@ -1534,7 +1535,8 @@ void (async () => {
|
||||
|
||||
const started = await engine.start({ channelId: "135", guildId: null, mode: "links", backend });
|
||||
await engine.processQueue();
|
||||
await engine.previewBatch(started.id, 5);
|
||||
const batch = await engine.titleBatch(started.id, 5);
|
||||
assert.equal(batch.titled, 1);
|
||||
|
||||
const store = new ScrapeStore(join(root, started.id));
|
||||
const row = store.queryMedia({ kind: "video" })[0];
|
||||
@@ -1561,7 +1563,8 @@ void (async () => {
|
||||
|
||||
const dead = await deadEngine.start({ channelId: "136", guildId: null, mode: "links", backend: deadBackend });
|
||||
await deadEngine.processQueue();
|
||||
await deadEngine.previewBatch(dead.id, 5);
|
||||
const deadBatch = await deadEngine.titleBatch(dead.id, 5);
|
||||
assert.equal(deadBatch.failed, 1);
|
||||
|
||||
const deadStore = new ScrapeStore(join(root, dead.id));
|
||||
const deadRow = deadStore.queryMedia({ kind: "video" })[0];
|
||||
@@ -1570,6 +1573,55 @@ void (async () => {
|
||||
deadStore.close();
|
||||
});
|
||||
|
||||
await test("title lane runs a catch-up across scrapes", async () => {
|
||||
const laneRoot = join(root, "lane-root");
|
||||
mkdirSync(laneRoot, { recursive: true });
|
||||
|
||||
const embed = (id: string) => ({
|
||||
type: "video",
|
||||
url: `https://www.youtube.com/watch?v=${id}`,
|
||||
title: null,
|
||||
provider: "YouTube",
|
||||
videoUrl: `https://www.youtube.com/watch?v=${id}`,
|
||||
imageUrl: null,
|
||||
thumbnailUrl: null
|
||||
});
|
||||
const backend = new FakeBackend([
|
||||
{ messages: [message("1500", { embeds: [embed("lane1"), embed("lane2")] })] }
|
||||
]);
|
||||
const engine = engineFor(laneRoot, backend, {
|
||||
download: {
|
||||
fetchImpl: async (input: any) =>
|
||||
new Response(JSON.stringify({ title: `T ${String(input).length}` }), {
|
||||
status: 200,
|
||||
headers: { "content-type": "application/json" }
|
||||
}),
|
||||
minGapMs: 0,
|
||||
maxGapMs: 0,
|
||||
sleep: async () => {}
|
||||
}
|
||||
});
|
||||
await engine.start({ channelId: "137", guildId: null, mode: "links", backend });
|
||||
await engine.processQueue();
|
||||
|
||||
const lane = new TitleLane(engine, {
|
||||
rootDir: laneRoot,
|
||||
batchSize: 1,
|
||||
batchPauseMs: 0,
|
||||
sleep: async () => {},
|
||||
log: () => {}
|
||||
});
|
||||
lane.start();
|
||||
await lane.idle();
|
||||
|
||||
const status = lane.status();
|
||||
assert.equal(status.state, "done");
|
||||
assert.equal(status.pending, 0);
|
||||
assert.equal(status.resolved, 2);
|
||||
assert.equal(status.failed, 0);
|
||||
assert.ok(status.processed >= 2);
|
||||
});
|
||||
|
||||
await test("title search matches word prefixes and exact phrases", () => {
|
||||
const dir = join(root, "title-search");
|
||||
mkdirSync(dir, { recursive: true });
|
||||
|
||||
Reference in New Issue
Block a user