'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, };