parent
69bf2bf61b
commit
66d0fd3e69
@ -1 +1,2 @@
|
||||
yarnPath: ".yarn/releases/yarn-berry.cjs"
|
||||
nodeLinker: node-modules
|
||||
|
@ -0,0 +1,45 @@
|
||||
const got = require("got");
|
||||
const { createWriteStream } = require("fs");
|
||||
const { pipeline } = require('stream/promises');
|
||||
const { existsSync } = require('fs');
|
||||
const fsp = require('fs').promises;
|
||||
const { dirname } = require('path');
|
||||
|
||||
/**
|
||||
* config example: {
|
||||
* endpoint: "https://bla.com",
|
||||
* directory: "dir/to/save/to",
|
||||
* override: true, // optional
|
||||
* extension: "jpg" // optional
|
||||
* }
|
||||
**/
|
||||
async function getPictures(webmentions, config) {
|
||||
const pics = await Promise.all(
|
||||
webmentions.filter(wm => wm.author && wm.author.picture).map(async wm => {
|
||||
let fileName = `${config.directory}/${wm.author.picture}`
|
||||
if(config.extension && !fileName.endsWith(config.extension)) {
|
||||
fileName += `.${config.extension}`
|
||||
}
|
||||
|
||||
if(config.override || !existsSync(fileName)) {
|
||||
try {
|
||||
await fsp.mkdir(dirname(fileName), { recursive: true }),
|
||||
// retry API with streams is ridiculously complicated: https://github.com/sindresorhus/got/blob/main/documentation/7-retry.md
|
||||
await pipeline(
|
||||
got.stream(`${config.endpoint}/${wm.author.picture}`),
|
||||
createWriteStream(fileName)
|
||||
)
|
||||
} catch(err) {
|
||||
console.log(` !! unable to download ${wm.author.picture}: ${err.message}`)
|
||||
await fsp.unlink(fileName)
|
||||
}
|
||||
}
|
||||
return fileName
|
||||
})
|
||||
)
|
||||
return pics
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getPictures
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
const fs = require('fs');
|
||||
const fsp = require('fs').promises;
|
||||
const { rmdir } = require('./../utils')
|
||||
const { getFiles } = require('../../src/file-utils');
|
||||
|
||||
const dumpdir = `${__dirname}/dump`
|
||||
|
||||
beforeEach(async () => {
|
||||
if(fs.existsSync(dumpdir)) {
|
||||
rmdir(dumpdir)
|
||||
}
|
||||
fs.mkdirSync(dumpdir)
|
||||
})
|
||||
|
||||
jest.disableAutomock()
|
||||
jest.unmock('got')
|
||||
|
||||
describe("webmention downloading of author pictures", () => {
|
||||
|
||||
const { getPictures } = require('./../../src/webmention/pictures')
|
||||
|
||||
test("getPictures does not write a file if error occurs", async () => {
|
||||
await getPictures([{
|
||||
author: {
|
||||
picture: '/unknownshit.lolz'
|
||||
}
|
||||
}], {
|
||||
endpoint: 'https://brainbaking.com/',
|
||||
directory: dumpdir,
|
||||
extension: "png"
|
||||
})
|
||||
|
||||
const output = await getFiles(dumpdir)
|
||||
expect(output.length).toBe(0)
|
||||
})
|
||||
|
||||
test("getPictures adds extension if not yet present", async () => {
|
||||
await getPictures([{
|
||||
author: {
|
||||
picture: '/img/avatar.jpg'
|
||||
}
|
||||
}], {
|
||||
endpoint: 'https://brainbaking.com/',
|
||||
directory: dumpdir,
|
||||
extension: "png"
|
||||
})
|
||||
|
||||
const output = fs.readFileSync(`${dumpdir}/img/avatar.jpg.png`).toString()
|
||||
expect(output).not.toBe(null)
|
||||
})
|
||||
|
||||
test("getPictures does not override existing picture if flag is set", async () => {
|
||||
fs.mkdirSync(`${dumpdir}/img`)
|
||||
fs.writeFileSync(`${dumpdir}/img/avatar.jpg`, "dummy", "utf8")
|
||||
await getPictures([{
|
||||
author: {
|
||||
picture: '/img/avatar.jpg'
|
||||
}
|
||||
}], {
|
||||
endpoint: 'https://brainbaking.com/',
|
||||
directory: dumpdir
|
||||
})
|
||||
|
||||
const output = fs.readFileSync(`${dumpdir}/img/avatar.jpg`).toString()
|
||||
expect(output).toBe("dummy")
|
||||
})
|
||||
|
||||
test("getPictures downloads author picture if present and overrides", async () => {
|
||||
fs.mkdirSync(`${dumpdir}/img`)
|
||||
fs.writeFileSync(`${dumpdir}/img/avatar.jpg`, "dummy", "utf8")
|
||||
|
||||
await getPictures([{
|
||||
author: {
|
||||
picture: '/img/avatar.jpg'
|
||||
}
|
||||
}, {
|
||||
author: {
|
||||
}
|
||||
}], {
|
||||
endpoint: 'https://brainbaking.com/',
|
||||
directory: dumpdir
|
||||
})
|
||||
|
||||
const output = await getFiles(dumpdir)
|
||||
expect(output.length).toBe(1)
|
||||
|
||||
const firstFile = fs.readFileSync(`${dumpdir}/img/avatar.jpg`).toString()
|
||||
expect(output).not.toBe("dummy")
|
||||
})
|
||||
|
||||
})
|
Loading…
Reference in new issue