diff --git a/scripts/clean.js b/scripts/clean.js index 358b275d26..87536695b3 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -1,93 +1,68 @@ +const IPTVChecker = require('iptv-checker') const { program } = require('commander') const ProgressBar = require('progress') -const axios = require('axios') -const https = require('https') -const chalk = require('chalk') const parser = require('./helpers/parser') const utils = require('./helpers/utils') const log = require('./helpers/log') program .usage('[OPTIONS]...') + .option('-d, --debug', 'Enable 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) +let bar const config = program.opts() -const offlineStatusCodes = [404, 410, 451, 500, 501] const ignoreStatus = ['Geo-blocked', 'Not 24/7', 'Offline'] -const instance = axios.create({ - timeout: config.timeout, - maxContentLength: 200000, - httpsAgent: new https.Agent({ - rejectUnauthorized: false - }), - validateStatus: function (status) { - return !offlineStatusCodes.includes(status) - } +const checker = new IPTVChecker({ + timeout: config.timeout }) -let broken = 0 - async function main() { log.start() + if (config.debug) log.print(`Debug mode enabled\n`) + log.print(`Parsing 'index.m3u'...`) let playlists = parser.parseIndex() playlists = utils.filterPlaylists(playlists, config.country, config.exclude) for (const playlist of playlists) { await parser .parsePlaylist(playlist.url) - .then(checkStatus) + .then(checkPlaylist) .then(p => p.save()) } log.finish() } -async function checkStatus(playlist) { - let bar = new ProgressBar(`Checking '${playlist.url}': [:bar] :current/:total (:percent) `, { +async function checkPlaylist(playlist) { + bar = new ProgressBar(`Checking '${playlist.url}': [:bar] :current/:total (:percent) `, { total: playlist.channels.length }) const channels = [] const total = playlist.channels.length for (const [index, channel] of playlist.channels.entries()) { - const current = index + 1 - const counter = chalk.gray(`[${current}/${total}]`) const skipChannel = channel.status && ignoreStatus.map(i => i.toLowerCase()).includes(channel.status.toLowerCase()) - bar.tick() - if ( - skipChannel || - (!channel.url.startsWith('http://') && !channel.url.startsWith('https://')) - ) { + if (skipChannel) { channels.push(channel) } else { - const CancelToken = axios.CancelToken - const source = CancelToken.source() - const timeout = setTimeout(() => { - source.cancel() - }, config.timeout) - - await instance - .get(channel.url, { cancelToken: source.token }) - .then(() => { - clearTimeout(timeout) - channels.push(channel) - }) - .then(utils.sleep(config.delay)) - .catch(err => { - clearTimeout(timeout) - if (err.response && offlineStatusCodes.includes(err.response.status)) { - broken++ - } else { - channels.push(channel) - } - }) + const result = await checker.checkStream(channel.data) + if ( + result.status.ok || + result.status.reason.includes('timed out') || + result.status.reason.includes('access denied') + ) { + channels.push(channel) + } else { + if (config.debug) bar.interrupt(`ERR: ${channel.url}: ${result.status.reason}`) + } } + bar.tick() } if (playlist.channels.length !== channels.length) {