// A cited Wayback Machine copy carries its provenance into compose, and the // links a citation of it shows are derived from that (lib/wayback.ts // waybackCitationLinks): the original at the second, named as the original and // as possibly gone, then the Wayback copy. Every id here is invented. // // Run with: node_modules/.bin/tsx --test publish/composeReportsWayback.test.ts import { test } from "node:test"; import assert from "node:assert/strict"; import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; import { readCitedRecord } from "./composeReports"; import { buildWaybackProvenance, waybackCitationLinks } from "../lib/wayback"; import { platformMomentUrl } from "../lib/momentUrl"; const YT = "Xyz987abc65"; const CAPTURE = `https://web.archive.org/web/20190807060504/https://www.youtube.com/watch?v=${YT}`; test("readCitedRecord loads a Wayback copy's provenance; others get null", async () => { const channels = mkdtempSync(path.join(tmpdir(), "compose-wayback-")); const dir = path.join(channels, "demo-wayback", "data", YT); mkdirSync(dir, { recursive: true }); writeFileSync( path.join(dir, "metadata.info.json"), JSON.stringify({ id: YT, extractor_key: "YoutubeWebArchive", title: "An archived upload", upload_date: "20090102", webpage_url: CAPTURE, }), ); const prov = buildWaybackProvenance(CAPTURE)!; writeFileSync(path.join(dir, "wayback.json"), JSON.stringify(prov)); const rec = await readCitedRecord(channels, "demo-wayback", YT); assert.ok(rec); assert.equal(rec.summary.platform, "youtube"); assert.equal(rec.summary.id, YT); assert.deepEqual(rec.wayback, prov); // The record's own moment link is the capture, which plays. assert.equal(platformMomentUrl(rec.summary.webpageUrl, "youtube", 42), CAPTURE); const links = waybackCitationLinks(rec.wayback!, { originalMomentUrl: platformMomentUrl(rec.wayback!.originalUrl, null, 42), }); assert.deepEqual(links.original, { label: "Original (may be gone)", url: `https://www.youtube.com/watch?v=${YT}&t=42s` }); assert.deepEqual(links.copy, { label: "Wayback Machine copy, 2019-08-07", url: CAPTURE }); const plain = path.join(channels, "demo-wayback", "data", "Plain12345a"); mkdirSync(plain, { recursive: true }); writeFileSync(path.join(plain, "metadata.info.json"), JSON.stringify({ id: "Plain12345a", extractor_key: "Youtube" })); assert.equal((await readCitedRecord(channels, "demo-wayback", "Plain12345a"))?.wayback, null); });