164 lines
3.9 KiB
JavaScript
164 lines
3.9 KiB
JavaScript
'use strict';
|
|
|
|
const fetch = require('node-fetch');
|
|
const mime = require('mime');
|
|
// const unprint = require('unprint');
|
|
|
|
const { version } = require('../../package.json');
|
|
|
|
async function fetchPredata() {
|
|
const userAgent = `ripunzel/${version}`;
|
|
const res = await fetch('https://api.redgifs.com/v2/auth/temporary', {
|
|
headers: {
|
|
'user-agent': userAgent,
|
|
},
|
|
});
|
|
|
|
const data = await res.json();
|
|
|
|
if (res.ok) {
|
|
return {
|
|
address: data.addr,
|
|
agent: data.agent,
|
|
token: data.token,
|
|
};
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
function scrapeGallery(data, { predata }) {
|
|
const oldestDate = Math.min(...data.gifs.map((gif) => gif.createDate));
|
|
|
|
const curated = {
|
|
album: {
|
|
id: data.id,
|
|
datetime: new Date(oldestDate * 1000),
|
|
},
|
|
items: data.gifs.map((gif) => ({
|
|
id: gif.id,
|
|
url: gif.urls.hd,
|
|
description: gif.tags.join(', '),
|
|
type: mime.getType(new URL(gif.urls.hd).pathname.slice(1)),
|
|
datetime: new Date(gif.createDate * 1000),
|
|
original: gif,
|
|
})),
|
|
headers: {
|
|
'user-agent': predata.agent,
|
|
},
|
|
};
|
|
|
|
return curated;
|
|
}
|
|
|
|
async function fetchGallery(galleryId, { predata }) {
|
|
const res = await fetch(`https://api.redgifs.com/v2/gallery/${galleryId}`, {
|
|
headers: {
|
|
authorization: `Bearer ${predata.token}`,
|
|
'user-agent': predata.agent,
|
|
},
|
|
});
|
|
|
|
const data = await res.json();
|
|
|
|
if (!data.gifs) {
|
|
return null;
|
|
}
|
|
|
|
return scrapeGallery(data, { predata });
|
|
}
|
|
|
|
async function redgifsApi(host, post, { predata }) {
|
|
if (!predata?.token) {
|
|
throw new Error('No RedGifs token provided');
|
|
}
|
|
|
|
const res = await fetch(`https://api.redgifs.com/v2/gifs/${host.id.toLowerCase()}`, {
|
|
headers: {
|
|
authorization: `Bearer ${predata.token}`,
|
|
'user-agent': predata.agent,
|
|
},
|
|
});
|
|
|
|
const data = await res.json();
|
|
|
|
if (data.errorMessage || data.error) {
|
|
throw new Error(`RedGifs API returned error for source '${host.url}' (${res.status}): ${data.errorMessage?.description || data.error?.description}`);
|
|
}
|
|
|
|
if (data.id && data.gifs) {
|
|
return scrapeGallery(data, { predata });
|
|
}
|
|
|
|
if (!data.gif) {
|
|
return null;
|
|
}
|
|
|
|
if (data.gif.gallery) {
|
|
return fetchGallery(data.gif.gallery, { predata });
|
|
}
|
|
|
|
const curated = {
|
|
album: null,
|
|
items: [{
|
|
id: data.gif.id,
|
|
url: data.gif.urls.hd,
|
|
description: data.gif.tags.join(', '),
|
|
type: mime.getType(new URL(data.gif.urls.hd).pathname),
|
|
datetime: new Date(data.gif.createDate * 1000),
|
|
original: data.gif,
|
|
}],
|
|
headers: {
|
|
'user-agent': predata.agent,
|
|
},
|
|
};
|
|
|
|
return curated;
|
|
}
|
|
|
|
async function redgifs(host, post, { predata }) {
|
|
if (predata?.token) {
|
|
return redgifsApi(host, post, { predata });
|
|
}
|
|
|
|
throw new Error('No RedGifs token provided');
|
|
|
|
/*
|
|
const res = await unprint.get(host.url);
|
|
|
|
if (!res.ok) {
|
|
throw new Error(`RedGifs returned error for source '${host.url}' (${res.status})`);
|
|
}
|
|
|
|
const data = res.context.query.json('script[type="application/ld+json"]');
|
|
|
|
if (!data.video) {
|
|
return null;
|
|
}
|
|
|
|
// console.log(data);
|
|
|
|
const curatedData = {
|
|
album: null,
|
|
items: [{
|
|
id: host.id,
|
|
url: data.video.contentUrl,
|
|
description: data.video.keywords,
|
|
type: mime.getType(new URL(data.video.contentUrl).pathname),
|
|
datetime: new Date(data.video.uploadDate),
|
|
original: data.video,
|
|
}],
|
|
};
|
|
|
|
// console.log(curatedData);
|
|
return null;
|
|
|
|
// return curatedData;
|
|
*/
|
|
}
|
|
|
|
module.exports = {
|
|
fetchInfo: redgifs,
|
|
fetchPredata,
|
|
};
|