Merge branch 'iptv-org:master' into master

This commit is contained in:
Anise 2024-10-13 21:12:13 +02:00 committed by GitHub
commit 276414bc63
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 2493 additions and 2860 deletions

View file

@ -35,14 +35,13 @@
| [directv.com.ar](sites/directv.com.ar) | 🔴 | https://github.com/iptv-org/epg/issues/2248 | | [directv.com.ar](sites/directv.com.ar) | 🔴 | https://github.com/iptv-org/epg/issues/2248 |
| [directv.com.uy](sites/directv.com.uy) | 🟢 | | | [directv.com.uy](sites/directv.com.uy) | 🟢 | |
| [dishtv.in](sites/dishtv.in) | 🟢 | | | [dishtv.in](sites/dishtv.in) | 🟢 | |
| [disneystar.com](sites/disneystar.com) | 🟢 | |
| [dsmart.com.tr](sites/dsmart.com.tr) | 🟢 | | | [dsmart.com.tr](sites/dsmart.com.tr) | 🟢 | |
| [dstv.com](sites/dstv.com) | 🟢 | | | [dstv.com](sites/dstv.com) | 🟢 | |
| [elcinema.com](sites/elcinema.com) | 🟢 | | | [elcinema.com](sites/elcinema.com) | 🟢 | |
| [ena.skylifetv.co.kr](sites/ena.skylifetv.co.kr) | 🟢 | | | [ena.skylifetv.co.kr](sites/ena.skylifetv.co.kr) | 🟢 | |
| [energeek.cl](sites/energeek.cl) | 🟢 | | | [energeek.cl](sites/energeek.cl) | 🟢 | |
| [entertainment.ie](sites/entertainment.ie) | 🟢 | | | [entertainment.ie](sites/entertainment.ie) | 🟢 | |
| [epg.i-cable.com](sites/epg.i-cable.com) | 🔴 | https://github.com/iptv-org/epg/issues/2228 | | [hoy.tv](sites/hoy.tv) | 🟢 | |
| [firstmedia.com](sites/firstmedia.com) | 🟢 | | | [firstmedia.com](sites/firstmedia.com) | 🟢 | |
| [flixed.io](sites/flixed.io) | 🟢 | | | [flixed.io](sites/flixed.io) | 🟢 | |
| [foxsports.com.au](sites/foxsports.com.au) | 🟢 | | | [foxsports.com.au](sites/foxsports.com.au) | 🟢 | |
@ -98,11 +97,11 @@
| [nowplayer.now.com](sites/nowplayer.now.com) | 🔴 | https://github.com/iptv-org/epg/issues/2247 | | [nowplayer.now.com](sites/nowplayer.now.com) | 🔴 | https://github.com/iptv-org/epg/issues/2247 |
| [nuevosiglo.com.uy](sites/nuevosiglo.com.uy) | 🟢 | | | [nuevosiglo.com.uy](sites/nuevosiglo.com.uy) | 🟢 | |
| [nzxmltv.com](sites/nzxmltv.com) | 🟢 | | | [nzxmltv.com](sites/nzxmltv.com) | 🟢 | |
| [ontvtonight.com](sites/ontvtonight.com) | 🟢 | | | [ontvtonight.com](sites/ontvtonight.com) | 🔴 | https://github.com/iptv-org/epg/issues/2416 |
| [osn.com](sites/osn.com) | 🔴 | https://github.com/iptv-org/epg/issues/2282, https://github.com/iptv-org/epg/issues/2358 | | [osn.com](sites/osn.com) | 🔴 | https://github.com/iptv-org/epg/issues/2282, https://github.com/iptv-org/epg/issues/2358 |
| [pbsguam.org](sites/pbsguam.org) | 🟢 | | | [pbsguam.org](sites/pbsguam.org) | 🟢 | |
| [player.ee.co.uk](sites/player.ee.co.uk) | 🟢 | | | [player.ee.co.uk](sites/player.ee.co.uk) | 🟢 | |
| [pickx.be](sites/pickx.be) | 🟢 | | | [pickx.be](sites/pickx.be) | 🔴 | https://github.com/iptv-org/epg/issues/2428 |
| [playtv.unifi.com.my](sites/playtv.unifi.com.my) | 🟢 | | | [playtv.unifi.com.my](sites/playtv.unifi.com.my) | 🟢 | |
| [plex.tv](sites/plex.tv) | 🟢 | | | [plex.tv](sites/plex.tv) | 🟢 | |
| [programacion-tv.elpais.com](sites/programacion-tv.elpais.com) | 🟢 | | | [programacion-tv.elpais.com](sites/programacion-tv.elpais.com) | 🟢 | |
@ -176,10 +175,10 @@
| [tvpassport.com](sites/tvpassport.com) | 🟢 | | | [tvpassport.com](sites/tvpassport.com) | 🟢 | |
| [tvplus.com.tr](sites/tvplus.com.tr) | 🔴 | https://github.com/iptv-org/epg/issues/2377 | | [tvplus.com.tr](sites/tvplus.com.tr) | 🔴 | https://github.com/iptv-org/epg/issues/2377 |
| [tvprofil.com](sites/tvprofil.com) | 🟡 | https://github.com/iptv-org/epg/issues/2399 | | [tvprofil.com](sites/tvprofil.com) | 🟡 | https://github.com/iptv-org/epg/issues/2399 |
| [tvtv.us](sites/tvtv.us) | 🟡 | https://github.com/iptv-org/epg/issues/2357 | | [tvtv.us](sites/tvtv.us) | 🟡 | https://github.com/iptv-org/epg/issues/2357, https://github.com/iptv-org/epg/issues/2353 |
| [vidio.com](sites/vidio.com) | 🟢 | | | [vidio.com](sites/vidio.com) | 🟢 | |
| [virginmediatelevision.ie](sites/virginmediatelevision.ie) | 🟢 | | | [virginmediatelevision.ie](sites/virginmediatelevision.ie) | 🟢 | |
| [virgintvgo.virginmedia.com](sites/virgintvgo.virginmedia.com) | 🟢 | | | [virgintvgo.virginmedia.com](sites/virgintvgo.virginmedia.com) | 🟡 | https://github.com/iptv-org/epg/issues/2310 |
| [visionplus.id](sites/visionplus.id) | 🟢 | | | [visionplus.id](sites/visionplus.id) | 🟢 | |
| [vivacom.bg](sites/vivacom.bg) | 🔴 | https://github.com/iptv-org/epg/issues/2270 | | [vivacom.bg](sites/vivacom.bg) | 🔴 | https://github.com/iptv-org/epg/issues/2270 |
| [vtm.be](sites/vtm.be) | 🟢 | | | [vtm.be](sites/vtm.be) | 🟢 | |

View file

@ -1,60 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="disneystar.com" lang="en" xmltv_id="Asianet.in" site_id="Asianet">Asianet</channel>
<channel site="disneystar.com" lang="en" xmltv_id="AsianetHD.in" site_id="Asianet HD">Asianet HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="AsianetMovies.in" site_id="Asianet Movies">Asianet Movies</channel>
<channel site="disneystar.com" lang="en" xmltv_id="AsianetPlus.in" site_id="Asianet Plus">Asianet Plus</channel>
<channel site="disneystar.com" lang="en" xmltv_id="FoxLife.in" site_id="Fox Life">Fox Life</channel>
<channel site="disneystar.com" lang="en" xmltv_id="FoxLifeHD.in" site_id="Fox Life HD">Fox Life HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="JalshaMovies.in" site_id="Jalsha Movies">Jalsha Movies</channel>
<channel site="disneystar.com" lang="en" xmltv_id="JalshaMoviesHD.in" site_id="Jalsha Movies HD">Jalsha Movies HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="NationalGeographic.in" site_id="National Geographic Channel">National Geographic Channel</channel>
<channel site="disneystar.com" lang="en" xmltv_id="NationalGeographicHD.in" site_id="National Geographic Channel HD">National Geographic Channel HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="NationalGeographicWild.in" site_id="Nat Geo Wild">Nat Geo Wild</channel>
<channel site="disneystar.com" lang="en" xmltv_id="NationalGeographicWildHD.in" site_id="Nat Geo Wild HD">Nat Geo Wild HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarBharat.in" site_id="Star Bharat">Star Bharat</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarBharatHD.in" site_id="Star Bharat HD">Star Bharat HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarGold.in" site_id="Star Gold">Star Gold</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarGold2.in" site_id="Star Gold 2">Star Gold 2</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarGoldHD.in" site_id="Star Gold HD">Star Gold HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarGoldSelect.in" site_id="Star Gold Select">Star Gold Select</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarGoldSelectHD.in" site_id="Star Gold Select HD">Star Gold Select HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarJalsha.in" site_id="Star Jalsha">Star Jalsha</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarJalshaHD.in" site_id="Star Jalsha HD">Star Jalsha HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarMaa.in" site_id="Star Maa">Star Maa</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarMaaGold.in" site_id="Star Maa Gold">Star Maa Gold</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarMaaHD.in" site_id="Star Maa HD">Star Maa HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarMaaMovies.in" site_id="Star Maa Movies">Star Maa Movies</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarMaaMoviesHD.in" site_id="Star Maa Movies HD">Star Maa Movies HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarMaaMusic.in" site_id="Star Maa Music">Star Maa Music</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarMovies.in" site_id="Star Movies">Star Movies</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarMoviesHD.in" site_id="Star Movies HD">Star Movies HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarMoviesSelect.in" site_id="Star Movies Select HD">Star Movies Select HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarPlus.in" site_id="STAR PLUS">STAR PLUS</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarPlusHD.in" site_id="STAR PLUS HD">STAR PLUS HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarPravah.in" site_id="Star Pravah">Star Pravah</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarPravahHD.in" site_id="Star Pravah HD">Star Pravah HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports1.in" site_id="Star Sports 1">Star Sports 1</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports1HD.in" site_id="Star Sports 1 HD">Star Sports 1 HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports1Hindi.in" site_id="Star Sports 1 Hindi">Star Sports 1 Hindi</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports1HindiHD.in" site_id="Star Sports 1 HD Hindi">Star Sports 1 HD Hindi</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports1Kannada.in" site_id="Star Sports 1 Kannada">Star Sports 1 Kannada</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports1Tamil.in" site_id="Star Sports 1 Tamil">Star Sports 1 Tamil</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports1Telugu.in" site_id="Star Sports 1 Telugu">Star Sports 1 Telugu</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports2.in" site_id="Star Sports 2">Star Sports 2</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports2HD.in" site_id="Star Sports 2 HD">Star Sports 2 HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSports3.in" site_id="Star Sports 3">Star Sports 3</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSportsFirst.in" site_id="Star Sports First">Star Sports First</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSportsSelect1.in" site_id="Star Sports Select 1">Star Sports Select 1</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSportsSelect1HD.in" site_id="Star Sports Select 1 HD">Star Sports Select 1 HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSportsSelect2.in" site_id="Star Sports Select 2">Star Sports Select 2</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSportsSelect2HD.in" site_id="Star Sports Select 2 HD">Star Sports Select 2 HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSuvarna.in" site_id="Star Suvarna">Star Suvarna</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSuvarnaHD.in" site_id="Star Suvarna HD">Star Suvarna HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarSuvarnaPlus.in" site_id="Star Suvarna Plus">Star Suvarna Plus</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarUtsav.in" site_id="Star Utsav">Star Utsav</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarUtsavMovies.in" site_id="Star Utsav Movies">Star Utsav Movies</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarVijay.in" site_id="Star Vijay">Star Vijay</channel>
<channel site="disneystar.com" lang="en" xmltv_id="StarVijayHD.in" site_id="Star Vijay HD">Star Vijay HD</channel>
<channel site="disneystar.com" lang="en" xmltv_id="VijaySuper.in" site_id="Star Vijay Super">Star Vijay Super</channel>
</channels>

View file

@ -1,88 +0,0 @@
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
const API_ENDPOINT = 'https://www.disneystar.com/umbraco/api/startvguideproxy'
module.exports = {
site: 'disneystar.com',
days: 2,
url: `${API_ENDPOINT}/GetTvGuideSchedule`,
request: {
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=UTF-8'
},
data({ channel, date }) {
return {
Channels: channel.site_id,
Start: date.format('YYYYMMDDHHmm'),
Stop: date.add(1, 'd').format('YYYYMMDDHHmm')
}
}
},
parser: function ({ content, channel }) {
let programs = []
const items = parseItems(content, channel)
items.forEach(item => {
programs.push({
title: item.title,
description: item.desc,
image: item.programmeurl,
category: item.subgenre,
start: parseStart(item),
stop: parseStop(item)
})
})
return programs
},
async channels() {
const data = await axios
.post(
`${API_ENDPOINT}/GetChannelResult`,
{ Genre: 'All Channels' },
{
headers: {
'Content-Type': 'application/json; charset=UTF-8'
}
}
)
.then(r => JSON.parse(r.data))
.catch(console.log)
const channels = data.channelsbygenreandlanguage.channellist.channelnames.split(',')
return channels.map(item => {
return {
lang: 'hi',
site_id: item,
name: item
}
})
}
}
function parseStart(item) {
return dayjs.tz(item.start, 'YYYYMMDDHHmm', 'Asia/Kolkata')
}
function parseStop(item) {
return dayjs.tz(item.stop, 'YYYYMMDDHHmm', 'Asia/Kolkata')
}
function parseItems(content, channel) {
if (!content.length) return []
const json = JSON.parse(content)
if (!json.length) return []
const data = JSON.parse(json)
if (!data || !data.ScheduleGrid || !Array.isArray(data.ScheduleGrid.channel)) return []
const channelData = data.ScheduleGrid.channel.find(c => c.channeldisplayname === channel.site_id)
return channelData && Array.isArray(channelData.programme) ? channelData.programme : []
}

View file

@ -1,64 +0,0 @@
const { parser, url, request } = require('./disneystar.com.config.js')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
const date = dayjs.utc('2022-03-31', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'STAR PLUS',
xmltv_id: 'StarPlus.in'
}
it('can generate valid url', () => {
expect(url).toBe('https://www.disneystar.com/umbraco/api/startvguideproxy/GetTvGuideSchedule')
})
it('can generate valid request method', () => {
expect(request.method).toBe('POST')
})
it('can generate valid request headers', () => {
expect(request.headers).toMatchObject({
'Content-Type': 'application/json; charset=UTF-8'
})
})
it('can generate valid request data', () => {
expect(request.data({ channel, date })).toMatchObject({
Channels: 'STAR PLUS',
Start: '202203310000',
Stop: '202204010000'
})
})
it('can parse response', () => {
const content =
'"{\\"ScheduleGrid\\":{\\"channel\\":[{\\"id\\":null,\\"displayname\\":null,\\"channelid\\":\\"10000000000080000\\",\\"channellogourl\\":\\"http://imagesstartv.whatsonindia.com/dasimages/channel/landscape/100x75/wHtcYVRZ.png\\",\\"channelgenre\\":\\"Hindi Entertainment\\",\\"channelweburl\\":\\"\\",\\"channeldisplayname\\":\\"STAR PLUS\\",\\"lcn\\":\\"1\\",\\"isfav\\":\\"0\\",\\"programme\\":[{\\"programmeid\\":\\"30000000550792674\\",\\"title\\":\\"Imlie\\",\\"start\\":\\"202203310000\\",\\"stop\\":\\"202203310030\\",\\"desc\\":\\"Imlie finds herself in deep trouble when she gets tied up before the wedding. Meanwhile, Aryan assumes that he is getting married to Imlie and performs the wedding rituals.\\",\\"programmeurl\\":\\"http://imagesstartv.whatsonindia.com/dasimages/landscape/360x270/59A9215E5DE13ABF4B05C59A6C87768AD61CA608M.jpg\\",\\"channelid\\":\\"10000000000080000\\",\\"date\\":\\"20220331\\",\\"episodenum\\":null,\\"subtitle\\":null,\\"scheduleid\\":\\"10000069158583187\\",\\"genre\\":\\"TV Show\\",\\"subgenre\\":\\"Drama\\",\\"programmescore\\":\\"0.083309\\",\\"languagename\\":\\"Hindi\\",\\"dubbedlanguageid\\":\\"10000000000040000\\",\\"timestring\\":\\"12:00 AM, Tomorrow\\",\\"duration\\":\\"30\\",\\"episodeshorttitle\\":\\"\\"}]}]}}"'
const result = parser({ content, channel }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
start: '2022-03-30T18:30:00.000Z',
stop: '2022-03-30T19:00:00.000Z',
title: 'Imlie',
description:
'Imlie finds herself in deep trouble when she gets tied up before the wedding. Meanwhile, Aryan assumes that he is getting married to Imlie and performs the wedding rituals.',
image:
'http://imagesstartv.whatsonindia.com/dasimages/landscape/360x270/59A9215E5DE13ABF4B05C59A6C87768AD61CA608M.jpg',
category: 'Drama'
}
])
})
it('can handle empty guide', () => {
const result = parser({
content: '""'
})
expect(result).toMatchObject([])
})

View file

@ -1,21 +0,0 @@
# disneystar.com
https://www.disneystar.com/tv-guide/
### Download the guide
```sh
npm run grab -- --site=disneystar.com
```
### Update channel list
```sh
npm run channels:parse -- --config=sites/disneystar.com/disneystar.com.config.js --output=sites/disneystar.com/disneystar.com.channels.xml
```
### Test
```sh
npm test -- disneystar.com
```

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,89 +0,0 @@
const axios = require('axios')
const { DateTime } = require('luxon')
const API_ENDPOINT = 'http://epg.i-cable.com/ci/channel'
module.exports = {
site: 'epg.i-cable.com',
days: 2,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1h
}
},
url: function ({ channel, date }) {
return `${API_ENDPOINT}/epg/${channel.site_id}/${date.format('YYYY-MM-DD')}?api=api`
},
parser({ content, channel, date }) {
const programs = []
const items = parseItems(content, date)
for (let item of items) {
const prev = programs[programs.length - 1]
let start = parseStart(item, date)
const stop = start.plus({ minutes: 30 })
if (prev) {
if (start < prev.start) {
start = start.plus({ days: 1 })
date = date.add(1, 'd')
}
prev.stop = start
}
programs.push({
title: parseTitle(item, channel),
start,
stop
})
}
return programs
},
async channels({ lang }) {
const data = await axios
.get(`${API_ENDPOINT}/category/0?api=api`)
.then(r => r.data)
.catch(console.error)
let channels = []
const promises = data.cates.map(c => axios.get(`${API_ENDPOINT}/category/${c.cate_id}?api=api`))
await Promise.allSettled(promises).then(results => {
results.forEach(r => {
if (r.status === 'fulfilled') {
channels = channels.concat(r.value.data.chs)
}
})
})
return channels.map(c => {
let name = lang === 'zh' ? c.channel_name : c.channel_name_en
name = c.remark_id == 3 ? `${name} [HD]` : name
return {
site_id: c.channel_no,
name,
lang
}
})
}
}
function parseTitle(item, channel) {
return channel.lang === 'en' ? item.programme_name_eng : item.programme_name_chi
}
function parseStart(item, date) {
let meridiem = item.session_mark === 'PM' ? 'PM' : 'AM'
return DateTime.fromFormat(
`${date.format('YYYY-MM-DD')} ${item.time} ${meridiem}`,
'yyyy-MM-dd hh:mm a',
{
zone: 'Asia/Hong_Kong'
}
).toUTC()
}
function parseItems(content) {
const data = JSON.parse(content)
if (!data || !Array.isArray(data.epgs)) return []
return data.epgs
}

View file

@ -1,70 +0,0 @@
const { parser, url } = require('./epg.i-cable.com.config.js')
const fs = require('fs')
const path = require('path')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
jest.mock('axios')
const date = dayjs.utc('2022-11-15', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '003',
xmltv_id: 'HOYTV.hk',
lang: 'zh'
}
it('can generate valid url', () => {
expect(url({ channel, date })).toBe(
'http://epg.i-cable.com/ci/channel/epg/003/2022-11-15?api=api'
)
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
let results = parser({ content, channel, date })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2022-11-14T22:00:00.000Z',
stop: '2022-11-14T23:00:00.000Z',
title: 'Bloomberg 時段'
})
expect(results[31]).toMatchObject({
start: '2022-11-15T21:00:00.000Z',
stop: '2022-11-15T21:30:00.000Z',
title: 'Bloomberg 時段'
})
})
it('can parse response in English', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
const channelEN = { ...channel, lang: 'en' }
let results = parser({ content, channel: channelEN, date })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2022-11-14T22:00:00.000Z',
stop: '2022-11-14T23:00:00.000Z',
title: 'Bloomberg Hour'
})
})
it('can handle empty guide', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json'))
const results = parser({ date, channel, content })
expect(results).toMatchObject([])
})

View file

@ -1,100 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="epg.i-cable.com" lang="de" xmltv_id="DWDeutsch.de" site_id="140">DW (Deutsch)</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ABCAustralia.au" site_id="326">ABC Australia</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="AlJazeeraEnglish.qa" site_id="133">Al Jazeera English</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="AnimalPlanetSoutheastAsia.sg" site_id="757">Animal Planet</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ArirangTV.kr" site_id="325">Arirang TV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="AsianFoodNetwork.sg" site_id="717">Asian Food Network [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="BBCEarthAsia.uk" site_id="721">BBC Earth</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="BBCLifestyleAsia.uk" site_id="760">BBC Lifestyle</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="BBCNewsAsiaPacific.uk" site_id="122">BBC WorldNews</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="BloombergTVAsia.hk" site_id="155">Bloomberg TV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="BoomerangAsia.sg" site_id="512">Boomerang</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CartoonNetworkAsia.sg" site_id="511">Cartoon Network</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CBeebiesAsia.uk" site_id="517">CBeebies</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CCTV1.cn" site_id="341">CCTV-1 [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CCTV11.cn" site_id="340">CCTV-11-Opera</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CCTV13.cn" site_id="111">CCTV-News</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CCTV4Asia.cn" site_id="112">CCTV-4</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CGTN.cn" site_id="129">CGTN</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CGTNDocumentary.cn" site_id="722">CGTN-Documentary [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ChannelBlue.hk" site_id="901">Channel Blue</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ChannelFire.hk" site_id="902">Channel Fire</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CNAInternational.sg" site_id="130">Ch News Asia</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CNBCAsia.sg" site_id="127">CNBC HK</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="CNNInternationalAsiaPacific.hk" site_id="124">CNNI</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="DaVinciAsia.de" site_id="513">Da Vinci</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="DiscoveryAsia.sg" site_id="710">Discovery Asia [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="DiscoveryChannelSoutheastAsia.sg" site_id="754">Discovery</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="DiscoveryScienceSoutheastAsia.sg" site_id="758">Discovery Sci</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="DMAXSoutheastAsia.sg" site_id="759">DMAX</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="DragonTV.cn" site_id="334">Dragon TV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="DreamWorksChannelAsia.us" site_id="510">DreamWorks</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="DWEnglish.de" site_id="139">DW (English)</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="EBCAsia.tw" site_id="331">ETTV Asia</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="EBCYOYO.tw" site_id="502">Asia YOYO TV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ETTVAsiaNews.tw" site_id="114">ETTV AsiaNews</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="EuronewsEnglish.fr" site_id="136">euronews(Eng)</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="EuronewsPortuguese.fr" site_id="137">euronews(Por)</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="EurosportAsia.fr" site_id="651">Eurosport</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="EVE.us" site_id="756">EVE</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="FashionTVAsia.fr" site_id="375">Fashion TV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="FightSports.us" site_id="652">FIGHT SPORTS</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="France24English.fr" site_id="135">France 24 English</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="GlobalTrekker.sg" site_id="708">Global Trekker [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="GuangdongSatelliteTV.cn" site_id="305">GRT GBA Satellite TV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="HITS.sg" site_id="310">HITS [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="HITSMovies.sg" site_id="213">HITS MOVIES [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="HKIBC.hk" site_id="005">HK Intl Business Ch</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="HLN.us" site_id="125">CNN HLN News</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="HOYTV.hk" site_id="003">HOY TV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="HubeiSatelliteTV.cn" site_id="337">Hubei TV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="HunanTVInternational.cn" site_id="336">Hunan TV International</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLECableMovies.hk" site_id="251">CABLE Movies</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEChannel18.hk" site_id="618">Channel 18</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLECinep.hk" site_id="253">Cine p.</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEFamilyEntertainmentChannel.hk" site_id="371">Family Entertainment Channel</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEFinanceInfoChannel.hk" site_id="151">i-CABLE Finance Info Channel</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEHD603.hk" site_id="603">HD Channel 603 [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEHorseRacing1.hk" site_id="668">Horse Racing 1</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEHorseRacing2.hk" site_id="669">Horse Racing 2</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLELiveNewsChannel.hk" site_id="153">i-CABLE Live News Channel</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLENewsChannel.hk" site_id="152">i-CABLE News Channel</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLESportsChannel.hk" site_id="661">Sports Channel</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLESportsPlus1.hk" site_id="662">Sports Plus 1</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLESportsPlus2.hk" site_id="664">Sports Plus 2</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLESportsPlus3.hk" site_id="665">Sports Plus 3</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="LFCTV.uk" site_id="654">LFCTV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="MTVLive.uk" site_id="333">MTV Live</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="MyCinemaEurope.ch" site_id="252">MyCineEu</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="NationalGeographic.hk" site_id="752">National Geographic</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="NationalGeographicWild.hk" site_id="751">Nat Geo Wild</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="NHKWorldJapan.jp" site_id="126">NHK World-Japan</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="NHKWorldPremium.jp" site_id="322">NHK World Pr</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="NickelodeonAsia.sg" site_id="514">Nickelodeon</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="NickJrAsia.sg" site_id="515">Nick Jr.</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="OutdoorChannelInternational.us" site_id="761">Outdoor Channel</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ParamountNetworkAsia.us" site_id="312">Paramount Network Asia [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="PetClubTV.hk" site_id="730">Pet Club TV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="PhoenixChineseChannel.hk" site_id="376">Phoenix Chi</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="PhoenixHongKongChannel.hk" site_id="304">Phoenix Hong Kong Channel</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="PhoenixInfoNewsChannel.hk" site_id="154">PhoenixInfonews</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ROCKEntertainment.sg" site_id="378">ROCK Entertainment</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ROCKExtreme.sg" site_id="318">ROCK Extreme [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="RT.ru" site_id="131">Russia Today</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ShenzhenSatelliteTV.cn" site_id="335">SZTV</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="SkyNewsInternational.uk" site_id="121">Sky News</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="StarChineseChannel.hk" site_id="332">STAR Chinese Channel</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="StarChineseMovies.hk" site_id="204">Star Chinese Movies [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="TechStorm.sg" site_id="610">TechStorm [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="Thrill.hk" site_id="219">Thrill</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="TLCSoutheastAsia.sg" site_id="755">TLC</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="TravelChannelSoutheastAsia.sg" site_id="718">Travel Channel [HD]</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="tvNAsia.hk" site_id="377">tvN</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="WION.in" site_id="852">WION</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="ZeeCinemaAsia.in" site_id="853">Zee Cinema</channel>
<channel site="epg.i-cable.com" lang="en" xmltv_id="Zing.in" site_id="854">Zing</channel>
<channel site="epg.i-cable.com" lang="fr" xmltv_id="France24French.fr" site_id="134">France 24 French</channel>
<channel site="epg.i-cable.com" lang="hi" xmltv_id="ZeeTVAsiaPacific.sg" site_id="851">Zee TV</channel>
</channels>

View file

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="AnimalPlanetSoutheastAsia.sg" site_id="757">動物星球頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="AsianFoodNetwork.sg" site_id="717">亞洲美食頻道 [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="BBCEarthAsia.uk" site_id="721">BBC Earth</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="BBCLifestyleAsia.uk" site_id="760">BBC Lifestyle</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="BloombergTVAsia.hk" site_id="155">Bloomberg TV</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="BoomerangAsia.sg" site_id="512">Boomerang 頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CartoonNetworkAsia.sg" site_id="511">卡通頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CCTV1.cn" site_id="341">中央電視台綜合頻道 [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CCTV11.cn" site_id="340">中央電視台戲曲頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CCTV13.cn" site_id="111">中央電視台新聞頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CCTV4Asia.cn" site_id="112">中央電視台中文國際頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ChannelBlue.hk" site_id="901">歡樂台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ChannelFire.hk" site_id="902">惹火台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CNAInternational.sg" site_id="130">亞洲新聞台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DiscoveryAsia.sg" site_id="710">Discovery Asia [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DiscoveryChannelSoutheastAsia.sg" site_id="754">Discovery</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DiscoveryScienceSoutheastAsia.sg" site_id="758">Discovery科學頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DMAXSoutheastAsia.sg" site_id="759">DMAX</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DragonTV.cn" site_id="334">東方衛視國際頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DreamWorksChannelAsia.us" site_id="510">夢工廠</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EBCAsia.tw" site_id="331">東森亞洲衛視</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EBCYOYO.tw" site_id="502">東森亞洲幼幼台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ETTVAsiaNews.tw" site_id="114">東森亞洲新聞台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EuronewsEnglish.fr" site_id="136">euronews(Eng)</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EuronewsPortuguese.fr" site_id="137">euronews(Por)</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EVE.us" site_id="756">EVE</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="GlobalTrekker.sg" site_id="708">Global Trekker [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="GuangdongSatelliteTV.cn" site_id="305">大灣區衛視</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HITS.sg" site_id="310">HITS [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HITSMovies.sg" site_id="213">HITS MOVIES [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HKIBC.hk" site_id="005">香港國際財經台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HOYTV.hk" site_id="003">HOY TV</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HubeiSatelliteTV.cn" site_id="337">湖北衛視</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HunanTVInternational.cn" site_id="336">湖南廣播電視台國際頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLECableMovies.hk" site_id="251">有線電影台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEChannel18.hk" site_id="618">有線18台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLECinep.hk" site_id="253">Cine p.</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEFamilyEntertainmentChannel.hk" site_id="371">綜合娛樂台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEFinanceInfoChannel.hk" site_id="151">財經資訊台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEHD603.hk" site_id="603">高清603台 [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEHorseRacing1.hk" site_id="668">賽馬1台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEHorseRacing2.hk" site_id="669">賽馬2台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLELiveNewsChannel.hk" site_id="153">直播新聞台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLENewsChannel.hk" site_id="152">新聞台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLESportsChannel.hk" site_id="661">體育台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLESportsPlus1.hk" site_id="662">Sports Plus 1</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLESportsPlus2.hk" site_id="664">Sports Plus 2</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLESportsPlus3.hk" site_id="665">Sports Plus 3</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="MyCinemaEurope.ch" site_id="252">光影歐洲</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="NationalGeographic.hk" site_id="752">國家地理頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="NationalGeographicWild.hk" site_id="751">國家地理野生頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="NickelodeonAsia.sg" site_id="514">Nickelodeon</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ParamountNetworkAsia.us" site_id="312">Paramount Network Asia [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="PhoenixChineseChannel.hk" site_id="376">鳯凰衛視中文台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="PhoenixHongKongChannel.hk" site_id="304">鳳凰衛視香港台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="PhoenixInfoNewsChannel.hk" site_id="154">鳳凰衛視資訊台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ROCKEntertainment.sg" site_id="378">ROCK綜藝娛樂</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ROCKExtreme.sg" site_id="318">ROCK超極娛樂 [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ShenzhenSatelliteTV.cn" site_id="335">深圳電視台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="StarChineseChannel.hk" site_id="332">衛視中文台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="StarChineseMovies.hk" site_id="204">衛視電影台 [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="Thrill.hk" site_id="219">驚慄電影台</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="TLCSoutheastAsia.sg" site_id="755">旅遊生活頻道</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="TravelChannelSoutheastAsia.sg" site_id="718">旅遊頻道 [HD]</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="tvNAsia.hk" site_id="377">tvN</channel>
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ZeeCinemaAsia.in" site_id="853">Zee Cinema</channel>
</channels>

View file

@ -1,37 +0,0 @@
# epg.i-cable.com
https://epg.i-cable.com/
### Download the guide
Chinese:
```sh
npm run grab -- --site=epg.i-cable.com --lang=zh
```
English:
```sh
npm run grab -- --site=epg.i-cable.com --lang=en
```
### Update channel list
Chinese:
```sh
npm run channels:parse -- --config=./sites/epg.i-cable.com/epg.i-cable.com.config.js --output=./sites/epg.i-cable.com/epg.i-cable.com_zh.channels.xml --set=lang:zh
```
English:
```sh
npm run channels:parse -- --config=./sites/epg.i-cable.com/epg.i-cable.com.config.js --output=./sites/epg.i-cable.com/epg.i-cable.com_en.channels.xml --set=lang:en
```
### Test
```sh
npm test -- epg.i-cable.com
```

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="hoy.tv" lang="zh" xmltv_id="HOYIBC.hk" site_id="76">HOY 國際財經台</channel>
<channel site="hoy.tv" lang="zh" xmltv_id="HOYTV.hk" site_id="77">HOY TV</channel>
<channel site="hoy.tv" lang="zh" xmltv_id="HOYInfotainment.hk" site_id="78">HOY 資訊台</channel>
</channels>

View file

@ -0,0 +1,63 @@
const axios = require('axios')
const convert = require('xml-js')
const dayjs = require('dayjs')
const timezone = require('dayjs/plugin/timezone')
dayjs.extend(timezone)
module.exports = {
site: 'hoy.tv',
days: 2,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1h
}
},
url: function ({ channel, date }) {
return `https://epg-file.hoy.tv/hoy/OTT${channel.site_id}${date.format('YYYYMMDD')}.xml`
},
parser({ content, channel, date }) {
const data = convert.xml2js(content, {
compact: true,
ignoreDeclaration: true,
ignoreAttributes: true
})
const programs = []
for (let item of data.ProgramGuide.Channel.EpgItem) {
const start = dayjs.tz(item.EpgStartDateTime._text, 'YYYY-MM-DD HH:mm:ss', 'Asia/Hong_Kong')
if (! date.isSame(start, 'day')) {
continue
}
const epIndex = item.EpisodeInfo.EpisodeIndex._text
const subtitle = parseInt(epIndex) > 0 ? `${epIndex}` : undefined
programs.push({
title: `${item.ComScore.ns_st_pr._text}${item.EpgOtherInfo?._text || ''}`,
sub_title: subtitle,
description: item.EpisodeInfo.EpisodeLongDescription._text,
start,
stop: dayjs.tz(item.EpgEndDateTime._text, 'YYYY-MM-DD HH:mm:ss', 'Asia/Hong_Kong'),
})
}
return programs
},
async channels({ lang }) {
const data = await axios
.get('https://api2.hoy.tv/api/v2/a/channel')
.then(r => r.data)
.catch(console.error)
return data.data.map(c => {
return {
site_id: c.videos.id,
name: c.name.zh_hk,
lang: 'zh',
}
})
}
}

116
sites/hoy.tv/hoy.tv.test.js Normal file
View file

@ -0,0 +1,116 @@
const { parser, url } = require('./hoy.tv.config.js')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
dayjs.extend(utc)
jest.mock('axios')
const date = dayjs.utc('2024-09-13', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '76',
xmltv_id: 'HOYIBC.hk',
lang: 'zh'
}
const content = `<?xml version="1.0" encoding="UTF-8" ?>
<ProgramGuide>
<Channel id="76">
<EpgItem>
<EpgStartDateTime>2024-09-13 11:30:00</EpgStartDateTime>
<EpgEndDateTime>2024-09-13 12:30:00</EpgEndDateTime>
<EpgOtherInfo>[PG]</EpgOtherInfo>
<DisableLive>false</DisableLive>
<DisableVod>false</DisableVod>
<VODLicPeriod>2024-09-27 11:30:00</VODLicPeriod>
<ProgramInfo>
<ProgramId>0</ProgramId>
<ProgramTitle></ProgramTitle>
<ProgramPos>0</ProgramPos>
<FirstRunDateTime></FirstRunDateTime>
<ProgramThumbnailUrl>http://tv.fantv.hk/images/thumbnail_1920_1080_fantv.jpg</ProgramThumbnailUrl>
</ProgramInfo>
<EpisodeInfo>
<EpisodeId>EQ00135</EpisodeId>
<EpisodeIndex>46</EpisodeIndex>
<EpisodeShortDescription>點講都係一家人</EpisodeShortDescription>
<EpisodeLongDescription></EpisodeLongDescription>
<EpisodeThumbnailUrl>http://tv.fantv.hk/images/nosuchthumbnail.jpg</EpisodeThumbnailUrl>
</EpisodeInfo>
<ComScore>
<ns_st_stc></ns_st_stc>
<ns_st_pr>點講都係一家人</ns_st_pr>
<ns_st_tpr>0</ns_st_tpr>
<ns_st_tep>EQ00135</ns_st_tep>
<ns_st_ep>點講都係一家人 Episode 46</ns_st_ep>
<ns_st_li>1</ns_st_li>
<ns_st_tdt>20240913</ns_st_tdt>
<ns_st_tm>1130</ns_st_tm>
<ns_st_ty>0001</ns_st_ty>
<ns_st_cl>3704000</ns_st_cl>
</ComScore>
</EpgItem>
<EpgItem>
<EpgStartDateTime>2024-09-13 12:30:00</EpgStartDateTime>
<EpgEndDateTime>2024-09-13 13:30:00</EpgEndDateTime>
<EpgOtherInfo></EpgOtherInfo>
<DisableLive>false</DisableLive>
<DisableVod>false</DisableVod>
<VODLicPeriod>2024-09-27 12:30:00</VODLicPeriod>
<ProgramInfo>
<ProgramId>0</ProgramId>
<ProgramTitle></ProgramTitle>
<ProgramPos>0</ProgramPos>
<FirstRunDateTime></FirstRunDateTime>
<ProgramThumbnailUrl>http://tv.fantv.hk/images/thumbnail_1920_1080_fantv.jpg</ProgramThumbnailUrl>
</ProgramInfo>
<EpisodeInfo>
<EpisodeId>ED00311</EpisodeId>
<EpisodeIndex>0</EpisodeIndex>
<EpisodeShortDescription>麝香之路</EpisodeShortDescription>
<EpisodeLongDescription>Ep. 2 .The Secret of disappeared kingdom.shows the mysterious disappearance of the ancient Tibetan kingdom which gained world</EpisodeLongDescription>
<EpisodeThumbnailUrl>http://tv.fantv.hk/images/nosuchthumbnail.jpg</EpisodeThumbnailUrl>
</EpisodeInfo>
<ComScore>
<ns_st_stc></ns_st_stc>
<ns_st_pr>麝香之路</ns_st_pr>
<ns_st_tpr>0</ns_st_tpr>
<ns_st_tep>ED00311</ns_st_tep>
<ns_st_ep>麝香之路 2024-09-13</ns_st_ep>
<ns_st_li>1</ns_st_li>
<ns_st_tdt>20240913</ns_st_tdt>
<ns_st_tm>1230</ns_st_tm>
<ns_st_ty>0001</ns_st_ty>
<ns_st_cl>3704000</ns_st_cl>
</ComScore>
</EpgItem>
</Channel>
</ProgramGuide>`
it('can generate valid url', () => {
expect(url({ channel, date })).toBe(
'https://epg-file.hoy.tv/hoy/OTT7620240913.xml'
)
})
it('can parse response', () => {
const result = parser({ content, channel, date }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
start: '2024-09-13T03:30:00.000Z',
stop: '2024-09-13T04:30:00.000Z',
title: '點講都係一家人[PG]',
sub_title: '第46集',
},
{
start: '2024-09-13T04:30:00.000Z',
stop: '2024-09-13T05:30:00.000Z',
title: '麝香之路',
description: 'Ep. 2 .The Secret of disappeared kingdom.shows the mysterious disappearance of the ancient Tibetan kingdom which gained world',
}
])
})

21
sites/hoy.tv/readme.md Normal file
View file

@ -0,0 +1,21 @@
# hoy.tv
https://hoy.tv/
### Download the guide
```sh
npm run grab -- --site=hoy.tv
```
### Update channel list
```sh
npm run channels:parse -- --config=./sites/hoy.tv/hoy.tv.config.js --output=./sites/hoy.tv/hoy.tv.channels.xml
```
### Test
```sh
npm test -- hoy.tv
```

View file

@ -10,41 +10,84 @@ dayjs.extend(timezone)
module.exports = { module.exports = {
site: 'mediasetinfinity.mediaset.it', site: 'mediasetinfinity.mediaset.it',
days: 2, days: 2,
url: function ({ date, channel }) { url: function ({date, channel}) {
// Get the epoch timestamp // Get the epoch timestamp
const todayEpoch = date.startOf('day').utc().valueOf(); const todayEpoch = date.startOf('day').utc().valueOf()
// Get the epoch timestamp for the next day // Get the epoch timestamp for the next day
const nextDayEpoch = date.add(1, 'day').startOf('day').utc().valueOf(); const nextDayEpoch = date.add(1, 'day').startOf('day').utc().valueOf()
return `https://api-ott-prod-fe.mediaset.net/PROD/play/feed/allListingFeedEpg/v2.0?byListingTime=${todayEpoch}~${nextDayEpoch}&byCallSign=${channel.site_id}` return `https://api-ott-prod-fe.mediaset.net/PROD/play/feed/allListingFeedEpg/v2.0?byListingTime=${todayEpoch}~${nextDayEpoch}&byCallSign=${channel.site_id}`
}, },
parser: function ({ content, date }) { parser: function ({content}) {
const programs = []; const programs = []
const data = JSON.parse(content); const data = JSON.parse(content)
if (!data.response || !data.response.entries || !data.response.entries[0] || !data.response.entries[0].listings) { if (!data.response || !data.response.entries || !data.response.entries[0] || !data.response.entries[0].listings) {
// If the structure is not as expected, return an empty array // If the structure is not as expected, return an empty array
return programs; return programs
} }
const listings = data.response.entries[0].listings; const listings = data.response.entries[0].listings
listings.forEach((listing) => { listings.forEach((listing) => {
if (listing.program.title && listing.startTime && listing.endTime) { const title = listing.mediasetlisting$epgTitle
const start = parseTime(listing.startTime); const subTitle = listing.program.title
const stop = parseTime(listing.endTime); const season = parseSeason(listing)
const episode = parseEpisode(listing)
if (listing.program.title && listing.startTime && listing.endTime) {
programs.push({ programs.push({
title: listing.program.title, title: title || subTitle,
description: listing.program.description, sub_title: title && title != subTitle ? subTitle : null,
start, description: listing.program.description || null,
stop category: listing.program.mediasetprogram$skyGenre || null,
}); season: episode && !season ? '0' : season,
episode: episode,
start: parseTime(listing.startTime),
stop: parseTime(listing.endTime),
image: getMaxResolutionThumbnails(listing)
})
} }
}); })
return programs;
return programs
} }
} }
function parseTime(timestamp) { function parseTime(timestamp) {
return dayjs(timestamp).utc().format('YYYY-MM-DD HH:mm'); return dayjs(timestamp).utc().format('YYYY-MM-DD HH:mm')
}
function parseSeason(item) {
if (!item.mediasetlisting$shortDescription) return null
const season = item.mediasetlisting$shortDescription.match(/S(\d+)\s/)
return season ? season[1] : null
}
function parseEpisode(item) {
if (!item.mediasetlisting$shortDescription) return null
const episode = item.mediasetlisting$shortDescription.match(/Ep(\d+)\s/)
return episode ? episode[1] : null
}
function getMaxResolutionThumbnails(item) {
const thumbnails = item.program.thumbnails || null
const maxResolutionThumbnails = {}
for (const key in thumbnails) {
const type = key.split('-')[0] // Estrarre il tipo di thumbnail
const {width, height, url, title} = thumbnails[key]
if (!maxResolutionThumbnails[type] ||
(width * height > maxResolutionThumbnails[type].width * maxResolutionThumbnails[type].height)) {
maxResolutionThumbnails[type] = {width, height, url, title}
}
}
if (maxResolutionThumbnails.image_keyframe_poster)
return maxResolutionThumbnails.image_keyframe_poster.url
else if (maxResolutionThumbnails.image_header_poster)
return maxResolutionThumbnails.image_header_poster.url
else
return null
} }

View file

@ -1,4 +1,4 @@
const { parser, url } = require('./mediasetinfinity.mediaset.it.config.js') const {parser, url} = require('./mediasetinfinity.mediaset.it.config.js')
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const dayjs = require('dayjs') const dayjs = require('dayjs')
@ -9,27 +9,32 @@ dayjs.extend(utc)
const date = dayjs.utc('2024-01-20', 'YYYY-MM-DD').startOf('d') const date = dayjs.utc('2024-01-20', 'YYYY-MM-DD').startOf('d')
const channel = { const channel = {
site_id: 'LB', site_id: 'LB', xmltv_id: '20.it'
xmltv_id: '20.it'
} }
it('can generate valid url', () => { it('can generate valid url', () => {
expect(url({ channel, date })).toBe( expect(url({
'https://api-ott-prod-fe.mediaset.net/PROD/play/feed/allListingFeedEpg/v2.0?byListingTime=1705708800000~1705795200000&byCallSign=LB' channel,
) date
})).toBe('https://api-ott-prod-fe.mediaset.net/PROD/play/feed/allListingFeedEpg/v2.0?byListingTime=1705708800000~1705795200000&byCallSign=LB')
}) })
it('can parse response', () => { it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'), 'utf8') const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'), 'utf8')
const results = parser({ content, date }).map(p => { const results = parser({content, date}).map(p => {
return p return p
}) })
expect(results[0]).toMatchObject({ expect(results[3]).toMatchObject({
start: '2024-01-19 22:37', start: '2024-01-20 02:14',
stop: '2024-01-20 00:54', stop: '2024-01-20 02:54',
title: 'Independence day: Rigenerazione', title: 'Chicago Fire',
description: 'Sequel del film di fantascienza Independence Day, con L. Hemsworth e B. Pullman. Dopo 20 anni la Terra si prepara a subire un secondo, terrificante attacco alieno.', sub_title: 'Ep. 22 - Io non ti lascio',
description: 'Severide e Kidd continuano a indagare su un vecchio caso doloso di Benny. Notizie inaspettate portano Brett a meditare su una grande decisione.',
category: 'Intrattenimento',
season: '7',
episode: '22',
image: 'https://static2.mediasetplay.mediaset.it/Mediaset_Italia_Production_-_Main/F309370301002204/media/0/0/1ef76b73-3173-43bd-9c16-73986a0ec131/46896726-11e7-4438-b947-d2ae53f58c0b.jpg'
}) })
}) })

View file

@ -77,6 +77,7 @@
<channel site="meo.pt" lang="pt" xmltv_id="" site_id="SPT4HD">Sport TV4</channel> <channel site="meo.pt" lang="pt" xmltv_id="" site_id="SPT4HD">Sport TV4</channel>
<channel site="meo.pt" lang="pt" xmltv_id="" site_id="SPT5HD">Sport TV5</channel> <channel site="meo.pt" lang="pt" xmltv_id="" site_id="SPT5HD">Sport TV5</channel>
<channel site="meo.pt" lang="pt" xmltv_id="" site_id="SPT6HD">Sport TV6</channel> <channel site="meo.pt" lang="pt" xmltv_id="" site_id="SPT6HD">Sport TV6</channel>
<channel site="meo.pt" lang="pt" xmltv_id="" site_id="SPT7HD">Sport TV7</channel>
<channel site="meo.pt" lang="pt" xmltv_id="" site_id="SPTVHD">Sport TV+</channel> <channel site="meo.pt" lang="pt" xmltv_id="" site_id="SPTVHD">Sport TV+</channel>
<channel site="meo.pt" lang="pt" xmltv_id="" site_id="SYFHD">SyFy</channel> <channel site="meo.pt" lang="pt" xmltv_id="" site_id="SYFHD">SyFy</channel>
<channel site="meo.pt" lang="pt" xmltv_id="" site_id="TAGES24">Tagesschau24</channel> <channel site="meo.pt" lang="pt" xmltv_id="" site_id="TAGES24">Tagesschau24</channel>
@ -113,6 +114,7 @@
<channel site="meo.pt" lang="pt" xmltv_id="CartoonNetwork.pt" site_id="CART">Cartoon Network</channel> <channel site="meo.pt" lang="pt" xmltv_id="CartoonNetwork.pt" site_id="CART">Cartoon Network</channel>
<channel site="meo.pt" lang="pt" xmltv_id="CGTNDocumentary.cn" site_id="CGTNDHD">CGTN Documentary</channel> <channel site="meo.pt" lang="pt" xmltv_id="CGTNDocumentary.cn" site_id="CGTNDHD">CGTN Documentary</channel>
<channel site="meo.pt" lang="pt" xmltv_id="ChannelOne.ru" site_id="1RUSS">Channel 1 Russia</channel> <channel site="meo.pt" lang="pt" xmltv_id="ChannelOne.ru" site_id="1RUSS">Channel 1 Russia</channel>
<channel site="meo.pt" lang="pt" xmltv_id="NewsNow.pt" site_id="NEWSNOW">Now</channel>
<channel site="meo.pt" lang="pt" xmltv_id="CMTV.pt" site_id="CMTV">CMTV</channel> <channel site="meo.pt" lang="pt" xmltv_id="CMTV.pt" site_id="CMTV">CMTV</channel>
<channel site="meo.pt" lang="pt" xmltv_id="CNBCEurope.uk" site_id="CNBC">CNBC</channel> <channel site="meo.pt" lang="pt" xmltv_id="CNBCEurope.uk" site_id="CNBC">CNBC</channel>
<channel site="meo.pt" lang="pt" xmltv_id="CNNInternationalEurope.us" site_id="CNN">CNN</channel> <channel site="meo.pt" lang="pt" xmltv_id="CNNInternationalEurope.us" site_id="CNN">CNN</channel>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<channels> <channels>
<channel site="mewatch.sg" lang="en" xmltv_id="" site_id="98201">SPL02</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="AnimaxAsia.sg" site_id="242030">Animax</channel> <channel site="mewatch.sg" lang="en" xmltv_id="AnimaxAsia.sg" site_id="242030">Animax</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="Channel5.sg" site_id="97098">Channel 5</channel> <channel site="mewatch.sg" lang="en" xmltv_id="Channel5.sg" site_id="97098">Channel 5</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="Channel8.sg" site_id="97104">Channel 8</channel> <channel site="mewatch.sg" lang="en" xmltv_id="Channel8.sg" site_id="97104">Channel 8</channel>
@ -7,7 +8,6 @@
<channel site="mewatch.sg" lang="en" xmltv_id="CinemaWorld.my" site_id="382872">CinemaWorld</channel> <channel site="mewatch.sg" lang="en" xmltv_id="CinemaWorld.my" site_id="382872">CinemaWorld</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="CinemaxAsia.sg" site_id="97155">Cinemax</channel> <channel site="mewatch.sg" lang="en" xmltv_id="CinemaxAsia.sg" site_id="97155">Cinemax</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="CNA.sg" site_id="97072">CNA</channel> <channel site="mewatch.sg" lang="en" xmltv_id="CNA.sg" site_id="97072">CNA</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="GEM.sg" site_id="242036">GEM</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="GlobalTrekker.sg" site_id="158961">Global Trekker</channel> <channel site="mewatch.sg" lang="en" xmltv_id="GlobalTrekker.sg" site_id="158961">Global Trekker</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="HBOAsia.sg" site_id="97137">HBO</channel> <channel site="mewatch.sg" lang="en" xmltv_id="HBOAsia.sg" site_id="97137">HBO</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="HBOFamilyAsia.sg" site_id="97147">HBO Family</channel> <channel site="mewatch.sg" lang="en" xmltv_id="HBOFamilyAsia.sg" site_id="97147">HBO Family</channel>
@ -15,12 +15,14 @@
<channel site="mewatch.sg" lang="en" xmltv_id="HBOSignatureAsia.sg" site_id="97146">HBO Signature</channel> <channel site="mewatch.sg" lang="en" xmltv_id="HBOSignatureAsia.sg" site_id="97146">HBO Signature</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="meWATCHLIVE1.sg" site_id="97073">LIVE 1</channel> <channel site="mewatch.sg" lang="en" xmltv_id="meWATCHLIVE1.sg" site_id="97073">LIVE 1</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="meWATCHLIVE2.sg" site_id="97078">LIVE 2</channel> <channel site="mewatch.sg" lang="en" xmltv_id="meWATCHLIVE2.sg" site_id="97078">LIVE 2</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="meWATCHLIVE5.sg" site_id="98202">LIVE 5</channel> <channel site="mewatch.sg" lang="en" xmltv_id="Now70s.uk" site_id="158964">NOW 70s</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="meWATCHLIVEPlus1.sg" site_id="267994">LIVE+ 1</channel> <channel site="mewatch.sg" lang="en" xmltv_id="Now80s.uk" site_id="158965">NOW 80s</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="NOWRock.uk" site_id="158963">NOW Rock</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="oktolidays.sg" site_id="186574">oktolidays</channel> <channel site="mewatch.sg" lang="en" xmltv_id="oktolidays.sg" site_id="186574">oktolidays</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="ROCKAction.sg" site_id="227349">ROCK Action</channel> <channel site="mewatch.sg" lang="en" xmltv_id="ROCKAction.sg" site_id="227349">ROCK Action</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="ROCKEntertainment.sg" site_id="227348">ROCK Entertainment</channel> <channel site="mewatch.sg" lang="en" xmltv_id="ROCKEntertainment.sg" site_id="227348">ROCK Entertainment</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="SPLCH01.sg" site_id="98200">SPL01</channel> <channel site="mewatch.sg" lang="en" xmltv_id="SPLCH01.sg" site_id="98200">SPL01</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="Suria.sg" site_id="97084">Suria</channel> <channel site="mewatch.sg" lang="en" xmltv_id="Suria.sg" site_id="97084">Suria</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="TraceUrban.fr" site_id="158962">TRACE Urban</channel>
<channel site="mewatch.sg" lang="en" xmltv_id="Vasantham.sg" site_id="97096">Vasantham</channel> <channel site="mewatch.sg" lang="en" xmltv_id="Vasantham.sg" site_id="97096">Vasantham</channel>
</channels> </channels>

View file

@ -1,12 +1,23 @@
const dayjs = require('dayjs') const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = { module.exports = {
site: 'mewatch.sg', site: 'mewatch.sg',
days: 2, days: 2,
url: function ({ channel, date }) { url: function ({ channel, date }) {
return `https://cdn.mewatch.sg/api/schedules?channels=${channel.site_id}&date=${date.format( const utcDate = date.isUTC() ? date.tz(dayjs.tz.guess(), true).utc() : date.utc()
return `https://cdn.mewatch.sg/api/schedules?channels=${channel.site_id}&date=${utcDate.format(
'YYYY-MM-DD' 'YYYY-MM-DD'
)}&duration=24&ff=idp,ldp,rpt,cd&hour=21&intersect=true&lang=en&segments=all` )}&duration=24&ff=idp,ldp,rpt,cd&hour=${utcDate.format(
'HH'
)}&intersect=true&lang=en&segments=all`
}, },
parser: function ({ content, channel }) { parser: function ({ content, channel }) {
let programs = [] let programs = []
@ -40,7 +51,11 @@ module.exports = {
$('#side-nav > div > div > div > nav:nth-child(1) > ul > li > ul > li').each((i, el) => { $('#side-nav > div > div > div > nav:nth-child(1) > ul > li > ul > li').each((i, el) => {
const name = $(el).find('a > span').text() const name = $(el).find('a > span').text()
const url = $(el).find('a').attr('href') const url = $(el).find('a').attr('href')
const [, site_id] = url.match(/\/(\d+)\?player-fullscreen/) const [, site_id = null] = url.match(/\/(\d+)\?player-fullscreen/) ?? []
if (!site_id) {
return
}
channels.push({ channels.push({
lang: 'en', lang: 'en',

View file

@ -13,7 +13,7 @@ const channel = {
it('can generate valid url', () => { it('can generate valid url', () => {
expect(url({ channel, date })).toBe( expect(url({ channel, date })).toBe(
'https://cdn.mewatch.sg/api/schedules?channels=97098&date=2022-06-11&duration=24&ff=idp,ldp,rpt,cd&hour=21&intersect=true&lang=en&segments=all' 'https://cdn.mewatch.sg/api/schedules?channels=97098&date=2022-06-10&duration=24&ff=idp,ldp,rpt,cd&hour=12&intersect=true&lang=en&segments=all'
) )
}) })

View file

@ -244,6 +244,7 @@
<channel site="telenet.tv" lang="nl" xmltv_id="PlayMoreBlack.be" site_id="channel6">Play More Black</channel> <channel site="telenet.tv" lang="nl" xmltv_id="PlayMoreBlack.be" site_id="channel6">Play More Black</channel>
<channel site="telenet.tv" lang="nl" xmltv_id="PlayMoreCinema.be" site_id="primestarhd">Play More Cinema</channel> <channel site="telenet.tv" lang="nl" xmltv_id="PlayMoreCinema.be" site_id="primestarhd">Play More Cinema</channel>
<channel site="telenet.tv" lang="nl" xmltv_id="PlayMoreKicks.be" site_id="primeaction">Play More Kicks</channel> <channel site="telenet.tv" lang="nl" xmltv_id="PlayMoreKicks.be" site_id="primeaction">Play More Kicks</channel>
<channel site="telenet.tv" lang="nl" xmltv_id="PlayMoreCrime.be" site_id="playcrime">Play More Crime</channel>
<channel site="telenet.tv" lang="nl" xmltv_id="PlaySports1.be" site_id="primesporthd">Play Sports HD1</channel> <channel site="telenet.tv" lang="nl" xmltv_id="PlaySports1.be" site_id="primesporthd">Play Sports HD1</channel>
<channel site="telenet.tv" lang="nl" xmltv_id="PlaySports2.be" site_id="sportinghd2">Play Sports HD2</channel> <channel site="telenet.tv" lang="nl" xmltv_id="PlaySports2.be" site_id="sportinghd2">Play Sports HD2</channel>
<channel site="telenet.tv" lang="nl" xmltv_id="PlaySports3.be" site_id="sporting3">Play Sports HD3</channel> <channel site="telenet.tv" lang="nl" xmltv_id="PlaySports3.be" site_id="sporting3">Play Sports HD3</channel>

View file

@ -234,11 +234,8 @@
<channel site="tv.blue.ch" lang="de" xmltv_id="AXNBlack.de" site_id="32">AXN Black</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="AXNBlack.de" site_id="32">AXN Black</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="Bergblick.de" site_id="1409">Bergblick</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="Bergblick.de" site_id="1409">Bergblick</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="BibelTV.de" site_id="44">Bibel TV</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="BibelTV.de" site_id="44">Bibel TV</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="Bild.de" site_id="1865">Bild</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="BlueAction.ch" site_id="591">blue Action</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="BlueAction.ch" site_id="591">blue Action</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="BlueCity.ch" site_id="1225">blue City</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="BlueEvent1.ch" site_id="1282">blue Music D 1</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="BlueEvent1.ch" site_id="1282">blue Music D 1</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="BluePrime.ch" site_id="588">blue Prime</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="BlueRetro.ch" site_id="1226">blue Retro</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="BlueRetro.ch" site_id="1226">blue Retro</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="BlueSport1.ch" site_id="483">blue Sport D 1</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="BlueSport1.ch" site_id="483">blue Sport D 1</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="BlueSport2.ch" site_id="494">blue Sport D 2</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="BlueSport2.ch" site_id="494">blue Sport D 2</channel>
@ -260,7 +257,6 @@
<channel site="tv.blue.ch" lang="de" xmltv_id="DisneyChannel.de" site_id="128">Disney Channel D</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="DisneyChannel.de" site_id="128">Disney Channel D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="DMAX.de" site_id="136">DMAX</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="DMAX.de" site_id="136">DMAX</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="ducktv.sk" site_id="1626">ducktv</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="ducktv.sk" site_id="1626">ducktv</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="DWDeutsch.de" site_id="1447">DW Deutsch</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="eSports1.de" site_id="1553">eSports1</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="eSports1.de" site_id="1553">eSports1</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="Eurochannel.uk" site_id="1635">Eurochannel D</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="Eurochannel.uk" site_id="1635">Eurochannel D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="EuronewsGerman.fr" site_id="163">Euronews D</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="EuronewsGerman.fr" site_id="163">Euronews D</channel>
@ -271,7 +267,6 @@
<channel site="tv.blue.ch" lang="de" xmltv_id="GameTV.ch" site_id="1224">Game TV</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="GameTV.ch" site_id="1224">Game TV</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="GEOTelevision.de" site_id="1333">GEO Television</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="GEOTelevision.de" site_id="1333">GEO Television</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="GoldstarTVGermany.de" site_id="1786">Goldstar TV</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="GoldstarTVGermany.de" site_id="1786">Goldstar TV</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="GoTV.at" site_id="194">gotv</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="Heimatkanal.de" site_id="664">Heimatkanal</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="Heimatkanal.de" site_id="664">Heimatkanal</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="HelvetiaOneTV.ch" site_id="1040">Helvetia One TV</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="HelvetiaOneTV.ch" site_id="1040">Helvetia One TV</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="HGTV.us" site_id="1510">Home &amp; Garden TV</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="HGTV.us" site_id="1510">Home &amp; Garden TV</channel>
@ -280,7 +275,6 @@
<channel site="tv.blue.ch" lang="de" xmltv_id="HopeChannelGerman.de" site_id="204">Hope TV</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="HopeChannelGerman.de" site_id="204">Hope TV</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="hrfernsehen.de" site_id="205">HR</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="hrfernsehen.de" site_id="205">HR</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="HSE.de" site_id="207">HSE</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="HSE.de" site_id="207">HSE</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="Junior.de" site_id="224">Junior</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="kabeleinsClassics.de" site_id="1389">kabel eins CLASSICS</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="kabeleinsClassics.de" site_id="1389">kabel eins CLASSICS</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="kabeleinsDoku.de" site_id="920">kabel eins Doku</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="kabeleinsDoku.de" site_id="920">kabel eins Doku</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="kabeleinsSchweiz.ch" site_id="226">Kabel eins</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="kabeleinsSchweiz.ch" site_id="226">Kabel eins</channel>
@ -297,14 +291,6 @@
<channel site="tv.blue.ch" lang="de" xmltv_id="Motorvision.de" site_id="264">Motorvision TV</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="Motorvision.de" site_id="264">Motorvision TV</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MTV.de" site_id="268">MTV</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="MTV.de" site_id="268">MTV</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="Musig24TV.ch" site_id="275">musig24</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="Musig24TV.ch" site_id="275">musig24</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MySports2.ch" site_id="1544">MySports 2 D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MySports3.ch" site_id="1545">MySports 3 D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MySports4.ch" site_id="1546">MySports 4 D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MySports5.ch" site_id="1547">MySports 5 D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MySports6.ch" site_id="1548">MySports 6 D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MySports7.ch" site_id="1549">MySports 7 D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MySports8.ch" site_id="1550">MySports 8 D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MySports9.ch" site_id="1551">MySports 9 D</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="MySportsOne.ch" site_id="1543">MySports Eins</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="MySportsOne.ch" site_id="1543">MySports Eins</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="N24Doku.de" site_id="1030">N24 Doku</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="N24Doku.de" site_id="1030">N24 Doku</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="NationalGeographic.de" site_id="278">National Geographic D</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="NationalGeographic.de" site_id="278">National Geographic D</channel>
@ -380,8 +366,6 @@
<channel site="tv.blue.ch" lang="de" xmltv_id="TOGGOplus.de" site_id="918">Toggo Plus</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="TOGGOplus.de" site_id="918">Toggo Plus</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="TV24.ch" site_id="634">TV24</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="TV24.ch" site_id="634">TV24</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="TV25.ch" site_id="665">TV25</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="TV25.ch" site_id="665">TV25</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="TV4TNG.ch" site_id="1269">TV4TNG</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="TVCentral.sk" site_id="1504">TV Central</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="TVO.ch" site_id="641">TVO</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="TVO.ch" site_id="641">TVO</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="TVOberwallis.ch" site_id="628">TV Oberwallis</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="TVOberwallis.ch" site_id="628">TV Oberwallis</channel>
<channel site="tv.blue.ch" lang="de" xmltv_id="TVRheintal.ch" site_id="630">TV Rheintal</channel> <channel site="tv.blue.ch" lang="de" xmltv_id="TVRheintal.ch" site_id="630">TV Rheintal</channel>
@ -479,7 +463,6 @@
<channel site="tv.blue.ch" lang="en" xmltv_id="Challenge.uk" site_id="1682">Challenge</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="Challenge.uk" site_id="1682">Challenge</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="Channel4.uk" site_id="89">Channel 4</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="Channel4.uk" site_id="89">Channel 4</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="Channel5.uk" site_id="178">Channel 5</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="Channel5.uk" site_id="178">Channel 5</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="CITV.uk" site_id="1653">CITV</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="ClublandTV.uk" site_id="105">Clubland TV</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="ClublandTV.uk" site_id="105">Clubland TV</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="CNBCEurope.uk" site_id="106">CNBC UK</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="CNBCEurope.uk" site_id="106">CNBC UK</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="CNNInternationalEurope.us" site_id="107">CNN</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="CNNInternationalEurope.us" site_id="107">CNN</channel>
@ -490,11 +473,9 @@
<channel site="tv.blue.ch" lang="en" xmltv_id="DWEnglish.de" site_id="142">DW Englisch</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="DWEnglish.de" site_id="142">DW Englisch</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="E4.uk" site_id="146">E4</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="E4.uk" site_id="146">E4</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="" site_id="1722">MySports EDGE</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="" site_id="1722">MySports EDGE</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="EEurope.nl" site_id="145">E! Entertainment Europe</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="EnglishClubTV.uk" site_id="1398">English Club TV</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="EnglishClubTV.uk" site_id="1398">English Club TV</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="EuronewsEnglish.fr" site_id="164">Euronews E</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="EuronewsEnglish.fr" site_id="164">Euronews E</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="Eurosport1.fr" site_id="1488">Eurosport 1 E</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="Eurosport1.fr" site_id="1488">Eurosport 1 E</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="ExtremeSportsChannel.nl" site_id="1555">Extreme Sports</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="FashionTVEurope.fr" site_id="175">Fashion TV</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="FashionTVEurope.fr" site_id="175">Fashion TV</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="Film4.uk" site_id="176">Film Four</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="Film4.uk" site_id="176">Film Four</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="FoodNetwork.uk" site_id="1292">Food Network E</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="FoodNetwork.uk" site_id="1292">Food Network E</channel>
@ -515,8 +496,6 @@
<channel site="tv.blue.ch" lang="en" xmltv_id="ITV4.uk" site_id="221">ITV4</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="ITV4.uk" site_id="221">ITV4</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="ITVBe.uk" site_id="1400">ITVBe</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="ITVBe.uk" site_id="1400">ITVBe</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="KBSWorld.kr" site_id="1500">KBS World</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="KBSWorld.kr" site_id="1500">KBS World</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="Kerrang.uk" site_id="391">Kerrang!</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="KissTV.uk" site_id="230">Kiss TV</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="LoveNature4K.ca" site_id="1375">Love Nature 4K</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="LoveNature4K.ca" site_id="1375">Love Nature 4K</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="More4.uk" site_id="262">More 4</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="More4.uk" site_id="262">More 4</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="NASATVUHD.us" site_id="1378">NASA TV</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="NASATVUHD.us" site_id="1378">NASA TV</channel>
@ -527,17 +506,12 @@
<channel site="tv.blue.ch" lang="en" xmltv_id="PBSAmerica.uk" site_id="1404">PBS America</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="PBSAmerica.uk" site_id="1404">PBS America</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="PhoenixInfoNewsChannel.hk" site_id="306">Phoenix Info News</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="PhoenixInfoNewsChannel.hk" site_id="306">Phoenix Info News</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="Quest.uk" site_id="1604">Quest</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="Quest.uk" site_id="1604">Quest</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="RT.ru" site_id="373">RT</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="RTRPlanetaEurope.ru" site_id="366">RTR Planeta</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="RTRPlanetaEurope.ru" site_id="366">RTR Planeta</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="SkyMix.uk" site_id="1677">Pick</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="SkyMix.uk" site_id="1677">Pick</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="SkyNewsInternational.uk" site_id="390">Sky News International</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="SkyNewsInternational.uk" site_id="390">Sky News International</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="SmithsonianChannel.uk" site_id="1490">Smithsonian Channel UK</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="StingrayFestival4K.ca" site_id="1257">Stingray Festival 4K</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="StingrayFestival4K.ca" site_id="1257">Stingray Festival 4K</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="StingrayiConcerts.ca" site_id="211">Stingray iConcerts</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="StingrayiConcerts.ca" site_id="211">Stingray iConcerts</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="TheBox.uk" site_id="604">The Box</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="TheIsraeliNetwork.il" site_id="1457">The Israeli Network</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="TheIsraeliNetwork.il" site_id="1457">The Israeli Network</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="TraceHits.uk" site_id="91">Trace Hits</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="ViaplayXtra.uk" site_id="1603">viaplay Xtra</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="VoATVGlobal.us" site_id="1637">Voice of America</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="VoATVGlobal.us" site_id="1637">Voice of America</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="Yesterday.uk" site_id="1674">Yesterday</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="Yesterday.uk" site_id="1674">Yesterday</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="" site_id="2062">Cubavisión Int.</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="" site_id="2062">Cubavisión Int.</channel>
@ -546,13 +520,10 @@
<channel site="tv.blue.ch" lang="es" xmltv_id="Antena3.es" site_id="1953">Antena 3 Int.</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="Antena3.es" site_id="1953">Antena 3 Int.</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="AragonTVInternacional.es" site_id="1535">Aragón TV Int</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="AragonTVInternacional.es" site_id="1535">Aragón TV Int</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="Atreseries.es" site_id="1954">Atreseries</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="Atreseries.es" site_id="1954">Atreseries</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="CanalExtremaduraSatelite.es" site_id="1291">Canal Extremadura Sat.</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="CanalSurAndalucia.es" site_id="19">Canal Sur Andalucía</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="CanalSurAndalucia.es" site_id="19">Canal Sur Andalucía</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="DePeliculaEuropa.mx" site_id="117">De Pelicula</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="DePeliculaEuropa.mx" site_id="117">De Pelicula</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="GVAXTV.ch" site_id="1757">GVAX Latino TV</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="GVAXTV.ch" site_id="1757">GVAX Latino TV</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="LasEstrellasEuropa.mx" site_id="75">Las Estrellas</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="LasEstrellasEuropa.mx" site_id="75">Las Estrellas</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="Latinos1TV.ch" site_id="1337">LATINOS 1</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="Teledeporte.es" site_id="1696">Teledeporte</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="TelehitMusica.mx" site_id="352">Telehit Music</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="TelehitMusica.mx" site_id="352">Telehit Music</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="Telesur.ve" site_id="1668">teleSUR</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="Telesur.ve" site_id="1668">teleSUR</channel>
<channel site="tv.blue.ch" lang="es" xmltv_id="TlnovelasEuropa.mx" site_id="608">Tlnovelas</channel> <channel site="tv.blue.ch" lang="es" xmltv_id="TlnovelasEuropa.mx" site_id="608">Tlnovelas</channel>
@ -701,11 +672,9 @@
<channel site="tv.blue.ch" lang="fr" xmltv_id="AB3.be" site_id="1081">AB 3</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="AB3.be" site_id="1081">AB 3</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="Action.fr" site_id="12">Action</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="Action.fr" site_id="12">Action</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="AjoieTV.ch" site_id="1456">Ajoie TV</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="AjoieTV.ch" site_id="1456">Ajoie TV</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="Alsace20.fr" site_id="1695">BFM Alsace</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="Animaux.fr" site_id="22">Animaux</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="Animaux.fr" site_id="22">Animaux</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="arte.fr" site_id="28">Arte Français</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="arte.fr" site_id="28">Arte Français</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="Automotolachaine.fr" site_id="10">AUTOMOTO</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="Automotolachaine.fr" site_id="10">AUTOMOTO</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="BET.fr" site_id="1730">BET</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="BFMBusiness.fr" site_id="42">BFM Business</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="BFMBusiness.fr" site_id="42">BFM Business</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="BFMTV.fr" site_id="43">BFM TV</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="BFMTV.fr" site_id="43">BFM TV</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="BlueEvent2.ch" site_id="1283">blue Music F 1</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="BlueEvent2.ch" site_id="1283">blue Music F 1</channel>
@ -736,7 +705,6 @@
<channel site="tv.blue.ch" lang="fr" xmltv_id="CinePlusFamiz.fr" site_id="65">Ciné+ Famiz</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="CinePlusFamiz.fr" site_id="65">Ciné+ Famiz</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="CinePlusFrisson.fr" site_id="66">Cine+ Frisson</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="CinePlusFrisson.fr" site_id="66">Cine+ Frisson</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="CinePlusPremier.fr" site_id="67">Ciné + Premier</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="CinePlusPremier.fr" site_id="67">Ciné + Premier</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="CliqueTV.fr" site_id="1754">Clique TV</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="CNews.fr" site_id="217">CNEWS</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="CNews.fr" site_id="217">CNEWS</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="ComediePlus.fr" site_id="109">Comedie!+</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="ComediePlus.fr" site_id="109">Comedie!+</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="ComedyCentral.fr" site_id="1969">Comedy Central F</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="ComedyCentral.fr" site_id="1969">Comedy Central F</channel>
@ -746,7 +714,6 @@
<channel site="tv.blue.ch" lang="fr" xmltv_id="DiscoveryScience.fr" site_id="125">Science Channel F</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="DiscoveryScience.fr" site_id="125">Science Channel F</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="DisneyChannel.fr" site_id="129">Disney Channel F</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="DisneyChannel.fr" site_id="129">Disney Channel F</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="DisneyJunior.fr" site_id="132">Disney Junior F</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="DisneyJunior.fr" site_id="132">Disney Junior F</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="E.fr" site_id="144">E! Entertainment France</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="Equidia.fr" site_id="151">Equidia Live</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="Equidia.fr" site_id="151">Equidia Live</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="Eurochannel.uk" site_id="1636">Eurochannel F</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="Eurochannel.uk" site_id="1636">Eurochannel F</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="EuronewsFrench.fr" site_id="165">Euronews F</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="EuronewsFrench.fr" site_id="165">Euronews F</channel>
@ -804,10 +771,6 @@
<channel site="tv.blue.ch" lang="fr" xmltv_id="NovelasTV.fr" site_id="1731">Novelas</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="NovelasTV.fr" site_id="1731">Novelas</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="NRJ12.fr" site_id="293">NRJ12</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="NRJ12.fr" site_id="293">NRJ12</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="NRTV.ch" site_id="294">NRTV</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="NRTV.ch" site_id="294">NRTV</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="OCSChoc.fr" site_id="1229">OCS Choc</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="OCSCitygenerationHBO.fr" site_id="1228">OCS City génération HBO</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="OCSGeants.fr" site_id="1230">OCS Géants</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="OCSMax.fr" site_id="1227">OCS Max</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="OlympiaTV.fr" site_id="1729">Olympia TV</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="OlympiaTV.fr" site_id="1729">Olympia TV</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="OneTV.ch" site_id="301">CARAC 2</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="OneTV.ch" site_id="301">CARAC 2</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="ORTBTV.bj" site_id="1686">ORTB</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="ORTBTV.bj" site_id="1686">ORTB</channel>
@ -819,8 +782,6 @@
<channel site="tv.blue.ch" lang="fr" xmltv_id="PolarPlus.fr" site_id="1273">Polar+</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="PolarPlus.fr" site_id="1273">Polar+</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="RFMTV.fr" site_id="349">RFM TV</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="RFMTV.fr" site_id="349">RFM TV</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="RMCDecouverte.fr" site_id="353">RMC Découverte</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="RMCDecouverte.fr" site_id="353">RMC Découverte</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="RMCSport1.fr" site_id="1036">RMC Sport Access 1</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="RMCSport2.fr" site_id="250">RMC Sport Access 2</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="RMCStory.fr" site_id="298">RMC Story</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="RMCStory.fr" site_id="298">RMC Story</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="RougeTV.ch" site_id="355">CARAC 1</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="RougeTV.ch" site_id="355">CARAC 1</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="RTL9.lu" site_id="364">RTL9</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="RTL9.lu" site_id="364">RTL9</channel>
@ -851,7 +812,6 @@
<channel site="tv.blue.ch" lang="fr" xmltv_id="TVM3.ch" site_id="640">TVM3</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="TVM3.ch" site_id="640">TVM3</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="TVOnex.ch" site_id="1331">TV Onex</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="TVOnex.ch" site_id="1331">TV Onex</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="TVSuissePlus.ch" site_id="1082">CARAC 4</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="TVSuissePlus.ch" site_id="1082">CARAC 4</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="UltraNature.fr" site_id="1217">Ultra Nature</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="UshuaiaTV.fr" site_id="644">Ushuaia TV</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="UshuaiaTV.fr" site_id="644">Ushuaia TV</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="VernierVisions.ch" site_id="1467">Vernier Visions</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="VernierVisions.ch" site_id="1467">Vernier Visions</channel>
<channel site="tv.blue.ch" lang="fr" xmltv_id="W9Switzerland.ch" site_id="653">W9</channel> <channel site="tv.blue.ch" lang="fr" xmltv_id="W9Switzerland.ch" site_id="653">W9</channel>
@ -925,7 +885,6 @@
<channel site="tv.blue.ch" lang="it" xmltv_id="FoodNetwork.it" site_id="1348">Food Network IT</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="FoodNetwork.it" site_id="1348">Food Network IT</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="Frisbee.it" site_id="189">Frisbee</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="Frisbee.it" site_id="189">Frisbee</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="Giallo.it" site_id="191">Giallo</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="Giallo.it" site_id="191">Giallo</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="GOTVCanale163.it" site_id="1811">GO-TV Canale 63</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="HGTV.it" site_id="1646">Home &amp; Garden TV IT</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="HGTV.it" site_id="1646">Home &amp; Garden TV IT</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="History.it" site_id="1693">History IT</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="History.it" site_id="1693">History IT</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="Iris.it" site_id="214">IRIS</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="Iris.it" site_id="214">IRIS</channel>
@ -939,8 +898,6 @@
<channel site="tv.blue.ch" lang="it" xmltv_id="LA7d.it" site_id="239">La 7d</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="LA7d.it" site_id="239">La 7d</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="MediasetExtra.it" site_id="257">Mediaset Extra</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="MediasetExtra.it" site_id="257">Mediaset Extra</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="MotorTrend.it" site_id="1384">Motor Trend</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="MotorTrend.it" site_id="1384">Motor Trend</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="NationalGeographic.it" site_id="280">National Geographic I</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="NationalGeographicWild.it" site_id="284">National Geographic Wild I</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="Nove.it" site_id="118">NOVE</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="Nove.it" site_id="118">NOVE</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="ParolediVita.it" site_id="1951">Parole di Vita</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="ParolediVita.it" site_id="1951">Parole di Vita</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="RadioItaliaTV.it" site_id="647">Video Italia TV</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="RadioItaliaTV.it" site_id="647">Video Italia TV</channel>
@ -956,7 +913,6 @@
<channel site="tv.blue.ch" lang="it" xmltv_id="RaiNews24.it" site_id="335">Rai News 24</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="RaiNews24.it" site_id="335">Rai News 24</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="RaiPremium.it" site_id="336">Rai Premium</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="RaiPremium.it" site_id="336">Rai Premium</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="RaiScuola.it" site_id="337">Rai Scuola</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="RaiScuola.it" site_id="337">Rai Scuola</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="RaiSport.it" site_id="339">Rai Sport</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="RaiSportHD.it" site_id="338">Rai Sport +</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="RaiSportHD.it" site_id="338">Rai Sport +</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="RaiStoria.it" site_id="340">Rai Storia</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="RaiStoria.it" site_id="340">Rai Storia</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="RaiYoyo.it" site_id="341">Rai Yoyo</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="RaiYoyo.it" site_id="341">Rai Yoyo</channel>
@ -982,7 +938,6 @@
<channel site="tv.blue.ch" lang="it" xmltv_id="TV8.it" site_id="266">TV8</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="TV8.it" site_id="266">TV8</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="Twentyseven.it" site_id="1948">Twentyseven</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="Twentyseven.it" site_id="1948">Twentyseven</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="UniNettunoUniversityTV.it" site_id="643">UniNettuno University TV</channel> <channel site="tv.blue.ch" lang="it" xmltv_id="UniNettunoUniversityTV.it" site_id="643">UniNettuno University TV</channel>
<channel site="tv.blue.ch" lang="it" xmltv_id="VH1.it" site_id="1253">VH1 Italy</channel>
<channel site="tv.blue.ch" lang="ku" xmltv_id="" site_id="236">Kurdsat</channel> <channel site="tv.blue.ch" lang="ku" xmltv_id="" site_id="236">Kurdsat</channel>
<channel site="tv.blue.ch" lang="ku" xmltv_id="KurdistanTV.iq" site_id="235">Kurdistan TV</channel> <channel site="tv.blue.ch" lang="ku" xmltv_id="KurdistanTV.iq" site_id="235">Kurdistan TV</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="RudawTV.iq" site_id="372">Rudaw TV</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="RudawTV.iq" site_id="372">Rudaw TV</channel>
@ -1002,14 +957,11 @@
<channel site="tv.blue.ch" lang="pt" xmltv_id="SICNoticias.pt" site_id="1482">SIC Noticias</channel> <channel site="tv.blue.ch" lang="pt" xmltv_id="SICNoticias.pt" site_id="1482">SIC Noticias</channel>
<channel site="tv.blue.ch" lang="pt" xmltv_id="TVIFiccao.pt" site_id="1487">TVI Ficção</channel> <channel site="tv.blue.ch" lang="pt" xmltv_id="TVIFiccao.pt" site_id="1487">TVI Ficção</channel>
<channel site="tv.blue.ch" lang="pt" xmltv_id="TVIInternacional.pt" site_id="1483">TVI Internacional</channel> <channel site="tv.blue.ch" lang="pt" xmltv_id="TVIInternacional.pt" site_id="1483">TVI Internacional</channel>
<channel site="tv.blue.ch" lang="ro" xmltv_id="B1.ro" site_id="33">B1 TV</channel>
<channel site="tv.blue.ch" lang="ro" xmltv_id="Digi24.ro" site_id="1650">Digi 24</channel> <channel site="tv.blue.ch" lang="ro" xmltv_id="Digi24.ro" site_id="1650">Digi 24</channel>
<channel site="tv.blue.ch" lang="ro" xmltv_id="PROTVInternational.ro" site_id="321">Pro TV International</channel> <channel site="tv.blue.ch" lang="ro" xmltv_id="PROTVInternational.ro" site_id="321">Pro TV International</channel>
<channel site="tv.blue.ch" lang="ro" xmltv_id="TVRInternational.ro" site_id="631">TV Romania International</channel> <channel site="tv.blue.ch" lang="ro" xmltv_id="TVRInternational.ro" site_id="631">TV Romania International</channel>
<channel site="tv.blue.ch" lang="ru" xmltv_id="" site_id="371">RTVi</channel> <channel site="tv.blue.ch" lang="ru" xmltv_id="" site_id="371">RTVi</channel>
<channel site="tv.blue.ch" lang="ru" xmltv_id="" site_id="409">CTC International</channel> <channel site="tv.blue.ch" lang="ru" xmltv_id="" site_id="409">CTC International</channel>
<channel site="tv.blue.ch" lang="ru" xmltv_id="Carousel.ru" site_id="1676">Karusel Int.</channel>
<channel site="tv.blue.ch" lang="ru" xmltv_id="ChannelOne.ru" site_id="90">Channel 1 Russia</channel>
<channel site="tv.blue.ch" lang="ru" xmltv_id="NashKinomir.de" site_id="229">Kinomir</channel> <channel site="tv.blue.ch" lang="ru" xmltv_id="NashKinomir.de" site_id="229">Kinomir</channel>
<channel site="tv.blue.ch" lang="ru" xmltv_id="OstWest.de" site_id="922">OstWest</channel> <channel site="tv.blue.ch" lang="ru" xmltv_id="OstWest.de" site_id="922">OstWest</channel>
<channel site="tv.blue.ch" lang="ru" xmltv_id="TelebomTeledom.de" site_id="587">TeleBom - TeleDom</channel> <channel site="tv.blue.ch" lang="ru" xmltv_id="TelebomTeledom.de" site_id="587">TeleBom - TeleDom</channel>
@ -1052,13 +1004,11 @@
<channel site="tv.blue.ch" lang="sr" xmltv_id="PinkPlus.rs" site_id="314">Pink Plus</channel> <channel site="tv.blue.ch" lang="sr" xmltv_id="PinkPlus.rs" site_id="314">Pink Plus</channel>
<channel site="tv.blue.ch" lang="sr" xmltv_id="PinkReality.rs" site_id="1459">Pink Reality</channel> <channel site="tv.blue.ch" lang="sr" xmltv_id="PinkReality.rs" site_id="1459">Pink Reality</channel>
<channel site="tv.blue.ch" lang="sr" xmltv_id="PinkSerije.rs" site_id="1692">Pink Serije</channel> <channel site="tv.blue.ch" lang="sr" xmltv_id="PinkSerije.rs" site_id="1692">Pink Serije</channel>
<channel site="tv.blue.ch" lang="sr" xmltv_id="PinkWorld.rs" site_id="1691">Pink World</channel>
<channel site="tv.blue.ch" lang="sr" xmltv_id="RTSSvet.rs" site_id="1445">RTS Svet</channel> <channel site="tv.blue.ch" lang="sr" xmltv_id="RTSSvet.rs" site_id="1445">RTS Svet</channel>
<channel site="tv.blue.ch" lang="sr" xmltv_id="TVDugaPlus.rs" site_id="1662">TV Duga+</channel> <channel site="tv.blue.ch" lang="sr" xmltv_id="TVDugaPlus.rs" site_id="1662">TV Duga+</channel>
<channel site="tv.blue.ch" lang="sr" xmltv_id="TVKCN3.rs" site_id="413">K::CN 3</channel> <channel site="tv.blue.ch" lang="sr" xmltv_id="TVKCN3.rs" site_id="413">K::CN 3</channel>
<channel site="tv.blue.ch" lang="ta" xmltv_id="" site_id="119">Deepam TV</channel> <channel site="tv.blue.ch" lang="ta" xmltv_id="" site_id="119">Deepam TV</channel>
<channel site="tv.blue.ch" lang="en" xmltv_id="VijayTVAsia.in" site_id="407">Vijay TV</channel> <channel site="tv.blue.ch" lang="en" xmltv_id="VijayTVAsia.in" site_id="407">Vijay TV</channel>
<channel site="tv.blue.ch" lang="th" xmltv_id="ThaiTVGlobalNetwork.th" site_id="603">Thai TV Global Network</channel>
<channel site="tv.blue.ch" lang="tr" xmltv_id="" site_id="296">NTV Avrupa</channel> <channel site="tv.blue.ch" lang="tr" xmltv_id="" site_id="296">NTV Avrupa</channel>
<channel site="tv.blue.ch" lang="tr" xmltv_id="" site_id="320">Powertürk</channel> <channel site="tv.blue.ch" lang="tr" xmltv_id="" site_id="320">Powertürk</channel>
<channel site="tv.blue.ch" lang="tr" xmltv_id="" site_id="406">Star TV Tur</channel> <channel site="tv.blue.ch" lang="tr" xmltv_id="" site_id="406">Star TV Tur</channel>
@ -1080,5 +1030,4 @@
<channel site="tv.blue.ch" lang="tr" xmltv_id="TV8International.tr" site_id="638">TV8 Int.</channel> <channel site="tv.blue.ch" lang="tr" xmltv_id="TV8International.tr" site_id="638">TV8 Int.</channel>
<channel site="tv.blue.ch" lang="uk" xmltv_id="" site_id="1919">FreeDOM</channel> <channel site="tv.blue.ch" lang="uk" xmltv_id="" site_id="1919">FreeDOM</channel>
<channel site="tv.blue.ch" lang="uk" xmltv_id="" site_id="2081">1+1 Int.</channel> <channel site="tv.blue.ch" lang="uk" xmltv_id="" site_id="2081">1+1 Int.</channel>
<channel site="tv.blue.ch" lang="uk" xmltv_id="NickelodeonUkrainePlutoTV.ua" site_id="1941">Nickelodeon Ukraine Pluto TV</channel>
</channels> </channels>

File diff suppressed because it is too large Load diff

View file

@ -1,16 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<channels> <channels>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="7004">Prambors On Air</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="7055">TRAX</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="7169">ELGANGGA</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="7216">Geronimo</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="7283">SWARA SEMARANG</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="7284">GAJAHMADA</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="7619">MUSICA</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="8815">Metro Globe Network</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="9430">World Cup 1</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="9431">World Cup 2</channel>
<channel site="vidio.com" lang="id" xmltv_id="ABCAustralia.au" site_id="7150">ABC Australia</channel> <channel site="vidio.com" lang="id" xmltv_id="ABCAustralia.au" site_id="7150">ABC Australia</channel>
<channel site="vidio.com" lang="id" xmltv_id="AfricanewsEnglish.fr" site_id="12784">AFRICANEWS TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="AjwaTV.id" site_id="7464">AJWA TV</channel> <channel site="vidio.com" lang="id" xmltv_id="AjwaTV.id" site_id="7464">AJWA TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="AlJazeeraEnglish.qa" site_id="6410">Aljazeera</channel> <channel site="vidio.com" lang="id" xmltv_id="AlJazeeraEnglish.qa" site_id="6410">Aljazeera</channel>
<channel site="vidio.com" lang="id" xmltv_id="ANTV.id" site_id="782">ANTV</channel> <channel site="vidio.com" lang="id" xmltv_id="ANTV.id" site_id="782">ANTV</channel>
@ -18,16 +9,17 @@
<channel site="vidio.com" lang="id" xmltv_id="beINSports1.id" site_id="6299">Bein 1</channel> <channel site="vidio.com" lang="id" xmltv_id="beINSports1.id" site_id="6299">Bein 1</channel>
<channel site="vidio.com" lang="id" xmltv_id="beINSports3.id" site_id="6317">Bein 3</channel> <channel site="vidio.com" lang="id" xmltv_id="beINSports3.id" site_id="6317">Bein 3</channel>
<channel site="vidio.com" lang="id" xmltv_id="BTV.id" site_id="6165">BTV</channel> <channel site="vidio.com" lang="id" xmltv_id="BTV.id" site_id="6165">BTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTV1.id" site_id="6685">CTV 1</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTV1.id" site_id="6685">Champions TV 1</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTV2.id" site_id="6686">CTV 2</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTV2.id" site_id="6686">Champions TV 2</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTV3.id" site_id="6786">CTV 3</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTV3.id" site_id="6786">Champions TV 3</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTV5.id" site_id="9182">CTV 5</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTV5.id" site_id="9182">Champions TV 5</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTV6.id" site_id="9183">CTV 6</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTV6.id" site_id="9183">Champions TV 6</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTVEPL.id" site_id="9353">Premier League TV</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTVEPL.id" site_id="9353">Premier League TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="CNA.sg" site_id="6411">News Asia</channel> <channel site="vidio.com" lang="id" xmltv_id="CNA.sg" site_id="6411">News Asia</channel>
<channel site="vidio.com" lang="id" xmltv_id="DAAITV.id" site_id="6482">DAAI TV</channel> <channel site="vidio.com" lang="id" xmltv_id="DAAITV.id" site_id="6482">DAAI TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="DWEnglish.de" site_id="5075">DW English</channel> <channel site="vidio.com" lang="id" xmltv_id="DWEnglish.de" site_id="5075">DW English</channel>
<channel site="vidio.com" lang="id" xmltv_id="ElshintaTV.id" site_id="10975">Elshinta TV</channel> <channel site="vidio.com" lang="id" xmltv_id="ElshintaTV.id" site_id="10975">Elshinta TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="EuronewsEnglish.fr" site_id="6412">Euro News</channel>
<channel site="vidio.com" lang="id" xmltv_id="FashionTVAsia.fr" site_id="6511">Fashion TV - Global</channel> <channel site="vidio.com" lang="id" xmltv_id="FashionTVAsia.fr" site_id="6511">Fashion TV - Global</channel>
<channel site="vidio.com" lang="id" xmltv_id="FashionTVLOriginal.fr" site_id="6507">FashionTV L&apos;Original</channel> <channel site="vidio.com" lang="id" xmltv_id="FashionTVLOriginal.fr" site_id="6507">FashionTV L&apos;Original</channel>
<channel site="vidio.com" lang="id" xmltv_id="FashionTVMidnightSecrets.fr" site_id="6504">Fashion TV Midnight Secrets</channel> <channel site="vidio.com" lang="id" xmltv_id="FashionTVMidnightSecrets.fr" site_id="6504">Fashion TV Midnight Secrets</channel>
@ -35,13 +27,13 @@
<channel site="vidio.com" lang="id" xmltv_id="Horee.id" site_id="6397">Horee</channel> <channel site="vidio.com" lang="id" xmltv_id="Horee.id" site_id="6397">Horee</channel>
<channel site="vidio.com" lang="id" xmltv_id="Indosiar.id" site_id="205">Indosiar</channel> <channel site="vidio.com" lang="id" xmltv_id="Indosiar.id" site_id="205">Indosiar</channel>
<channel site="vidio.com" lang="id" xmltv_id="JakTV.id" site_id="5415">Jaktv</channel> <channel site="vidio.com" lang="id" xmltv_id="JakTV.id" site_id="5415">Jaktv</channel>
<channel site="vidio.com" lang="id" xmltv_id="JPMTV.id" site_id="9714">JPM TV</channel> <channel site="vidio.com" lang="id" xmltv_id="JPMTV.id" site_id="9714">jawaposTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="JTV.id" site_id="9713">JTV</channel> <channel site="vidio.com" lang="id" xmltv_id="JTV.id" site_id="9713">JTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="KompasTV.id" site_id="874">Kompas TV</channel> <channel site="vidio.com" lang="id" xmltv_id="KompasTV.id" site_id="874">Kompas TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="LFCTV.uk" site_id="7916">Liverpool TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="MagnaChannel.id" site_id="7230">Magna TV</channel> <channel site="vidio.com" lang="id" xmltv_id="MagnaChannel.id" site_id="7230">Magna TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="MakkahTV.sa" site_id="6852">Makkah TV</channel> <channel site="vidio.com" lang="id" xmltv_id="MakkahTV.sa" site_id="6852">Makkah TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="MentariTV.id" site_id="8237">Mentari TV</channel> <channel site="vidio.com" lang="id" xmltv_id="MentariTV.id" site_id="8237">Mentari TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="MetroGlobeNetwork.id" site_id="8815">Metro Globe Network</channel>
<channel site="vidio.com" lang="id" xmltv_id="MetroTV.id" site_id="777">Metro TV</channel> <channel site="vidio.com" lang="id" xmltv_id="MetroTV.id" site_id="777">Metro TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="Moji.id" site_id="206">Moji</channel> <channel site="vidio.com" lang="id" xmltv_id="Moji.id" site_id="206">Moji</channel>
<channel site="vidio.com" lang="id" xmltv_id="NBATV.us" site_id="6717">NBA TV</channel> <channel site="vidio.com" lang="id" xmltv_id="NBATV.us" site_id="6717">NBA TV</channel>
@ -54,15 +46,17 @@
<channel site="vidio.com" lang="id" xmltv_id="ROCKEntertainment.sg" site_id="8120">ROCK Entertainment</channel> <channel site="vidio.com" lang="id" xmltv_id="ROCKEntertainment.sg" site_id="8120">ROCK Entertainment</channel>
<channel site="vidio.com" lang="id" xmltv_id="ROCKExtreme.sg" site_id="8121">Rock Action</channel> <channel site="vidio.com" lang="id" xmltv_id="ROCKExtreme.sg" site_id="8121">Rock Action</channel>
<channel site="vidio.com" lang="id" xmltv_id="SCTV.id" site_id="204">SCTV</channel> <channel site="vidio.com" lang="id" xmltv_id="SCTV.id" site_id="204">SCTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="SPOTV.id" site_id="17139">SPOTV</channel> <channel site="vidio.com" lang="id" xmltv_id="SEAToday.id" site_id="7687">SEA TODAY</channel>
<channel site="vidio.com" lang="id" xmltv_id="SPOTV2.id" site_id="17140">SPOTV 2</channel> <channel site="vidio.com" lang="id" xmltv_id="SPOTV2.id" site_id="17140">SPOTV 2</channel>
<channel site="vidio.com" lang="id" xmltv_id="SPOTV.id" site_id="17139">SPOTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="TawafTV.id" site_id="12607">Tawaf TV</channel> <channel site="vidio.com" lang="id" xmltv_id="TawafTV.id" site_id="12607">Tawaf TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="Trans7.id" site_id="734">Trans7</channel> <channel site="vidio.com" lang="id" xmltv_id="Trans7.id" site_id="734">Trans7</channel>
<channel site="vidio.com" lang="id" xmltv_id="TransTV.id" site_id="733">TRANS TV</channel> <channel site="vidio.com" lang="id" xmltv_id="TransTV.id" site_id="733">TRANS TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="TV5MondeAsia.fr" site_id="17278">TV5Monde</channel>
<channel site="vidio.com" lang="id" xmltv_id="tvNAsia.hk" site_id="6362">TVN</channel> <channel site="vidio.com" lang="id" xmltv_id="tvNAsia.hk" site_id="6362">TVN</channel>
<channel site="vidio.com" lang="id" xmltv_id="tvOne.id" site_id="783">TVOne</channel> <channel site="vidio.com" lang="id" xmltv_id="tvOne.id" site_id="783">TVOne</channel>
<channel site="vidio.com" lang="id" xmltv_id="TVRINasional.id" site_id="6441">TVRI</channel> <channel site="vidio.com" lang="id" xmltv_id="TVRINasional.id" site_id="6441">TVRI</channel>
<channel site="vidio.com" lang="id" xmltv_id="TVTempo.id" site_id="7946">TV Tempo</channel>
<channel site="vidio.com" lang="id" xmltv_id="UChannel.id" site_id="6898">U-Channel TV</channel> <channel site="vidio.com" lang="id" xmltv_id="UChannel.id" site_id="6898">U-Channel TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="ZeeBioskop.id" site_id="6399">Zee Bioskop</channel>
<channel site="vidio.com" lang="id" xmltv_id="ZooMoo.sg" site_id="6533">Zoomoo</channel> <channel site="vidio.com" lang="id" xmltv_id="ZooMoo.sg" site_id="6533">Zoomoo</channel>
</channels> </channels>

View file

@ -41,19 +41,26 @@ module.exports = {
.catch(console.error) .catch(console.error)
const $ = cheerio.load(result) const $ = cheerio.load(result)
const items = $('.home-content a').toArray() const itemGroups = $('.home-content').toArray()
const channels = [] const channels = []
items.forEach(item => { const processedIds = []
const $item = $(item)
const name = $item.find('p').text() itemGroups.forEach(group => {
if (name.toUpperCase().indexOf('FM') < 0 && name.toUpperCase().indexOf('RADIO') < 0) { const $group = $(group)
channels.push({ const props = $group.data('ahoy-props')
lang: 'id', const name = props.content_title
site_id: $item.attr('href').substr($item.attr('href').lastIndexOf('/') + 1).split('-')[0], const siteId = props.content_id
name
}) if (props.section.includes('Radio') || processedIds.includes(siteId)) {
return
} }
channels.push({
lang: 'id',
site_id: siteId,
name: name
})
processedIds.push(siteId)
}) })
return channels return channels