Merge branch 'master' into patch-2025.01.3

This commit is contained in:
freearhey 2025-01-15 14:23:15 +03:00
commit e2d86b59d8
52 changed files with 10352 additions and 1618 deletions

View file

@ -181,7 +181,7 @@
<tr><td><a href="sites/tvcesoir.fr">tvcesoir.fr</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvcubana.icrt.cu">tvcubana.icrt.cu</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvgids.nl">tvgids.nl</a></td><td>🟡</td><td>https://github.com/iptv-org/epg/issues/2400</td></tr>
<tr><td><a href="sites/tvguide.com">tvguide.com</a></td><td>🔴</td><td>https://github.com/iptv-org/epg/issues/2542</td></tr>
<tr><td><a href="sites/tvguide.com">tvguide.com</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvguide.myjcom.jp">tvguide.myjcom.jp</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvhebdo.com">tvhebdo.com</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvheute.at">tvheute.at</a></td><td>🟢</td><td></td></tr>

View file

@ -1,78 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="comteco.com.bo" lang="es" xmltv_id="" site_id="ATB (4)">ATB</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="" site_id="P.A.T. (42)">PAT</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="" site_id="Sony">Sony Channel</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="AbyaYalaTV.bo" site_id="ABYA YALA">Abya Yala TV</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="AEPanregional.us" site_id="A&amp;E Mundo">A&amp;E</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="AMCLatinAmerica.us" site_id="AMC">AMC</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="AnimalPlanetLatinAmerica.us" site_id="Animal Planet">Animal Planet</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="AXNCentralAmerica.us" site_id="AXN">AXN</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="AzMundo.mx" site_id="AZ Mundo">Az Mundo</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="BoliviaTV.bo" site_id="Bolivia TV (7)">Bolivia TV</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="BoliviaTV72.bo" site_id="Bolivia TV (7.2)">Bolivia TV 7.2 Deportes</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="Bolivision.bo" site_id="Bolivision (5)">Bolivisión</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="CadenaA.bo" site_id="Cadena A (36)">Cadena A</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="24Horas.es" site_id="Canal 24 horas">Canal 24 Horas</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="CaracolInternacional.co" site_id="Caracol">Caracol TV</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="CartoonNetworkPacific.us" site_id="Cartoon Network">Cartoon Network</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="CinecanalEast.us" site_id="CINECANAL">Cinecanal Este</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="CinemaxLatinAmerica.us" site_id="Cinemax">Cinemax</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="CNNInternationalLatinAmerica.us" site_id="CNN">CNN</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="CubavisionInternacional.cu" site_id="Cuba Vision">Cubavisión</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="DePeliculaLatinAmerica.mx" site_id="De Pelicula">De Película</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="DiscoveryChannelPanregional.us" site_id="Discovery Chanel">Discovery Channel</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="DiscoveryHomeHealthPanregional.us" site_id="Discovery Home &amp; Health">Discovery Home &amp; Health Latinoamérica</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="DiscoveryKidsPanregional.us" site_id="Discovery Kids">Discovery Kids América Latina</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="DisneyChannelSouth.us" site_id="Disney Chanel">Disney Channel</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="DisneyJunior.es" site_id="Disney Junior">Disney Junior España</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="ElGourmetSouth.ar" site_id="elgourmet">El Gourmet</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="ElTreceInternacionalLatinAmerica.ar" site_id="El Trece">El Trece</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="ESouth.us" site_id="E! Entertaiment">E!</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="EuronewsSpanish.fr" site_id="EURONEWS">EuroNews Español</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="EuropaEuropa.ar" site_id="EUROPA EUROPA">Europa Europa</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="EWTNEspanaLatinAmerica.us" site_id="EWTN">EWTN</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="FoxSports2South.us" site_id="Fox Sport 2">Fox Sports 2</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="FoxSports3Panregional.us" site_id="Fox Sport 3">Fox Sports 3</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="FoxSportsSouth.us" site_id="Fox Sport">Fox Sports Latin America</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="FXMEast.us" site_id="FXM">FXM</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="FXSouth.us" site_id="FX">FX</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="HBOLatinAmerica.us" site_id="HBO">HBO</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="HistoryPanregional.us" site_id="History Chanel">History</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="HTV.us" site_id="HTV">HTV</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="InvestigationDiscoveryPanregional.us" site_id="ID">Investigation Discovery</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="MariaVision.mx" site_id="Clara Vision">María+Visión</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="MasChicPanregional.ar" site_id="MAS CHIC">Más Chic</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="MTVNorth.us" site_id="MTV">MTV Latino Norte</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="NatGeoKidsPanregional.us" site_id="NatGeo Kids">Nat Geo Kids</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="NationalGeographicPanregional.us" site_id="Nathional Geografic">National Geographic</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="NickelodeonPanregional.us" site_id="Nickelodeom">Nickelodeon</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="RecordTVAmericas.br" site_id="Record">Record TV</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="RedUno.bo" site_id="Red Uno (9)">Red Uno</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="RTP.bo" site_id="RTP Red Nacional">RTP</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="SBTInternacionalAmerica.br" site_id="SBT">SBT</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="Space.mx" site_id="Space">Space México</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="StarChannelPanregional.us" site_id="STAR">Star Channel</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="StarLifePanregional.us" site_id="STAR LIFE">Star Life</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="StudioUniversalPanregional.us" site_id="Studio Universal">Studio Universal</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TBSPanregional.us" site_id="TBS Very Funny">TBS</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TCMPanregional.us" site_id="TCM">TCM</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TelefeInternacional.ar" site_id="Telefe Internacional">Telefe Internacional</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TelemundoCentralAmerica.us" site_id="Telemundo">Telemundo</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TelesurEnglish.ve" site_id="Telesur">Telesur</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TLCLatinAmerica.us" site_id="TLC">TLC</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TlnovelasLatinAmerica.mx" site_id="TeleNovelas">Tlnovelas</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TNTPacific.us" site_id="TNT">TNT</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TNTSeries.br" site_id="TNT SERIES">TNT Series</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="Tooncast.us" site_id="Toon Cast">Tooncast</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TVChile.cl" site_id="TV Chile">TV Chile</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TVCulturas.bo" site_id="TV Culturas">TV Culturas</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TVEInternacionalAmerica.es" site_id="TVE">TVE</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TVGloboInternacionalAmericas.br" site_id="TV Globo Internacional">TV Globo Internacional</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TVPeruInternacional.pe" site_id="TNP">TV Perú</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="TyCSportsPanregional.ar" site_id="TyC Sports">TyC Sports</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="UnitelSantaCruz.bo" site_id="Unitel (13)">Unitel Santa Cruz</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="UniversalTVPanregional.us" site_id="Universal">Universal TV</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="VH1East.us" site_id="Vh1">VH1 East</channel>
<channel site="comteco.com.bo" lang="es" xmltv_id="WarnerChannelPanregional.us" site_id="Warner Channel">Warner Channel</channel>
</channels>

View file

@ -1,68 +0,0 @@
const cheerio = require('cheerio')
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 = {
site: 'comteco.com.bo',
days: 2,
url: function ({ channel }) {
return `https://comteco.com.bo/pages/canales-y-programacion-tv/paquete-oro/${channel.site_id}`
},
request: {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: function ({ date }) {
const params = new URLSearchParams()
params.append('_method', 'POST')
params.append('fechaini', date.format('D/M/YYYY'))
params.append('fechafin', date.format('D/M/YYYY'))
return params
}
},
parser: function ({ content, date }) {
const programs = []
const items = parseItems(content)
items.forEach(item => {
const prev = programs[programs.length - 1]
const $item = cheerio.load(item)
let start = parseStart($item, date)
if (prev) {
if (start.isBefore(prev.start)) {
start = start.add(1, 'd')
date = date.add(1, 'd')
}
prev.stop = start
}
const stop = start.add(30, 'm')
programs.push({ title: parseTitle($item), start, stop })
})
return programs
}
}
function parseStart($item, date) {
const timeString = $item('div > div.col-xs-11 > p > span').text().trim()
const dateString = `${date.format('YYYY-MM-DD')} ${timeString}`
return dayjs.tz(dateString, 'YYYY-MM-DD HH:mm:ss', 'America/La_Paz')
}
function parseTitle($item) {
return $item('div > div.col-xs-11 > p > strong').text().trim()
}
function parseItems(content) {
const $ = cheerio.load(content)
return $('#datosasociados > div > .list-group-item').toArray()
}

View file

@ -1,72 +0,0 @@
const { parser, url, request } = require('./comteco.com.bo.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('2021-11-25', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'ABYA YALA',
xmltv_id: 'AbyaYalaTV.bo'
}
const content =
'<!DOCTYPE html><html dir="ltr" lang="es"> <head></head> <body class=""> <div id="wrapper" class="clearfix"> <div class="main-content"> <section class="rubroguias"> <div class="container pt-70 pb-40"> <div class="section-content"> <form method="post" accept-charset="utf-8" class="reservation-form mb-0" role="form" id="myform" action="/pages/canales-y-programacion-tv/paquete-oro/ABYA%20YALA" > <div style="display: none"><input type="hidden" name="_method" value="POST"/></div><div class="row"> <div class="col-sm-5"> <div class="col-xs-5 col-sm-7"> <img src="/img/upload/canales/abya-yala.png" alt="" class="img-responsive"/> </div><div class="col-xs-7 col-sm-5 mt-sm-50 mt-lg-50 mt-md-50 mt-xs-20"> <p><strong>Canal Analógico:</strong> 48</p></div></div></div></form> <div class="row"> <div class="col-sm-12"> <div class="row mt-0"> <div class="single-service"> <h3 class=" text-theme-colored line-bottom text-theme-colored mt-0 text-uppercase " > ABYA YALA </h3> <div id="datosasociados"> <div class="list-group"> <div href="#" class="list-group-item bg-white-f1"> <div class="row"> <div class="col-xs-11"> <p class="mb-0"> <span class="text-red mr-15">00:00:00</span> <strong>Abya Yala noticias - 3ra edición</strong> </p></div></div></div><div href="#" class="list-group-item bg-white-f1"> <div class="row"> <div class="col-xs-11"> <p class="mb-0"> <span class="text-red mr-15">01:00:00</span> <strong>Cierre de emisión</strong> </p></div></div></div><div href="#" class="list-group-item bg-white-f1"> <div class="row"> <div class="col-xs-11"> <p class="mb-0"> <span class="text-red mr-15">23:00:00</span> <strong>Referentes</strong> </p></div></div></div><p class="mt-20"> <a href="/pages/canales-y-programacion-tv" class="btn btn-border btn-gray btn-transparent btn-circled" >Regresar a canales</a > </p></div></div></div></div></div></div></div></div></section> </div></div></body></html>'
it('can generate valid url', () => {
expect(url({ channel })).toBe(
'https://comteco.com.bo/pages/canales-y-programacion-tv/paquete-oro/ABYA YALA'
)
})
it('can generate valid request method', () => {
expect(request.method).toBe('POST')
})
it('can generate valid request headers', () => {
expect(request.headers).toMatchObject({
'Content-Type': 'application/x-www-form-urlencoded'
})
})
it('can generate valid request data', () => {
const result = request.data({ date })
expect(result.get('_method')).toBe('POST')
expect(result.get('fechaini')).toBe('25/11/2021')
expect(result.get('fechafin')).toBe('25/11/2021')
})
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: '2021-11-25T04:00:00.000Z',
stop: '2021-11-25T05:00:00.000Z',
title: 'Abya Yala noticias - 3ra edición'
},
{
start: '2021-11-25T05:00:00.000Z',
stop: '2021-11-26T03:00:00.000Z',
title: 'Cierre de emisión'
},
{
start: '2021-11-26T03:00:00.000Z',
stop: '2021-11-26T03:30:00.000Z',
title: 'Referentes'
}
])
})
it('can handle empty guide', () => {
const result = parser({
date,
channel,
content: '<!DOCTYPE html><html><head></head><body></body></html>'
})
expect(result).toMatchObject([])
})

View file

@ -1,15 +0,0 @@
# comteco.com.bo
https://www.comteco.com.bo/pages/canales-y-programacion-tv/
### Download the guide
```sh
npm run grab --- --site=comteco.com.bo
```
### Test
```sh
npm test --- comteco.com.bo
```

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-1118">Yle TV1</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-1424">Viasat History</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-1426">MTV Viihde</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-56786">MTV Aitio</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-86249">STAR Channel</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-216356">MTV3</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-216366">Nelonen</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-216368">MTV Sub</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-216370">MTV Ava</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-216394">Frii</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-216396">National Geographic</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-216400">Kutonen</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-216403">TV5</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-295476">MTV Juniori</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-295480">MTV Max</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-296147">Eurosport 1</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-296162">MTV Urheilu 1</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-296180">Animal Planet</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-296199">MTV Urheilu 2</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-304785">Discovery Channel</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-307370">SVT1</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-359757">Yle TV2</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-359767">Yle Teema &amp; Fem</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-452010">V sport 2 Suomi</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-474278">V sport 1 Suomi</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-483208">V sport+ Suomi</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-549801">JIM</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-549944">LIV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-549957">Hero</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-549980">TLC</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-556271">V sport golf</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-556382">V sport 1</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-556706">V film premiere</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-801557">Iskuri.net</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-802611">TV7</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-802619">France 24</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-815633">SF-kanalen</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816060">V film family</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816070">V film hits</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816087">V film action</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816114">Viasat Explore</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816116">Viasat Nature</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816157">V sport premium</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816336">V sport football</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816355">V Sport Vinter</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816399">V sport live 1</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816402">V sport live 2</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816405">V sport live 3</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816418">V sport live 4</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816424">V sport live 5</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816519">Eurosport 2</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816669">DNA Infokanava</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816685">Fuel TV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816712">Nautical Channel</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816728">Ginx eSport TV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-816730">Motorvision+ HD</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819255">Extreme Sports Channel</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819259">Toto TV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819288">Nat Geo Wild</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819298">ID</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819319">Discovery Science</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819333">Travel Channel</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819808">Disney Channel</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819873">Nick Jr.</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819881">Cartoon Network</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-819889">CNN International</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820066">BBC Nordic</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820071">BBC World News</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820087">Sky News</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820089">CNBC</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820095">Fashion TV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820141">MTV 00s</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820143">MTV 80s</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820145">iConcerts</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820219">MTV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820221">MTV Hits</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820282">MTV 90s</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820286">Club MTV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820327">SVT2</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820382">TV3</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820384">TV4</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820429">TV6</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820431">SVTB /SVT24</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820433">Kunskapskanalen</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820485">ARTE</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820499">3sat</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820519">Deutsche Welle</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820521">RTL</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820523">ZDF</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820622">TV5MONDE EUROPE</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820633">TVE Internacional</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820639">Al Jazeera English</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-820641">Al Jazeera Arabic</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-823382">Euronews</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-823459">Playboy TV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-901934">Fight Sports</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-901948">History</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-901961">MTV LIVE</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-901963">France 2</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-940072">Mezzo</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-940115">English Club TV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-940118">V sport ultra</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-1883879">Mezzo Live</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-2352053">Kuukauden kanava</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-3353262">DNA Extra</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-4388314">One Way TV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7293948">Infokanava</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7662172">MTV Liiga 1</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7662208">MTV Liiga 2</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7662253">MTV Liiga 3</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7662258">MTV Liiga 4</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7662261">MTV Liiga 5</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7662264">MTV Liiga 6</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7662268">MTV Liiga 7</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7662271">MTV Urheilu 3</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-7662272">MTV Liiga UHD</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-8761536">OnniTV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-9103132">onniTV</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-17520315">Infokanava 2</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-18721608">EVEO</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-22986792">MTV Liiga 8</channel>
<channel site="dna.fi" lang="fi" xmltv_id="" site_id="ch-23672028">Alfa</channel>
</channels>

View file

@ -0,0 +1,99 @@
const axios = require('axios')
const dayjs = require('dayjs')
module.exports = {
site: 'dna.fi',
days: 2,
url({ date, channel }) {
const beginTimestamp = date.add(2, 'h').valueOf()
const endTimestamp = date.add(1, 'd').add(2, 'h').subtract(1, 's').valueOf()
return `https://mts-pro-envoy-vip.dna.fi/hbx/api/pub/xrtv/g/media?q=channel:${channel.site_id}&q=profile:pr&q=start-interval:${beginTimestamp}/${endTimestamp}`
},
parser({ content, date }) {
let programs = []
let items = parseItems(content, date)
items.forEach(item => {
const data = item?._embedded?.['xrtv:meta']?.data
programs.push({
title: data?.title,
subtitle: data?.episode_title,
description: data?.description,
season: data?.season_number,
episode: data?.episode_number,
date: data?.year,
categories: parseCategories(item),
rating: parseRating(data),
images: parseImages(item),
directors: parseCast(data, 'director'),
actors: parseCast(data, 'actors'),
start: dayjs(data?.start),
stop: dayjs(data?.end)
})
})
return programs
},
async channels() {
const data = await axios
.get('https://mts-pro-envoy-vip.dna.fi/hbx/api/pub/xrtv/g/media?q=profile:ch&limit=1000')
.then(r => r.data)
.catch(console.error)
return data._embedded['xrtv:media-item'].map(c => {
return {
lang: 'fi',
site_id: c.datalistTerm,
name: c.name
}
})
}
}
function parseCast(data, role) {
if (!data[role] || !data[role].value) return []
return data[role].value.split(', ').map(name => ({
lang: data[role].lang,
value: name
}))
}
function parseCategories(item) {
const categories = item?._embedded?.['xrtv:media-category']
return Array.isArray(categories) ? categories.map(category => category.name) : []
}
function parseRating(data) {
if (!data.age_rating) return null
return {
system: 'VET',
value: data.age_rating
}
}
function parseImages(item) {
const images = item?._embedded?.['xrtv:image']
return Array.isArray(images) ? images.map(image => image.src) : []
}
function parseItems(content, date) {
try {
const data = JSON.parse(content)
let items = data?._embedded?.['xrtv:media-item']
items = Array.isArray(items) ? items : []
items = items.filter(item => {
const start = item?._embedded?.['xrtv:meta']?.data?.start
if (!start) return false
return date.isSame(dayjs(start), 'day')
})
return items
} catch {
return []
}
}

138
sites/dna.fi/dna.fi.test.js Normal file
View file

@ -0,0 +1,138 @@
const { parser, url } = require('./dna.fi.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)
const date = dayjs.utc('2025-01-15', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'ch-216356',
xmltv_id: 'MTV3.fi'
}
it('can generate valid url', async () => {
expect(url({ date, channel })).toBe(
'https://mts-pro-envoy-vip.dna.fi/hbx/api/pub/xrtv/g/media?q=channel:ch-216356&q=profile:pr&q=start-interval:1736906400000/1736992799000'
)
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'), 'utf8')
let results = parser({ date, content })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results.length).toBe(20)
expect(results[0]).toMatchObject({
start: '2025-01-15T02:30:00.000Z',
stop: '2025-01-15T03:22:00.000Z',
title: {
lang: 'fi',
value: 'Next Level Chef'
},
subtitle: {
lang: 'fi',
value: 'Brunssi'
},
season: 1,
episode: 6,
rating: {
system: 'VET',
value: 'S'
},
date: '2022',
images: [
'https://mts-pro-cache-vip.dna.fi/meme/v2/37f/3851073346622580374_aspect_ratio_16_9_1.jpg'
],
description: {
lang: 'fi',
value:
'Kausi 1, 6/11. Brunssi. Päivän haasteessa valmistetaan rentoa brunssiruokaa. Yksi kilpailija tekee valtaisan virheen myöhästyessään annosten luovutuksesta. Amerikkalainen tosi-tv-sarja.'
},
categories: ['Reality TV', 'Entertainment', 'TV Show', 'Next Level Chef', 'Series 1']
})
expect(results[5]).toMatchObject({
title: {
lang: 'fi',
value: 'Kauniit ja rohkeat (S)'
},
subtitle: {
lang: 'fi',
value: 'Parantava syleily'
},
start: '2025-01-15T08:30:00.000Z',
stop: '2025-01-15T09:00:00.000Z',
season: 37,
episode: 9380,
rating: {
system: 'VET',
value: 'S'
},
date: '2023',
images: [
'https://mts-pro-cache-vip.dna.fi/meme/v2/79e/6509488401145439178_aspect_ratio_16_9_1.jpg'
],
description: {
lang: 'fi',
value:
'Steffy on vähällä yllättää Hopen ja Carterin kesken herkän hetken. Ridgen kannustamana Taylor suostuu kokeilemaan Shandran parannusmenetelmää, ja pitkään padotut tunteet saavat viimein vapautua.'
},
categories: [
'Soap',
'Drama',
'Romance',
'Series',
'TV Show',
'The Bold and the Beautiful',
'Series 37'
],
actors: [{ lang: 'en', value: 'Katherine Kelly Lang' }]
})
expect(results[19]).toMatchObject({
start: '2025-01-15T16:30:00.000Z',
stop: '2025-01-15T17:00:00.000Z',
title: {
lang: 'fi',
value: 'Emmerdale (S)'
},
subtitle: {
lang: 'fi',
value: 'Epäilyksen varjossa'
},
season: 54,
episode: 9845,
rating: {
system: 'VET',
value: 'S'
},
date: '2023',
images: [
'https://mts-pro-cache-vip.dna.fi/meme/v2/5e8/5978592001161112833_aspect_ratio_16_9_1.jpg'
],
description: {
lang: 'fi',
value:
'Caleb haistaa palaneen käryä Craigin kuolemaan liittyen. Mackenzien yllätysvierailu antaa vahvistuksen Chloen päätökselle. Lydia pohtii, pitäisikö hänen mennä Craigin hautajaisiin. Dawnin supistukset säikäyttävät Rhonan.'
},
categories: ['Soap', 'Drama', 'Romance', 'Series', 'TV Show', 'Emmerdale', 'Series 54'],
directors: [
{ lang: 'en', value: 'Ian Bevitt' },
{ lang: 'en', value: 'Munir Malik' }
]
})
})
it('can handle empty guide', () => {
const results = parser({
date,
content: ''
})
expect(results).toMatchObject([])
})

21
sites/dna.fi/readme.md Normal file
View file

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

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"meta": {"code": 200, "message": "OK"}, "data": {"total": 218, "channels": [{"rating": 3, "ch_id": 805, "logo": "66fd23e8cfef0b37446b86fc", "ch_no": 1, "is_hd": true, "genre": [1, 11], "packages": ["58cfc9c7e138237a591f9a61", "58cfc9c7e138237a591f9a62", "58cfc9c7e138237a591f9a5f", "58cfc9c7e138237a591f9a60", "58cfc9c7e138237a591f9a63", "58cfc9c7e138237a591f9a64", "5dfcdac0cfef0b201d22ad58", "58e5e19be1382365ad190dc3", "58cfc9c7e138237a591f9a67", "58cfc9c7e138237a591f9a66", "58cfc9c7e138237a591f9a65"], "slug": "teknofest", "hd": true, "_id": "58d29bb0eefad3db9c606290", "order": 1, "channel_name": "Teknofest", "description": "", "schedule": []}]}}

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,213 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="dsmart.com.tr" lang="en" xmltv_id="BBCNewsEurope.uk" site_id="50#58d29bb0eefad3db9c6062c6">BBC World News</channel>
<channel site="dsmart.com.tr" lang="en" xmltv_id="CNNInternationalEurope.us" site_id="49#58d29bb0eefad3db9c6062b8">CNN International</channel>
<channel site="dsmart.com.tr" lang="en" xmltv_id="NBATV.us" site_id="69#58d29bb0eefad3db9c60626e">NBA TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="102#58d29bb0eefad3db9c60623c">NR1</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="104#58d29bb0eefad3db9c606245">NR1 Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="105#5c7fda31cfef0b6cb7a578af">Türkçe Müzik</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="106#5c7fda93cfef0b6cb7a5793b">Turkish Silk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="111#58d29bb0eefad3db9c6062b9">Cartoonito</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="112#58d29bb0eefad3db9c6062b7">Baby TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="115#58d29bb0eefad3db9c6062b6">Da Vinci Learning</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="116#6540d968cfef0b02d2dbb177">Moonbug</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="117#5fedddcecfef0b159330996e">Disney Junior</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="123#5e75c6f5cfef0b15938bc9b9">TRT EBA TV İlkokul</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="124#5e75c923cfef0b15938bc9cc">TRT EBA TV Ortaokul</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="125#5e75c9d1cfef0b15938bc9d1">TRT EBA TV Lise</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="126#59dca805cfef0b4d80a47c2c">Vizyon Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="131#59dca8e2cfef0b4d80a47c34">RTV 23</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="135#5df20d44cfef0b19df84668e">Bahartürk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="139#59dcaaaccfef0b4d80a47d7e">Çifçi TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="150#59dcbc42cfef0b4d80a49628">Kanal 16</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="151#5dea10f3cfef0b49bf6de6fa">Kanal 35</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="158#59dcbd54cfef0b4d80a4963a">Uzay TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="159#59dcbd97cfef0b4d80a4963e">Kanal 28</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="163#6163ee3dcfef0b1593d572b0">Flash Haber</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="166#5de50035cfef0b49bf6ba4e7">Ege Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="167#59dcbe60cfef0b4d80a4964a">KKTC Kanal T</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="168#59dcbe7dcfef0b4d80a4964c">Yeni Kocaeli TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="175#59dcbf24cfef0b4d80a49652">Saudi Quran TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="176#59dcbf4acfef0b4d80a49654">Saudi Sunnah TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="181#58d29bb0eefad3db9c60624f">NHK World English</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="198#58d29bb0eefad3db9c606247">ATV Turkiye SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="206#5d25dbe5cfef0b5761a051db">Test</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="207#5e7865eacfef0b15938c1bb0">TRT EBA TV İlkokul SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="208#5e78662ecfef0b15938c1c03">TRT EBA TV Ortaokul SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="209#5e7866dfcfef0b15938c1c1b">TRT EBA TV Lise SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="210#618bd2bbcfef0b1593e5d42c">45&apos;lik</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="60#61a408d7cfef0b1593ed2812">History Channel</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="63#64edfc67cfef0b02d2c038c5">Tarih Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="64#59dca29fcfef0b4d80a47a61">Nature Escape</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="67#59dca3b2cfef0b4d80a47b77">Fashion TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="87#63ecd91acfef0b02d2687aed">SZC</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="89#6486edd4cfef0b02d29f163e">Cadde TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="90#6481bce5cfef0b02d29e23d1">Cine 1</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="93#58d29bb0eefad3db9c606231">TRT 3 Spor</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="99#58d29bb0eefad3db9c6062c5">Dream Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="24Kitchen.tr" site_id="53#58d29bb0eefad3db9c60627b">24Kitchen</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="24TV.tr" site_id="33#58d29bb0eefad3db9c60622e">24</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="360.tr" site_id="42#58d29bb0eefad3db9c606236">360</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="A2TV.tr" site_id="165#59dcbe14cfef0b4d80a49646">a2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="AgroTV.tr" site_id="140#5fa3d0a9cfef0b15930f7742">Agro Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="AHaber.tr" site_id="199#58d29bb0eefad3db9c60625d">A Haber SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="AHaber.tr" site_id="34#58d29bb0eefad3db9c60625e">a Haber</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="AkitTV.tr" site_id="91#59dca630cfef0b4d80a47b82">Akit TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="AlJazeera.qa" site_id="184#59dcc114cfef0b4d80a49a0a">Al Jazeera Arabic</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="AlJazeeraEnglish.qa" site_id="185#59dcc133cfef0b4d80a49a0c">Al Jazeera English</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="AltasTV.tr" site_id="153#59dcbc79cfef0b4d80a4962c">Altaş TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ANews.tr" site_id="177#59638e5fcfef0b43f0fd31b5">a News</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="APara.tr" site_id="51#5b9fb1eecfef0b35341b7eb7">A Para</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ASpor.tr" site_id="204#58d29bb0eefad3db9c6062a3">A Spor SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ASpor.tr" site_id="77#58d29bb0eefad3db9c6062b2">a Spor</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ASTV.tr" site_id="147#59dcbbf3cfef0b4d80a49622">AS TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ATV.tr" site_id="24#58d29bb0eefad3db9c60625f">ATV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BBCEarth.tr" site_id="55#58d29bb0eefad3db9c6062bc">BBC Earth</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BBNTurk.tr" site_id="37#5fd318b4cfef0b15932230d0">BBN Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BenguturkTV.tr" site_id="129#59cb8a67cfef0b15ae760a92">Bengütürk TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BeyazTV.tr" site_id="39#58d29bb0eefad3db9c606298">Beyaz TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BeykentTV.tr" site_id="154#59dcbc90cfef0b4d80a4962e">Beykent TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BloombergHT.tr" site_id="43#58d29bb0eefad3db9c60623e">Bloomberg HT</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BRT1.cy" site_id="169#59dcbe9acfef0b4d80a4964e">BRT 1</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CartoonNetwork.tr" site_id="109#58d29bb0eefad3db9c6062c8">Cartoon Network</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CemTV.tr" site_id="152#5d2dde88cfef0b39db6ab393">Cem Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CNNTurk.tr" site_id="205#59dca1f3cfef0b4d80a47a5f">CNN Türk SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CNNTurk.tr" site_id="29#5f2fc688cfef0b1593e08b76">CNN TÜRK</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CocukSmart.tr" site_id="110#58d29bb0eefad3db9c6062b5">Çocuk Smart</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DiscoveryChannel.tr" site_id="58#58d29bb0eefad3db9c606248">Discovery</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DiscoveryScience.tr" site_id="59#58d29bb0eefad3db9c60628e">Discovery Science</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DisneyChannel.tr" site_id="118#58d29bb0eefad3db9c60626c">Disney Channel</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DiyanetTV.tr" site_id="186#58d29bb0eefad3db9c606262">Diyanet Tv Sd</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DiyanetTV.tr" site_id="94#5ac73ebbcfef0b34db533a95">Diyanet Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DiziSmartMax.tr" site_id="19#58d29bb0eefad3db9c606278">Dizi Smart Max</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DiziSmartPremium.tr" site_id="16#58d29bb0eefad3db9c60625a">Dizi Smart Premium</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DMAX.tr" site_id="197#58d29bb0eefad3db9c606246">DMAX SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DMAX.tr" site_id="45#58d29bb0eefad3db9c606282">DMAX</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DocuBox.nl" site_id="57#58d29bb0eefad3db9c6062be">DocuScreen</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DreamTurk.tr" site_id="100#58d29bb0eefad3db9c60628d">Dream Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Ekoturk.tr" site_id="47#5c6e8e0ecfef0b613d9ff782">Ekotürk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ESTV.tr" site_id="160#59dcbdaecfef0b4d80a49640">Es TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="EuroD.tr" site_id="179#59dcbfdccfef0b4d80a4974a">Euro D</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Eurosport1.fr" site_id="72#58d29bb0eefad3db9c6062aa">Eurosport</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Eurosport2.fr" site_id="73#58d29bb0eefad3db9c606281">Eurosport 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="EuroStar.tr" site_id="180#59dcc000cfef0b4d80a4974d">Euro Star</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="FastFunBox.nl" site_id="68#58d29bb0eefad3db9c6062bf">GameScreen</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="FBTV.tr" site_id="80#58d29bb0eefad3db9c606235">FB TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="FightBox.nl" site_id="78#58d29bb0eefad3db9c6062b4">FightScreen</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="FilmBox.tr" site_id="13#58d29bb0eefad3db9c6062ba">FilmBox</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Fox.tr" site_id="195#58d29bb0eefad3db9c60623b">FOX SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Fox.tr" site_id="28#58d29bb0eefad3db9c6062a0">FOX</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="FoxCrime.tr" site_id="18#58d29bb0eefad3db9c606268">FOXCRIME</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="FX.us" site_id="17#58d29bb0eefad3db9c606269">FX</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="HaberGlobal.tr" site_id="41#5bac7dedcfef0b02fac035fd">Haber Global</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="HaberturkTV.tr" site_id="192#58d29bb0eefad3db9c606232">Haberturk SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="HaberturkTV.tr" site_id="32#58d29bb0eefad3db9c60629d">Haber Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="HalkTV.tr" site_id="161#58d29bb0eefad3db9c606288">Halk TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="InsightTV.nl" site_id="66#5dfc6dc2cfef0b201d222aa0">Insight TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KadirgaTV.tr" site_id="128#59dca8b8cfef0b4d80a47c32">Kadırga TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Kanal26.tr" site_id="148#59dcbc08cfef0b4d80a49624">Kanal 26</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Kanal3.tr" site_id="120#59dca70bcfef0b4d80a47b86">Kanal 3</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Kanal42.tr" site_id="141#59dcab38cfef0b4d80a47e24">Kanal 42</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Kanal7.tr" site_id="194#58d29bb0eefad3db9c606239">Kanal 7 SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Kanal7.tr" site_id="26#58d29bb0eefad3db9c60629c">Kanal 7</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KanalB.tr" site_id="85#58d29bb0eefad3db9c606240">Kanal B</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KanalD.tr" site_id="187#58d29bb0eefad3db9c60622b">Kanal D SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KanalD.tr" site_id="21#58d29bb0eefad3db9c606258">Kanal D</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KanalFirat.tr" site_id="134#59dca9ddcfef0b4d80a47c3c">Kanal Fırat</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KanalV.tr" site_id="137#59dcaa71cfef0b4d80a47c42">Kanal V</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KardelenTV.tr" site_id="136#5d44406ecfef0b71b1d3885b">Kardelen Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KoyTV.tr" site_id="138#59dcaa91cfef0b4d80a47d7c">Köy TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KozaTV.tr" site_id="149#59dcbc2fcfef0b4d80a49626">Koza TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KRT.tr" site_id="127#59dca881cfef0b4d80a47c30">KRT</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="LiderHaber.tr" site_id="97#61517908cfef0b1593cd5f9e">Lider Haber</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="LineTV.tr" site_id="130#59b7c231cfef0b07291c2aa2">Line TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="LoveNature.ca" site_id="70#5dfc9faacfef0b201d2246b5">Love Nature</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="LuysTV.tr" site_id="133#61605578cfef0b1593d4a81f">Luys Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MaviKaradenizTV.tr" site_id="155#59dcbc9fcfef0b4d80a49630">Mavi Karadeniz</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MilyonTV.tr" site_id="121#5c9889b0cfef0b4cffc475b4">Milyon</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MinikaCocuk.tr" site_id="119#58d29bb0eefad3db9c60626d">Minika Çocuk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MinikaGo.tr" site_id="113#58d29bb0eefad3db9c606257">Minika GO</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MovieSmartClassic.tr" site_id="14#58d29bb0eefad3db9c60629a">MovieSmart Classic</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MovieSmartPremium.tr" site_id="1#58d29bb0eefad3db9c606290">MovieSmart Premium</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MovieSmartPremium2.tr" site_id="2#58d29bb0eefad3db9c606291">MovieSmart Premium 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MovieSmartTurk.tr" site_id="15#58d29bb0eefad3db9c606299">MovieSmart Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="NationalGeographic.tr" site_id="61#58d29bb0eefad3db9c6062a4">National Geographic</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="NationalGeographicWild.tr" site_id="62#58d29bb0eefad3db9c6062a5">National Geographic WILD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="NTV.tr" site_id="30#58d29bb0eefad3db9c60623a">NTV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="On4TV.tr" site_id="145#5dde8c07cfef0b2f64b09f0e">On4</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="PowerTurkTV.tr" site_id="107#58d29bb0eefad3db9c6062ac">Power Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="PowerTV.tr" site_id="108#58d29bb0eefad3db9c6062b3">Power TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="RTRPlaneta.ru" site_id="183#5d25b34fcfef0b75bced8a6e">Rtr Planeta</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="RumeliTV.tr" site_id="157#5d75f3bacfef0b29f5225f0e">Rumeli Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Russia24.ru" site_id="182#59dcc0d0cfef0b4d80a498cf">Russia-24</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Sat7Turk.cy" site_id="132#59dca98dcfef0b4d80a47c3a">Sat 7 Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ShowMax.tr" site_id="88#59dca5fdcfef0b4d80a47b80">ShowMax</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ShowTV.tr" site_id="188#58d29bb0eefad3db9c60622c">Show TV SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ShowTV.tr" site_id="22#58d29bb0eefad3db9c60629b">Show TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Sinema1001.tr" site_id="11#5fe07f5dcfef0b1593275822">Sinema TV 1001</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Sinema1002.tr" site_id="12#5fe07f72cfef0b159327585a">Sinema TV 1002</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Sinema2.tr" site_id="4#5fe07d9fcfef0b1593275754">Sinema TV 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaAile.tr" site_id="7#5fe07e42cfef0b15932757a3">Sinema TV Aile</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaAile2.tr" site_id="8#5fe07eabcfef0b15932757a6">Sinema TV Aile 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaAksiyon.tr" site_id="5#5fe07dd5cfef0b1593275758">Sinema TV Aksiyon</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaAksiyon2.tr" site_id="6#5fe07e23cfef0b15932757a1">Sinema TV Aksiyon 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaKomedi.tr" site_id="9#5fe07f29cfef0b1593275800">Sinema TV Comedy</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaKomedi2.tr" site_id="10#5fe07f45cfef0b159327581f">Sinema TV Comedy 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaTV.tr" site_id="3#5fe07d7acfef0b1593275751">Sinema TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SporSmart.tr" site_id="74#58d29bb0eefad3db9c60628a">Spor Smart</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SporSmart2.tr" site_id="79#5fcb6bd2cfef0b15931fcdf8">SPOR SMART 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SportsTV.tr" site_id="81#58d29bb0eefad3db9c606296">Sports Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SSport.tr" site_id="75#5ff5d18bcfef0b1593364e28">S Sport</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SSport2.tr" site_id="76#5ff5d2c8cfef0b15933651c7">S Sport 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="StarTV.tr" site_id="189#58d29bb0eefad3db9c60622d">STAR TV SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="StarTV.tr" site_id="23#58d29bb0eefad3db9c606259">Star</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TatlisesTV.tr" site_id="103#644a774dcfef0b02d28abccb">Tatlıses Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TAYTV.tr" site_id="71#59dca4d8cfef0b4d80a47b7a">TAY TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Tele1.tr" site_id="162#59dcbddccfef0b4d80a49642">Tele 1</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TempoTV.tr" site_id="144#61f935e5cfef0b1593123810">Tempo Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Teve2.tr" site_id="20#58d29bb0eefad3db9c6062a1">teve2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Teve2.tr" site_id="203#58d29bb0eefad3db9c60627a">teve2 SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TGRTBelgesel.tr" site_id="122#59dca751cfef0b4d80a47b88">TGRT Belgesel</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="178#59dcbfb6cfef0b4d80a49748">TGRT EU</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TGRTHaber.tr" site_id="44#58d29bb0eefad3db9c60623d">TGRT Haber</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Tivi6.tr" site_id="142#618bd28fcfef0b1593e5d42a">Tivi6</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TLC.tr" site_id="35#58d29bb0eefad3db9c606238">TLC</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TMB.tr" site_id="101#58d29bb0eefad3db9c606272">TMB</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRT1.tr" site_id="190#58d29bb0eefad3db9c60622f">TRT 1 SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRT1.tr" site_id="25#58d29bb0eefad3db9c606274">TRT 1</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRT2.tr" site_id="95#58d29bb0eefad3db9c606263">trt 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRT4K.tr" site_id="174#59dcbee1cfef0b4d80a49650">TRT 4K</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTArabi.tr" site_id="173#58d29bb0eefad3db9c606265">TRT Arabi</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTAvaz.tr" site_id="172#58d29bb0eefad3db9c60624b">TRT Avaz</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTBelgesel.tr" site_id="200#58d29bb0eefad3db9c606264">Trt Belgesel SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTBelgesel.tr" site_id="65#58d29bb0eefad3db9c6062a8">TRT Belgesel</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTCocuk.tr" site_id="114#58d29bb0eefad3db9c606255">TRT Çocuk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTHaber.tr" site_id="191#58d29bb0eefad3db9c606230">TRT Haber SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTHaber.tr" site_id="31#58d29bb0eefad3db9c606289">TRT Haber</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTKurdi.tr" site_id="171#58d29bb0eefad3db9c60624a">TRT Kurdi</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTMuzik.tr" site_id="98#58d29bb0eefad3db9c606266">TRT Müzik</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTSpor.tr" site_id="201#58d29bb0eefad3db9c606270">Trt Spor SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTSpor.tr" site_id="82#58d29bb0eefad3db9c6062a9">TRT Spor</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTSporYildiz.tr" site_id="83#5da87214cfef0b4df9157780">Trt Spor Yıldız</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTTurk.tr" site_id="96#58d29bb0eefad3db9c60624c">TRT Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTWorld.tr" site_id="170#58d29bb0eefad3db9c6062cc">TRT World</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV100.tr" site_id="36#5ccfd6adcfef0b6021816941">Tv 100</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV4.tr" site_id="84#59dca577cfef0b4d80a47b7c">TV4</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV5.tr" site_id="92#5bf6b074cfef0b7351c27d14">Tv 5</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV52.tr" site_id="146#5db29993cfef0b4df918bc9e">Tv 52</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV8.tr" site_id="193#58d29bb0eefad3db9c606233">TV 8 SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV8.tr" site_id="27#58d29bb0eefad3db9c6062ae">TV8</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV85.tr" site_id="46#58d29bb0eefad3db9c6062cb">TV 8,5</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TVDen.tr" site_id="143#5975e329cfef0b50e2627904">TV Den</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TVNET.tr" site_id="202#58d29bb0eefad3db9c606276">Tvnet SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TVNET.tr" site_id="40#58d29bb0eefad3db9c60629e">TV Net</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="UcanKusTV.tr" site_id="38#58d29bb0eefad3db9c6062b0">Uçankuş TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="UlkeTV.tr" site_id="196#58d29bb0eefad3db9c606243">ULKE TV SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="UlkeTV.tr" site_id="48#58d29bb0eefad3db9c60629f">Ülke TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="UlusalKanal.tr" site_id="86#58d29bb0eefad3db9c606242">Ulusal TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="UniversiteTV.tr" site_id="164#65142dbbcfef0b02d2cc14b7">Üniversite Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="VatanTV.tr" site_id="156#59dcbcb5cfef0b4d80a49632">Vatan TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="VavTV.tr" site_id="54#6071fb3bcfef0b159373a531">Vav Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ViasatHistory.tr" site_id="56#58d29bb0eefad3db9c6062bd">Viasat History</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="WomanTV.tr" site_id="52#61f934e2cfef0b1593123808">Woman TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="5d25dbe5cfef0b5761a051db">Test</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="58d29bb0eefad3db9c6062b4">CosmoSports</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="58d29bb0eefad3db9c6062ba">FilmScreen</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="58d29bb0eefad3db9c6062bf">Azoomee</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="58d29bb0eefad3db9c606231">TRT 3 Spor</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="58d29bb0eefad3db9c606247">ATV Turkiye SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="59dca29fcfef0b4d80a47a61">Nature Escape</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="61a408d7cfef0b1593ed2812">History Channel</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="6540d968cfef0b02d2dbb177">Moonbug</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="66337391cfef0b02d78776c8">Ekol Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="66e7e5cdcfef0b374461c45b">Spor Çoklu Ekran</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="66e7e50dcfef0b374461c36e">Ulusal Çoklu Ekran</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="66e7e54ccfef0b374461c370">Haber Çoklu Ekran</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="" site_id="5e75c923cfef0b15938bc9cc">TRT EBA TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="24TV.tr" site_id="58d29bb0eefad3db9c60622e">24</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="360.tr" site_id="58d29bb0eefad3db9c606236">360</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="A2TV.tr" site_id="59dcbe14cfef0b4d80a49646">a2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="AHaber.tr" site_id="58d29bb0eefad3db9c60625e">a Haber</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ANews.tr" site_id="59638e5fcfef0b43f0fd31b5">a News</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="APara.tr" site_id="5b9fb1eecfef0b35341b7eb7">A Para</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ASpor.tr" site_id="58d29bb0eefad3db9c6062b2">a Spor</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ATV.tr" site_id="58d29bb0eefad3db9c60625f">ATV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BabyTV.fr" site_id="58d29bb0eefad3db9c6062b7">Baby TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BBCEarth.tr" site_id="58d29bb0eefad3db9c6062bc">BBC Earth</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BBCNewsEurope.uk" site_id="58d29bb0eefad3db9c6062c6">BBC World News</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BeyazTV.tr" site_id="58d29bb0eefad3db9c606298">Beyaz TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="BloombergHT.tr" site_id="58d29bb0eefad3db9c60623e">Bloomberg HT</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Cartoonito.uk" site_id="58d29bb0eefad3db9c6062b9">Cartoonito</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CartoonNetwork.tr" site_id="58d29bb0eefad3db9c6062c8">Cartoon Network</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CNBCEurope.uk" site_id="66630f98cfef0b02d797d815">CNBC-e</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CNNInternationalEurope.us" site_id="58d29bb0eefad3db9c6062b8">CNN International</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CNNTurk.tr" site_id="59dca1f3cfef0b4d80a47a5f">CNN Türk SD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="CocukSmart.tr" site_id="58d29bb0eefad3db9c6062b5">Çocuk Smart</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DaVinci.de" site_id="58d29bb0eefad3db9c6062b6">Da Vinci Learning</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DiscoveryChannel.tr" site_id="58d29bb0eefad3db9c606248">Discovery</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DisneyJunior.tr" site_id="5fedddcecfef0b159330996e">Disney Junior</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DiziSmartMax.tr" site_id="58d29bb0eefad3db9c606278">Dizi Smart Max</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DiziSmartPremium.tr" site_id="58d29bb0eefad3db9c60625a">Dizi Smart Premium</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DMAX.tr" site_id="58d29bb0eefad3db9c606282">DMAX</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DocuBox.nl" site_id="58d29bb0eefad3db9c6062be">DocuScreen</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DreamTurk.tr" site_id="58d29bb0eefad3db9c6062c5">Dream Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="DreamTurk.tr" site_id="58d29bb0eefad3db9c60628d">Dream Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Ekoturk.tr" site_id="5c6e8e0ecfef0b613d9ff782">Ekotürk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="EuroD.tr" site_id="59dcbfdccfef0b4d80a4974a">Euro D</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Eurosport1.tr" site_id="58d29bb0eefad3db9c6062aa">Eurosport</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Eurosport2.tr" site_id="58d29bb0eefad3db9c606281">Eurosport 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="FashionTVEurope.fr" site_id="59dca3b2cfef0b4d80a47b77">Fashion TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="FX.us" site_id="58d29bb0eefad3db9c606269">FX</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="HaberGlobal.tr" site_id="5bac7dedcfef0b02fac035fd">Haber Global</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="HaberturkTV.tr" site_id="58d29bb0eefad3db9c60629d">Haber Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="HTSporTV.tr" site_id="66d839a0cfef0b37445c6db1">HT Spor</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="InvestigationDiscoveryEurope.us" site_id="58d29bb0eefad3db9c60628e">Discovery ID</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Kanal7.tr" site_id="58d29bb0eefad3db9c60629c">Kanal 7</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="KanalD.tr" site_id="58d29bb0eefad3db9c606258">Kanal D</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="LoveNature.ca" site_id="5dfc9faacfef0b201d2246b5">Love Nature</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MinikaGo.tr" site_id="58d29bb0eefad3db9c606257">Minika GO</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MovieSmartClassic.tr" site_id="58d29bb0eefad3db9c60629a">MovieSmart Classic</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="MovieSmartTurk.tr" site_id="58d29bb0eefad3db9c606299">MovieSmart Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="NationalGeographic.tr" site_id="58d29bb0eefad3db9c6062a4">National Geographic</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="NationalGeographicWild.tr" site_id="58d29bb0eefad3db9c6062a5">National Geographic WILD</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="NBATV.us" site_id="58d29bb0eefad3db9c60626e">NBA TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="NOWTV.tr" site_id="58d29bb0eefad3db9c6062a0">NOW</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="NTV.tr" site_id="58d29bb0eefad3db9c60623a">NTV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ShowTV.tr" site_id="58d29bb0eefad3db9c60629b">Show TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Sinema2.tr" site_id="5fe07d9fcfef0b1593275754">Sinema TV 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Sinema1001.tr" site_id="5fe07f5dcfef0b1593275822">Sinema TV 1001</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Sinema1002.tr" site_id="5fe07f72cfef0b159327585a">Sinema TV 1002</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaAile2.tr" site_id="5fe07eabcfef0b15932757a6">Sinema TV Aile 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaAile.tr" site_id="5fe07e42cfef0b15932757a3">Sinema TV Aile</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaAksiyon2.tr" site_id="5fe07e23cfef0b15932757a1">Sinema TV Aksiyon 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaAksiyon.tr" site_id="5fe07dd5cfef0b1593275758">Sinema TV Aksiyon</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaKomedi2.tr" site_id="5fe07f45cfef0b159327581f">Sinema TV Comedy 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaKomedi.tr" site_id="5fe07f29cfef0b1593275800">Sinema TV Comedy</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SinemaTV.tr" site_id="5fe07d7acfef0b1593275751">Sinema TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SozcuTV.tr" site_id="63ecd91acfef0b02d2687aed">SZC</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SporSmart2.tr" site_id="5fcb6bd2cfef0b15931fcdf8">SPOR SMART 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="SporSmart.tr" site_id="58d29bb0eefad3db9c60628a">Spor Smart</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="StarTV.tr" site_id="58d29bb0eefad3db9c606259">Star</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TarihTV.tr" site_id="64edfc67cfef0b02d2c038c5">Tarih Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Tele1.tr" site_id="59dcbddccfef0b4d80a49642">Tele 1</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="Teve2.tr" site_id="58d29bb0eefad3db9c6062a1">teve2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TGRTHaber.tr" site_id="58d29bb0eefad3db9c60623d">TGRT Haber</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TLC.tr" site_id="58d29bb0eefad3db9c606238">TLC</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TMB.tr" site_id="58d29bb0eefad3db9c606272">TMB</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRT1.tr" site_id="58d29bb0eefad3db9c606274">TRT 1</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRT2.tr" site_id="58d29bb0eefad3db9c606263">trt 2</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRT4K.tr" site_id="59dcbee1cfef0b4d80a49650">TRT 4K</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTAvaz.tr" site_id="58d29bb0eefad3db9c60624b">TRT Avaz</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTBelgesel.tr" site_id="58d29bb0eefad3db9c6062a8">TRT Belgesel</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTCocuk.tr" site_id="58d29bb0eefad3db9c606255">TRT Çocuk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTHaber.tr" site_id="58d29bb0eefad3db9c606289">TRT Haber</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTKurdi.tr" site_id="58d29bb0eefad3db9c60624a">TRT Kurdi</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTMuzik.tr" site_id="58d29bb0eefad3db9c606266">TRT Müzik</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTSpor.tr" site_id="58d29bb0eefad3db9c6062a9">TRT Spor</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTSporYildiz.tr" site_id="5da87214cfef0b4df9157780">Trt Spor Yıldız</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TRTTurk.tr" site_id="58d29bb0eefad3db9c60624c">TRT Türk</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV4.tr" site_id="59dca577cfef0b4d80a47b7c">TV4</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV8.tr" site_id="58d29bb0eefad3db9c6062ae">TV8</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV85.tr" site_id="58d29bb0eefad3db9c6062cb">TV 8,5</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TV100.tr" site_id="5ccfd6adcfef0b6021816941">Tv 100</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="TVNET.tr" site_id="58d29bb0eefad3db9c60629e">TV Net</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="UlkeTV.tr" site_id="58d29bb0eefad3db9c60629f">Ülke TV</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="VavTV.tr" site_id="6071fb3bcfef0b159373a531">Vav Tv</channel>
<channel site="dsmart.com.tr" lang="tr" xmltv_id="ViasatHistory.tr" site_id="58d29bb0eefad3db9c6062bd">Viasat History</channel>
</channels>

View file

@ -1,104 +1,130 @@
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
const duration = require('dayjs/plugin/duration')
const doFetch = require('@ntlab/sfetch')
const debug = require('debug')('site:dsmart.com.tr')
dayjs.extend(utc)
dayjs.extend(customParseFormat)
dayjs.extend(duration)
const API_ENDPOINT = 'https://www.dsmart.com.tr/api/v1/public/epg/schedules'
doFetch.setDebugger(debug)
const channelsWithSchedule = true
const pageLimit = 10
const caches = {}
module.exports = {
site: 'dsmart.com.tr',
days: 2,
url({ date, channel }) {
const [page] = channel.site_id.split('#')
return `${API_ENDPOINT}?page=${page}&limit=1&day=${date.format('YYYY-MM-DD')}`
},
parser: function ({ content, channel }) {
let programs = []
const items = parseItems(content, channel)
items.forEach(item => {
const prev = programs[programs.length - 1]
let start
if (prev) {
start = parseStart(item, prev.stop)
} else {
start = parseStart(item, dayjs.utc(item.day))
request: {
cache: {
ttl: 24 * 60 * 60 * 1000 // 1 day
}
let duration = parseDuration(item)
let stop = start.add(duration, 's')
programs.push({
title: item.program_name,
category: parseCategory(item),
description: item.description.trim(),
},
url({ date, page = 1 }) {
return `https://www.dsmart.com.tr/api/v1/public/epg/schedules?page=${
page
}&limit=${
pageLimit
}&day=${
date.format('YYYY-MM-DD')
}`
},
async parser({ content, channel, date, useCache = true }) {
const programs = []
if (content) {
if (typeof content === 'string') {
content = JSON.parse(content)
}
if (useCache) {
const cacheKey = date.format('YYYYMMDD')
// cache whole channels for the day
if (caches[cacheKey] === undefined) {
if (content?.data?.total) {
const queues = []
const pages = Math.ceil(content.data.total / pageLimit)
for (let page = 2; page <= pages; page++) {
queues.push(module.exports.url({ date, page }))
}
await doFetch(queues, (url, res) => {
if (Array.isArray(res?.data?.channels)) {
content.data.channels.push(...res.data.channels)
}
})
caches[cacheKey] = content
}
} else {
content = caches[cacheKey]
}
}
if (Array.isArray(content?.data?.channels)) {
content.data.channels
.filter(i => i._id === channel.site_id)
.forEach(i => {
if (i.schedule.length) {
let dayStart, ofs
programs.push(...i.schedule
.map(p => {
const baseDate = dayjs.utc(p.day)
const startDate = dayjs.utc(p.start_date)
// calculate base offset if needed
if (!dayStart) {
dayStart = startDate
ofs = dayjs.duration(dayjs.utc(`${p.day.substr(0, 11)}${p.start_date.substr(11)}`).diff(baseDate))
.asSeconds()
}
const delta = dayjs.duration(startDate.diff(dayStart)).asSeconds()
// ignore days in duration
const [h, m, s] = (p.duration.includes(',') ? p.duration.split(',')[1].trim() : p.duration)
.split(':').map(Number)
const duration = (h * 3600) + (m * 60) + s
const start = baseDate.add(ofs + delta, 's')
const stop = start.add(duration, 's')
return {
title: p.program_name,
description: p.description,
category: p.genre && p.genre.includes('/') ?
p.genre.split('/').map(g => `${g.substr(0, 1).toUpperCase()}${g.substr(1)}`) : null,
start,
stop
}
})
)
}
})
}
}
return programs
},
async channels() {
const perPage = 1
const totalChannels = 210
const pages = Math.ceil(totalChannels / perPage)
const channels = []
for (let i in Array(pages).fill(0)) {
const page = parseInt(i) + 1
const url = `${API_ENDPOINT}?page=${page}&limit=${perPage}&day=${dayjs().format(
'YYYY-MM-DD'
)}`
let offset = i * perPage
await axios
.get(url)
.then(r => r.data)
.then(data => {
offset++
if (data && data.data && Array.isArray(data.data.channels)) {
data.data.channels.forEach((item, j) => {
const index = offset + j
channels.push({
const f = page => this.url({ date: dayjs(), page })
let pages, page = 1
const queues = [f(page)]
await doFetch(queues, (url, res) => {
if (!pages && res.data.total) {
pages = Math.ceil(res.data.total / pageLimit)
while (page < pages) {
queues.push(f(++page))
}
}
if (Array.isArray(res?.data?.channels)) {
channels.push(...res.data.channels
.filter(i => (channelsWithSchedule && i.schedule.length) || !channelsWithSchedule)
.map(i => {
return {
lang: 'tr',
name: item.channel_name,
site_id: index + '#' + item._id
})
})
name: i.channel_name,
site_id: i._id
}
})
.catch(err => {
console.log(err.message)
})
)
}
})
return channels
}
}
function parseCategory(item) {
return item.genre !== '0' ? item.genre : null
}
function parseStart(item, date) {
const time = dayjs.utc(item.start_date)
return dayjs.utc(`${date.format('YYYY-MM-DD')} ${time.format('HH:mm:ss')}`, 'YYYY-MM-DD HH:mm:ss')
}
function parseDuration(item) {
const [, H, mm, ss] = item.duration.match(/(\d+):(\d+):(\d+)$/)
return parseInt(H) * 3600 + parseInt(mm) * 60 + parseInt(ss)
}
function parseItems(content, channel) {
const [, channelId] = channel.site_id.split('#')
const data = JSON.parse(content)
if (!data || !data.data || !Array.isArray(data.data.channels)) return null
const channelData = data.data.channels.find(i => i._id == channelId)
return channelData && Array.isArray(channelData.schedule) ? channelData.schedule : []
}

View file

@ -1,64 +1,81 @@
const { parser, url } = require('./dsmart.com.tr.config.js')
const axios = require('axios')
const dayjs = require('dayjs')
const fs = require('fs')
const path = require('path')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
const date = dayjs.utc('2023-01-16', 'YYYY-MM-DD').startOf('d')
jest.mock('axios')
const date = dayjs.utc('2025-01-13', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '3#5fe07d7acfef0b1593275751',
xmltv_id: 'SinemaTV.tr'
site_id: '5fe07f5dcfef0b1593275822',
xmltv_id: 'Sinema1001.tr'
}
axios.get.mockImplementation(url => {
const result = {}
const urls = {
'https://www.dsmart.com.tr/api/v1/public/epg/schedules?page=1&limit=10&day=2025-01-13':
'content1.json',
'https://www.dsmart.com.tr/api/v1/public/epg/schedules?page=2&limit=10&day=2025-01-13':
'content2.json',
}
if (urls[url] !== undefined) {
result.data = fs.readFileSync(path.join(__dirname, '__data__', urls[url])).toString()
if (!urls[url].startsWith('content1')) {
result.data = JSON.parse(result.data)
}
}
return Promise.resolve(result)
})
it('can generate valid url', () => {
expect(url({ date, channel })).toBe(
'https://www.dsmart.com.tr/api/v1/public/epg/schedules?page=3&limit=1&day=2023-01-16'
expect(url({ date })).toBe(
'https://www.dsmart.com.tr/api/v1/public/epg/schedules?page=1&limit=10&day=2025-01-13'
)
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
const results = parser({ channel, content }).map(p => {
it('can parse response', async () => {
const content = fs.readFileSync(path.join(__dirname, '__data__', 'content1.json')).toString()
const results = (await parser({ content, channel, date })).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results.length).toBe(11)
expect(results[0]).toMatchObject({
start: '2023-01-15T22:00:00.000Z',
stop: '2023-01-15T23:45:00.000Z',
title: 'Bizi Ayıran Her Şey',
category: 'sinema/genel',
start: '2025-01-12T21:30:00.000Z',
stop: '2025-01-12T23:30:00.000Z',
title: 'Taksi Şoförü',
description:
'Issızlığın ortasında yer alan orta sınıf bir evde bir anne kız yaşamaktadır. Çevrelerindeki taşları insanlarla yaşadıkları çatışmalar, anne-kızın hayatını olumsuz yönde etkilemektedir. Kızının ansızın ortadan kaybolması, bu çatışmaların seviyesini artıracak ve anne, kızını bulmak için her türlü yola başvuracaktır.'
'Vietnam savaşının izlerinin etkisindeki bir asker ve New York sokakları. Travis Bickle, geceleri taksi şoförlüğü yaptığı New Yorkta bir yandan da gündelik yaşama ayak uydurmaya çalışır. Çürümeye yüz tutmuş bir topluma karşı tutulan bir ayna niteliğindeki film, yönetmen Martin Scorsesenin kariyerinin en önemli filmlerinden biri olarak kabul görür.',
category: ['Sinema', 'Genel']
})
expect(results[1]).toMatchObject({
start: '2023-01-15T23:45:00.000Z',
stop: '2023-01-16T01:30:00.000Z',
title: 'Pixie',
category: 'sinema/genel',
expect(results[10]).toMatchObject({
start: '2025-01-13T19:00:00.000Z',
stop: '2025-01-13T21:00:00.000Z',
title: 'Senin Adın',
description:
'Annesinin intikamını almak isteyen Pixie, dahiyane bir soygun planlar. Fakat işler planladığı gibi gitmeyince kendini İrlandanın vahşi gangsterleri tarafından kovalanan iki adamla birlikte kaçarken bulur.'
})
expect(results[12]).toMatchObject({
start: '2023-01-16T20:30:00.000Z',
stop: '2023-01-16T22:30:00.000Z',
title: 'Seberg',
category: 'sinema/genel',
description:
'Başrolünde ünlü yıldız Kristen Stewartın yer aldığı politik gerilim, 1960ların sonunda insan hakları aktivisti Hakim Jamal ile yaşadığı politik ve romantik ilişki sebebiyle FBI tarafından hedef alınan, Fransız Yeni Dalgasının sevilen yüzü ve Serseri Aşıkların yıldızı Jean Sebergün çarpıcı hikayesini anlatıyor.'
'Dağların sardığı bir bölgede yaşayan Mitsuha, hayatından çok da memnun olmayan liseli bir kızdır. Babası vali olarak çalışmakta ve seçim kampanyaları ile uğraşmaktadır. Evde kendisi, kardeşi ve büyükannesi dışında kimse yoktur. Kırsal kesimdeki yaşamı onu bunaltmaktadır ve esas isteği Tokyo\'nun muhteşem şehir hayatının bir parçası olmaktır. Diğer tarafta ise Taki vardır.',
category: ['Sinema', 'Genel']
})
})
it('can handle empty guide', () => {
const results = parser({
it('can handle empty guide', async () => {
const results = await parser({
channel,
content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json'))
date,
content: fs.readFileSync(path.join(__dirname, '__data__', 'no_content.json')).toString(),
useCache: false
})
expect(results).toMatchObject([])

View file

@ -1,123 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="hd-plus.de" lang="de" xmltv_id="123tv.de" site_id="1-2-3-tv-hd">1-2-3 TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="13thStreetUniversal.de" site_id="13th-street-hd">13th Street Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="3sat.de" site_id="3sat-hd">3sat</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="AnixeHDSerie.de" site_id="anixe-hd">Anixe HD Serie</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ARDalpha.de" site_id="ard-alpha">ARD Alpha</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="arte.de" site_id="arte-hd">ARTE Deutsch</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="AstroTV.de" site_id="astrotv">AstroTV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ATV.at" site_id="atv-hd">ATV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ATV2.at" site_id="atv2">ATV 2</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="AugsburgTV.de" site_id="a-tv">Augsburg TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="BibelTV.de" site_id="bibel-tv-hd">Bibel TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="BloombergTVEurope.uk" site_id="bloomberg-tv-europe">Bloomberg TV Europe</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Boomerang.de" site_id="boomerang">Boomerang Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="BRFernsehenNord.de" site_id="bayerisches-fernsehen-hd">Bayerisches Fernsehen Nord</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="CartoonNetwork.de" site_id="cartoon-network">Cartoon Network Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Channel21.de" site_id="channel-21">Channel 21</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ComedyCentral.de" site_id="comedy-central">Comedy Central Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="DasErste.de" site_id="das-erste-hd">Das Erste</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="DeluxeMusic.de" site_id="deluxe-music-hd">Deluxe Music</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="DeutschesMusikFernsehen.de" site_id="deutsches-musik-fernsehen">Deutsches Musik Fernsehen</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="DieNeueZeitTV.ch" site_id="die-neue-zeit-tv">Die Neue Zeit TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="DiscoveryChannel.de" site_id="discovery-channel-hd">Discovery Channel Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="DisneyChannel.de" site_id="disney-channel-hd">Disney Channel Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="DMAX.de" site_id="dmax-hd">DMAX Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="EEurope.nl" site_id="e-entertainment-hd">E! Europe</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="EuronewsGerman.fr" site_id="euronews">EuroNews Deutsch</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Eurosport1.de" site_id="eurosport-hd">Eurosport 1 Germany</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="EWTN.de" site_id="ewtn">EWTN auf Deutsch</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="FrankenFernsehen.de" site_id="franken-fernsehen">Franken Fernsehen</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="GoTV.at" site_id="gotv">GoTV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Heimatkanal.de" site_id="heimatkanal">Heimatkanal</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="History.de" site_id="history-hd">History Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="HopeChannelGerman.de" site_id="hope-channel">Hope TV Deutsch</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="hrfernsehen.de" site_id="hr-fernsehen-hd">HR Fernsehen</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="HSE.de" site_id="hse24-hd">HSE</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="HSEExtra.de" site_id="hse24-extra-hd">HSE Extra</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="JMLDirectTV.uk" site_id="jml">JML Direct</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Junior.de" site_id="junior">Junior</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Juwelo.de" site_id="juwelo-hd">Juwelo</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="kabeleins.de" site_id="kabel-eins-hd">Kabel Eins Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="kabeleinsClassics.de" site_id="kabel-eins-classics">Kabel Eins Classics</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="KiKA.de" site_id="kika-hd">KIKA</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="KinoweltTV.de" site_id="kinowelt-tv">Kinowelt TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="KTV.at" site_id="k-tv">K-TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="LTV.de" site_id="l-tv">L TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Motorvision.de" site_id="motorvision-tv">Motorvision TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="MTV.de" site_id="mtv-hd">MTV Germany</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="MTVHitsEurope.uk" site_id="mtv-hits">MTV Hits Europe</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="MTVLive.uk" site_id="mtv-live-hd">MTV Live HD</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="MunchenTV.de" site_id="muenchen-tv">München TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="NationalGeographic.de" site_id="nat-geo-hd">National Geographic Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="NationalGeographicWild.de" site_id="nat-geo-wild-hd">National Geographic Wild Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Nitro.de" site_id="rtl-nitro-hd">Nitro Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="NPO1.nl" site_id="nl-1">NPO 1</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="NPO2.nl" site_id="nl-2">NPO 2</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ntv.de" site_id="n-tv-hd">N-TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="One.de" site_id="one-hd">One</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ORF1.at" site_id="orf-eins-hd">ORF 1</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ORF2.at" site_id="orf2">ORF 2</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ORFIII.at" site_id="orf-iii-hd">ORF III</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ORFSportPlus.at" site_id="orf-sport-plus-hd">ORF Sport +</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="PearlTV.de" site_id="pearl-tv-hd">Pearl TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="phoenix.de" site_id="phoenix-hd">Phoenix</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ProSieben.de" site_id="prosieben-hd">ProSieben Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ProSiebenMaxx.de" site_id="prosieben-maxx-hd">ProSieben Maxx Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Puls4.at" site_id="puls-4-hd">Puls 4</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="QVCZweiHD.de" site_id="qvc-plus-hd">QVC Zwei</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="QVC.de" site_id="qvc-hd">QVC Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="RFO.de" site_id="rfo">RFO</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="RheinMainTV.de" site_id="rhein-main-tv">RheinMain TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="RiC.de" site_id="ric">RiC</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="RomanceTV.de" site_id="romance-tv">Romance TV Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="RTLCrime.de" site_id="rtl-crime-hd">RTL Crime Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="RTL.de" site_id="rtl-hd">RTL Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="RTLLiving.de" site_id="rtl-living">RTL Living Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="RTLZwei.de" site_id="rtl-ii-hd">RTL Zwei Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SAT1.de" site_id="sat-1-hd">Sat. 1 Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SAT1emotions.de" site_id="sat-1-emotions">Sat. 1 Emotions</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SAT1Gold.de" site_id="sat-1-gold-hd">Sat. 1 Gold Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ServusTVDeutschland.de" site_id="servustv-hd-deutschland">Servus TV Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="sixx.de" site_id="sixx-hd">Sixx Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkyAtlantic.de" site_id="sky-atlantic-hd">Sky Atlantic</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkyCinemaAction.de" site_id="sky-action-hd">Sky Cinema Action</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkyCinemaBestOf.de" site_id="sky-hits-hd">Sky Cinema Hits</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkyCinemaSpecial.de" site_id="sky-nostalgie">Sky Cinema Nostalgie</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkyComedy.de" site_id="sky-comedy">Sky Comedy</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkyKrimi.de" site_id="sky-krimi">Sky Krimi</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkySport1.de" site_id="sky-sport-hd-1">Sky Sport 1</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkySport2.de" site_id="sky-sport-hd-2">Sky Sport 2</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkySportAustria1.at" site_id="sky-sport-austria-hd">Sky Sport Austria 1</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkySportBundesliga1.de" site_id="sky-bundesliga-hd-1">Sky Sport Bundesliga 1</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkySportBundesliga2.de" site_id="sky-bundesliga-hd-2">Sky Sport Bundesliga 2</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkySportBundesliga3.de" site_id="sky-bundesliga-hd-3">Sky Sport Bundesliga 3</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkySportBundesliga4.de" site_id="sky-bundesliga-hd-4">Sky Sport Bundesliga 4</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SkySportNews.de" site_id="sky-sport-news-hd">Sky Sport News</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SonnenklarTV.de" site_id="sonnenklar-tv-hd">Sonnenklar TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="AXNBlack.de" site_id="axn-hd">Sony AXN</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Sport1.de" site_id="sport1-hd">Sport 1</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="Sport1Plus.de" site_id="sport1-plus-hd">Sport 1+</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SportdigitalFUSSBALL.de" site_id="sportdigital">Sportdigital Fussball</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SRF1.ch" site_id="srf-1-hd">SRF 1</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SRFernsehen.de" site_id="sr-fernsehen-hd">SR Fernsehen</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SRFzwei.ch" site_id="srf-zwei-hd">SRF Zwei</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="StingrayClassica.ca" site_id="classica">Stingray Classica</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="RTLSuper.de" site_id="super-rtl-hd">Super RTL Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="SYFY.de" site_id="syfy-hd">Syfy Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="tagesschau24.de" site_id="tagesschau24-hd">Tagesschau 24</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="TELE5.de" site_id="tele-5-hd">Tele 5</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="TLC.de" site_id="tlc-hd">TLC Germany</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="WarnerTVFilm.de" site_id="tnt-film">TNT Film</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="WarnerTVSerieHD.de" site_id="tnt-serie-hd">TNT Serie</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="TVA.de" site_id="tva-ostbayern">TVA Ostbayern</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="TVOberfranken.de" site_id="tv-oberfranken">TV Oberfranken</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="UniversalTV.de" site_id="universal-channel-hd">Universal TV Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="VOX.de" site_id="vox-hd">Vox Deutschland</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="WELT.de" site_id="n24-hd">Welt</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="WeltderWunderTV.de" site_id="welt-der-wunder-tv">Welt der Wunder TV</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ZDF.de" site_id="zdf-hd">ZDF</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ZDFinfo.de" site_id="zdfinfo-hd">ZDF Info</channel>
<channel site="hd-plus.de" lang="de" xmltv_id="ZDFneo.de" site_id="zdfneo-hd">ZDF Neo</channel>
</channels>

View file

@ -1,57 +0,0 @@
const cheerio = require('cheerio')
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 = {
site: 'hd-plus.de',
days: 2,
url({ date, channel }) {
const today = dayjs().utc().startOf('d')
const day = date.diff(today, 'd')
return `https://www.hd-plus.de/epg/channel/${channel.site_id}?d=${day}`
},
parser({ content, date }) {
const programs = []
const items = parseItems(content)
items.forEach(item => {
const prev = programs[programs.length - 1]
const $item = cheerio.load(item)
let start = parseStart($item, date)
if (prev) {
if (start.isBefore(prev.start)) {
start = start.add(1, 'd')
date = date.add(1, 'd')
}
prev.stop = start
}
const stop = start.add(1, 'h')
programs.push({ title: parseTitle($item), start, stop })
})
return programs
}
}
function parseStart($item, date) {
const timeString = $item('td:nth-child(2)').text().split(' ').pop()
const dateString = `${date.format('YYYY-MM-DD')} ${timeString}`
return dayjs.tz(dateString, 'YYYY-MM-DD HH:mm', 'Europe/Berlin')
}
function parseTitle($item) {
return $item('td:nth-child(1) > a').text()
}
function parseItems(content) {
const $ = cheerio.load(content)
return $('table > tbody > tr').toArray()
}

View file

@ -1,54 +0,0 @@
const { parser, url } = require('./hd-plus.de.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('2021-11-25', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '1-2-3-tv-hd',
xmltv_id: '123tv.de'
}
const content =
'<!DOCTYPE html><html> <head lang="de"></head> <body data-sensory-parallax-role="main" data-sensory-controller=\'{"controllerName": "OffscreenController"}\' class="webshop-epg red" > <main data-sensory-controller=\'{"controllerName": "TeaserController"}\'> <div class="grid-container-epg channel"> <div class="site_overlay"> <div class="loading_icon"></div></div><div class="site_wrapper"> <div id="UIChannelContent-619fb9d2e185d" class="channel-content"> <header> <img src="//cdn.hd-plus.de/senderlogos/bright-cropped/24444-2.png" alt="1-2-3.tv HD" class="channel-image"/> <h2 class="title">1-2-3.tv HD</h2> </header> <table> <thead> <tr> <th>Titel</th> <th>Ausstrahlungszeit</th> </tr></thead> <tbody> <tr> <td> <a href="/epg/show/1-2-3-tv-hd-ihre-lieblingsuhren/1442396582" >Ihre Lieblingsuhren</a > </td><td>Do 25.11 00:00</td></tr><tr> <td> <a href="/epg/show/1-2-3-tv-hd-ihre-lieblingsuhren/1442396584" >Ihre Lieblingsuhren</a > </td><td>Do 25.11 01:00</td></tr><tr> <td><a href="/epg/show/1-2-3-tv-hd-flash-deals/1452944370">Flash Deals</a></td><td>Do 25.11 06:00</td></tr></tbody> </table> </div></div></div></main> </body></html>'
it('can generate valid url', () => {
const today = dayjs.utc().startOf('d')
expect(url({ channel, date: today })).toBe('https://www.hd-plus.de/epg/channel/1-2-3-tv-hd?d=0')
})
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: '2021-11-24T23:00:00.000Z',
stop: '2021-11-25T00:00:00.000Z',
title: 'Ihre Lieblingsuhren'
},
{
start: '2021-11-25T00:00:00.000Z',
stop: '2021-11-25T05:00:00.000Z',
title: 'Ihre Lieblingsuhren'
},
{
start: '2021-11-25T05:00:00.000Z',
stop: '2021-11-25T06:00:00.000Z',
title: 'Flash Deals'
}
])
})
it('can handle empty guide', () => {
const result = parser({
date,
channel,
content: '<!DOCTYPE html><html><head></head><body></body></html>'
})
expect(result).toMatchObject([])
})

View file

@ -1,15 +0,0 @@
# hd-plus.de
https://hd-plus.de/
### Download the guide
```sh
npm run grab --- --site=hd-plus.de
```
### Test
```sh
npm test --- hd-plus.de
```

View file

@ -1,15 +0,0 @@
# rev.bs
https://www.rev.bs/
### Download the guide
```sh
npm run grab --- --site=rev.bs
```
### Test
```sh
npm test --- rev.bs
```

View file

@ -1,183 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="rev.bs" lang="en" xmltv_id="" site_id="359">Me TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="3ABNEnglish.us" site_id="653">3ABN English</channel>
<channel site="rev.bs" lang="en" xmltv_id="AEEast.us" site_id="480">A&amp;E East</channel>
<channel site="rev.bs" lang="en" xmltv_id="AlJazeeraEnglish.qa" site_id="404">Aljazeera English</channel>
<channel site="rev.bs" lang="en" xmltv_id="AMCEast.us" site_id="489">AMC East</channel>
<channel site="rev.bs" lang="en" xmltv_id="AnimalPlanetEast.us" site_id="259">Animal Planet East</channel>
<channel site="rev.bs" lang="en" xmltv_id="ANT1Satellite.gr" site_id="681">Ant1 Satellite</channel>
<channel site="rev.bs" lang="en" xmltv_id="AWE.us" site_id="267">AWE</channel>
<channel site="rev.bs" lang="en" xmltv_id="AXSTV.us" site_id="369">AXS TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="BabyFirst.us" site_id="318">BabyFirst TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="BBCAmericaEast.us" site_id="485">BBC America East</channel>
<channel site="rev.bs" lang="en" xmltv_id="BBCNewsNorthAmerica.uk" site_id="409">BBC World News Americas</channel>
<channel site="rev.bs" lang="en" xmltv_id="BCNTV.bs" site_id="660">BCN TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="BETEast.us" site_id="356">BET East</channel>
<channel site="rev.bs" lang="en" xmltv_id="BETGospel.us" site_id="385">BET Gospel</channel>
<channel site="rev.bs" lang="en" xmltv_id="BETHerEast.us" site_id="380">BET Her East</channel>
<channel site="rev.bs" lang="en" xmltv_id="BETJams.us" site_id="376">BET Jams</channel>
<channel site="rev.bs" lang="en" xmltv_id="BETSoul.us" site_id="379">BET Soul</channel>
<channel site="rev.bs" lang="en" xmltv_id="BigTenNetwork.us" site_id="713">Big Ten Network</channel>
<channel site="rev.bs" lang="en" xmltv_id="BloombergTV.us" site_id="417">Bloomberg TV US</channel>
<channel site="rev.bs" lang="en" xmltv_id="Boomerang.us" site_id="312">Boomerang US</channel>
<channel site="rev.bs" lang="en" xmltv_id="Bounce.us" site_id="367">Bounce</channel>
<channel site="rev.bs" lang="en" xmltv_id="BravoEast.us" site_id="483">Bravo</channel>
<channel site="rev.bs" lang="en" xmltv_id="CalaClassics.bs" site_id="358">Cala Classics</channel>
<channel site="rev.bs" lang="en" xmltv_id="CalaWeather.bs" site_id="412">Cala Weather</channel>
<channel site="rev.bs" lang="en" xmltv_id="CaribVision.bb" site_id="271">CaribVision</channel>
<channel site="rev.bs" lang="en" xmltv_id="CartoonNetworkEast.us" site_id="301">Cartoon Network East</channel>
<channel site="rev.bs" lang="en" xmltv_id="CBLTDT.ca" site_id="208">CBC Toronto</channel>
<channel site="rev.bs" lang="en" xmltv_id="CCTV4America.cn" site_id="688">CCTV 4 America</channel>
<channel site="rev.bs" lang="en" xmltv_id="CCTV9.cn" site_id="680">CCTV 9</channel>
<channel site="rev.bs" lang="en" xmltv_id="CFTODT.ca" site_id="220">CTV Toronto</channel>
<channel site="rev.bs" lang="en" xmltv_id="CICADT.ca" site_id="306">TVO</channel>
<channel site="rev.bs" lang="en" xmltv_id="CinemaxEast.us" site_id="462">Cinemax East</channel>
<channel site="rev.bs" lang="en" xmltv_id="CITYDT.ca" site_id="219">Citytv Toronto</channel>
<channel site="rev.bs" lang="en" xmltv_id="CMTMusic.us" site_id="390">CMT Music</channel>
<channel site="rev.bs" lang="en" xmltv_id="CNBC.us" site_id="403">CNBC US</channel>
<channel site="rev.bs" lang="en" xmltv_id="CNN.us" site_id="405">CNN USA</channel>
<channel site="rev.bs" lang="en" xmltv_id="CNNInternationalLatinAmerica.us" site_id="408">CNN International Latin America</channel>
<channel site="rev.bs" lang="en" xmltv_id="ComedyCentralEast.us" site_id="354">Comedy Central East</channel>
<channel site="rev.bs" lang="en" xmltv_id="ComedyTV.us" site_id="355">Comedy TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="CookingChannel.us" site_id="251">Cooking Channel</channel>
<channel site="rev.bs" lang="en" xmltv_id="CourtTVMystery.us" site_id="314">Court TV Mystery</channel>
<channel site="rev.bs" lang="en" xmltv_id="CuriosityChannel.us" site_id="260">Curiosity Channel</channel>
<channel site="rev.bs" lang="en" xmltv_id="DaystarTV.us" site_id="659">Daystar TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="DiscoveryChannelEast.us" site_id="258">Discovery Channel East</channel>
<channel site="rev.bs" lang="en" xmltv_id="DiscoveryHomeHealthPanregional.us" site_id="268">Discovery Home &amp; Health</channel>
<channel site="rev.bs" lang="en" xmltv_id="DiscoveryKidsPanregional.us" site_id="304">Discovery Kids</channel>
<channel site="rev.bs" lang="en" xmltv_id="DiscoveryScience.us" site_id="262">Discovery Science</channel>
<channel site="rev.bs" lang="en" xmltv_id="DiscoveryTheaterLatinAmerica.us" site_id="275">Discovery Theater</channel>
<channel site="rev.bs" lang="en" xmltv_id="DiscoveryTurboPanregional.us" site_id="263">Discovery Turbo</channel>
<channel site="rev.bs" lang="en" xmltv_id="DisneyChannelEast.us" site_id="300">Disney Channel East</channel>
<channel site="rev.bs" lang="en" xmltv_id="DisneyJuniorEast.us" site_id="320">Disney Junior East</channel>
<channel site="rev.bs" lang="en" xmltv_id="DisneyXDEast.us" site_id="319">Disney XD East</channel>
<channel site="rev.bs" lang="en" xmltv_id="MagnoliaNetworkEast.us" site_id="253">DIY Network</channel>
<channel site="rev.bs" lang="en" xmltv_id="DWEnglish.de" site_id="676">DW English</channel>
<channel site="rev.bs" lang="en" xmltv_id="EEast.us" site_id="350">E! East</channel>
<channel site="rev.bs" lang="en" xmltv_id="ESPN2Caribbean.us" site_id="705">ESPN 2 Caribbean</channel>
<channel site="rev.bs" lang="en" xmltv_id="ESPNCaribbean.us" site_id="700">ESPN Caribbean</channel>
<channel site="rev.bs" lang="en" xmltv_id="ESPNU.us" site_id="723">ESPNU</channel>
<channel site="rev.bs" lang="en" xmltv_id="ESTV.us" site_id="454">Es TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="Eurochannel.uk" site_id="270">Eurochannel</channel>
<channel site="rev.bs" lang="en" xmltv_id="EuronewsEnglish.fr" site_id="426">EuroNews English</channel>
<channel site="rev.bs" lang="en" xmltv_id="EWTN.us" site_id="657">EWTN US</channel>
<channel site="rev.bs" lang="en" xmltv_id="FightNetwork.ca" site_id="726">Fight Network</channel>
<channel site="rev.bs" lang="en" xmltv_id="FoodNetworkEast.us" site_id="252">Food Network East</channel>
<channel site="rev.bs" lang="en" xmltv_id="FoxBusinessNetwork.us" site_id="410">Fox Business</channel>
<channel site="rev.bs" lang="en" xmltv_id="FoxNewsChannel.us" site_id="407">Fox News Channel</channel>
<channel site="rev.bs" lang="en" xmltv_id="FoxSoccerPlus.us" site_id="703">Fox Soccer Plus</channel>
<channel site="rev.bs" lang="en" xmltv_id="FoxSports2.us" site_id="707">FS2</channel>
<channel site="rev.bs" lang="en" xmltv_id="FoxSportsRacing.us" site_id="732">Fox Sports Racing</channel>
<channel site="rev.bs" lang="en" xmltv_id="FXEast.us" site_id="456">FX East</channel>
<channel site="rev.bs" lang="en" xmltv_id="FYIEast.us" site_id="255">FYI East</channel>
<channel site="rev.bs" lang="en" xmltv_id="GamePlus.ca" site_id="725">Game+</channel>
<channel site="rev.bs" lang="en" xmltv_id="GameShowNetworkEast.us" site_id="361">Game Show Network East</channel>
<channel site="rev.bs" lang="en" xmltv_id="GolfChannel.us" site_id="721">Golf Channel US</channel>
<channel site="rev.bs" lang="en" xmltv_id="GoneViralMusic.bb" site_id="282">Gone Viral Music</channel>
<channel site="rev.bs" lang="en" xmltv_id="GoneViralTV.bb" site_id="285">Gone Viral TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="GoneViralVogue.bb" site_id="284">Gone Viral Vogue</channel>
<channel site="rev.bs" lang="en" xmltv_id="GoneViralXtreme.bb" site_id="283">Gone Viral X-treme</channel>
<channel site="rev.bs" lang="en" xmltv_id="Grit.us" site_id="357">Grit</channel>
<channel site="rev.bs" lang="en" xmltv_id="HBO2LatinAmerica.us" site_id="507">HBO 2</channel>
<channel site="rev.bs" lang="en" xmltv_id="HBOEast.us" site_id="506">HBO East</channel>
<channel site="rev.bs" lang="en" xmltv_id="HBOFamilyLatinAmerica.us" site_id="502">HBO Family Latinoamérica</channel>
<channel site="rev.bs" lang="en" xmltv_id="HBOPlusLatinAmerica.us" site_id="504">HBO + Latinoamérica</channel>
<channel site="rev.bs" lang="en" xmltv_id="HBOPopLatinAmerica.us" site_id="541">HBO Pop Latinoamérica</channel>
<channel site="rev.bs" lang="en" xmltv_id="HBOXtremeLatinAmerica.us" site_id="542">HBO Xtreme Latinoamérica</channel>
<channel site="rev.bs" lang="en" xmltv_id="HGTVEast.us" site_id="250">HGTV East</channel>
<channel site="rev.bs" lang="en" xmltv_id="HistoryEast.us" site_id="254">History East</channel>
<channel site="rev.bs" lang="en" xmltv_id="HLN.us" site_id="400">HLN</channel>
<channel site="rev.bs" lang="en" xmltv_id="HopeChannelNorthAmerica.us" site_id="658">Hope Channel North America</channel>
<channel site="rev.bs" lang="en" xmltv_id="ImpactNetwork.us" site_id="661">Impact Network</channel>
<channel site="rev.bs" lang="en" xmltv_id="InspirationTV.us" site_id="651">Inspiration TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="InvestigationDiscoveryEast.us" site_id="265">Investigation Discovery East</channel>
<channel site="rev.bs" lang="en" xmltv_id="IONPlusEast.us" site_id="487">ION Plus East</channel>
<channel site="rev.bs" lang="en" xmltv_id="IONTVEast.us" site_id="465">ION TV East</channel>
<channel site="rev.bs" lang="en" xmltv_id="ISatPanregional.us" site_id="286">I-Sat</channel>
<channel site="rev.bs" lang="en" xmltv_id="IslandLuckTV.bs" site_id="224">Island Luck TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="IslandTV.ht" site_id="689">Island TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="JCNChannel14.bs" site_id="214">JCN Channel 14</channel>
<channel site="rev.bs" lang="en" xmltv_id="JewelryTV.us" site_id="362">Jewelry TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="JusticeCentralTV.us" site_id="415">Justice Central TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="KAYUDT1.us" site_id="216">FOX (KAYU) Spokane, WA</channel>
<channel site="rev.bs" lang="en" xmltv_id="KIRODT1.us" site_id="217">CBS (KIRO) Seattle, WA</channel>
<channel site="rev.bs" lang="en" xmltv_id="KTLADT1.us" site_id="227">KTLA Los Angeles, CA</channel>
<channel site="rev.bs" lang="en" xmltv_id="KTVXDT1.us" site_id="218">ABC (KTVX) Salt Lake City, UT</channel>
<channel site="rev.bs" lang="en" xmltv_id="LawCrime.us" site_id="416">Law &amp; Crime</channel>
<channel site="rev.bs" lang="en" xmltv_id="LifetimeEast.us" site_id="470">Lifetime East</channel>
<channel site="rev.bs" lang="en" xmltv_id="LifetimeMoviesEast.us" site_id="472">Lifetime Movies East</channel>
<channel site="rev.bs" lang="en" xmltv_id="LifetimeRealWomen.us" site_id="473">Lifetime Real Women</channel>
<channel site="rev.bs" lang="en" xmltv_id="MAVTV.us" site_id="459">MavTV</channel>
<channel site="rev.bs" lang="en" xmltv_id="MLBNetwork.us" site_id="728">MLB Network</channel>
<channel site="rev.bs" lang="en" xmltv_id="Movies.us" site_id="586">Movies!</channel>
<channel site="rev.bs" lang="en" xmltv_id="MSNBC.us" site_id="402">MSNBC</channel>
<channel site="rev.bs" lang="en" xmltv_id="MTV2East.us" site_id="374">MTV 2 East</channel>
<channel site="rev.bs" lang="en" xmltv_id="MTVEast.us" site_id="370">MTV East</channel>
<channel site="rev.bs" lang="en" xmltv_id="MyDestinationTV.us" site_id="276">My Destination TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="NationalGeographicEast.us" site_id="256">National Geographic East</channel>
<channel site="rev.bs" lang="en" xmltv_id="NationalGeographicWildEast.us" site_id="273">National Geographic Wild</channel>
<channel site="rev.bs" lang="en" xmltv_id="NBATV.us" site_id="730">NBA TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="NBCSN.us" site_id="717">NBCSN</channel>
<channel site="rev.bs" lang="en" xmltv_id="NFLNetwork.us" site_id="711">NFL Network</channel>
<channel site="rev.bs" lang="en" xmltv_id="NickelodeonEast.us" site_id="303">Nickelodeon East</channel>
<channel site="rev.bs" lang="en" xmltv_id="NickMusic.us" site_id="377">NickMusic US</channel>
<channel site="rev.bs" lang="en" xmltv_id="OneAmericaNewsNetwork.us" site_id="406">One America News Network</channel>
<channel site="rev.bs" lang="en" xmltv_id="OneCaribbeanTelevision.us" site_id="382">One Caribbean TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="OurTV.bs" site_id="212">Our TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="OutdoorChannel.us" site_id="708">Outdoor Channel</channel>
<channel site="rev.bs" lang="en" xmltv_id="OWNEast.us" site_id="475">Oprah Winfrey Network East</channel>
<channel site="rev.bs" lang="en" xmltv_id="ParamountNetworkEast.us" site_id="453">Paramount Network East</channel>
<channel site="rev.bs" lang="en" xmltv_id="PBSKids.us" site_id="305">PBS Kids</channel>
<channel site="rev.bs" lang="en" xmltv_id="PursuitChannel.us" site_id="718">Pursuit Channel</channel>
<channel site="rev.bs" lang="en" xmltv_id="Quest.uk" site_id="720">Quest UK</channel>
<channel site="rev.bs" lang="en" xmltv_id="RaiItaliaAmerica.it" site_id="682">Rai Italia Nord America</channel>
<channel site="rev.bs" lang="en" xmltv_id="RecipeTV.us" site_id="249">Recipe TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="Revolt.us" site_id="340">Revolt</channel>
<channel site="rev.bs" lang="en" xmltv_id="SECNetwork.us" site_id="724">SEC Network</channel>
<channel site="rev.bs" lang="en" xmltv_id="Space.mx" site_id="231">Space México</channel>
<channel site="rev.bs" lang="en" xmltv_id="SportsMax.jm" site_id="735">SportsMax</channel>
<channel site="rev.bs" lang="en" xmltv_id="SportsMax2.jm" site_id="745">SportsMax 2</channel>
<channel site="rev.bs" lang="en" xmltv_id="StarAction.us" site_id="558">Star Action</channel>
<channel site="rev.bs" lang="en" xmltv_id="StarCinema.us" site_id="564">Star Cinema</channel>
<channel site="rev.bs" lang="en" xmltv_id="StarClassics.us" site_id="563">Star Classics</channel>
<channel site="rev.bs" lang="en" xmltv_id="StarComedy.us" site_id="560">Star Comedy</channel>
<channel site="rev.bs" lang="en" xmltv_id="StarFun.us" site_id="561">Star Fun</channel>
<channel site="rev.bs" lang="en" xmltv_id="StarHits.us" site_id="557">Star Hits</channel>
<channel site="rev.bs" lang="en" xmltv_id="StarSeries.us" site_id="555">Star Series</channel>
<channel site="rev.bs" lang="en" xmltv_id="SyfyPanregional.us" site_id="222">Syfy Panregional</channel>
<channel site="rev.bs" lang="en" xmltv_id="TBNEast.us" site_id="650">TBN US</channel>
<channel site="rev.bs" lang="en" xmltv_id="TBSEast.us" site_id="225">TBS East</channel>
<channel site="rev.bs" lang="en" xmltv_id="TCMEast.us" site_id="492">TCM</channel>
<channel site="rev.bs" lang="en" xmltv_id="TeenNickEast.us" site_id="315">TeenNick East</channel>
<channel site="rev.bs" lang="en" xmltv_id="TelePacific.ht" site_id="384">Tele Pacific</channel>
<channel site="rev.bs" lang="en" xmltv_id="TempoNetworks.us" site_id="381">Tempo Networks</channel>
<channel site="rev.bs" lang="en" xmltv_id="TheAfricaChannel.us" site_id="269">The Africa Channel</channel>
<channel site="rev.bs" lang="en" xmltv_id="TheParliamentaryChannel.bs" site_id="420">The Parliamentary Channel</channel>
<channel site="rev.bs" lang="en" xmltv_id="TheWeatherChannel.us" site_id="411">The Weather Channel</channel>
<channel site="rev.bs" lang="en" xmltv_id="TheWordNetwork.us" site_id="652">The Word Network</channel>
<channel site="rev.bs" lang="en" xmltv_id="TLCEast.us" site_id="266">TLC East</channel>
<channel site="rev.bs" lang="en" xmltv_id="TNTEast.us" site_id="450">TNT East</channel>
<channel site="rev.bs" lang="en" xmltv_id="TravelChannelEast.us" site_id="261">Travel Channel East</channel>
<channel site="rev.bs" lang="en" xmltv_id="TreehouseTV.ca" site_id="309">Treehouse TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="truTVEast.us" site_id="414">Tru TV East</channel>
<channel site="rev.bs" lang="en" xmltv_id="TSN1.ca" site_id="715">TSN 1</channel>
<channel site="rev.bs" lang="en" xmltv_id="TV5MondeUSA.fr" site_id="677">TV5Monde États-Unis</channel>
<channel site="rev.bs" lang="en" xmltv_id="TVOne.us" site_id="366">TV One</channel>
<channel site="rev.bs" lang="en" xmltv_id="UnivisionEast.us" site_id="679">Univisión Este</channel>
<channel site="rev.bs" lang="en" xmltv_id="VH1East.us" site_id="372">VH1 East</channel>
<channel site="rev.bs" lang="en" xmltv_id="VICETV.us" site_id="341">Vice East</channel>
<channel site="rev.bs" lang="en" xmltv_id="WarnerChannelPanregional.us" site_id="221">Warner Channel Panregional</channel>
<channel site="rev.bs" lang="en" xmltv_id="WFORDT1.us" site_id="209">CBS (WFOR) Miami, FL</channel>
<channel site="rev.bs" lang="en" xmltv_id="WGNDT1.us" site_id="229">WGN-TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="WPBTDT1.us" site_id="213">PBS (WPBT) Miami, FL</channel>
<channel site="rev.bs" lang="en" xmltv_id="WPIXDT1.us" site_id="226">WPIX-TV</channel>
<channel site="rev.bs" lang="en" xmltv_id="WPLGDT1.us" site_id="210">ABC (WPLG) Miami, FL</channel>
<channel site="rev.bs" lang="en" xmltv_id="WPTVDT1.us" site_id="215">NBC (WPTV) West Palm Beach, FL</channel>
<channel site="rev.bs" lang="en" xmltv_id="WSVNDT1.us" site_id="207">FOX (WSVN) Miami, FL</channel>
<channel site="rev.bs" lang="en" xmltv_id="WTVJDT1.us" site_id="206">NBC (WTVJ) Miami, FL</channel>
<channel site="rev.bs" lang="en" xmltv_id="WWORDT1.us" site_id="228">MyNetworkTV (WWOR) New York, NY</channel>
<channel site="rev.bs" lang="en" xmltv_id="YTVEast.ca" site_id="307">YTV</channel>
<channel site="rev.bs" lang="en" xmltv_id="ZNSTV.bs" site_id="211">ZNS TV</channel>
</channels>

View file

@ -1,68 +0,0 @@
const _ = require('lodash')
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
dayjs.extend(utc)
dayjs.extend(timezone)
module.exports = {
site: 'rev.bs',
days: 2,
url: function ({ date }) {
return `https://www.rev.bs/wp-content/uploads/tv-guide/${date.format('YYYY-MM-DD')}_0.json`
},
parser: async function ({ content, channel, date }) {
const programs = []
const items0 = parseItems(content, channel)
if (!items0.length) return programs
const items1 = parseItems(await loadNextItems(date, 1), channel)
const items2 = parseItems(await loadNextItems(date, 2), channel)
const items3 = parseItems(await loadNextItems(date, 3), channel)
const items = _.unionBy(items0, items1, items2, items3, 'sid')
items.forEach(item => {
const start = parseStart(item, date)
const stop = start.add(item.duration, 'm')
programs.push({
title: item.title,
start,
stop
})
})
return programs
}
}
async function loadNextItems(date, index) {
const url = `https://www.rev.bs/wp-content/uploads/tv-guide/${date.format(
'YYYY-MM-DD'
)}_${index}.json`
return axios
.get(url, {
responseType: 'arraybuffer'
})
.then(res => res.data.toString())
.catch(console.log)
}
function parseStart(item, date) {
const shift = parseInt(item.s)
return dayjs.tz(date.add(shift, 'm').toString(), 'America/New_York')
}
function parseItems(content, channel) {
let data
try {
data = JSON.parse(content)
} catch {
return []
}
if (!data || data.status !== 'OK') return []
return data.data.schedule[channel.site_id] || []
}

View file

@ -1,80 +0,0 @@
const { parser, url } = require('./rev.bs.config.js')
const axios = require('axios')
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('2021-11-21', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '206',
xmltv_id: 'WTVJ.us'
}
it('can generate valid url', () => {
expect(url({ date, channel })).toBe(
'https://www.rev.bs/wp-content/uploads/tv-guide/2021-11-21_0.json'
)
})
it('can parse response', done => {
axios.get.mockImplementation(url => {
if (url === 'https://www.rev.bs/wp-content/uploads/tv-guide/2021-11-21_1.json') {
return Promise.resolve({
data: Buffer.from(
'{"status":"OK","data":{"schedule":{"206":[{"title":"Talk Stoop","sid":43599836,"s":"330.0000","duration":30,"rating":"TVPG"}]}}}'
)
})
} else {
return Promise.resolve({
data: Buffer.from('{"status":"OK","data":{"schedule":{}}}')
})
}
})
const content =
'{"status":"OK","data":{"schedule":{"205":[{"title":"Rev Pulse 5 - Online Classifieds","sid":43576112,"s":"-120.0000","duration":120,"rating":""}],"206":[{"title":"Saturday Night Live","sid":43599827,"s":"-31.0000","duration":93,"rating":"TV14"}]}}}'
parser({ content, channel, date })
.then(result => {
result = result.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
start: '2021-11-21T04:29:00.000Z',
stop: '2021-11-21T06:02:00.000Z',
title: 'Saturday Night Live'
},
{
start: '2021-11-21T10:30:00.000Z',
stop: '2021-11-21T11:00:00.000Z',
title: 'Talk Stoop'
}
])
done()
})
.catch(err => {
done(err)
})
})
it('can handle empty guide', done => {
parser({
date,
channel,
content: '<html lang="en"><head></head><body></body></html>'
})
.then(result => {
expect(result).toMatchObject([])
done()
})
.catch(err => {
done(err)
})
})

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,15 @@
# telebilbao.es
https://www.telebilbao.es/programacion-2/
### Download the guide
```sh
npm run grab --- --site=telebilbao.es
```
### Test
```sh
npm test --- telebilbao.es
```

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="telebilbao.es" lang="es" xmltv_id="TeleBilbao.es" site_id="#">TeleBilbao</channel>
</channels>

View file

@ -0,0 +1,70 @@
const dayjs = require('dayjs')
const cheerio = require('cheerio')
const table2array = require('table2array')
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)
require('dayjs/locale/es')
module.exports = {
site: 'telebilbao.es',
days: 1,
url: 'https://www.telebilbao.es/programacion-2/',
request: {
cache: {
ttl: 24 * 60 * 60 * 1000 // 1 day
}
},
parser({ content, date }) {
let programs = []
const items = parseItems(content, date)
items.forEach(item => {
const prev = programs[programs.length - 1]
let start = parseStart(item, date)
if (prev) {
if (start.isBefore(prev.start)) {
start = start.add(1, 'd')
date = date.add(1, 'd')
}
prev.stop = start
}
const stop = start.add(30, 'm')
programs.push({
title: item.title,
start,
stop
})
})
return programs
}
}
function parseStart(item, date) {
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${item.time}`, 'YYYY-MM-DD HH:mm', 'Europe/Madrid')
}
function parseItems(content, date) {
const $ = cheerio.load(content)
const tableHtml = $('table.programacion').html()
let tableArray = table2array(`<table>${tableHtml}</table>`)
const day = date.locale('es').format('dddd\nD MMMM').toUpperCase()
if (!tableArray[0]) return []
const indexOfColumn = tableArray[0].indexOf(day)
tableArray.pop()
const items = []
tableArray.forEach(row => {
items.push({
time: row[0],
title: row[indexOfColumn]
})
})
return items.filter(i => Boolean(i.time))
}

View file

@ -0,0 +1,44 @@
const { parser, url } = require('./telebilbao.es.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)
const date = dayjs.utc('2025-01-16', 'YYYY-MM-DD').startOf('d')
it('can generate valid url', () => {
expect(url).toBe('https://www.telebilbao.es/programacion-2/')
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'))
let results = parser({ content, date })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results.length).toBe(50)
expect(results[0]).toMatchObject({
start: '2025-01-16T06:00:00.000Z',
stop: '2025-01-16T06:30:00.000Z',
title: 'BAI HORIXE'
})
expect(results[49]).toMatchObject({
start: '2025-01-17T07:30:00.000Z',
stop: '2025-01-17T08:00:00.000Z',
title: 'LA KAPITAL'
})
})
it('can handle empty guide', () => {
const results = parser({
date,
content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'))
})
expect(results).toMatchObject([])
})

File diff suppressed because one or more lines are too long

View file

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

View file

@ -0,0 +1,315 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="3sat">3sat</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="24urm">Televizija 24</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="24vesti">TV Vijesti</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="360_tunebox">360 TuneBox</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="adria">Adria</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="akanal">Kanal A</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="alfa">Alfa TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="aljazeera">Al Jazeera Balkans</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="alsatm">Alsat Macedonia</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="alternativa">Elta 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="angelshd">Angels HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="animalhd">Animal Planet HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="ansattv">ePosavje TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="ard">ARD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="arenafight">Arena Fight</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="arenapremium">Arena Sport 1 Premium</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="arenaslo1">Arena Sport 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="arenaslo2">Arena Sport 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="arenaslo3">Arena Sport 3</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="arenaslo4">Arena Sport 4</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="arenatv">Arena TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="arte">Arte</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="atmtvkg">ATM TV Kranjska Gora HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="b92">B92</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="babytv">Baby TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="balkan">Balkan Erotic</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="balkantrip">Balkan trip</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="bbcearth">BBC Earth</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="bbcfirsthd_">BBC First HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="bbcworld">BBC News</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="bht1_">BHT1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="bir">BIR</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="bktv">BK TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="bloombergadria">Bloomberg Adria</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="bntv">BN TV 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="boobhd">BooB HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="boomerang">Cartoonito</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="brio">Brio</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="capableholehd">Capable Hole HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="carlitv">Veseljak Golica</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cartoon">Cartoon</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cinemax1">Cinemax</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cinemax2">Cinemax 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cinestaraction">CineStar TV Action &amp; Thriller</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cinestarfantasy">Cinestar Fantasy</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cinestarpr1">CineStar TV Premiere 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cinestarpr2">CineStar TV Premiere 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cinestartv">Cinestar TV 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cinestartv2">Cinestar TV 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cmc">CMC</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="cnn">CNN</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="curiosity">Curiosity Channel</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="davincilear">Da Vinci Learning</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="devilshomehd">Devils Home HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="discidx">Discovery ID Xtra</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="discoveryhdd">Discovery Channel HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="disctlc">Discovery TLC</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="disney">Disney Channel</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="disneyjr">Disney Junior</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="dizi">Dizi</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="dmtv">DM SAT</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="docubox">DocuBox</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="dogtv">Dog TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="domkino">Dom Kino</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="doq">24Kitchen</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="dorcel">Dorcel TV HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="dorcelhd">Dorcel XXX HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="doxtv">DOX TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="drfit">Dr. Fit</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="dugans">TV Duga Novi sad</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="duna">Duna World</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="dusktv">Dusk TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="eeurope">E!</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="eltahd">ELTA HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="eltatv">ELTA TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="enaplusena">1+1 International</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="epicdrama">Epic Drama</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="erox">Erox</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="eroxxx">Eroxxx</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="etv">ETV HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="eurosport">Eurosport 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="eurosport2">Eurosport 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="ewtn">EWTN</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="exodustv">Exodus TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="explore">Viasat Explore</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="extreme">Extreme TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="extremede">Extrem</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="fashion">Fashion TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="fashionbox">FashionBox</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="fashionhd">Fashion HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="fast_and_funbox">Fast and FunBox</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="fightbox">FightBox</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="filmbox_arthouse">FilmBox Arthouse</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="filmbox_extra">FilmBox Extra</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="filmbox_premium">FilmBox Premium</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="filmbox_stars">FilmBox Stars</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="folkp">Folk Plus</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="folx">Folx</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="fox">STAR Channel</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="foxcrime">STAR Crime</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="foxlife">STAR Life</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="foxmovies">STAR Movies</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="foxnews">Fox News</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="foxydollshd">Foxy Dolls HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="france24">France 24</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="freex">Pinko club</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="ftv">FTV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="funbox">FunBox</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="galejatv">TV Galeja HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="gametoon">Gametoon</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="geatv">Gea TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="glamhd">Glam HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="gold">Gold TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="h2">H2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hallmark">Diva</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="happy">Happy TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="happy_puppy">Happy Puppy</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="happyreality1">Happy Reality 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="happyreality2">Happy Reality 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hayat">Hayat</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hbo">HBO</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hbo2">HBO 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hbo3">HBO 3</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hema">Hema</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hgtv">HGTV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="history">Viasat History</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="historych">History Channel</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hotpleasure">Hot Pleasure</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hotxxl">Hot XXL</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hrt1">HRT 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hrt2">HRT 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hrt3">HRT 3</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hustler">Hustler TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="hustlerhd">Hustler TV HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="ict">ICTbusiness TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="ideatv">Kanal 10 / Idea TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="infotv">Top TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="istra">TV RI</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="jabukatv">Jabuka (OTV)</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="jadran">TV Jadran</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="jimjam">JimJam</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="jugotontv">Jugoton</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="kabel1">Kabel 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="kakanj">NTV IC Kakanj</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="karousel">Karousel</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="kcn">KCN 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="kcnm">KCN 2 (music)</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="kictvhd">KIC TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="kitchentv">Kitchen TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="klasiktv">Klasik</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="koper">TV Koper Capodistria</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="koroskatv">KOROŠKA TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="lhtv">LH TV HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="ljtv">Ljubljana TV HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mediainter">Mediaset Italia</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="megafontv">Megafon TV HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mezzo">Mezzo</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mezzolivehd">Mezzo Live HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mgm">AMC</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="minimax">Minimax</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mixxxhd">MIXXX HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mktv1">MTV 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mktv2">MTV 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mktv3">MTV 3</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="motorvisiontv">Motorvision+</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mtv2">MTV 90s</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mtvdance">Club MTV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mtvh">MTV Hits</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="mtvlivehd">MTV HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="museumhd">Museum HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="muzpervogo">Muzika Pervogo</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="narodna">Narodna TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="nasatv">NAŠA TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="natgeo">National Geographic</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="natgeow">National Geographic Wild</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="net">NET TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="nickjr1">Nick Jr.</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="nickleodeon">Nickelodeon</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="nicktoons">NickToons</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="nova24tv">Nova 24 TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="nova24tv2">Nova 24 TV 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="ntv">n-tv</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="obnbosna">OBN</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="oneadria">One Adria</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="orf1">ORF 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="orf2">ORF 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="orontv">Oron TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="otvv">OTV Valentino</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="paprika">BEST TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="passionxxxhd">Passion XXX HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pickboxtv">Pickbox TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pink">Pink Plus</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkextra">Pink Extra</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkfilm">Pink Film</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkfolk">Pink Folk</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkfolk2">Pink Folk 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkkoncert">Pink Koncert</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkmusic">Pink Music</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinknroll">Pink&apos;n&apos;Roll</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkreality">Pink Reality</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkserije">Pink Serije</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkshow">Pink Show</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinksi">TV3</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkslo">PINK SI</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pinkzabava">Pink Zabava</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="planet2">Planet 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="planetearthsd">Planet Earth</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="planetplus">Planet Eva</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="planettv">Planet</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="playboytv">Playboy TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="popkino">Kino</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="popoto">OTO</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="poptv">POP TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="private">Private TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="pro7">Pro7</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="prvafiles">TV Prva Files</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="prvakick">TV Prva Kick</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="prvalife">TV Prva Life</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="prvamax">TV Prva Max</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="prvaplus">TV Prva Plus</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="prvasrb">PRVA Srbska TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="prvatvhd">PRVA TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="prvaworld">TV Prva World</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="ptujtv">Ptujska TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rai1">RAI 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rai2">RAI 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rai3">RAI 3</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rkanalp">R Kanal+</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rkings">Reality Kings TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtcg">MNE</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtcg2">RTCG 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtk">RTK</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtl">RTL</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtl2">RTL II</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtlhrvatska">RTL Hrvaška</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtlhrvatska2">RTL 2 Hrvaška</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtlkockica_">RTL Kockica</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtlliving">RTL Living</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtrs">RTRS</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rts">RT Srbija HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rts1">RTS 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rts2">RTS 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="rtsm">RTS Maribor</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="sarajevo">TV Sarajevo</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="sat1">SAT 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="satisfactionitaly">Redlight HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="savinjskatv">Savinjska TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="scifi">SciFi</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="sct">Vivid Red HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="sctprive">CentoXCento</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="sexation">Sexation</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="siptv">SIP TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="sitel">TV Sitel</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="skynews">Sky News</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="slo1">TV SLO 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="slo2">TV SLO 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="slo3">TV SLO 3</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="slontv">SLON TV extra</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="soncetv">Sonce TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="spbeograd">KCN 3 (svet+)</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="spice">Brazzers TV Europe</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="sporttv">Šport TV 1</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="sporttv2">Šport TV 2</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="sporttv3">Šport TV 3</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="superonehd">Super One HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="superrtl">Super RTL</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="telecafe">Telecafe</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="telem">Tele Maribor</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="trace">Trace Urban</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tracesport">Trace Sport</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="travel">Travel Channel</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="travelxp4k">Travelxp 4K</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="travelxphd">Travelxp HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tring7">Tring 7</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tringm">Tring Max</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="trings">Tring Shqip</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tringt">Tring Tring</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tringvp">Tring Vizion+</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="trzictv">Tržič TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tv1">O Kanal</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tv5">TV5MONDE</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tv8">Tv8</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tv1000">TV 1000</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvarenaesport">Arena eSport</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvas">TV As</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvbeltinci">TV Beltinci</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvcelje">TV Celje</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tve">TVE</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvgolica">TV Zlati zvoki</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvmiklavzhd">TV Miklavž HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvnakupihd">TV nakupi HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvormoz">Tv Ormož HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvpetelin">AKTUAL TV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvradgona">TV Radgona</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="tvvascom">TV Vascom</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vaskanal">Vaš kanal</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vh1">MTV 00s</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vh1cla">MTV 80s</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vianature">Viasat Nature</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vikom">Vikom</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vitel">Vitel</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vividtouch">Vivid Touch</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vox">VOX</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vremya">Vremya</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="vtv">VTV</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="woman">Woman</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="xxxtazyhd">XXXTAZY HD</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="yachtsail">Nautical Channel</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="z1">Z1 Televizija</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="zdf">ZDF</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="zdrava">Zdrava Televizija</channel>
<channel site="tv-spored.siol.net" lang="sl" xmltv_id="" site_id="zdravatv">Zdrava TV</channel>
</channels>

View file

@ -0,0 +1,81 @@
const axios = require('axios')
const cheerio = require('cheerio')
module.exports = {
site: 'tv-spored.siol.net',
days: 2,
url({ channel, date }) {
return `https://tv-spored.siol.net/kanal/${channel.site_id}/datum/${date.format('YYYYMMDD')}`
},
request: {
headers: {
Accept: 'text/html'
}
},
parser({ content, date }) {
const items = parseItems(content, date)
return items.map(item => ({
title: item.title,
category: item.category,
season: item.season,
episode: item.episode,
start: item.startDateTime,
stop: item.stopDateTime
}))
},
async channels() {
const content = await axios
.get('https://tv-spored.siol.net/', {
headers: {
Accept: 'text/html'
}
})
.then(r => r.data)
.catch(console.log)
const $ = cheerio.load(content)
const script = $('script:contains(tvChannelsAsJson)').text()
const func = new Function(`const self = { __next_f: [] };${script};return self.__next_f`)
const __next_f = func()
if (!__next_f[0] || !__next_f[0][1]) return []
const [, dataString] = __next_f[0][1].split(/:(.*)/s)
const data = JSON.parse(dataString)
const tvChannelsAsJson = findByKey(data, 'tvChannelsAsJson')
return tvChannelsAsJson.map(item => ({
name: item.name,
site_id: item.externalId.toLowerCase(),
lang: 'sl'
}))
}
}
function parseItems(content, date) {
try {
const $ = cheerio.load(content)
const script = $('script:contains(channelsAsJson)').text()
const func = new Function(`const self = { __next_f: [] };${script};return self.__next_f`)
const __next_f = func()
if (!__next_f[0] || !__next_f[0][1]) return []
const [, dataString] = __next_f[0][1].split(/:(.*)/s)
const data = JSON.parse(dataString)
const channelsAsJson = findByKey(data, 'channelsAsJson')
if (!channelsAsJson[0] || !Array.isArray(channelsAsJson[0].events)) return []
return channelsAsJson[0].events.filter(p => date.isSame(p.startDateTime, 'day'))
} catch {
return []
}
}
function findByKey(arr, key) {
if (!Array.isArray(arr)) return
return arr.reduce((a, item) => {
if (a) return a
if (item && item[key]) return item[key]
if (item && item.children) return findByKey(item.children, key)
if (Array.isArray(item)) return findByKey(item, key)
}, null)
}

View file

@ -0,0 +1,56 @@
const { parser, url, request } = require('./tv-spored.siol.net.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)
const date = dayjs.utc('2025-01-15', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'exodustv',
xmltv_id: 'ExodusTV.si'
}
it('can generate valid url', () => {
expect(url({ channel, date })).toBe('https://tv-spored.siol.net/kanal/exodustv/datum/20250115')
})
it('can generate request headers', () => {
expect(request.headers).toMatchObject({
Accept: 'text/html'
})
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'))
const results = parser({ content, date })
expect(results.length).toBe(41)
expect(results[0]).toMatchObject({
start: '2025-01-15T00:00:00.000Z',
stop: '2025-01-15T00:30:00.000Z',
title: 'Novice iz Svete dežele',
category: 'informativni',
season: null,
episode: null
})
expect(results[40]).toMatchObject({
start: '2025-01-15T23:00:00.000Z',
stop: '2025-01-15T23:45:00.000Z',
title: 'Sveta maša',
category: 'ostalo',
season: null,
episode: null
})
})
it('can handle empty guide', () => {
const result = parser({
date,
content: '<!DOCTYPE html><html><head></head><body></body></html>'
})
expect(result).toMatchObject([])
})

File diff suppressed because one or more lines are too long

View file

@ -1,159 +0,0 @@
{
"data": {
"duration": "1440",
"providerId": "9100001138",
"startTime": "1667088000",
"items": [
{
"channel": {
"fullName": "CBS",
"name": "CBS",
"number": null,
"sourceId": 9200018514,
"legacySourceId": 5943,
"networkName": "CBS",
"networkId": 1,
"logo": "/provider/1/4/1-685389140.png"
},
"programSchedules": [
{
"airingAttrib": 524817,
"catId": 2,
"startTime": 1667088000,
"endTime": 1667097000,
"programId": 6060455538,
"title": "NWSL Soccer Playoff",
"rating": null,
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6060455538/web"
},
{
"airingAttrib": 558098,
"catId": 5,
"startTime": 1667097000,
"endTime": 1667098800,
"programId": 6060248599,
"title": "Young Sheldon",
"rating": "TV-PG",
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6060248599/web"
},
{
"airingAttrib": 524288,
"catId": 5,
"startTime": 1667098800,
"endTime": 1667102400,
"programId": 1030182907,
"title": "Local Programming",
"rating": "TV-G",
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/1030182907/web"
},
{
"airingAttrib": 524288,
"catId": 5,
"startTime": 1667102400,
"endTime": 1667120400,
"programId": 1030182907,
"title": "Local Programming",
"rating": "TV-G",
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/1030182907/web"
},
{
"airingAttrib": 524288,
"catId": 5,
"startTime": 1667120400,
"endTime": 1667134800,
"programId": 1030182907,
"title": "Local Programming",
"rating": "TV-G",
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/1030182907/web"
},
{
"airingAttrib": 557588,
"catId": 4,
"startTime": 1667134800,
"endTime": 1667140200,
"programId": 6060613824,
"title": "CBS Sunday Morning",
"rating": "TV-PG",
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6060613824/web"
},
{
"airingAttrib": 557588,
"catId": 4,
"startTime": 1667140200,
"endTime": 1667143800,
"programId": 6060613861,
"title": "Face the Nation",
"rating": "TV-PG",
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6060613861/web"
},
{
"airingAttrib": 524288,
"catId": 5,
"startTime": 1667143800,
"endTime": 1667145600,
"programId": 1030182907,
"title": "Local Programming",
"rating": "TV-G",
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/1030182907/web"
},
{
"airingAttrib": 558097,
"catId": 2,
"startTime": 1667145600,
"endTime": 1667149200,
"programId": 6003572942,
"title": "The NFL Today",
"rating": null,
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6003572942/web"
},
{
"airingAttrib": 524817,
"catId": 2,
"startTime": 1667149200,
"endTime": 1667160000,
"programId": 6000129053,
"title": "NFL Football",
"rating": null,
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6000129053/web"
},
{
"airingAttrib": 524817,
"catId": 2,
"startTime": 1667160000,
"endTime": 1667170800,
"programId": 6000129053,
"title": "NFL Football",
"rating": null,
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6000129053/web"
},
{
"airingAttrib": 558100,
"catId": 4,
"startTime": 1667170800,
"endTime": 1667174400,
"programId": 6003572892,
"title": "60 Minutes",
"rating": "TV-PG",
"programDetails": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6003572892/web"
}
]
}
]
},
"links": {
"self": {
"href": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/9100001138/web?start=1667088000&duration=1440&channelSourceIds=9200018514"
},
"prev": {
"href": null
},
"next": {
"href": "https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/9100001138/web?start=1667088000&duration=1440&channelSourceIds=9200018514&offset=1667089440&limit=1667088000"
}
},
"meta": {
"componentName": null,
"componentDisplayName": null,
"componentType": null
}
}

View file

@ -0,0 +1 @@
{"data":{"duration":"240","providerId":"9100001138","startTime":"1736640000","items":[{"channel":{"fullName":"CBS National Schedule","name":"CBS","number":null,"sourceId":9200018514,"legacySourceId":null,"networkName":"CBS","networkId":1,"logo":"/provider/8/4/8-9200018514.png"},"programSchedules":[{"airingAttrib":524304,"catId":5,"startTime":1736643600,"endTime":1736647200,"programId":9000351140,"title":"FBI: International","rating":null,"programDetails":"https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000351140/web"},{"airingAttrib":524304,"catId":5,"startTime":1736647200,"endTime":1736650800,"programId":9000317198,"title":"FBI: Most Wanted","rating":null,"programDetails":"https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000317198/web"},{"airingAttrib":524308,"catId":5,"startTime":1736650800,"endTime":1736654400,"programId":9000415495,"title":"48 Hours","rating":null,"programDetails":"https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000415495/web"}]}]},"links":{"self":{"href":"https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1736640000&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc"},"prev":{"href":"https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1736625600&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc"},"next":{"href":"https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1736654400&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc"}},"meta":{"componentName":null,"componentDisplayName":null,"componentType":null}}

View file

@ -0,0 +1 @@
{"data":{"duration":"240","providerId":"9100001138","startTime":"1736654400","items":[{"channel":{"fullName":"CBS National Schedule","name":"CBS","number":null,"sourceId":9200018514,"legacySourceId":null,"networkName":"CBS","networkId":1,"logo":"/provider/8/4/8-9200018514.png"},"programSchedules":[{"airingAttrib":524288,"catId":5,"startTime":1736654400,"endTime":1736661600,"programId":9000000408,"title":"Local Programs","rating":null,"programDetails":"https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000000408/web"},{"airingAttrib":524288,"catId":5,"startTime":1736661600,"endTime":1736668800,"programId":9000000408,"title":"Local Programs","rating":null,"programDetails":"https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000000408/web"}]}]},"links":{"self":{"href":"https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1736654400&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc"},"prev":{"href":"https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1736640000&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc"},"next":{"href":"https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1736668800&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc"}},"meta":{"componentName":null,"componentDisplayName":null,"componentType":null}}

View file

@ -1,20 +1 @@
{
"errors": [
{
"code": 400,
"reason": "Not Found",
"message": "Bad Request"
}
],
"links": {
"self": {
"href": "https://cmg-prod.apigee.net/v1/xapi/tvschedules/tvguide/100001138/web?start=1667088000&duration=1440&channelSourceIds=9200018514"
}
},
"meta": {
"componentName": null,
"componentDisplayName": null,
"componentType": null
}
}
[]

View file

@ -1,91 +0,0 @@
{
"data": {
"item": {
"id": 6060613824,
"name": "CBS Sunday Morning",
"parentId": 1030037352,
"description": "The Backseat Lovers perform on the \"Saturday Sessions\"; and Daisy Ryan guests on \"The Dish.\" Also: comedian Fortune Feimster.",
"isSportsEvent": false,
"rating": null,
"tvRating": "TV-PG",
"episodeTitle": "10-30-2022",
"releaseYear": 2022,
"seoUrl": null,
"categoryId": 4,
"subCategoryId": 0,
"episodeAirDate": "/Date(1667088000000)/",
"episodeNumber": 248,
"seasonNumber": 40,
"mcoId": 1030037352,
"title": "CBS Sunday Morning",
"type": "show",
"slug": "cbs-sunday-morning",
"typeId": 1,
"images": [
{
"id": "1-10744155154",
"provider": "Tivo",
"imageType": {
"typeId": 1,
"typeName": "showcard",
"providerTypeName": "Vertical Showcard (3:4)"
},
"bucketType": "catalog",
"bucketPath": "/provider/1/1/1-10744155154.jpg",
"filename": "",
"width": 2160,
"height": 2880
},
{
"id": "1-10744155148",
"provider": "Tivo",
"imageType": {
"typeId": 5,
"typeName": "key art",
"providerTypeName": "Key Art"
},
"bucketType": "catalog",
"bucketPath": "/provider/1/5/1-10744155148.jpg",
"filename": "",
"width": 3000,
"height": 1688
}
],
"genres": [
{
"id": 19,
"name": "Talk & Interview",
"genres": [
"interview",
"talk"
]
},
{
"id": 99,
"name": "Other",
"genres": [
"newsmagazine",
"profile"
]
}
],
"duration": null,
"metacriticSummary": {
"url": null,
"score": 0,
"reviewCount": 0
},
"video": null
}
},
"links": {
"self": {
"href": "https://cmg-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6060613824/web"
}
},
"meta": {
"componentName": null,
"componentDisplayName": null,
"componentType": null
}
}

View file

@ -0,0 +1 @@
{"data":{"item":{"id":9000351140,"name":"FBI: International","isSportsEvent":false,"tvRating":"TV-14","categoryId":5,"subCategoryId":0,"episodeNumber":12,"mcoId":1060026058,"title":"FBI: International","type":"show","slug":"fbi-international","typeId":1,"images":[{"id":"2-da3822c4eec5e6100c9b6ff2ac667213","provider":"2","imageType":{"typeId":1,"typeName":"showcard","providerTypeName":"showcard"},"bucketType":"catalog","bucketPath":"/provider/2/13/2-da3822c4eec5e6100c9b6ff2ac667213.jpg","filename":"","width":3840,"height":2160},{"id":"2-d7bbccddf55702be0028e4c7b37d91d2","provider":"2","imageType":{"typeId":2,"typeName":"poster art","providerTypeName":"poster art"},"bucketType":"catalog","bucketPath":"/provider/2/2/2-d7bbccddf55702be0028e4c7b37d91d2.jpg","filename":"","width":1400,"height":2100}],"genres":[{"id":3,"name":"Action & Adventure","genres":["Action","Adventure"]},{"id":5,"name":"Suspense","genres":["Crime","Mystery","Thriller"]},{"id":1,"name":"Drama","genres":["Drama"]}],"metacriticSummary":null,"video":null,"parentId":1060026058,"description":"The owner of a prominent cyber security company is murdered in Copenhagen just before a massive data leak surfaces online, leading the NSA to ask the team for assistance in catching the killer and leaker before more data is revealed.","rating":"L","episodeTitle":"Gift","releaseYear":2024,"seoUrl":null,"episodeAirDate":"/Date(1715644800000)/","seasonNumber":3,"duration":null}},"links":{"self":{"href":"https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000351140/web"}},"meta":{"componentName":null,"componentDisplayName":null,"componentType":null}}

View file

@ -0,0 +1 @@
{"data":{"item":{"id":9000000408,"name":"Local Programs","isSportsEvent":false,"tvRating":"TV-14","categoryId":5,"subCategoryId":0,"episodeNumber":null,"mcoId":null,"title":null,"type":null,"slug":null,"typeId":null,"images":[],"genres":[],"metacriticSummary":null,"video":null,"parentId":null,"description":"Local programming information.","rating":"L","episodeTitle":"Local Programs","releaseYear":null,"seoUrl":null,"episodeAirDate":null,"seasonNumber":null,"duration":null}},"links":{"self":{"href":"https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000000408/web"}},"meta":{"componentName":null,"componentDisplayName":null,"componentType":null}}

View file

@ -1,89 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="tvguide.com" lang="en" xmltv_id="" site_id="9100001138#9233000035">Travel Channel (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="" site_id="9100001138#9233001847">MyNetworkTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="" site_id="9100001138#9233011874">ABC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AEEast.us" site_id="9100001138#9200004889">A&amp;E Network (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AMCEast.us" site_id="9100001138#9233011832">AMC (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AnimalPlanetEast.us" site_id="9100001138#9200018479">Animal Planet (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BBCAmericaEast.us" site_id="9100001138#9200014701">BBC America (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BETEast.us" site_id="9100001138#9233005931">Black Entertainment Television (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BravoEast.us" site_id="9100001138#9200002886">Bravo (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CartoonNetworkEast.us" site_id="9100001138#9200004848">Cartoon Network (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CBSEast.us" site_id="9100001138#9200018514">CBS</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CinemaxEast.us" site_id="9100001138#9233009829">Cinemax (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CMTEast.us" site_id="9100001138#9200012085">CMT (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CNBC.us" site_id="9100001138#9200009413">Consumer News &amp; Business Channel</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CNN.us" site_id="9100001138#9233013812">Cable News Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ComedyCentralEast.us" site_id="9100001138#9200000657">Comedy Central (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryChannelEast.us" site_id="9100001138#9233004102">The Discovery Channel (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryLife.us" site_id="9100001138#9233013857">Discovery Life Channel</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyChannelEast.us" site_id="9100001138#9200018475">The Disney Channel (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyXDEast.us" site_id="9100001138#9200004852">Disney XD (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="EEast.us" site_id="9100001138#9200012343">E! Entertainment Television (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPN2.us" site_id="9100001138#9200012351">ESPN2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPN.us" site_id="9100001138#9200006937">ESPN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPNU.us" site_id="9100001138#9233011350">ESPNU</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FanDuelTV.us" site_id="9100001138#9200012412">FanDuel TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FlixEast.us" site_id="9100001138#9233000217">Flix (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoodNetworkEast.us" site_id="9100001138#9233009448">Food Network (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxEast.us" site_id="9100001138#9233002271">FOX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxNewsChannel.us" site_id="9100001138#9233000410">Fox News Channel (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxSports1.us" site_id="9100001138#9233008440">Fox Sports 1</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FreeformEast.us" site_id="9100001138#9200006942">Freeform (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FuseEast.us" site_id="9100001138#9233000028">Fuse (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXEast.us" site_id="9100001138#9200006932">FX (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXMovieChannel.us" site_id="9100001138#9233013967">FX Movie Channel</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXXEast.us" site_id="9100001138#9200018644">FXX (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FYIEast.us" site_id="9100001138#9200020460">FYI</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GameShowNetworkEast.us" site_id="9100001138#9200019858">GSN (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GolfChannel.us" site_id="9100001138#9233005443">The Golf Channel</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HallmarkChannelEast.us" site_id="9100001138#9200016034">Hallmark Channel (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBO2East.us" site_id="9100001138#9233003524">HBO 2 (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOEast.us" site_id="9100001138#9200004886">HBO (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOSignatureEast.us" site_id="9100001138#9233008160">HBO Signature (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HGTVEast.us" site_id="9100001138#9233004104">Home &amp; Garden Television (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HistoryEast.us" site_id="9100001138#9233008002">History (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="IFCEast.us" site_id="9100001138#9200004303">IFC (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="InvestigationDiscoveryEast.us" site_id="9100001138#9200002243">Investigation Discovery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="IONTVEast.us" site_id="9100001138#9233011910">ION East Cable/Dish</channel>
<channel site="tvguide.com" lang="en" xmltv_id="LifetimeEast.us" site_id="9100001138#9200020452">Lifetime Television (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="LifetimeMoviesEast.us" site_id="9100001138#9233009825">Lifetime Movies (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="LifetimeRealWomen.us" site_id="9100001138#9233001621">Lifetime Real Women</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MagnoliaNetworkEast.us" site_id="9100001138#9200012415">Magnolia Network [East]</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MoreMaxEast.us" site_id="9100001138#9233015766">More Max (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MSNBC.us" site_id="9100001138#9233006803">msnbc</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MTVEast.us" site_id="9100001138#9200014754">MTV (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NationalGeographicEast.us" site_id="9100001138#9233002310">National Geographic Channel</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NBCEast.us" site_id="9100001138#9233009876">NBC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NewsNationEast.us" site_id="9100001138#9233013251">NewsNation SDTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NickelodeonEast.us" site_id="9100001138#9200006939">Nickelodeon (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OWNEast.us" site_id="9100001138#9200002736">The Oprah Winfrey Network (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OxygenEast.us" site_id="9100001138#9200004949">Oxygen (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ParamountNetworkEast.us" site_id="9100001138#9233013810">Paramount Network (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="PBSEast.us" site_id="9100001138#9233004141">PBS</channel>
<channel site="tvguide.com" lang="en" xmltv_id="PopEast.us" site_id="9100001138#9200020464">Pop (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="QVC.us" site_id="9100001138#9200002891">Quality Value Convenience Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Reelz.us" site_id="9100001138#9200011769">ReelzChannel</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Science.us" site_id="9100001138#9200019847">Science</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Showtime2East.us" site_id="9100001138#9200018178">Showtime 2 (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeEast.us" site_id="9100001138#9200016599">Showtime (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SmithsonianChannelEast.us" site_id="9100001138#9233002112">Smithsonian Channel (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEast.us" site_id="9100001138#9233013809">Starz (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreEast.us" site_id="9100001138#9200009649">STARZ ENCORE (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SundanceTVEast.us" site_id="9100001138#9233001687">SundanceTV (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SyfyEast.us" site_id="9100001138#9200004316">Syfy (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TBSEast.us" site_id="9100001138#9233000403">TBS Superstation (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TCMEast.us" site_id="9100001138#9200017928">Turner Classic Movies</channel>
<channel site="tvguide.com" lang="es" xmltv_id="TelemundoEast.us" site_id="9100001138#9200011857">Telemundo Network (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheCW.us" site_id="9100001138#9233011398">The CW</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheMovieChannelEast.us" site_id="9100001138#9233015305">The Movie Channel (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TLCEast.us" site_id="9100001138#9233004112">The Learning Channel (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TNTEast.us" site_id="9100001138#9233011830">Turner Network Television (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="truTVEast.us" site_id="9100001138#9200009547">truTV (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TVLandEast.us" site_id="9100001138#9233005468">TV Land (East)</channel>
<channel site="tvguide.com" lang="es" xmltv_id="UnivisionEast.us" site_id="9100001138#9200000867">Univisión Network (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="USANetworkEast.us" site_id="9100001138#9233004106">USA Network (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="VH1East.us" site_id="9100001138#9233000037">VH1 (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="WeTVEast.us" site_id="9100001138#9200018188">Women's Entertainment Network (East)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="" site_id="9200009636">Great American Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="" site_id="9233001847">MyNetworkTV National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="" site_id="9233010939">Hallmark Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="5StarMaxEast.us" site_id="9233011931">5StarMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ABCEast.us" site_id="9233011874">ABC Network Feed</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ACCNetwork.us" site_id="9200017734">ACC Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ActionMaxEast.us" site_id="9200016592">ActionMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AEEast.us" site_id="9200004889">A&amp;E</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AMCEast.us" site_id="9233011832">AMC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AmericanHeroesChannel.us" site_id="9233015768">American Heroes</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AnimalPlanetEast.us" site_id="9200018479">Animal Planet</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BBCAmericaEast.us" site_id="9200014701">BBC America</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BBCNewsNorthAmerica.uk" site_id="9200004927">BBC News</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BETEast.us" site_id="9233005931">BET</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BETHerEast.us" site_id="9200020665">BET Her</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BigTenNetwork.us" site_id="9200004533">Big Ten Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BloombergTV.us" site_id="9233015798">Bloomberg Television</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Boomerang.us" site_id="9233015844">Boomerang</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BravoEast.us" site_id="9200002886">Bravo</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CartoonNetworkEast.us" site_id="9200004848">Cartoon Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CBSEast.us" site_id="9200018514">CBS National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CBSSportsNetworkUSA.us" site_id="9233013235">CBS Sports Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CinemaxEast.us" site_id="9233009829">Cinemax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CMTEast.us" site_id="9200012085">CMT</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CNBC.us" site_id="9200009413">CNBC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CNN.us" site_id="9233013812">CNN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ComedyCentralEast.us" site_id="9200000657">Comedy Central</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CookingChannel.us" site_id="9200000016">Cooking</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CrimePlusInvestigation.us" site_id="9233003673">Crime &amp; Investigation Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CSPAN.us" site_id="9233007144">C-SPAN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DestinationAmerica.us" site_id="9200009245">Destination America</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryChannelEast.us" site_id="9233004102">Discovery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryFamily.us" site_id="9200004290">Discovery Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryLife.us" site_id="9233013857">Discovery Life</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyChannelEast.us" site_id="9200018475">Disney</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyJuniorEast.us" site_id="9233009788">Disney Junior</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyXDEast.us" site_id="9200004852">Disney XD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="EEast.us" site_id="9200012343">E!</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPN2.us" site_id="9200012351">ESPN2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPN.us" site_id="9200006937">ESPN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPNews.us" site_id="9200006950">ESPN News</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPNU.us" site_id="9233011350">ESPNU</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FanDuelTV.us" site_id="9200012412">FanDuel TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FlixEast.us" site_id="9233000217">Flix</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoodNetworkEast.us" site_id="9233009448">Food Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxBusinessNetwork.us" site_id="9200009124">Fox Business Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxEast.us" site_id="9233002271">FOX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxNewsChannel.us" site_id="9233000410">Fox News</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxSports1.us" site_id="9233008440">FOX Sports 1</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxSports2.us" site_id="9200009884">FOX Sports 2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FreeformEast.us" site_id="9200006942">Freeform</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FuseEast.us" site_id="9233011488">Fuse HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXEast.us" site_id="9200006932">FX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXMovieChannel.us" site_id="9233013967">FX Movie</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXXEast.us" site_id="9200018644">FXX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FYIEast.us" site_id="9200020460">FYI</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GameShowNetworkEast.us" site_id="9200019858">Game Show Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GolfChannel.us" site_id="9233005443">Golf</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HallmarkChannelEast.us" site_id="9200016034">Hallmark</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HallmarkMoviesMysteriesEast.us" site_id="9233013351">Hallmark Mystery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBO2East.us" site_id="9233003524">HBO 2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOComedyEast.us" site_id="9200006981">HBO Comedy</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOEast.us" site_id="9200004886">HBO</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOFamilyEast.us" site_id="9200004595">HBO Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOSignatureEast.us" site_id="9233008160">HBO Signature</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOZoneEast.us" site_id="9233009866">HBO Zone</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HGTVEast.us" site_id="9233004104">HGTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HistoryEast.us" site_id="9233008002">History</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HLN.us" site_id="9200016601">HLN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="IFCEast.us" site_id="9200004303">IFC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="InvestigationDiscoveryEast.us" site_id="9200002243">Investigation Discovery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="IONTVEast.us" site_id="9233011910">ION</channel>
<channel site="tvguide.com" lang="en" xmltv_id="LifetimeEast.us" site_id="9200020452">Lifetime</channel>
<channel site="tvguide.com" lang="en" xmltv_id="LifetimeMoviesEast.us" site_id="9233009825">LMN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="LogoEast.us" site_id="9233013354">LOGO</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MagnoliaNetworkEast.us" site_id="9200012415">MAGNOLIA Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMHD.us" site_id="9200009335">MGM+ HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMPlusDriveIn.us" site_id="9200006851">MGM+ Drive-In</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMPlusHitsEast.us" site_id="9233013634">MGM+ Hits HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMPlusMarquee.us" site_id="9200020594">MGM+ Marquee HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MLBNetwork.us" site_id="9200009223">MLB Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MoreMaxEast.us" site_id="9233015766">MoreMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MotorTrend.us" site_id="9233003479">Motor Trend Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MovieMaxEast.us" site_id="9233000532">MovieMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MSNBC.us" site_id="9233006803">MSNBC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MTV2East.us" site_id="9200000872">MTV2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MTVEast.us" site_id="9200014754">MTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NationalGeographicEast.us" site_id="9233002310">National Geographic</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NationalGeographicWildEast.us" site_id="9200004683">National Geographic Wild</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NBATV.us" site_id="9200000070">NBA TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NBCEast.us" site_id="9233009876">NBC National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NewsNationEast.us" site_id="9233013251">NewsNation</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NFLNetwork.us" site_id="9200004330">NFL Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NHLNetwork.us" site_id="9233009455">NHL Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NickelodeonEast.us" site_id="9200006939">Nickelodeon</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NickJrEast.us" site_id="9233007153">Nick Jr.</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NicktoonsEast.us" site_id="9200020469">Nicktoons</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OutdoorChannel.us" site_id="9233003538">Outdoor</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OuterMaxEast.us" site_id="9200014841">OuterMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Ovation.us" site_id="9233011240">Ovation</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OWNEast.us" site_id="9200002736">OWN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OxygenEast.us" site_id="9200004949">Oxygen</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ParamountNetworkEast.us" site_id="9233013810">Paramount Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="PBSEast.us" site_id="9233004141">PBS HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="PopEast.us" site_id="9200020464">Pop Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Reelz.us" site_id="9200011769">Reelz</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Science.us" site_id="9200019847">Science</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SECNetwork.us" site_id="9233008517">SEC Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Showtime2East.us" site_id="9200018178">SHOWTIME 2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeEast.us" site_id="9200016599">Paramount+ with Showtime</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeExtremeEast.us" site_id="9200004879">SHOWTIME EXTREME</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeFamilyZoneEast.us" site_id="9200000968">SHOWTIME FAMILY ZONE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeNextEast.us" site_id="9200016686">SHOWTIME NEXT</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeShowcaseEast.us" site_id="9233003805">SHOWTIME SHOWCASE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeWomenEast.us" site_id="9200002975">SHOWTIME WOMEN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShoxBetEast.us" site_id="9233017018">SHOxBET</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SmithsonianChannelEast.us" site_id="9233002112">Smithsonian</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzCinemaEast.us" site_id="9233008357">STARZ Cinema</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzComedyEast.us" site_id="9233003558">STARZ Comedy</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEast.us" site_id="9233013809">STARZ</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEdgeEast.us" site_id="9233011247">STARZ Edge</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreActionEast.us" site_id="9233005667">STARZ ENCORE Action</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreBlackEast.us" site_id="9200001097">STARZ ENCORE Black</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreClassicEast.us" site_id="9200003144">STARZ ENCORE Classic</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreEast.us" site_id="9200009649">STARZ ENCORE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreFamilyEast.us" site_id="9200011867">STARZ ENCORE Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreSuspenseEast.us" site_id="9200011866">STARZ ENCORE Suspense</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreWesternsEast.us" site_id="9233008131">STARZ ENCORE Westerns</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzInBlackEast.us" site_id="9200011898">STARZ InBlack</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzKidsFamilyEast.us" site_id="9200006977">STARZ Kids &amp; Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SundanceTVEast.us" site_id="9233001687">Sundance TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SyfyEast.us" site_id="9200004316">Syfy</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TBSEast.us" site_id="9233000403">tbs</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TCMEast.us" site_id="9200017928">Turner Classic Movies</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TeenNickEast.us" site_id="9200006974">TeenNick</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TelemundoEast.us" site_id="9200011927">Telemundo</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TennisChannel.us" site_id="9200017917">The Tennis</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheCW.us" site_id="9233011398">CW Network National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheMovieChannelEast.us" site_id="9233015305">The Movie</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheMovieChannelXtraEast.us" site_id="9233011536">The Movie Xtra</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheWeatherChannel.us" site_id="9233013815">The Weather</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ThrillerMaxEast.us" site_id="9200000856">ThrillerMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TLCEast.us" site_id="9233004112">TLC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TNTEast.us" site_id="9233011830">TNT</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TravelChannelEast.us" site_id="9233000035">Travel</channel>
<channel site="tvguide.com" lang="en" xmltv_id="truTVEast.us" site_id="9200009547">truTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TVLandEast.us" site_id="9233005468">TV Land</channel>
<channel site="tvguide.com" lang="en" xmltv_id="UniversalKidsEast.us" site_id="9233003660">Universal Kids</channel>
<channel site="tvguide.com" lang="en" xmltv_id="USANetworkEast.us" site_id="9233004106">USA</channel>
<channel site="tvguide.com" lang="en" xmltv_id="VH1East.us" site_id="9233000037">VH1</channel>
<channel site="tvguide.com" lang="en" xmltv_id="VICETV.us" site_id="9233002242">VICE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="WeTVEast.us" site_id="9200018188">WE tv</channel>
<channel site="tvguide.com" lang="es" xmltv_id="UnivisionEast.us" site_id="9200000867">Univision</channel>
</channels>

View file

@ -2,97 +2,113 @@ const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const doFetch = require('@ntlab/sfetch')
const debug = require('debug')('site:tvguide.com')
dayjs.extend(utc)
dayjs.extend(timezone)
doFetch.setDebugger(debug).setCheckResult(false)
const providerId = '9100001138'
const maxDuration = 240
const segments = 1440 / maxDuration
module.exports = {
site: 'tvguide.com',
days: 2,
url: function ({ date, channel }) {
const [providerId, channelSourceIds] = channel.site_id.split('#')
const url = `https://internal-prod.apigee.fandom.net/v1/xapi/tvschedules/tvguide/${providerId}/web?start=${date
.startOf('d')
.unix()}&duration=1440&channelSourceIds=${channelSourceIds}`
return url
request: {
cache: {
ttl: 24 * 60 * 60 * 1000 // 1 day
}
},
async parser({ content }) {
async url({ date, segment = 1 }) {
const params = []
if (module.exports.apiKey === undefined) {
module.exports.apiKey = await module.exports.fetchApiKey()
debug('Got api key', module.exports.apiKey)
}
if (date) {
if (segment > 1) {
date = date.add((segment - 1) * maxDuration, 'm')
}
params.push(`start=${date.unix()}`, `duration=${maxDuration}`)
}
params.push(`apiKey=${module.exports.apiKey}`)
return date ?
`https://backend.tvguide.com/tvschedules/tvguide/${providerId}/web?${params.join('&')}` :
`https://backend.tvguide.com/tvschedules/tvguide/serviceprovider/${providerId}/sources/web?${params.join('&')}`
},
async parser({ content, date, channel }) {
const programs = []
const items = parseItems(content)
for (let item of items) {
const details = await loadProgramDetails(item)
const f = data => {
const result = []
if (typeof data === 'string') {
data = JSON.parse(data)
}
if (data && Array.isArray(data?.data?.items)) {
data.data.items
.filter(i => i.channel.sourceId.toString() === channel.site_id)
.forEach(i => {
result.push(...i.programSchedules.map(p => {
return { i: p, url: p.programDetails }
}))
})
}
return result
}
const queues = f(content)
if (queues.length) {
const parts = []
for (let i = 2; i <= segments; i++) {
parts.push(await module.exports.url({ date, segment: i }))
}
await doFetch(parts, (url, res) => {
queues.push(...f(res))
})
await doFetch(queues, (queue, res) => {
const item = res?.data?.item ? res.data.item : queue.i
programs.push({
title: item.title,
sub_title: details.episodeTitle,
description: details.description,
season: details.seasonNumber,
episode: details.episodeNumber,
rating: parseRating(item),
categories: parseCategories(details),
start: parseTime(item.startTime),
stop: parseTime(item.endTime)
title: item.title ? item.title : queue.i.title,
sub_title: item.episodeNumber ? item.episodeTitle : null,
description: item.description,
season: item.seasonNumber,
episode: item.episodeNumber,
rating: item.rating ? { system: 'MPA', value: item.rating } : null,
categories: Array.isArray(item.genres) ? item.genres.map(g => g.name) : null,
start: dayjs.unix(item.startTime ? item.startTime : queue.i.startTime),
stop: dayjs.unix(item.endTime ? item.endTime : queue.i.endTime)
})
})
}
return programs
},
async channels() {
const providers = [9100001138]
let channels = []
for (let providerId of providers) {
const channels = []
const data = await axios
.get(
`https://internal-prod.apigee.fandom.net/v1/xapi/tvschedules/tvguide/serviceprovider/${providerId}/sources/web`
)
.get(await this.url({}))
.then(r => r.data)
.catch(console.log)
.catch(console.error)
data.data.items.forEach(item => {
channels.push({
lang: 'en',
site_id: `${providerId}#${item.sourceId}`,
name: item.fullName
site_id: item.sourceId,
name: item.fullName.replace(/Channel|Schedule/g, '').trim()
})
})
}
return channels
}
}
function parseRating(item) {
return item.rating ? { system: 'MPA', value: item.rating } : null
}
function parseCategories(details) {
return Array.isArray(details.genres) ? details.genres.map(g => g.name) : []
}
function parseTime(timestamp) {
return dayjs.unix(timestamp)
}
function parseItems(content) {
const data = JSON.parse(content)
if (!data.data || !Array.isArray(data.data.items) || !data.data.items.length) return []
return data.data.items[0].programSchedules
}
async function loadProgramDetails(item) {
item.programDetails = item.programDetails.replace(
'player1-backend-prod-internal.apigee.net',
'internal-prod.apigee.fandom.net'
)
},
async fetchApiKey() {
const data = await axios
.get(item.programDetails)
.get('https://www.tvguide.com/listings/')
.then(r => r.data)
.catch(err => {
console.log(err.message)
})
if (!data || !data.data || !data.data.item) return {}
.catch(console.error)
return data.data.item
return data ? data.match(/apiKey=([a-zA-Z0-9]+)&/)[1] : null
}
}

View file

@ -5,59 +5,82 @@ const axios = require('axios')
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-10-30', 'YYYY-MM-DD').startOf('d')
const date = dayjs.utc('2025-01-12', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '9100001138#9200018514',
site_id: '9200018514',
xmltv_id: 'CBSEast.us'
}
it('can generate valid url', () => {
expect(url({ date, channel })).toBe(
'https://internal-prod.apigee.fandom.net/v1/xapi/tvschedules/tvguide/9100001138/web?start=1667088000&duration=1440&channelSourceIds=9200018514'
axios.get.mockImplementation(url => {
const result = {}
const urls = {
'https://www.tvguide.com/listings/':
'content.html',
'https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1736640000&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc':
'content1.json',
'https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1736654400&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc':
'content2.json',
'https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000351140/web':
'program1.json',
'https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000000408/web':
'program2.json',
}
if (urls[url] !== undefined) {
result.data = fs.readFileSync(path.join(__dirname, '__data__', urls[url])).toString()
if (!urls[url].startsWith('content1') && !urls[url].endsWith('.html')) {
result.data = JSON.parse(result.data)
}
}
return Promise.resolve(result)
})
it('can generate valid url', async () => {
expect(await url({ date })).toBe(
'https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1736640000&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc'
)
})
it('can parse response', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
axios.get.mockImplementation(url => {
if (
url ===
'https://fandom-prod.apigee.net/v1/xapi/tvschedules/tvguide/programdetails/6060613824/web'
) {
return Promise.resolve({
data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program.json')))
})
} else {
return Promise.resolve({ data: '' })
}
})
let results = await parser({ content, channel, date })
results = results.map(p => {
const content = fs.readFileSync(path.join(__dirname, '__data__', 'content1.json')).toString()
const results = (await parser({ content, channel, date })).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[5]).toMatchObject({
start: '2022-10-30T13:00:00.000Z',
stop: '2022-10-30T14:30:00.000Z',
title: 'CBS Sunday Morning',
sub_title: '10-30-2022',
expect(results.length).toBe(5)
expect(results[0]).toMatchObject({
start: '2025-01-12T01:00:00.000Z',
stop: '2025-01-12T02:00:00.000Z',
title: 'FBI: International',
sub_title: 'Gift',
description:
'The Backseat Lovers perform on the "Saturday Sessions"; and Daisy Ryan guests on "The Dish." Also: comedian Fortune Feimster.',
categories: ['Talk & Interview', 'Other'],
season: 40,
episode: 248,
'The owner of a prominent cyber security company is murdered in Copenhagen just before a massive data leak surfaces online, leading the NSA to ask the team for assistance in catching the killer and leaker before more data is revealed.',
categories: ['Action & Adventure', 'Suspense', 'Drama'],
season: 3,
episode: 12,
rating: {
system: 'MPA',
value: 'TV-PG'
value: 'L'
}
})
expect(results[4]).toMatchObject({
start: '2025-01-12T06:00:00.000Z',
stop: '2025-01-12T08:00:00.000Z',
title: 'Local Programs',
description:
'Local programming information.',
categories: [],
rating: {
system: 'MPA',
value: 'L'
}
})
})
@ -66,7 +89,7 @@ it('can handle empty guide', async () => {
const results = await parser({
date,
channel,
content: fs.readFileSync(path.resolve(__dirname, '__data__/no-content.json'))
content: fs.readFileSync(path.join(__dirname, '__data__', 'no-content.json')).toString()
})
expect(results).toMatchObject([])
})

File diff suppressed because it is too large Load diff

View file

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

View file

@ -0,0 +1,191 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="3SAT">3Sat</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="360TUNEBOX">360TuneBox</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ALJAZEERA">Al Jazeera</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="AMC">AMC</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ANIMALPLANETHD">Animal Planet HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="APOSTOL_TV">Apostol TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ARD">ARD1</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ARENA4">Aréna4</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ARTE">Arte</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ATV">ATV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ATVSPIRIT">ATV SPIRIT</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="AXN">AXN</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="BABYFIRST">Babyfirst</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="BABYTV">Baby TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="BALATONTV">Balaton TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="BBCEARTH">BBC Earth</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="BONUMTV">Bonum TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="BRAZZERSTVEUROPE">Brazzers TV Europe</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="CARTOON">Cartoon Network</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="CARTOONITO">Cartoonito</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="CINEMAX">Cinemax</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="CINEMAX2">Cinemax 2</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="CLASSICA">Stingray Classica</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="CLUBMTV">Club MTV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="CMUSIC">Stingray CMusic</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="CNN">CNN</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="COMEDY">Comedy Central</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="COOL">Cool TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="CRIME_INVESTIGATION">Crime + Investigation</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="D1">D1</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DAVINCILEARNING">Da Vinci Tv</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DEUTSCHEWELLE">Deutsche Welle</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DIKHTV">Dikh TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DISCOVERYCHANNEL">Discovery Channel</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DISCOVERYID">ID: Investigation Discovery</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DISNEY">Disney Channel</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DOCUBOX">Docubox</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DUCKTV">Duck Tv</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DUNA">Duna TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="DUNAWORLD">Duna World</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ENGLISH_CLUB_TV">English Club TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="EPICDRAMA">Epic Drama</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="EROX">Eroxxx HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="EURONEWS">Euronews</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="EUROSPORT">Eurosport HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="EUROSPORT2">Eurosport 2 HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="EUROSPORT4K">Eurosport 4K</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="EXTREMESPORTS">Extreme Sports</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FASHIONBOX">Fashionbox</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FH">Fishing and Hunting Channel</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FIGHTBOX">FightBox</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILM4">Film4</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILMBOX">Filmbox</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILMBOXARTHOUSE">Filmbox Arthouse</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILMBOXFAMILY">Filmbox Family</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILMBOXHD">Filmbox Extra HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILMBOXPREMIUM">FilmBox Prémium</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILMBOXSTARS">FilmBox Stars</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILMCAFE">Film Café</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILMMANIA">Film Mánia</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FILMPLUSSZ">Film+</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FITHD">Fit HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FOODNETWORK">Food Network</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FTV">Fashion TV Europe</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FTVHD">FTV HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="FUNBOX">FunBox UHD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="GALAXY4">Galaxy4</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="GAMETOON">Gametoon</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="GINX">Ginx</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HATOSCSATORNA">Hatos csatorna</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HBO">HBO</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HBO2">HBO 2</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HBO3">HBO 3</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HETITV">Heti Tv</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HGTV">HGTV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HIRTV">HIR TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HISTORY2">History2</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HRT1">HRT-1</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HRT2">HRT-2</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="HUSTLERTV">Hustler TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ICONCERT">Stingray iConcerts</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="IZAURATV">Izaura TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="JAZZTV">JazzTV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="JIMJAM">JimJam</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="JOCKYTV">Jocky TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="KIKA">Kika</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="KOLYOKKLUB">Kölyökklub</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="LIFETV">LifeTv</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="LOVE_NATURE">Love Nature</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="M1HD">m1 HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="M2HD">m2 HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="M4">m4</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="M4_SPORT_PLUSZ">m4sport+</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="M5">m5</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MAGYARMOZITV">Magyar Mozi TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MATCH4">Match 4</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MAX4">Max4</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MEZZO">MEZZO</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MEZZOHD">MEZZOHD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MINIMAX">Minimax</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MOTORVISIONHD">Motorvision TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MOZIKLUB">Moziklub</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MOZIPLUSZ">Mozi+</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MOZIVERZUM">Moziverzum</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MR1KOSSUTH">MR1-Kossuth</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MR2PETOFI">MR2-Petőfi</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MR3BARTOK">MR3-Bartók</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MR4NEMZETISEGI">MR4-Nemzetiségi</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MR6DANKO">MR6-Dankó</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MTV00S">MTV 00&apos;s</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MTV80S">MTV 80&apos;s</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MTV90S">MTV 90&apos;s</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MTVEURO">MTV Euro</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MTVHITS">MTV Hits</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MTVHUNGARY">MTV Hungary</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MTVLIVEHD">MTV Live HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="MUZSIKA">Muzsika TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="NATGEOHD">National Geographic HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="NATIONALGEOGRAPHIC">National Geographic</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="NATIONALGEOWILD">National Geographic Wild</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="NATIONALGEOWILDHD">National Geographic Wild HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="NAUTICALCHANNEL">Nautical Channel HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="NICK_JR">Nick Jr.</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="NICKELODEON">Nickelodeon</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="NICKMUSIC">Nickmusic</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="NICKTOONS">Nicktoons</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ORF1">ORF1</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ORF2">ORF2</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="OZONETV">OzoneTv</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="PARAMOUNT_NETWORK">Paramount Network</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="PAXTV">Pax TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="PLAYBOYTV">Playboy TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="PRIME">Prime</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="PRIVATETV">Private TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="PRO7">PRO 7</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="RAIUNO">Rai 1</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="REDLIGHTHD">Redlight HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="RTL">RTL</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="RTL2_DE">RTL2 DE</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="RTL_DE">RTL DE</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="RTL_HAROM">RTL HÁROM</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="RTL_KETTO">RTL KETTŐ</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="RTLGOLD">RTL GOLD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="RTLOTTHON">RTL OTTHON</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SAT1">SAT 1</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SLAGERTV">Sláger TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SMILEOFACHILD">Smile of a Child</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SOROZATKLUB">SorozatKlub</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SOROZATPLUSSZ">Sorozat+</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SPEKTRUM">Spektrum</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SPEKTRUMHD">Spektrum HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SPEKTRUMHOME">Spektrum Home</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SPILER1TV">Spíler1 TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SPILER2TV">Spíler2 TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SPORT1">Sport1</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SPORT2">Sport2</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="STORY4">Story4</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SUPERONEHD">Superone HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SUPERRTL">Super Rtl</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="SUPERTV2">Super TV2</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TEENNICK">TeenNick</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TELEPAKS">Telepaks</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="THEHISTORYCHANNEL">History Channel</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="THEHISTORYCHANNELHD">The History HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TLC">TLC</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TOLNATAJTV">Tolnatáj TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TRAVELCHANNELHD">Travel Channel HD</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TRAVELXP">TravelXP</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TV2">TV2</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TV2_KIDS">TV2 Kids</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TV2COMEDY">TV2 Comedy</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TV2KLUB">TV2 Klub</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TV2SEF">TV2 Séf</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TV4">TV4</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TV5MONDE">TV5</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TVE">TVE</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="TVPAPRIKA">TV Paprika</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="VIASAT2">Viasat 2</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="VIASAT3">Viasat 3</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="VIASAT6">Viasat 6</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="VIASAT_FILM">Viasat Film</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="VIASATEXPLORE">Viasat Explore</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="VIASATHISTORY">Viasat History</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="VIASATNATURE">Viasat Nature</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="VOX">Vox</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ZDF">ZDF</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ZEGTV">Zeg TV</channel>
<channel site="tvmustra.hu" lang="hu" xmltv_id="" site_id="ZENEBUTIK">Zenebutik</channel>
</channels>

View file

@ -0,0 +1,78 @@
const cheerio = require('cheerio')
const axios = require('axios')
const { DateTime } = require('luxon')
module.exports = {
site: 'tvmustra.hu',
days: 2,
url({ channel, date }) {
return `https://www.tvmustra.hu/tvmusor/${channel.site_id}/${date.format('YYYY-MM-DD')}`
},
parser({ content, date }) {
const programs = []
const items = parseItems(content)
items.forEach(item => {
const prev = programs[programs.length - 1]
const $item = cheerio.load(item)
let start = parseStart($item, date)
if (!start) return
if (prev) {
if (start < prev.start) {
start = start.plus({ days: 1 })
date = date.add(1, 'd')
}
prev.stop = start
}
const stop = start.plus({ minute: 30 })
programs.push({
title: parseTitle($item),
start,
stop
})
})
return programs
},
async channels() {
const html = await axios
.get('https://www.tvmustra.hu/')
.then(r => r.data)
.catch(console.log)
const $ = cheerio.load(html)
const items = $('.channel-selector option').toArray()
const channels = []
items.forEach(item => {
const name = $(item).text().trim()
const site_id = $(item).attr('value').trim()
if (!site_id) return
channels.push({
lang: 'hu',
site_id,
name
})
})
return channels
}
}
function parseTitle($item) {
return $item('.musor_lista_cim, .musor_lista_cim2').text().trim()
}
function parseStart($item, date) {
const time = $item('.musor_lista_idopont, .musor_lista_idopont2').text().trim()
return DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${time}`, 'yyyy-MM-dd HH:mm', {
zone: 'Europe/Budapest'
}).toUTC()
}
function parseItems(content) {
const $ = cheerio.load(content)
return $('#epg-container > div:nth-child(4) > div.col-6_sor3 > div.showtime').toArray()
}

View file

@ -0,0 +1,47 @@
const { parser, url } = require('./tvmustra.hu.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)
const date = dayjs.utc('2025-01-17', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'M1HD',
xmltv_id: 'M1HD.hu'
}
it('can generate valid url', () => {
expect(url({ channel, date })).toBe('https://www.tvmustra.hu/tvmusor/M1HD/2025-01-17')
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'))
const results = parser({ content, date }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results.length).toBe(98)
expect(results[0]).toMatchObject({
start: '2025-01-17T05:00:00.000Z',
stop: '2025-01-17T05:30:00.000Z',
title: 'HÍRADÓ'
})
expect(results[97]).toMatchObject({
start: '2025-01-18T04:00:00.000Z',
stop: '2025-01-18T04:30:00.000Z',
title: 'Ma éjszaka'
})
})
it('can handle empty guide', () => {
const results = parser({
date,
content: ''
})
expect(results).toMatchObject([])
})