From 3b95579c735640faf23d0601faedfeac6d724728 Mon Sep 17 00:00:00 2001 From: freearhey Date: Sat, 24 Apr 2021 15:42:29 +0300 Subject: [PATCH 1/8] Update parser.js - renamed toJSON() to toObject() - created method getInfo() --- scripts/parser.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/parser.js b/scripts/parser.js index 5def3eacb..b410b732e 100644 --- a/scripts/parser.js +++ b/scripts/parser.js @@ -181,7 +181,7 @@ class Channel { return '' } - toString(short = false) { + getInfo(short = false) { this.tvg.country = this.tvg.country.toUpperCase() let info = `-1 tvg-id="${this.tvgId}" tvg-name="${this.tvgName}" tvg-country="${this.tvg.country}" tvg-language="${this.tvg.language}" tvg-logo="${this.logo}"` @@ -208,10 +208,16 @@ class Channel { info += `\n#EXTVLCOPT:http-user-agent=${this.http['user-agent']}` } + return info + } + + toString(short = false) { + const info = this.getInfo(short) + return '#EXTINF:' + info + '\n' + this.url + '\n' } - toJSON() { + toObject() { return { name: this.name, logo: this.logo || null, From f5dc1387ce17e5c6d6cf038b9676aef6e512863a Mon Sep 17 00:00:00 2001 From: freearhey Date: Sat, 24 Apr 2021 15:44:04 +0300 Subject: [PATCH 2/8] Update generate.js Comparing each link description with the buffer --- scripts/generate.js | 106 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 93 insertions(+), 13 deletions(-) diff --git a/scripts/generate.js b/scripts/generate.js index 369483ecd..49071fd57 100644 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -35,9 +35,16 @@ function generateIndex() { const filename = `${ROOT_DIR}/index.m3u` utils.createFile(filename, '#EXTM3U\n') + const buffer = [] const channels = db.channels.sortBy(['name', 'url']).all() for (const channel of channels) { - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } } } @@ -46,9 +53,16 @@ function generateSFWIndex() { const filename = `${ROOT_DIR}/index.sfw.m3u` utils.createFile(filename, '#EXTM3U\n') + const buffer = [] const channels = db.channels.sortBy(['name', 'url']).sfw() for (const channel of channels) { - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } } } @@ -58,7 +72,7 @@ function generateChannelsJson() { const channels = db.channels .sortBy(['name', 'url']) .all() - .map(c => c.toJSON()) + .map(c => c.toObject()) utils.createFile(filename, JSON.stringify(channels)) } @@ -75,12 +89,17 @@ function generateCountryIndex() { channel.category = category } + const buffer = [] const playlists = db.playlists.sortBy(['country']).except(['unsorted']) for (const playlist of playlists) { for (const channel of playlist.channels) { const category = channel.category channel.category = playlist.country - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + buffer.push(info) + } channel.category = category } } @@ -91,21 +110,33 @@ function generateLanguageIndex() { const filename = `${ROOT_DIR}/index.language.m3u` utils.createFile(filename, '#EXTM3U\n') + const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forLanguage({ code: null }).get() for (const channel of channels) { const category = channel.category channel.category = '' - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } channel.category = category } const languages = db.languages.sortBy(['name']).all() for (const language of languages) { + const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forLanguage(language).get() for (const channel of channels) { const category = channel.category channel.category = language.name - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + buffer.push(info) + } channel.category = category } } @@ -116,9 +147,16 @@ function generateCategoryIndex() { const filename = `${ROOT_DIR}/index.category.m3u` utils.createFile(filename, '#EXTM3U\n') + const buffer = [] const channels = db.channels.sortBy(['category', 'name', 'url']).all() for (const channel of channels) { - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } } } @@ -131,17 +169,31 @@ function generateCategories() { const filename = `${outputDir}/${category.id}.m3u` utils.createFile(filename, '#EXTM3U\n') + const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forCategory(category).get() for (const channel of channels) { - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } } } + const buffer = [] const other = `${outputDir}/other.m3u` const channels = db.channels.sortBy(['name', 'url']).forCategory({ id: null }).get() utils.createFile(other, '#EXTM3U\n') for (const channel of channels) { - utils.appendToFile(other, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(other, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } } } @@ -154,17 +206,31 @@ function generateCountries() { const filename = `${outputDir}/${country.code}.m3u` utils.createFile(filename, '#EXTM3U\n') + const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forCountry(country).get() for (const channel of channels) { - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } } } + const buffer = [] const other = `${outputDir}/undefined.m3u` const channels = db.channels.sortBy(['name', 'url']).forCountry({ code: null }).get() utils.createFile(other, '#EXTM3U\n') for (const channel of channels) { - utils.appendToFile(other, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(other, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } } } @@ -177,17 +243,31 @@ function generateLanguages() { const filename = `${outputDir}/${language.code}.m3u` utils.createFile(filename, '#EXTM3U\n') + const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forLanguage(language).get() for (const channel of channels) { - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } } } + const buffer = [] const other = `${outputDir}/undefined.m3u` const channels = db.channels.sortBy(['name', 'url']).forLanguage({ code: null }).get() utils.createFile(other, '#EXTM3U\n') for (const channel of channels) { - utils.appendToFile(other, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(other, channel.toString()) + if (channel.filename !== 'unsorted') { + buffer.push(info) + } + } } } From ed490849fb916dd0e6b492de914a4ef88061a580 Mon Sep 17 00:00:00 2001 From: freearhey Date: Sat, 24 Apr 2021 16:11:19 +0300 Subject: [PATCH 3/8] Update generate.js Removed extra check --- scripts/generate.js | 49 +++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/scripts/generate.js b/scripts/generate.js index 49071fd57..8afdfcaf0 100644 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -41,9 +41,7 @@ function generateIndex() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } } } @@ -59,9 +57,7 @@ function generateSFWIndex() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } } } @@ -81,15 +77,19 @@ function generateCountryIndex() { const filename = `${ROOT_DIR}/index.country.m3u` utils.createFile(filename, '#EXTM3U\n') + const buffer = [] const unsorted = db.playlists.only(['unsorted'])[0] for (const channel of unsorted.channels) { const category = channel.category channel.category = '' - utils.appendToFile(filename, channel.toString()) + const info = channel.getInfo() + if (!buffer.includes(info)) { + utils.appendToFile(filename, channel.toString()) + buffer.push(info) + } channel.category = category } - const buffer = [] const playlists = db.playlists.sortBy(['country']).except(['unsorted']) for (const playlist of playlists) { for (const channel of playlist.channels) { @@ -118,16 +118,13 @@ function generateLanguageIndex() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } channel.category = category } const languages = db.languages.sortBy(['name']).all() for (const language of languages) { - const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forLanguage(language).get() for (const channel of channels) { const category = channel.category @@ -153,9 +150,7 @@ function generateCategoryIndex() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } } } @@ -175,9 +170,7 @@ function generateCategories() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } } } @@ -190,9 +183,7 @@ function generateCategories() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(other, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } } } @@ -212,9 +203,7 @@ function generateCountries() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } } } @@ -227,9 +216,7 @@ function generateCountries() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(other, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } } } @@ -249,9 +236,7 @@ function generateLanguages() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } } } @@ -264,9 +249,7 @@ function generateLanguages() { const info = channel.getInfo() if (!buffer.includes(info)) { utils.appendToFile(other, channel.toString()) - if (channel.filename !== 'unsorted') { - buffer.push(info) - } + buffer.push(info) } } } From 5a2b11104b0e63acd57926e80572cbdf660b6b54 Mon Sep 17 00:00:00 2001 From: freearhey Date: Fri, 7 May 2021 19:18:28 +0300 Subject: [PATCH 4/8] Update generate.js --- scripts/generate.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scripts/generate.js b/scripts/generate.js index 8afdfcaf0..c982bac2f 100644 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -38,7 +38,7 @@ function generateIndex() { const buffer = [] const channels = db.channels.sortBy(['name', 'url']).all() for (const channel of channels) { - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -54,7 +54,7 @@ function generateSFWIndex() { const buffer = [] const channels = db.channels.sortBy(['name', 'url']).sfw() for (const channel of channels) { - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -82,7 +82,7 @@ function generateCountryIndex() { for (const channel of unsorted.channels) { const category = channel.category channel.category = '' - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -95,7 +95,7 @@ function generateCountryIndex() { for (const channel of playlist.channels) { const category = channel.category channel.category = playlist.country - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -115,7 +115,7 @@ function generateLanguageIndex() { for (const channel of channels) { const category = channel.category channel.category = '' - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -129,7 +129,7 @@ function generateLanguageIndex() { for (const channel of channels) { const category = channel.category channel.category = language.name - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -147,7 +147,7 @@ function generateCategoryIndex() { const buffer = [] const channels = db.channels.sortBy(['category', 'name', 'url']).all() for (const channel of channels) { - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -167,7 +167,7 @@ function generateCategories() { const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forCategory(category).get() for (const channel of channels) { - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -180,7 +180,7 @@ function generateCategories() { const channels = db.channels.sortBy(['name', 'url']).forCategory({ id: null }).get() utils.createFile(other, '#EXTM3U\n') for (const channel of channels) { - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(other, channel.toString()) buffer.push(info) @@ -200,7 +200,7 @@ function generateCountries() { const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forCountry(country).get() for (const channel of channels) { - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -213,7 +213,7 @@ function generateCountries() { const channels = db.channels.sortBy(['name', 'url']).forCountry({ code: null }).get() utils.createFile(other, '#EXTM3U\n') for (const channel of channels) { - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(other, channel.toString()) buffer.push(info) @@ -233,7 +233,7 @@ function generateLanguages() { const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forLanguage(language).get() for (const channel of channels) { - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(filename, channel.toString()) buffer.push(info) @@ -246,7 +246,7 @@ function generateLanguages() { const channels = db.channels.sortBy(['name', 'url']).forLanguage({ code: null }).get() utils.createFile(other, '#EXTM3U\n') for (const channel of channels) { - const info = channel.getInfo() + const info = channel.toString() if (!buffer.includes(info)) { utils.appendToFile(other, channel.toString()) buffer.push(info) From f53d664680df4e435381deb95499ecd25ac2be82 Mon Sep 17 00:00:00 2001 From: freearhey Date: Fri, 7 May 2021 19:18:31 +0300 Subject: [PATCH 5/8] Update parser.js --- scripts/parser.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/parser.js b/scripts/parser.js index b4ac08341..0e7e5e298 100644 --- a/scripts/parser.js +++ b/scripts/parser.js @@ -183,9 +183,7 @@ class Channel { return '' } - toString(raw = false) { - if (raw) return this.raw + '\n' - + getInfo() { this.tvg.country = this.tvg.country.toUpperCase() let info = `-1 tvg-id="${this.tvgId}" tvg-name="${this.tvgName}" tvg-country="${this.tvg.country}" tvg-language="${this.tvg.language}" tvg-logo="${this.logo}"` @@ -211,8 +209,10 @@ class Channel { return info } - toString(short = false) { - const info = this.getInfo(short) + toString(raw = false) { + if (raw) return this.raw + '\n' + + const info = this.getInfo() return '#EXTINF:' + info + '\n' + this.url + '\n' } From ed60663c88e5cd4ecdc5ddc57e9a3a566cf76832 Mon Sep 17 00:00:00 2001 From: freearhey Date: Sat, 8 May 2021 14:53:42 +0300 Subject: [PATCH 6/8] Update generate.js --- scripts/generate.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/generate.js b/scripts/generate.js index 08e5d7d33..8092f946c 100644 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -13,8 +13,8 @@ function main() { generateCountryIndex() generateLanguageIndex() generateCategories() - generateLanguages() generateCountries() + generateLanguages() generateChannelsJson() finish() } @@ -205,7 +205,7 @@ function generateChannelsJson() { const channels = db.channels .sortBy(['name', 'url']) .all() - .map(c => c.toJSON()) + .map(c => c.toObject()) utils.createFile(filename, JSON.stringify(channels)) } From 246d4a9b489bd4406ed616f92519f5665b2c9c3a Mon Sep 17 00:00:00 2001 From: freearhey Date: Sat, 8 May 2021 15:43:31 +0300 Subject: [PATCH 7/8] Update parser.js --- scripts/parser.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/parser.js b/scripts/parser.js index fd357aa8d..35455c367 100644 --- a/scripts/parser.js +++ b/scripts/parser.js @@ -214,9 +214,7 @@ class Channel { toString(raw = false) { if (raw) return this.raw + '\n' - const info = this.getInfo() - - return '#EXTINF:' + info + '\n' + this.url + '\n' + return '#EXTINF:' + this.getInfo() + '\n' + this.url + '\n' } toObject() { From debf3c417005016ef4bca5ec0d26c2abef52c53a Mon Sep 17 00:00:00 2001 From: freearhey Date: Sat, 8 May 2021 15:43:34 +0300 Subject: [PATCH 8/8] Update generate.js --- scripts/generate.js | 52 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/scripts/generate.js b/scripts/generate.js index 8092f946c..eb3a99594 100644 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -37,8 +37,13 @@ function generateIndex() { const sfwFilename = `${ROOT_DIR}/index.sfw.m3u` utils.createFile(sfwFilename, '#EXTM3U\n') + const buffer = [] const channels = db.channels.sortBy(['name', 'url']).all() for (const channel of channels) { + const info = channel.getInfo() + if (buffer.includes(info)) continue + buffer.push(info) + utils.appendToFile(filename, channel.toString()) if (channel.isSFW()) { utils.appendToFile(sfwFilename, channel.toString()) @@ -54,8 +59,13 @@ function generateCategoryIndex() { const sfwFilename = `${ROOT_DIR}/index.category.sfw.m3u` utils.createFile(sfwFilename, '#EXTM3U\n') + const buffer = [] const channels = db.channels.sortBy(['category', 'name', 'url']).all() for (const channel of channels) { + const info = channel.getInfo() + if (buffer.includes(info)) continue + buffer.push(info) + utils.appendToFile(filename, channel.toString()) if (channel.isSFW()) { utils.appendToFile(sfwFilename, channel.toString()) @@ -71,8 +81,13 @@ function generateCountryIndex() { const sfwFilename = `${ROOT_DIR}/index.country.sfw.m3u` utils.createFile(sfwFilename, '#EXTM3U\n') + const buffer = [] const unsorted = db.playlists.only(['unsorted'])[0] for (const channel of unsorted.channels) { + const info = channel.getInfo() + if (buffer.includes(info)) continue + buffer.push(info) + const category = channel.category const sfw = channel.isSFW() channel.category = '' @@ -86,6 +101,10 @@ function generateCountryIndex() { const playlists = db.playlists.sortBy(['country']).except(['unsorted']) for (const playlist of playlists) { for (const channel of playlist.channels) { + const info = channel.getInfo() + if (buffer.includes(info)) continue + buffer.push(info) + const category = channel.category const sfw = channel.isSFW() channel.category = playlist.country @@ -106,8 +125,13 @@ function generateLanguageIndex() { const sfwFilename = `${ROOT_DIR}/index.language.sfw.m3u` utils.createFile(sfwFilename, '#EXTM3U\n') - const channels = db.channels.sortBy(['name', 'url']).forLanguage({ code: null }).get() + const buffer = [] + const channels = db.channels.sortBy(['name', 'url']).forLanguage({ code: 'undefined' }).get() for (const channel of channels) { + const info = channel.getInfo() + if (buffer.includes(info)) continue + buffer.push(info) + const category = channel.category const sfw = channel.isSFW() channel.category = '' @@ -122,6 +146,10 @@ function generateLanguageIndex() { for (const language of languages) { const channels = db.channels.sortBy(['name', 'url']).forLanguage(language).get() for (const channel of channels) { + const info = channel.getInfo() + if (buffer.includes(info)) continue + buffer.push(info) + const category = channel.category const sfw = channel.isSFW() channel.category = language.name @@ -139,18 +167,18 @@ function generateCategories() { const outputDir = `${ROOT_DIR}/categories` utils.createDir(outputDir) + const buffer = [] for (const category of [...db.categories.all(), { id: 'other' }]) { const filename = `${outputDir}/${category.id}.m3u` utils.createFile(filename, '#EXTM3U\n') - const buffer = [] const channels = db.channels.sortBy(['name', 'url']).forCategory(category).get() for (const channel of channels) { - const info = channel.toString() - if (!buffer.includes(info)) { - utils.appendToFile(filename, channel.toString()) - buffer.push(info) - } + const info = channel.getInfo() + if (buffer.includes(info)) continue + buffer.push(info) + + utils.appendToFile(filename, channel.toString()) } } } @@ -160,6 +188,7 @@ function generateCountries() { const outputDir = `${ROOT_DIR}/countries` utils.createDir(outputDir) + const buffer = [] for (const country of [...db.countries.all(), { code: 'undefined' }]) { const filename = `${outputDir}/${country.code}.m3u` utils.createFile(filename, '#EXTM3U\n') @@ -169,6 +198,10 @@ function generateCountries() { const channels = db.channels.sortBy(['name', 'url']).forCountry(country).get() for (const channel of channels) { + const info = channel.getInfo() + if (buffer.includes(info)) continue + buffer.push(info) + utils.appendToFile(filename, channel.toString()) if (channel.isSFW()) { utils.appendToFile(sfwFilename, channel.toString()) @@ -182,6 +215,7 @@ function generateLanguages() { const outputDir = `${ROOT_DIR}/languages` utils.createDir(outputDir) + const buffer = [] for (const language of [...db.languages.all(), { code: 'undefined' }]) { const filename = `${outputDir}/${language.code}.m3u` utils.createFile(filename, '#EXTM3U\n') @@ -191,6 +225,10 @@ function generateLanguages() { const channels = db.channels.sortBy(['name', 'url']).forLanguage(language).get() for (const channel of channels) { + const info = channel.getInfo() + if (buffer.includes(info)) continue + buffer.push(info) + utils.appendToFile(filename, channel.toString()) if (channel.isSFW()) { utils.appendToFile(sfwFilename, channel.toString())