#! /usr/bin/env node const fs = require('fs') const path = require('path') const axios = require('axios') const axiosDelayAdapter = require('axios-delay').default const utils = require('./utils') const { Command } = require('commander') const program = new Command() const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') dayjs.extend(utc) program .version('0.1.0', '-v, --version') .name('epg-grabber') .description('EPG grabber') .usage('[options] [file-or-url]') .option('-c, --config ', 'Path to config.xml file', './config.xml') .option('-s, --sites ', 'Path to /sites folder', './sites') .parse(process.argv) const options = program.opts() const config = utils.parseConfig(options.config) const sites = utils.loadSites(options.sites) const client = axios.create({ adapter: axiosDelayAdapter(axios.defaults.adapter), headers: { 'User-Agent': config.userAgent } }) async function main() { const d = dayjs.utc() const dates = Array.from({ length: config.days }, (_, i) => d.add(i, 'd')) const channels = config.channels const requests = [] channels.forEach(channel => { const site = sites[channel.site] dates.forEach(date => { const url = site.url({ date, channel }) const promise = client.get(url).catch(console.log) requests.push({ url, site, channel, promise }) }) }) let programs = [] for (let request of requests) { const progs = await request.promise .then(response => { const channel = request.channel console.log(`${channel.site} - ${channel.xmltv_id}`) return request.site.parser({ channel, content: response.data }) }) .then(utils.sleep(3000)) programs = programs.concat(progs) } const xml = utils.convertToXMLTV({ channels, programs }) fs.writeFileSync(path.resolve(__dirname, config.filename), xml) } main()