diff --git a/scripts/test.js b/scripts/test.js index 2a59e5314..1f0ec9087 100644 --- a/scripts/test.js +++ b/scripts/test.js @@ -1,14 +1,27 @@ -process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0 - +const { program } = require('commander') const helper = require('./helper') -const iptvChecker = require('iptv-checker-module') +const axios = require('axios') +const https = require('https') +const ProgressBar = require('progress') -const config = { - debug: process.env.npm_config_debug || false, - country: process.env.npm_config_country, - exclude: process.env.npm_config_exclude, - timeout: 10000 -} +program + .usage('[OPTIONS]...') + .option('-d, --debug', 'Debug mode') + .option('-c, --country ', 'Comma-separated list of country codes', '') + .option('-e, --exclude ', 'Comma-separated list of country codes to be excluded', '') + .option('--delay ', 'Delay between parser requests', 1000) + .option('--timeout ', 'Set timeout for each request', 5000) + .parse(process.argv) + +const config = program.opts() + +const instance = axios.create({ + timeout: config.timeout, + maxContentLength: 20000, + httpsAgent: new https.Agent({ + rejectUnauthorized: false + }) +}) let stats = { playlists: 0, @@ -22,47 +35,40 @@ async function test() { const countries = helper.filterPlaylists(playlist.items, config.country, config.exclude) for (let country of countries) { - stats.playlists++ + const playlist = helper.parsePlaylist(country.url) + const bar = new ProgressBar(`Processing '${country.url}'...:current/:total\n`, { + total: playlist.items.length + }) - console.log(`Processing '${country.url}'...`) - - const options = { - timeout: config.timeout, - userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', - debug: config.debug, - omitMetadata: true, - parallel: 1, - itemCallback: item => { - stats.channels++ - if ( - !item.status.ok && - item.status.reason !== 'Timed out' && - item.status.reason !== 'Duplicate' && - item.status.reason !== 'Server returned 403 Forbidden (access denied)' - ) { - stats.failures++ - - helper.writeToLog(country.url, item.status.reason, item.url) + stats.playlists++ - console.log(`${item.status.reason} '${item.url}'`) - } - } + for (let channel of playlist.items) { + bar.tick() + stats.channels++ + await instance + .get(channel.url) + .then(helper.sleep(config.delay)) + .catch(error => { + if (error.response) { + stats.failures++ + helper.writeToLog(country.url, error.message, channel.url) + console.log(`Error: ${error.message} '${channel.url}'`) + } + }) } - - await iptvChecker(country.url, options) } if (stats.failures === 0) { - console.log(`OK (${stats.playlists} playlists, ${stats.channels} channels)`) + console.log(`\nOK (${stats.playlists} playlists, ${stats.channels} channels)`) } else { console.log( - `FAILURES! (${stats.playlists} playlists, ${stats.channels} channels, ${stats.failures} failures)` + `\nFAILURES! (${stats.playlists} playlists, ${stats.channels} channels, ${stats.failures} failures)` ) process.exit(1) } } -console.log('Test is running...') +console.log('Test is running...\n') test()