'use strict'; const config = require('config'); const moment = require('moment'); const knex = require('./knex'); const scrapers = require('./scrapers'); function destructConfigNetworks(networks) { return networks.reduce((acc, network) => { if (Array.isArray(network)) { // network specifies sites return { ...acc, sites: [...acc.sites, ...network[1]], }; } return { ...acc, networks: [...acc.networks, network], }; }, { networks: [], sites: [], }); } function curateSites(sites) { return sites.map(site => ({ id: site.id, name: site.name, description: site.description, url: site.url, networkId: site.network_id, parameters: JSON.parse(site.parameters), })); } async function accumulateIncludedSites() { const included = destructConfigNetworks(config.include); const rawSites = await knex('sites') .whereIn('id', included.sites) .orWhereIn('network_id', included.networks); return curateSites(rawSites); } async function fetchReleases() { const sites = await accumulateIncludedSites(); const scenesPerSite = await Promise.all(sites.map(async (site) => { const scraper = scrapers[site.id] || scrapers[site.networkId]; if (scraper) { const [latest, upcoming] = await Promise.all([ scraper.fetchLatest(site), scraper.fetchUpcoming ? scraper.fetchUpcoming(site) : [], ]); return [...latest, ...upcoming]; } return []; })); const accumulatedScenes = scenesPerSite.reduce((acc, siteScenes) => ([...acc, ...siteScenes]), []); const sortedScenes = accumulatedScenes.sort(({ date: dateA }, { date: dateB }) => moment(dateB).diff(dateA)); return sortedScenes; } module.exports = fetchReleases;