UNPKG

@acephale-green-party/coomer-downloader

Version:

Downloads images/videos from Coomer/Kemono/Reddit-NSFW user posts

49 lines (37 loc) 1.34 kB
import * as cheerio from 'cheerio'; import { testMediaType, fetch } from './../utils.js'; async function getPageFile(url) { const page = await fetch(url).then((r) => r.text()); const $ = cheerio.load(page); const name = $('title').text().split('|')[0].trim(); const src0 = Array.from($('a').map((_, e) => $(e).attr('href'))) .filter((a) => /\/file\/\w+/.test(a)) .pop(); const page2 = await fetch(src0).then((r) => r.text()); const $2 = cheerio.load(page2); const src = $2('a').first().attr('href'); return { name, src }; } async function getGalleryFiles(url, mediaType) { const data = []; const page = await fetch(url).then((r) => r.text()); const $ = cheerio.load(page); const title = $('title').text(); const url_ = new URL(url); const fileLinks = Array.from($('a').map((_, e) => $(e).attr('href'))) .filter((a) => /\/f\/\w+/.test(a)) .map((a) => `${url_.origin}${a}`); for (const fileLink of fileLinks) { const res = await getPageFile(fileLink); data.push(res); } return { title, data: data.filter((f) => testMediaType(f.name, mediaType)), }; } export async function getBunkrData(url, mediaType) { const { data: files, title } = await getGalleryFiles(url, mediaType); const dirName = `${title.split('|')[0].trim()}-bunkr`; return { dirName, files }; }