diff --git a/channels/us.m3u b/channels/us.m3u index afc28ba8a8..11117df020 100644 --- a/channels/us.m3u +++ b/channels/us.m3u @@ -6614,3 +6614,5 @@ https://ln-zen.localnowlive.com/v1/master/385c85a93929f94966d0fb186fc33b431e6f1e https://rockentertainment-zoomoo-1.samsung.wurl.com/manifest/playlist.m3u8 #EXTINF:-1 tvg-id="KanalDisney.us" tvg-name="Канал Disney" tvg-country="RU" tvg-language="Russian" tvg-logo="https://i.imgur.com/Q9KoVy9.png" group-title="Kids",Канал Disney (576p) http://188.40.68.167/russia/disney/playlist.m3u8 +#EXTINF:-1 tvg-id="KABCDT2.us" tvg-name="Localish (KABC-DT2)" tvg-country="US" tvg-language="English" tvg-logo="https://zap2it.tmsimg.com/h3/NowShowing/35230/s70938_h3_aa.png" group-title="Local",Localish (KABC-DT2) +https://streams.the6tv.duckdns.org:2443/locals/SoCal/kabc-dt2.m3u8 diff --git a/scripts/clean.js b/scripts/clean.js index fa2cb364be..358b275d26 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -17,7 +17,7 @@ program const config = program.opts() const offlineStatusCodes = [404, 410, 451, 500, 501] -const ignore = ['Geo-blocked', 'Not 24/7'] +const ignoreStatus = ['Geo-blocked', 'Not 24/7', 'Offline'] const instance = axios.create({ timeout: config.timeout, maxContentLength: 200000, @@ -56,9 +56,12 @@ async function checkStatus(playlist) { 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 ( - (channel.status && ignore.map(i => i.toLowerCase()).includes(channel.status.toLowerCase())) || + skipChannel || (!channel.url.startsWith('http://') && !channel.url.startsWith('https://')) ) { channels.push(channel) diff --git a/scripts/detect-resolution.js b/scripts/detect-resolution.js index 5c01841f5d..5da6a282f5 100644 --- a/scripts/detect-resolution.js +++ b/scripts/detect-resolution.js @@ -15,6 +15,7 @@ program .parse(process.argv) const config = program.opts() +const ignoreStatus = ['Offline'] const instance = axios.create({ timeout: config.timeout, maxContentLength: 200000, @@ -50,7 +51,10 @@ async function detectResolution(playlist) { let updated = false for (const channel of playlist.channels) { bar.tick() - if (!channel.resolution.height) { + const skipChannel = + channel.status && + ignoreStatus.map(i => i.toLowerCase()).includes(channel.status.toLowerCase()) + if (!channel.resolution.height && !skipChannel) { const CancelToken = axios.CancelToken const source = CancelToken.source() const timeout = setTimeout(() => { diff --git a/scripts/generate.js b/scripts/generate.js index 6aa31c2245..3a2e6a7a3a 100644 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -42,7 +42,7 @@ function generateIndex() { const nsfwFilename = `${ROOT_DIR}/index.nsfw.m3u` file.create(nsfwFilename, '#EXTM3U\n') - const channels = db.channels.sortBy(['name', 'url']).removeDuplicates().get() + const channels = db.channels.sortBy(['name', 'url']).removeDuplicates().removeOffline().get() for (const channel of channels) { if (!channel.isNSFW()) { file.append(filename, channel.toString()) @@ -56,7 +56,11 @@ function generateCategoryIndex() { const filename = `${ROOT_DIR}/index.category.m3u` file.create(filename, '#EXTM3U\n') - const channels = db.channels.sortBy(['category', 'name', 'url']).removeDuplicates().get() + const channels = db.channels + .sortBy(['category', 'name', 'url']) + .removeDuplicates() + .removeOffline() + .get() for (const channel of channels) { file.append(filename, channel.toString()) } @@ -72,6 +76,7 @@ function generateCountryIndex() { .sortBy(['name', 'url']) .forCountry(country) .removeDuplicates() + .removeOffline() .get() for (const channel of channels) { const groupTitle = channel.group.title @@ -95,6 +100,7 @@ function generateLanguageIndex() { .sortBy(['name', 'url']) .forLanguage(language) .removeDuplicates() + .removeOffline() .get() for (const channel of channels) { const groupTitle = channel.group.title @@ -121,6 +127,7 @@ function generateCategories() { .sortBy(['name', 'url']) .forCategory(category) .removeDuplicates() + .removeOffline() .get() for (const channel of channels) { file.append(filename, channel.toString()) @@ -141,6 +148,7 @@ function generateCountries() { .sortBy(['name', 'url']) .forCountry(country) .removeDuplicates() + .removeOffline() .get() for (const channel of channels) { if (!channel.isNSFW()) { @@ -163,6 +171,7 @@ function generateLanguages() { .sortBy(['name', 'url']) .forLanguage(language) .removeDuplicates() + .removeOffline() .get() for (const channel of channels) { if (!channel.isNSFW()) { diff --git a/scripts/helpers/db.js b/scripts/helpers/db.js index 417742f847..f94ce678a1 100644 --- a/scripts/helpers/db.js +++ b/scripts/helpers/db.js @@ -31,6 +31,7 @@ db.channels = { list: [], filter: null, duplicates: true, + offline: true, nsfw: true, add(channel) { this.list.push(channel) @@ -86,8 +87,13 @@ db.channels = { output = output.filter(channel => !channel.isNSFW()) } + if (!this.offline) { + output = output.filter(channel => channel.status !== 'Offline') + } + this.nsfw = true this.duplicates = true + this.offline = true this.filter = null return output @@ -102,6 +108,11 @@ db.channels = { return this }, + removeOffline() { + this.offline = false + + return this + }, all() { return this.list },