// A VOD mirror's recorded date, read off a title (release 20 D1). Synthetic // titles throughout. // // Run with: pnpm --filter yt-dlp-transcript-common exec tsx --test lib/recordedDate.test.ts import { test } from "node:test"; import assert from "node:assert/strict"; import { coerceRecordedDateRule, compileRecordedDateRule, coverageDate, deriveRecordedDate, } from "./recordedDate"; import { parseChannelConfig } from "./channelConfig"; import { channelConfigSchema } from "./channelConfigSchema"; const ISO = { titlePattern: String.raw`(?\d{4})-(?\d{2})-(?\d{2})` }; const WORDS = { titlePattern: String.raw`(?[a-z]+)\.? (?\d{1,2}),? (?\d{4})` }; const US = { titlePattern: String.raw`(?\d{1,2})/(?\d{1,2})/(?\d{2,4})` }; test("an ISO date in the title", () => { assert.equal(deriveRecordedDate(ISO, "Example Stream VOD 2024-03-05 | part 1", "20240310"), "20240305"); }); test("month names, whole, cut and dotted, any case", () => { assert.equal(deriveRecordedDate(WORDS, "VOD: March 5, 2024", "20240306"), "20240305"); assert.equal(deriveRecordedDate(WORDS, "vod - sept 30 2023 (full)", "20231001"), "20230930"); assert.equal(deriveRecordedDate(WORDS, "Stream | DEC. 1, 2022", "20221202"), "20221201"); assert.equal(deriveRecordedDate(WORDS, "Stream | Ma 1, 2022", "20221202"), undefined, "two letters name no month"); assert.equal(deriveRecordedDate(WORDS, "Stream | Smarch 1, 2022", "20221202"), undefined); }); test("a two-digit year is 20YY", () => { assert.equal(deriveRecordedDate(US, "Stream 3/5/24", "20240306"), "20240305"); assert.equal(deriveRecordedDate(US, "Stream 12/31/2023", "20240102"), "20231231"); }); test("not a real day, no match, or after the upload: none", () => { assert.equal(deriveRecordedDate(ISO, "Stream 2023-02-30", "20230401"), undefined); assert.equal(deriveRecordedDate(ISO, "Stream 2023-13-01", "20240401"), undefined); assert.equal(deriveRecordedDate(ISO, "A title with no date", "20240401"), undefined); // A date the title MENTIONS (the next stream) is not the day it was recorded. assert.equal(deriveRecordedDate(ISO, "Next stream 2024-05-01", "20240420"), undefined); // The same day as the upload is fine. assert.equal(deriveRecordedDate(ISO, "Stream 2024-04-20", "20240420"), "20240420"); // No upload date to compare: the title's date stands. assert.equal(deriveRecordedDate(ISO, "Stream 2024-04-20"), "20240420"); }); test("a rule needs a compiling pattern with all three named groups, or it is dropped", () => { assert.deepEqual(coerceRecordedDateRule({ titlePattern: ` ${ISO.titlePattern} ` }), ISO); assert.equal(coerceRecordedDateRule({ titlePattern: String.raw`(?\d{4})-(?\d{2})` }), undefined); assert.equal(coerceRecordedDateRule({ titlePattern: "(?[" }), undefined); // The download filter's safety rules: no nested quantifier, at most 200 characters. assert.equal( coerceRecordedDateRule({ titlePattern: String.raw`(?(\d+)+)-(?\d+)-(?\d+)` }), undefined, ); assert.equal(coerceRecordedDateRule({ titlePattern: `${ISO.titlePattern}${"x".repeat(200)}` }), undefined); assert.equal(coerceRecordedDateRule({ titlePattern: " " }), undefined); assert.equal(coerceRecordedDateRule({ titlePattern: 7 }), undefined); assert.equal(coerceRecordedDateRule("(?.)"), undefined); assert.equal(coerceRecordedDateRule([ISO]), undefined); assert.equal(compileRecordedDateRule({ titlePattern: "(?[" }), null); assert.ok(compileRecordedDateRule(ISO)?.flags.includes("i")); }); test("config.json: the key round-trips through both readers, and a bad one is omitted", () => { const raw = { handling: "youtube", name: "Example VODs", recordedDate: ISO }; assert.deepEqual(parseChannelConfig(raw)?.recordedDate, ISO); assert.deepEqual(channelConfigSchema.parse(raw)?.recordedDate, ISO); const bad = { handling: "youtube", recordedDate: { titlePattern: "no groups" } }; assert.equal("recordedDate" in (parseChannelConfig(bad) ?? {}), false); assert.equal("recordedDate" in (channelConfigSchema.parse(bad) ?? {}), false); }); test("coverage reads the recorded date before the upload date", () => { assert.equal(coverageDate({ uploadDate: "20240310", recordedDate: "20240305" }), "20240305"); assert.equal(coverageDate({ uploadDate: "20240310" }), "20240310"); });