From c94589664f3a101d482acdd19fa8d7d2786435b5 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Sun, 1 Aug 2021 06:25:04 +0300 Subject: [PATCH] Update format.js --- scripts/format.js | 100 ++++------------------------------------------ 1 file changed, 7 insertions(+), 93 deletions(-) diff --git a/scripts/format.js b/scripts/format.js index 38673dd6b..45a8303a1 100644 --- a/scripts/format.js +++ b/scripts/format.js @@ -1,152 +1,66 @@ const { program } = require('commander') const parser = require('./parser') const utils = require('./utils') -const axios = require('axios') -const ProgressBar = require('progress') -const https = require('https') program .usage('[OPTIONS]...') .option('-d, --debug', 'Debug mode') - .option('-r --resolution', 'Parse stream resolution') .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: 200000, - httpsAgent: new https.Agent({ - rejectUnauthorized: false - }) -}) - async function main() { - console.info('Starting...') - console.time('Done in') + utils.log('Starting...\n') + console.time('\nDone in') const playlists = parseIndex() for (const playlist of playlists) { - await loadPlaylist(playlist.url) - .then(sortChannels) - .then(detectResolution) - .then(savePlaylist) - .then(done) + await loadPlaylist(playlist.url).then(sortChannels).then(savePlaylist) } finish() } function parseIndex() { - console.info(`\nParsing 'index.m3u'...`) + utils.log(`Parsing 'index.m3u'...`) let playlists = parser.parseIndex() playlists = utils .filterPlaylists(playlists, config.country, config.exclude) .filter(i => i.url !== 'channels/unsorted.m3u') - console.info(`Found ${playlists.length} playlist(s)\n`) return playlists } async function loadPlaylist(url) { - console.info(`Processing '${url}'...`) + utils.log(`\nProcessing '${url}'...`) return parser.parsePlaylist(url) } async function sortChannels(playlist) { - console.info(` Sorting channels...`) playlist.channels = utils.sortBy(playlist.channels, ['name', 'url']) return playlist } -async function detectResolution(playlist) { - if (!config.resolution) return playlist - console.log(' Detecting resolution...') - const bar = new ProgressBar(' Progress: [:bar] :current/:total (:percent) ', { - total: playlist.channels.length - }) - const results = [] - for (const channel of playlist.channels) { - bar.tick() - if (!channel.resolution.height) { - const CancelToken = axios.CancelToken - const source = CancelToken.source() - const timeout = setTimeout(() => { - source.cancel() - }, config.timeout) - - const response = await instance - .get(channel.url, { cancelToken: source.token }) - .then(res => { - clearTimeout(timeout) - - return res - }) - .then(utils.sleep(config.delay)) - .catch(err => { - clearTimeout(timeout) - }) - - if (response && response.status === 200) { - if (/^#EXTM3U/.test(response.data)) { - const resolution = parseResolution(response.data) - if (resolution) { - channel.resolution = resolution - } - } - } - } - - results.push(channel) - } - - playlist.channels = results - - return playlist -} - -function parseResolution(string) { - const regex = /RESOLUTION=(\d+)x(\d+)/gm - const match = string.matchAll(regex) - const arr = Array.from(match).map(m => ({ - width: parseInt(m[1]), - height: parseInt(m[2]) - })) - - return arr.length - ? arr.reduce(function (prev, current) { - return prev.height > current.height ? prev : current - }) - : undefined -} - async function savePlaylist(playlist) { const original = utils.readFile(playlist.url) const output = playlist.toString() if (original === output) { - console.info(`No changes have been made.`) return false } else { utils.createFile(playlist.url, output) - console.info(`Playlist has been updated.`) + utils.log(`updated`) } return true } -async function done() { - console.info(` `) -} - function finish() { - console.timeEnd('Done in') + console.timeEnd('\nDone in') } main()