]> git.r.bdr.sh - rbdr/linkding-linkblog-updater/blobdiff - index.js
Make some of the values more generic
[rbdr/linkding-linkblog-updater] / index.js
index 78c3d267e72ad10776b3389122ed0c66149b73ae..518cc79b83c44610a609e824d7c7da1d9d48a30a 100644 (file)
--- a/index.js
+++ b/index.js
@@ -1,55 +1,92 @@
 const { exec } = require('child_process');
 const { resolve, join} = require('path');
 const { rm, writeFile } = require('fs/promises');
-const { debuglog, promisify } = require('util');
+const { promisify } = require('util');
 const Pinboard = require('node-pinboard').default;
 
 const internals = {
   exec: promisify(exec),
-  debuglog: debuglog('blog'),
+
   apiToken: process.env.PINBOARD_TOKEN,
+  blogUrl: process.env.BLOG_URL,
+  archiveUrl: process.env.ARCHIVE_URL,
+  blogPublicUrl: process.env.BLOG_PUBLIC_URL,
+  archivePublicUrl: process.env.ARCHIVE_PUBLIC_URL,
+  tootToken: process.env.TOOT_TOKEN,
+  mastodonDomain: process.env.MASTODON_DOMAIN,
+
   date: (new Date()).toISOString().split('T')[0],
 
-  generateGemtext(posts) {
+  generateGemtext(title, text) {
+
+    return `# ${title}\n\n${text}`;
+  },
+
+  getText(posts) {
 
-    const title = posts.length === 1 ? 'A link' : `${posts.length} links`;
+    return posts.map((post) => {
 
-    const linkText = posts.map((pin) => {
-      return `=> ${pin.href} ${pin.description}\n${pin.extended}`;
+      return `=> ${post.href} ${post.description}\n${post.extended}`;
     }).join('\n\n');
+  },
+
+  getTitle(posts) {
+
+    if (posts.length === 1) {
+      return `Link: ${posts[0].description}`;
+    }
+    return `${posts.length} links for ${internals.date}`;
+  },
+
+  slugify(text) {
 
-    return `# ${title} for ${internals.date}\n\n${linkText}`;
+    return text.toLowerCase().replace(/[^a-z0-9 ]/g, '').replace(/ +/g, '-')
+  },
+
+  async toot(title) {
+
+    const body = new FormData();
+    body.set(
+      'status',
+      `New post: ${title}\n\nAvailable on:\n\nā™Šļø the gemini archive ${internals.archivePublicUrl}\n\n or, the ephemeral blog šŸŒ: ${internals.blogPublicUrl}`
+    );
+    return fetch(`https://${internals.mastodonDomain}/api/v1/statuses`, {
+      method: 'post',
+      headers: {
+        Authorization: `Bearer ${internals.tootToken}`,
+      },
+      body
+    });
   }
+
 };
 
 
 async function run() {
   const pinboard = new Pinboard(internals.apiToken);
-  const getPins = promisify(pinboard.get);
+  const getPins = promisify(pinboard.all);
   const addPin = promisify(pinboard.add);
 
-  internals.debuglog('Fetching Pins');
   const pins = await getPins({ tag: 'linkblog' });
 
-  internals.debuglog(`Found ${pins.posts.length} pins`);
-  if (pins.posts.length === 0) {
+  if (pins.length === 0) {
     console.error('No links to post');
     return;
   }
 
-  internals.debuglog('Generating gemtext');
-  const gemtext = internals.generateGemtext(pins.posts);
-  const gemfile = resolve(join(__dirname, `linkblog-${internals.date}.gmi`));
-  internals.debuglog(`Writing to ${gemfile}`);
+  const title = internals.getTitle(pins);
+  const text = internals.getText(pins);
+  const gemtext = internals.generateGemtext(title, text);
+  const filename = internals.slugify(title);
+
+  const gemfile = resolve(join(__dirname, `${filename}.gmi`));
   await writeFile(gemfile, gemtext);
-  internals.debuglog('Adding gemfile to log');
-  const output = await internals.exec(`blog --add ${gemfile}`);
-  internals.debuglog(output.stderr);
-  internals.debuglog(`Removing ${gemfile}`);
+  await internals.exec(`blog --add ${gemfile}`);
+  await internals.exec(`blog --publish ${internals.blogUrl}`);
+  await internals.exec(`blog --publish-archive ${internals.archiveUrl}`);
   await rm(gemfile);
 
-  for (const pin of pins.posts) {
-    internals.debuglog(`Updating ${pin.href}`);
+  for (const pin of pins) {
     await addPin({
       url: pin.href,
       description: pin.description,
@@ -58,6 +95,10 @@ async function run() {
       tags: pin.tags.replace('linkblog', 'linkblog-posted')
     });
   }
+
+  if (internals.tootToken) {
+    await internals.toot(title);
+  }
 }
 
 run()