diff options
Diffstat (limited to 'index.js')
| -rw-r--r-- | index.js | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/index.js b/index.js new file mode 100644 index 0000000..78c3d26 --- /dev/null +++ b/index.js @@ -0,0 +1,68 @@ +const { exec } = require('child_process'); +const { resolve, join} = require('path'); +const { rm, writeFile } = require('fs/promises'); +const { debuglog, promisify } = require('util'); +const Pinboard = require('node-pinboard').default; + +const internals = { + exec: promisify(exec), + debuglog: debuglog('blog'), + apiToken: process.env.PINBOARD_TOKEN, + date: (new Date()).toISOString().split('T')[0], + + generateGemtext(posts) { + + const title = posts.length === 1 ? 'A link' : `${posts.length} links`; + + const linkText = posts.map((pin) => { + return `=> ${pin.href} ${pin.description}\n${pin.extended}`; + }).join('\n\n'); + + return `# ${title} for ${internals.date}\n\n${linkText}`; + } +}; + + +async function run() { + const pinboard = new Pinboard(internals.apiToken); + const getPins = promisify(pinboard.get); + 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) { + 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}`); + 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 rm(gemfile); + + for (const pin of pins.posts) { + internals.debuglog(`Updating ${pin.href}`); + await addPin({ + url: pin.href, + description: pin.description, + extended: pin.extended, + dt: pin.time, + tags: pin.tags.replace('linkblog', 'linkblog-posted') + }); + } +} + +run() + .then(() => process.exit(0)) + .catch((err) => { + console.error(err); + process.exit(1); + }) |