ripunzel/src/methods/imgurImage.js

83 lines
2.0 KiB
JavaScript

'use strict';
const config = require('config');
const fetch = require('node-fetch');
async function fetchPredata() {
const data = {
limit: 0,
remaining: 0,
};
data.setRemaining = (remaining) => {
data.remaining = remaining;
};
const res = await fetch('https://api.imgur.com/3/credits', {
headers: {
Authorization: `Client-ID ${config.methods.imgur.clientId}`,
},
});
if (res.ok) {
const body = await res.json();
if (body.success) {
data.limit = body.data.UserLimit;
data.remaining = body.data.UserRemaining;
}
}
return data;
}
async function imgurImageApi(host, post, { predata }) {
if (predata.remaining === 10) { // keep a buffer
throw new Error(`Reached Imgur API rate limit with source '${host.url}'`);
}
const res = await fetch(`https://api.imgur.com/3/image/${host.id}`, {
headers: {
Authorization: `Client-ID ${config.methods.imgur.clientId}`,
},
});
const rateRemaining = Number(res.headers.get('x-ratelimit-userremaining'));
if (rateRemaining) {
predata.setRemaining(rateRemaining);
}
if (!res.ok) {
throw new Error(`Imgur API returned HTTP ${res.status} for source '${host.url}'`);
}
const { data } = await res.json();
if (res.status !== 200) {
throw new Error(`Could not fetch info for imgur image '${host.id}': ${data.error}`);
}
return {
album: null,
items: [{
id: data.id,
url: data.animated ? data.mp4 : data.link,
title: data.title,
description: data.description,
type: data.animated ? 'video/mp4' : data.type,
datetime: new Date(data.datetime * 1000),
original: data,
}],
};
}
async function imgurImage(host, post, context) {
return imgurImageApi(host, post, context);
}
module.exports = {
fetchInfo: imgurImage,
fetchPredata,
};