Files

66 lines
2.0 KiB
JavaScript

import { mkdir, copyFile, readFile, readdir, writeFile } from "node:fs/promises";
import { existsSync } from "node:fs";
import path from "node:path";
const root = process.cwd();
const sourceDir = path.join(root, "images", "facebook-060426");
const manifestPath = path.join(root, "tmp", "facebook-060426-manifest.json");
const targetDir = path.join(root, "public", "images", "family-lab", "facebook-060426");
const targetManifest = path.join(targetDir, "manifest.json");
const supported = new Set([".jpg", ".jpeg", ".png", ".webp", ".gif"]);
function titleFromFilename(filename) {
const stem = path.parse(filename).name;
return stem
.replace(/^\d+_[0-9a-z]+_/i, "")
.replace(/[_-]+/g, " ")
.replace(/\s+/g, " ")
.trim() || "Untitled Photo";
}
function fallbackRowsFromFiles(files) {
return files.map((filename) => ({
filename,
title: titleFromFilename(filename),
description: "Family archive snapshot awaiting fuller annotation.",
tags: ["family"],
duplicate_of: null,
named_file: !/^\d{6,}_/.test(filename) && !/^unnamed/i.test(filename),
}));
}
async function main() {
await mkdir(targetDir, { recursive: true });
const sourceFiles = (await readdir(sourceDir))
.filter((filename) => supported.has(path.extname(filename).toLowerCase()))
.sort((a, b) => a.localeCompare(b));
let rows;
if (existsSync(manifestPath)) {
rows = JSON.parse(await readFile(manifestPath, "utf-8"));
} else {
rows = fallbackRowsFromFiles(sourceFiles);
}
const uniqueRows = rows
.filter((row) => !row.duplicate_of)
.map((row) => ({
...row,
src: `/images/family-lab/facebook-060426/${row.filename}`,
}));
for (const row of uniqueRows) {
await copyFile(path.join(sourceDir, row.filename), path.join(targetDir, row.filename));
}
await writeFile(targetManifest, `${JSON.stringify(uniqueRows, null, 2)}\n`, "utf-8");
console.log(`Family lab synced: ${uniqueRows.length} unique photos`);
}
main().catch((error) => {
console.error(error);
process.exit(1);
});