From 2a1eb57c05f126cd5913aa91018866b724c33722 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Thu, 16 Sep 2021 03:30:52 +0300 Subject: [PATCH 1/9] Update Playlist.js --- scripts/helpers/Playlist.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/scripts/helpers/Playlist.js b/scripts/helpers/Playlist.js index 6b797c96c..0df181a2d 100644 --- a/scripts/helpers/Playlist.js +++ b/scripts/helpers/Playlist.js @@ -11,17 +11,21 @@ module.exports = class Playlist { this.updated = false } - toString(options = {}) { - const config = { raw: false, ...options } - let parts = ['#EXTM3U'] + getHeader() { + let header = ['#EXTM3U'] for (let key in this.header.attrs) { let value = this.header.attrs[key] if (value) { - parts.push(`${key}="${value}"`) + header.push(`${key}="${value}"`) } } - let output = `${parts.join(' ')}\n` + return header.join(' ') + } + + toString(options = {}) { + const config = { raw: false, ...options } + let output = `${this.getHeader()}\n` for (let channel of this.channels) { output += channel.toString(config.raw) } From d7f3998a3d74ed6c995e5a6d8b097827a7d0e404 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Thu, 16 Sep 2021 03:53:03 +0300 Subject: [PATCH 2/9] Install axios package --- package-lock.json | 57 ++++++++++++++++++++++++++++------------------- package.json | 1 + 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index d377bf1b2..ebcda9db2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,9 +4,11 @@ "requires": true, "packages": { "": { + "name": "iptv", "license": "MIT", "dependencies": { "@freearhey/iso-639-3": "^1.0.0", + "axios": "^0.21.4", "commander": "^7.0.0", "iptv-checker": "^0.21.0", "iptv-playlist-parser": "^0.5.4", @@ -1046,19 +1048,11 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dependencies": { - "follow-redirects": "^1.10.0" - } - }, - "node_modules/axios/node_modules/follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", - "engines": { - "node": ">=4.0" + "follow-redirects": "^1.14.0" } }, "node_modules/babel-jest": { @@ -1679,6 +1673,25 @@ "node": ">=8" } }, + "node_modules/follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -4615,18 +4628,11 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { - "follow-redirects": "^1.10.0" - }, - "dependencies": { - "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" - } + "follow-redirects": "^1.14.0" } }, "babel-jest": { @@ -5091,6 +5097,11 @@ "path-exists": "^4.0.0" } }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + }, "form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", diff --git a/package.json b/package.json index dff30960a..b2eb86fad 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@freearhey/iso-639-3": "^1.0.0", + "axios": "^0.21.4", "commander": "^7.0.0", "iptv-checker": "^0.21.0", "iptv-playlist-parser": "^0.5.4", From 7f2c5b36c975d0cb7c6473c5369076e43e1293c0 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Thu, 16 Sep 2021 03:53:06 +0300 Subject: [PATCH 3/9] Create epg.js --- scripts/helpers/epg.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 scripts/helpers/epg.js diff --git a/scripts/helpers/epg.js b/scripts/helpers/epg.js new file mode 100644 index 000000000..202a89e89 --- /dev/null +++ b/scripts/helpers/epg.js @@ -0,0 +1,12 @@ +const axios = require('axios') + +module.exports = { + codes: { + async load() { + return await axios + .get('https://iptv-org.github.io/epg/codes.json') + .then(r => r.data) + .catch(console.log) + } + } +} From 7e811f4c33402cd7a97c90a7a10b6a1d213d8c25 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Thu, 16 Sep 2021 04:26:25 +0300 Subject: [PATCH 4/9] Update db.js --- scripts/helpers/db.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/scripts/helpers/db.js b/scripts/helpers/db.js index 859a41576..20c8ff7f1 100644 --- a/scripts/helpers/db.js +++ b/scripts/helpers/db.js @@ -2,15 +2,22 @@ const categories = require('../data/categories') const parser = require('./parser') const utils = require('./utils') const file = require('./file') +const epg = require('./epg') const db = {} db.load = async function () { - let files = await file.list() + const files = await file.list() + const codes = await epg.codes.load() for (const file of files) { const playlist = await parser.parsePlaylist(file) - db.playlists.add(playlist) + let guides = [] for (const channel of playlist.channels) { + const code = codes.find(ch => ch['tvg_id'] === channel.tvg.id) + if (code && Array.isArray(code.guides)) { + guides = [...guides, ...code.guides] + } + db.channels.add(channel) for (const country of channel.countries) { @@ -25,6 +32,10 @@ db.load = async function () { } } } + + if (guides.length) playlist.header.attrs['url-tvg'] = guides.join(',') + + db.playlists.add(playlist) } } From b4c430a5101b93508c308a560686c933edcaf069 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Fri, 17 Sep 2021 14:22:25 +0300 Subject: [PATCH 5/9] Update format.js --- scripts/format.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/format.js b/scripts/format.js index f70d11b39..99f9643bf 100644 --- a/scripts/format.js +++ b/scripts/format.js @@ -187,10 +187,6 @@ function parseRequests(requests) { function updateDescription(channel, playlist) { const code = playlist.country.code - // tvg-name - if (!channel.tvg.name && channel.name) { - channel.tvg.name = channel.name.replace(/\"/gi, '') - } // tvg-id if (!channel.tvg.id && channel.tvg.name) { const id = utils.name2id(channel.tvg.name) From 52e8e617e19ae23e0c7c251ded6f417e20fe11b3 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Fri, 17 Sep 2021 14:22:29 +0300 Subject: [PATCH 6/9] Update Channel.js --- scripts/helpers/Channel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/helpers/Channel.js b/scripts/helpers/Channel.js index d938c2bb1..aa10bc880 100644 --- a/scripts/helpers/Channel.js +++ b/scripts/helpers/Channel.js @@ -148,7 +148,7 @@ module.exports = class Channel { countries: this.countries, tvg: { id: this.tvg.id || null, - name: this.tvg.name || null, + name: this.tvg.name || this.name.replace(/\"/gi, ''), url: this.tvg.url || null } } From 11cc75fa2ad0a7756d058366766f9e6a5c41c413 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Fri, 17 Sep 2021 14:24:50 +0300 Subject: [PATCH 7/9] Update db.js --- scripts/helpers/db.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/scripts/helpers/db.js b/scripts/helpers/db.js index 20c8ff7f1..0545a6c73 100644 --- a/scripts/helpers/db.js +++ b/scripts/helpers/db.js @@ -11,11 +11,10 @@ db.load = async function () { const codes = await epg.codes.load() for (const file of files) { const playlist = await parser.parsePlaylist(file) - let guides = [] for (const channel of playlist.channels) { const code = codes.find(ch => ch['tvg_id'] === channel.tvg.id) - if (code && Array.isArray(code.guides)) { - guides = [...guides, ...code.guides] + if (code && Array.isArray(code.guides) && code.guides.length) { + channel.tvg.url = code.guides[0] } db.channels.add(channel) @@ -33,8 +32,6 @@ db.load = async function () { } } - if (guides.length) playlist.header.attrs['url-tvg'] = guides.join(',') - db.playlists.add(playlist) } } From fb427d5bd3e54973ff8947ecb57d9b13aaac90ad Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Fri, 17 Sep 2021 14:25:23 +0300 Subject: [PATCH 8/9] Update generate.js --- scripts/generate.js | 91 +++++++++++++++++++++++++++++---------------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/scripts/generate.js b/scripts/generate.js index 3a2e6a7a3..4b50ec3c1 100644 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -36,13 +36,16 @@ function createNoJekyllFile() { function generateIndex() { log.print('Generating index.m3u...\n') + const channels = db.channels.sortBy(['name', 'url']).removeDuplicates().removeOffline().get() + const guides = channels.map(channel => channel.tvg.url) + const filename = `${ROOT_DIR}/index.m3u` - file.create(filename, '#EXTM3U\n') + const urlTvg = generateUrlTvg(guides) + file.create(filename, `#EXTM3U url-tvg="${urlTvg}"\n`) const nsfwFilename = `${ROOT_DIR}/index.nsfw.m3u` - file.create(nsfwFilename, '#EXTM3U\n') + file.create(nsfwFilename, `#EXTM3U url-tvg="${urlTvg}"\n`) - const channels = db.channels.sortBy(['name', 'url']).removeDuplicates().removeOffline().get() for (const channel of channels) { if (!channel.isNSFW()) { file.append(filename, channel.toString()) @@ -53,14 +56,17 @@ function generateIndex() { function generateCategoryIndex() { log.print('Generating index.category.m3u...\n') - const filename = `${ROOT_DIR}/index.category.m3u` - file.create(filename, '#EXTM3U\n') - const channels = db.channels .sortBy(['category', 'name', 'url']) .removeDuplicates() .removeOffline() .get() + const guides = channels.map(channel => channel.tvg.url) + + const filename = `${ROOT_DIR}/index.category.m3u` + const urlTvg = generateUrlTvg(guides) + file.create(filename, `#EXTM3U url-tvg="${urlTvg}"\n`) + for (const channel of channels) { file.append(filename, channel.toString()) } @@ -68,50 +74,56 @@ function generateCategoryIndex() { function generateCountryIndex() { log.print('Generating index.country.m3u...\n') - const filename = `${ROOT_DIR}/index.country.m3u` - file.create(filename, '#EXTM3U\n') + const guides = [] + const lines = [] for (const country of [{ code: 'undefined' }, ...db.countries.sortBy(['name']).all()]) { const channels = db.channels .sortBy(['name', 'url']) .forCountry(country) .removeDuplicates() + .removeNSFW() .removeOffline() .get() for (const channel of channels) { const groupTitle = channel.group.title - const nsfw = channel.isNSFW() channel.group.title = country.name || '' - if (!nsfw) { - file.append(filename, channel.toString()) - } + lines.push(channel.toString()) channel.group.title = groupTitle + guides.push(channel.tvg.url) } } + + const filename = `${ROOT_DIR}/index.country.m3u` + const urlTvg = generateUrlTvg(guides) + file.create(filename, `#EXTM3U url-tvg="${urlTvg}"\n${lines.join('')}`) } function generateLanguageIndex() { log.print('Generating index.language.m3u...\n') - const filename = `${ROOT_DIR}/index.language.m3u` - file.create(filename, '#EXTM3U\n') + const guides = [] + const lines = [] for (const language of [{ code: 'undefined' }, ...db.languages.sortBy(['name']).all()]) { const channels = db.channels .sortBy(['name', 'url']) .forLanguage(language) .removeDuplicates() + .removeNSFW() .removeOffline() .get() for (const channel of channels) { const groupTitle = channel.group.title - const nsfw = channel.isNSFW() channel.group.title = language.name || '' - if (!nsfw) { - file.append(filename, channel.toString()) - } + lines.push(channel.toString()) channel.group.title = groupTitle + guides.push(channel.tvg.url) } } + + const filename = `${ROOT_DIR}/index.language.m3u` + const urlTvg = generateUrlTvg(guides) + file.create(filename, `#EXTM3U url-tvg="${urlTvg}"\n${lines.join('')}`) } function generateCategories() { @@ -120,15 +132,17 @@ function generateCategories() { file.createDir(outputDir) for (const category of [...db.categories.all(), { id: 'other' }]) { - const filename = `${outputDir}/${category.id}.m3u` - file.create(filename, '#EXTM3U\n') - const channels = db.channels .sortBy(['name', 'url']) .forCategory(category) .removeDuplicates() .removeOffline() .get() + const guides = channels.map(channel => channel.tvg.url) + + const filename = `${outputDir}/${category.id}.m3u` + const urlTvg = generateUrlTvg(guides) + file.create(filename, `#EXTM3U url-tvg="${urlTvg}"\n`) for (const channel of channels) { file.append(filename, channel.toString()) } @@ -141,19 +155,20 @@ function generateCountries() { file.createDir(outputDir) for (const country of [...db.countries.all(), { code: 'undefined' }]) { - const filename = `${outputDir}/${country.code}.m3u` - file.create(filename, '#EXTM3U\n') - const channels = db.channels .sortBy(['name', 'url']) .forCountry(country) .removeDuplicates() .removeOffline() + .removeNSFW() .get() + const guides = channels.map(channel => channel.tvg.url) + + const filename = `${outputDir}/${country.code}.m3u` + const urlTvg = generateUrlTvg(guides) + file.create(filename, `#EXTM3U url-tvg="${urlTvg}"\n`) for (const channel of channels) { - if (!channel.isNSFW()) { - file.append(filename, channel.toString()) - } + file.append(filename, channel.toString()) } } } @@ -164,19 +179,20 @@ function generateLanguages() { file.createDir(outputDir) for (const language of [...db.languages.all(), { code: 'undefined' }]) { - const filename = `${outputDir}/${language.code}.m3u` - file.create(filename, '#EXTM3U\n') - const channels = db.channels .sortBy(['name', 'url']) .forLanguage(language) .removeDuplicates() .removeOffline() + .removeNSFW() .get() + const guides = channels.map(channel => channel.tvg.url) + + const filename = `${outputDir}/${language.code}.m3u` + const urlTvg = generateUrlTvg(guides) + file.create(filename, `#EXTM3U url-tvg="${urlTvg}"\n`) for (const channel of channels) { - if (!channel.isNSFW()) { - file.append(filename, channel.toString()) - } + file.append(filename, channel.toString()) } } } @@ -197,4 +213,13 @@ function showResults() { ) } +function generateUrlTvg(guides) { + const output = guides.reduce((acc, curr) => { + if (curr && !acc.includes(curr)) acc.push(curr) + return acc + }, []) + + return output.sort().join(',') +} + main() From 0cd97731595360d1822822cd96564ac39c4ef8e4 Mon Sep 17 00:00:00 2001 From: Sphinxroot <47762050+Sphinxroot@users.noreply.github.com> Date: Fri, 17 Sep 2021 12:00:49 -0400 Subject: [PATCH 9/9] Update mx.m3u activate youtube channel for me all work but i cant pretend that some are geo --- channels/mx.m3u | 62 ++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/channels/mx.m3u b/channels/mx.m3u index c9d46ec0c..e09887b27 100644 --- a/channels/mx.m3u +++ b/channels/mx.m3u @@ -3,7 +3,7 @@ https://cdn87.theus6tv.tk/locals/SanDiego/xhtit-tdt2.m3u8 #EXTINF:-1 tvg-id="ADN40.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/x8lwsjM.png" group-title="",ADN 40 (480p) https://mdstrm.com/live-stream-playlist/60b578b060947317de7b57ac.m3u8 -#EXTINF:-1 tvg-id="ADN40.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/x8lwsjM.png" group-title="",ADN 40 [Offline] +#EXTINF:-1 tvg-id="ADN40.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/x8lwsjM.png" group-title="",ADN 40 https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UC7k--FhnJzhPTrbtldMSoQQ/live #EXTINF:-1 tvg-id="AlcarriaTV.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/9Xn7ZEZ.jpg" group-title="",Alcarria TV (576p) http://217.182.77.27/live/alcarriatv-livestream.m3u8 @@ -19,9 +19,9 @@ https://cdn87.theus6tv.tk/locals/SanDiego/xhjk-tdt.m3u8 http://stream2.dynalias.com:1935/live/tvlive1/playlist.m3u8 #EXTINF:-1 tvg-id="XEWTTDT.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://media.localbtv.com/images/sandiegobtv/logos/12.1.png" group-title="Local",Canal 12 (XETW-TDT) (1080p) https://cdn87.theus6tv.tk/locals/SanDiego/xewt-tdt.m3u8 -#EXTINF:-1 tvg-id="XEWTTDT.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://media.localbtv.com/images/sandiegobtv/logos/12.1.png" group-title="Local",Canal 12 (XETW-TDT) (1080p) [Offline] +#EXTINF:-1 tvg-id="XEWTTDT.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://media.localbtv.com/images/sandiegobtv/logos/12.1.png" group-title="Local",Canal 12 (XETW-TDT) (1080p) https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCjwXjnO3BGePtB7gSKEpoqA/live -#EXTINF:-1 tvg-id="Canal28.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/lr4MZFg.png" group-title="",Canal 28 (720p) [Offline] +#EXTINF:-1 tvg-id="Canal28.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/lr4MZFg.png" group-title="",Canal 28 (720p) https://api.new.livestream.com/accounts/3789491/events/8003011/live.m3u8 #EXTINF:-1 tvg-id="Canal44.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/YDp8MlN.png" group-title="",Canal 44 Chihuahua (720p) https://5e50264bd6766.streamlock.net/canal442/videocanal442/playlist.m3u8 @@ -54,11 +54,11 @@ http://201.144.184.98:1935/genesis/smil:television.smil/playlist.m3u8 http://wms.tecnoxia.com:1935/8158/8158/playlist.m3u8 #EXTINF:-1 tvg-id="IcrtvColima.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/Dru29kQ.png" group-title="",Icrtv Colima (720p) https://5ca9af4645e15.streamlock.net/canal11/videocanal11/playlist.m3u8 -#EXTINF:-1 tvg-id="ImagenMulticast.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/KDZ50eC.jpg" group-title="Local",Imagen Multicast [Offline] +#EXTINF:-1 tvg-id="ImagenMulticast.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/KDZ50eC.jpg" group-title="Local",Imagen Multicast https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UClqo4ZAAZ01HQdCTlovCgkA/live #EXTINF:-1 tvg-id="XHCTTITDT.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://yt3.ggpht.com/ytc/AAUvwngCFclkx8_OjeImr3mO1BvDLtxIUkDcDL037PCAgw" group-title="Local",Imagen Multicast (XHCTTI-TDT) (432p) [Not 24/7] https://cdn87.theus6tv.tk/locals/SanDiego/xhctti-tdt2.m3u8 -#EXTINF:-1 tvg-id="ImagenRadio.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/SINYy29.png" group-title="",Imagen Radio [Offline] +#EXTINF:-1 tvg-id="ImagenRadio.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/SINYy29.png" group-title="",Imagen Radio https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCB0BUmdBOrH9mYU2ebs1eWA/live #EXTINF:-1 tvg-id="Imagentv.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/mRGetOJ.png" group-title="",Imagen TV (720p) https://stream-04.nyc.dailymotion.com/sec(YDiRVmci6dFcTAVfdXnSLkVhTJz_zPGOO7WKknz-Hj0)/dm/3/x82z4if/s/live-2.m3u8 @@ -72,7 +72,7 @@ https://stream-01.nyc.dailymotion.com/sec(jgGqWSgcC1UbbwRnedTC2hpb0C-zKG3oSJZVmO https://1601580044.rsc.cdn77.org/live/_jcn_/amlst:Mariavision/master.m3u8 #EXTINF:-1 tvg-id="MexiquenseTV.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/IjE1ORI.png" group-title="",Mexiquense TV (720p) https://5ca3e84a76d30.streamlock.net/mexiquense/videomexiquense/playlist.m3u8 -#EXTINF:-1 tvg-id="Milenio.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/d/d4/Milenio_Television.png" group-title="",Milenio Televisión (1080p) [Offline] +#EXTINF:-1 tvg-id="Milenio.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/d/d4/Milenio_Television.png" group-title="",Milenio Televisión (1080p) https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCFxHplbcoJK9m70c4VyTIxg/live #EXTINF:-1 tvg-id="XHDTVTDT.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/d/d4/Milenio_Television.png" group-title="",Milenio Televisión (XHDTV-TDT) (1080p) [Offline] https://cdn87.theus6tv.tk/locals/SanDiego/xhdtv-tdt.m3u8 @@ -126,7 +126,7 @@ http://189.240.210.28:1935/live/setpuebla/playlist.m3u8 https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.twitch.tv/sintesistv #EXTINF:-1 tvg-id="TELESISTEMACANAL9.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="http://mastelevisioncr.com/wp-content/uploads/2020/08/WhatsApp-Image-2020-08-02-at-12.42.47-300x300.jpeg" group-title="",TELE SISTEMA CANAL 9 (720p) http://k4.usastreams.com/ARBtv/ARBtv/playlist.m3u8 -#EXTINF:-1 tvg-id="Teleformula.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/aH9uKk0.jpg" group-title="",Telefórmula (720p) [Offline] +#EXTINF:-1 tvg-id="Teleformula.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/aH9uKk0.jpg" group-title="",Telefórmula (720p) https://stream-02.nyc.dailymotion.com/sec(M6H1kElr_3TPI3uTZiYJqlbuB2QrrqBCmXePJswrljQ)/dm/3/x7u0spq/s/live-3.m3u8 #EXTINF:-1 tvg-id="TelemarCampeche.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/ysowtzb.png" group-title="",Telemar Campeche (480p) https://59d39900ebfb8.streamlock.net/8410/8410/playlist.m3u8 @@ -134,51 +134,51 @@ https://59d39900ebfb8.streamlock.net/8410/8410/playlist.m3u8 http://s5.mexside.net:1935/telemax/telemax/playlist.m3u8 #EXTINF:-1 tvg-id="Teleritmo.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://cdn.tvpassport.com/image/station/240x135/teleritmo-logo.png" group-title="",Teleritmo (720p) http://mdstrm.com/live-stream-playlist/57b4dc126338448314449d0c.m3u8 -#EXTINF:-1 tvg-id="TelevisaAguascalientes.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/iVF17fh.png" group-title="Local",Televisa Aguascalientes [Offline] +#EXTINF:-1 tvg-id="TelevisaAguascalientes.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/iVF17fh.png" group-title="Local",Televisa Aguascalientes https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UC5ZtV3bu3bjSuOLoA6oCFIg/live -#EXTINF:-1 tvg-id="TelevisaChihuahua.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/CAuAu0Z.png" group-title="Local",Televisa Chihuahua [Offline] +#EXTINF:-1 tvg-id="TelevisaChihuahua.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/CAuAu0Z.png" group-title="Local",Televisa Chihuahua https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCjfxDe7In59Jbfw2HmIh_Vg/live -#EXTINF:-1 tvg-id="TelevisaCiudadJuarez.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/4vEFJxf.png" group-title="Local",Televisa Ciudad Juarez [Offline] +#EXTINF:-1 tvg-id="TelevisaCiudadJuarez.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/4vEFJxf.png" group-title="Local",Televisa Ciudad Juarez https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCot4t8PVKz8TT5xVM8Eb00w/live -#EXTINF:-1 tvg-id="TelevisaDelBajio" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/LkeCdc5.png" group-title="Local",Televisa Del Bajio [Offline] +#EXTINF:-1 tvg-id="TelevisaDelBajio" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/LkeCdc5.png" group-title="Local",Televisa Del Bajio https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UC-uYy4_jIvDoJ4wigEv1S5A/live -#EXTINF:-1 tvg-id="TelevisaDelGolfo.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/35fsRTS.jpg" group-title="Local",Televisa Del Golfo [Offline] +#EXTINF:-1 tvg-id="TelevisaDelGolfo.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/35fsRTS.jpg" group-title="Local",Televisa Del Golfo https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCQ08tNTPiBn44c975S81ftg/live -#EXTINF:-1 tvg-id="TelevisaEstado.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/gyZCypH.png" group-title="Local",Televisa Estado [Offline] +#EXTINF:-1 tvg-id="TelevisaEstado.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/gyZCypH.png" group-title="Local",Televisa Estado https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UC9DH82HVSf4katwMeUpY80w -#EXTINF:-1 tvg-id="TelevisaGuadalajara.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/Vp4B0BM.jpg" group-title="Local",Televisa Guadalajara [Offline] +#EXTINF:-1 tvg-id="TelevisaGuadalajara.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/Vp4B0BM.jpg" group-title="Local",Televisa Guadalajara https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCRujF_YxVVFmTRWURQH-Cww/live -#EXTINF:-1 tvg-id="TelevisaGuerrero.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/lOAnjFs.png" group-title="Local",Televisa Guerrero [Offline] +#EXTINF:-1 tvg-id="TelevisaGuerrero.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/lOAnjFs.png" group-title="Local",Televisa Guerrero https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCnxTRk2K1iNsQkgpWXxyj4w/live -#EXTINF:-1 tvg-id="TelevisaLaguna.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/L4GDHQm.png" group-title="Local",Televisa Laguna [Offline] +#EXTINF:-1 tvg-id="TelevisaLaguna.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/L4GDHQm.png" group-title="Local",Televisa Laguna https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UC_mwCcsKDJLSWjply5s0h8w/live -#EXTINF:-1 tvg-id="TelevisaMexicali.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/NIEWc2s.jpg" group-title="Local",Televisa Mexicali [Offline] +#EXTINF:-1 tvg-id="TelevisaMexicali.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/NIEWc2s.jpg" group-title="Local",Televisa Mexicali https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCcmuFsMIIIHO3LBqeBVfm8Q/live -#EXTINF:-1 tvg-id="TelevisaMonterrey.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/ierlYM1.jpg" group-title="Local",Televisa Monterrey [Offline] +#EXTINF:-1 tvg-id="TelevisaMonterrey.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/ierlYM1.jpg" group-title="Local",Televisa Monterrey https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCGDJLLphnP0zQQaE3kgo5Wg/live -#EXTINF:-1 tvg-id="TelevisaMorelos.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/QiJoBVs.png" group-title="Local",Televisa Morelos [Offline] +#EXTINF:-1 tvg-id="TelevisaMorelos.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/QiJoBVs.png" group-title="Local",Televisa Morelos https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCcC9ykApQrgl4UxbKg2U4zw/live -#EXTINF:-1 tvg-id="TelevisaNewsMexico.mx" tvg-country="MX" tvg-language="" tvg-logo="" group-title="News",Televisa News Mexico [Offline] -https://stnothds-lh.akamaihd.net/i/sslf0r0tvnus_1@109755/master.m3u8 -#EXTINF:-1 tvg-id="TelevisaNoreste.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/rHCKwYB.jpg" group-title="Local",Televisa Noreste [Offline] +#EXTINF:-1 tvg-id="TelevisaNewsMexico.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/KVc1hqI.png" group-title="News",Televisa News Mexico +https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCUsm-fannqOY02PNN67C0KA/live +#EXTINF:-1 tvg-id="TelevisaNoreste.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/rHCKwYB.jpg" group-title="Local",Televisa Noreste https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UC752DYv5vPlTSMrvEjfZXcw/live -#EXTINF:-1 tvg-id="TelevisaPiedrasNegras.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/fEtvxpz.jpg" group-title="Local",Televisa Piedras Negras [Offline] +#EXTINF:-1 tvg-id="TelevisaPiedrasNegras.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/fEtvxpz.jpg" group-title="Local",Televisa Piedras Negras https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCxK8C1E8UZ5RipNXIBYEvTA/live -#EXTINF:-1 tvg-id="TelevisaPuebla.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/2dqF5S8.jpg" group-title="Local",Televisa Puebla [Offline] +#EXTINF:-1 tvg-id="TelevisaPuebla.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/2dqF5S8.jpg" group-title="Local",Televisa Puebla https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UC-HNztluSQSffhIWJTL-LUw/live -#EXTINF:-1 tvg-id="TelevisaQueretaro.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/47c1AIS.png" group-title="Local",Televisa Queretaro [Offline] +#EXTINF:-1 tvg-id="TelevisaQueretaro.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/47c1AIS.png" group-title="Local",Televisa Queretaro https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UC9QNz6VS3gGz55dzxAQtgtA/live -#EXTINF:-1 tvg-id="TelevisaSanLuisPotosí.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/oxt91dr.jpg" group-title="Local",Televisa San Luis Potosí [Offline] +#EXTINF:-1 tvg-id="TelevisaSanLuisPotosí.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/oxt91dr.jpg" group-title="Local",Televisa San Luis Potosí https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCaRuyaHshLdq462E9_pLzdA/live -#EXTINF:-1 tvg-id="TelevisaSinaloa.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/nZ9HE94.png" group-title="Local",Televisa Sinaloa [Offline] +#EXTINF:-1 tvg-id="TelevisaSinaloa.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/nZ9HE94.png" group-title="Local",Televisa Sinaloa https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCtm1LvYEIQ_NrfOUVJ08YhQ/live -#EXTINF:-1 tvg-id="TelevisaSonora.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/3FjHKAC.jpg" group-title="Local",Televisa Sonora [Offline] +#EXTINF:-1 tvg-id="TelevisaSonora.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/3FjHKAC.jpg" group-title="Local",Televisa Sonora https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCyzWMHGS7bs0sot6KZk5EZg/live -#EXTINF:-1 tvg-id="TelevisaVeracruz.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/4hPbfbg.png" group-title="Local",Televisa Veracruz [Offline] +#EXTINF:-1 tvg-id="TelevisaVeracruz.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/4hPbfbg.png" group-title="Local",Televisa Veracruz https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UC5EnLdE7ASjYzWt7wvT-QSg/live -#EXTINF:-1 tvg-id="TelevisaZacatecas.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/vsbl0u6.png" group-title="Local",Televisa Zacatecas [Offline] +#EXTINF:-1 tvg-id="TelevisaZacatecas.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/vsbl0u6.png" group-title="Local",Televisa Zacatecas https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.youtube.com/channel/UCQb3i7gu9J8A4zzQU7j6C1Q/live -#EXTINF:-1 tvg-id="TlaxcalaTelevisión.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/6YKFW2G.png" group-title="",Tlaxcala Televisión (360p) [Offline] +#EXTINF:-1 tvg-id="TlaxcalaTelevisión.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/6YKFW2G.png" group-title="",Tlaxcala Televisión (360p) https://vid.mega00.com:5443/LiveApp/streams/928111829917388844551988/928111829917388844551988.m3u8?token=null #EXTINF:-1 tvg-id="TransmediaTelevisionMorelia.mx" tvg-country="MX" tvg-language="Spanish" tvg-logo="https://i.imgur.com/kpffqTI.png" group-title="",Transmedia Televisión Morelia (500p) http://streamingcws20.com:1935/tmtv/videotmtv/playlist.m3u8