Последняя активность 1737924693

Takes the outbox.json Pixelfed export data and downloads the files and creates markdown files. Great for use with something like 11ty or Astro.

Версия 70bd840f7e91a40201dc7131f78d9814a87ac95b

index.js Исходник
1import { stringify } from "yaml";
2import fs from "node:fs";
3import https from "node:https";
4import sanitize from "sanitize-html";
5
6function omit(obj, props) {
7 obj = { ...obj };
8 props.forEach((prop) => delete obj[prop]);
9 return obj;
10}
11
12function readJsonFile(file = "./outbox.json") {
13 const data = fs.readFileSync(file);
14 return JSON.parse(data);
15}
16
17function processOutbox(outbox) {
18 return outbox.map((item) => {
19 const body = sanitize(item.content, {
20 allowedTags: [],
21 allowedAttributes: {},
22 });
23 return {
24 id: item.id.split("/").at(-1),
25 date: item.published,
26 body,
27 tags: body.match(/(?<=\#)\w*/g),
28 attachments: item.attachment.map((el) => ({
29 altText: el.summary,
30 type: el.mediaType,
31 url: el.url,
32 })),
33 };
34 });
35}
36
37function writeFiles(data, outputDir = "./out") {
38 if (!fs.existsSync(outputDir)) {
39 fs.mkdirSync(outputDir);
40 }
41
42 for (const item of data) {
43 const id = item.id;
44 item.attachments = item.attachments.map((attachment, idx) => {
45 const extension = attachment.url.split(".").at(-1);
46 const fileName = `${id}${idx > 0 ? `-${idx}` : ""}.${extension}`;
47 const fileStream = fs.createWriteStream(`${outputDir}/${fileName}`);
48 https.get(attachment.url, (res) => res.pipe(fileStream));
49 attachment.url = `./${fileName}`;
50 return attachment;
51 });
52 const yaml = stringify(omit(item, ["id"]));
53 const file = `---\n${yaml}---\n\n${item.body}\n`;
54 fs.writeFileSync(`${outputDir}/${id}.md`, file);
55 }
56}
57
58function main() {
59 const outbox = readJsonFile();
60 const processedOutbox = processOutbox(outbox);
61 writeFiles(processedOutbox);
62}
63
64main();
65
package.json Исходник
1{
2 "name": "pixelfed-export-downloader",
3 "version": "1.0.0",
4 "main": "index.js",
5 "scripts": {
6 "start": "node index.js",
7 "test": "echo \"Error: no test specified\" && exit 1"
8 },
9 "keywords": ["pixelfed"],
10 "author": "melanie kat",
11 "license": "ISC",
12 "type": "module",
13 "description": "",
14 "dependencies": {
15 "sanitize-html": "^2.14.0",
16 "yaml": "^2.7.0"
17 }
18}
19