X-Git-Url: https://git.r.bdr.sh/rbdr/linkding-linkblog-updater/blobdiff_plain/2390d230fa9ff119cddd90250c83ebb220947c0d..9d9552d186c136c8252a5a5b1abc972279624061:/index.js diff --git a/index.js b/index.js index e1aaebf..518cc79 100644 --- a/index.js +++ b/index.js @@ -10,43 +10,83 @@ const internals = { 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) { - const title = posts.length === 1 ? 'A link' : `${posts.length} links`; + return `# ${title}\n\n${text}`; + }, - const linkText = posts.map((pin) => { - return `=> ${pin.href} ${pin.description}\n${pin.extended}`; + getText(posts) { + + return posts.map((post) => { + + 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 text.toLowerCase().replace(/[^a-z0-9 ]/g, '').replace(/ +/g, '-') + }, - return `# ${title} for ${internals.date}\n\n${linkText}`; + 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); const pins = await getPins({ tag: 'linkblog' }); - if (pins.posts.length === 0) { + if (pins.length === 0) { console.error('No links to post'); return; } - const gemtext = internals.generateGemtext(pins.posts); - const gemfile = resolve(join(__dirname, `linkblog-${internals.date}.gmi`)); + 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); 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) { + for (const pin of pins) { await addPin({ url: pin.href, description: pin.description, @@ -55,6 +95,10 @@ async function run() { tags: pin.tags.replace('linkblog', 'linkblog-posted') }); } + + if (internals.tootToken) { + await internals.toot(title); + } } run()