-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Pesquisa por canal
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/sites/nos.pt/__data__/no_content.html b/sites/nos.pt/__data__/no_content.html
deleted file mode 100644
index 63607bce..00000000
--- a/sites/nos.pt/__data__/no_content.html
+++ /dev/null
@@ -1,2988 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Pesquisa por canal
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/sites/nos.pt/__data__/program_0.json b/sites/nos.pt/__data__/program_0.json
deleted file mode 100644
index 089070ee..00000000
--- a/sites/nos.pt/__data__/program_0.json
+++ /dev/null
@@ -1 +0,0 @@
-{"d":"Anatomia de Grey T.17 Ep.3_#|$_Os mÃĐdicos do Grey Sloan continuam a enfrentar a nova realidade do COVID-19 e lidam com um paciente conhecido e teimoso. Koracick fica encarregue dos internos e Link opera um terapeuta sexual._#|$_b6fd27f4bd0b404abd4c3fc4faa79024_resized_352x198.jpg_#|$_undefined_#|$_undefined_#|$_RTP 1_#|$_2023-01-27T23:50:00+00:00_#|$_2023-01-28T00:36:00+00:00_#|$_false"}
\ No newline at end of file
diff --git a/sites/nos.pt/__data__/program_21.json b/sites/nos.pt/__data__/program_21.json
deleted file mode 100644
index 06584a0e..00000000
--- a/sites/nos.pt/__data__/program_21.json
+++ /dev/null
@@ -1 +0,0 @@
-{"d":"MasterChef Portugal T.1 Ep.10_#|$_A maior competiçÃĢo de cozinha do mundo arranca ao comando de trÊs dos mais conceituados chefs portugueses: Pedro Pena Bastos, NoÃĐlia JerÃģnimo e Ricardo Costa, que nos vÃĢo transmitir os seus conhecimentos e a sua paixÃĢo pela cozinha._#|$_8aa511d697f0401a88a0cb1ec2718cc3_resized_352x198.jpg_#|$_undefined_#|$_undefined_#|$_RTP 1_#|$_2023-01-28T21:38:00+00:00_#|$_2023-01-29T00:05:00+00:00_#|$_false"}
\ No newline at end of file
diff --git a/sites/nos.pt/nos.pt.channels.xml b/sites/nos.pt/nos.pt.channels.xml
deleted file mode 100644
index 6a63fd55..00000000
--- a/sites/nos.pt/nos.pt.channels.xml
+++ /dev/null
@@ -1,207 +0,0 @@
-
-
- Eurosport 1
- Record TV
- RTP Açores
- Al Jazeera
- PFC
- BNT World
- Eurosport 2
- Caça e Pesca
- E! Entertainment
- RTP 1 HD
- CançÃĢo Nova
- MAX
- SET Asia
- Eurosport 1 HD
- AXN HD
- AXN White
- TVE 24h
- FOX HD
- FOX Life HD
- Toros TV HD
- ACOLH
- Syfy HD
- E! Entertainment HD
- HOT HD
- TLC
- BTV1 HD
- BTV1
- CNN
- RTP Ãfrica
- TeleSUR
- STV NotÃcias
- Canal de Teste
- Record TV HD
- Penthouse HD1
- Sky News
- AtivaçÃĢo NOS
- RTL
- ARTE
- AMC HD
- SPORT TV+ HD
- SIC HD
- SIC NotÃcias HD
- CMTV HD
- Globo HD
- Sport TV NBA
- FTV HD
- ARD
- VIVA Germany
- DSF
- AMC Break HD
- FTV
- Rai Italia
- SIC K HD
- RTP 2 HD
- TVI HD
- RTP 3 HD
- Eurosport 2 HD
- Canal 11 HD
- Zee TV
- AzoresTV by VITEC â TESTE
- Canal 180
- Canal Galeria
- RTP Açores HD
- Canal Galeria
- RTP MemÃģria
- Em Destaque
- UnifÃĐ TV
- Playboy HD
- Travel Channel HD
- AXN White HD
- AMC Break
- 1+1
- 24Kitchen HD
- 3SAT
- Afro Music Channel
- AMC Crime
- AMC
- ARTV
- AXN Movies
- AXN
- Baby TV
- Biggs
- Bloomberg
- BVN
- Canal 11 HD
- Canal Hollywood
- Canal NOS HD
- Canal Panda
- Canal Q
- Cartoon Network HD
- Casa e Cozinha HD
- CCTV 4
- CGTN
- CMTV
- CNBC
- CNN Portugal
- CubavisiÃģn Internacional
- Discovery Channel
- Disney Channel HD
- Disney Junior
- DOGTV
- DW (AlemÃĢo)
- DW
- Eleven 1
- Eleven 2
- Eleven 3
- Eleven 4
- Eleven 5
- Eleven 6
- Euronews
- Fight Network HD
- Food Network HD
- FOX Comedy
- FOX Crime
- FOX Life
- FOX Movies
- FOX
- France 24 (I)
- France 24 (F)
- Fuel TV
- TV Galicia
- Globo Now HD
- Globo
- Canal HistÃģria
- Horse TV
- HOT Man
- HOT Taboo
- HOT
- ID Investigation Discovery
- KBS World HD
- KiKa
- Kuriakos TV
- LocalvisÃĢo TV HD
- M6
- MCM Pop
- MCM Top
- Mezzo
- Mezzo Live HD
- Motorvision HD
- MTV 00s
- MTV Live
- MTV Portugal
- MyZen TV
- National Geographic
- National Geographic WILD
- Nautical Channel
- NHK World TV
- Nickelodeon
- Nickelodeon Ukraine Pluto TV
- Nick Jr.
- NOS Studios
- Odisseia
- Panda KIDS
- Phoenix CNE
- Phoenix Infonews
- Porto Canal
- ProSieben
- Record News
- Russia Today
- RTP 1
- RTP 2
- RTP 3
- RTP Madeira
- RTP MemÃģria
- RTR Planeta
- SAT 1
- Sextreme
- SIC
- SIC Caras
- SIC K
- SIC Mulher
- SIC NotÃcias
- SIC Radical
- S+ HD
- Sporting TV
- SPORT TV1
- SPORT TV2
- SPORT TV3
- SPORT TV4
- SPORT TV5
- Sport TV 6 HD
- SPORT TV+
- Stingray iConcerts HD
- Super RTL
- SYFY
- TCV Internacional
- TPA Internacional
- Trace Toca
- Trace Urban HD
- Travel Channel
- TV5 Monde
- TVCine ACTION
- TVCine EDITION
- TVCine EMOTION
- TVCine TOP
- TVEi
- TVI
- TVI FicçÃĢo HD
- TVI Reality
- TVR Internacional
- Venus
- ZAP Viva HD
- ZDF
- ZDF Neo
-
diff --git a/sites/nos.pt/nos.pt.config.js b/sites/nos.pt/nos.pt.config.js
deleted file mode 100644
index 14a5a902..00000000
--- a/sites/nos.pt/nos.pt.config.js
+++ /dev/null
@@ -1,114 +0,0 @@
-const axios = require('axios')
-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: 'nos.pt',
- days: 2,
- url({ channel }) {
- return `https://www.nos.pt/particulares/televisao/guia-tv/Pages/channel.aspx?channel=${channel.site_id}`
- },
- async parser({ content, date }) {
- const programs = []
- const items = parseItems(content, date)
- date = date.subtract(1, 'd')
- for (let item of items) {
- const $item = cheerio.load(item)
-
- const channelAcronym = parseChannelAcronym(content)
- const programId = parseProgramId($item)
- const details = await loadProgramDetails(channelAcronym, programId)
-
- programs.push({
- title: details.title,
- description: details.description,
- icon: parseIcon(details),
- start: dayjs(details.start),
- stop: dayjs(details.stop)
- })
- }
-
- return programs
- },
- async channels() {
- const html = await axios
- .get('https://www.nos.pt/particulares/televisao/guia-tv/Pages/default.aspx')
- .then(r => r.data)
- .catch(console.log)
-
- const $ = cheerio.load(html)
- const items = $('#guide-filters > dl.dropdown-ord > dd > ul > li').toArray()
-
- return items.map(item => {
- const $item = cheerio.load(item)
-
- return {
- lang: 'pt',
- site_id: $item('.value').text().trim(),
- name: $item('a').clone().children().remove().end().text().trim()
- }
- })
- }
-}
-
-async function loadProgramDetails(channelAcronym, programId) {
- if (!channelAcronym || !programId) return {}
- const data = await axios
- .post(
- 'https://www.nos.pt/_layouts/15/Armstrong/ApplicationPages/EPGGetProgramsAndDetails.aspx/GetProgramDetails',
- {
- programId,
- channelAcronym,
- hour: 'undefined',
- startHour: 'undefined',
- endHour: 'undefined'
- },
- {
- headers: {
- 'content-type': 'application/json; charset=UTF-8'
- }
- }
- )
- .then(r => r.data)
- .catch(console.log)
-
- if (!data) return {}
-
- const [title, description, image, , , , start, stop] = data.d.split('_#|$_')
-
- return {
- title,
- description,
- image,
- start,
- stop
- }
-}
-
-function parseIcon(details) {
- return details.image ? `https://images.nos.pt/${details.image}` : null
-}
-
-function parseProgramId($item) {
- return $item('a').attr('id')
-}
-
-function parseChannelAcronym(content) {
- const $ = cheerio.load(content)
-
- return $('#channel-logo > img').attr('alt')
-}
-
-function parseItems(content, date) {
- const day = date.date()
- const $ = cheerio.load(content)
-
- return $(`#day${day} > ul > li`).toArray()
-}
diff --git a/sites/nos.pt/nos.pt.test.js b/sites/nos.pt/nos.pt.test.js
deleted file mode 100644
index c5f7d7c4..00000000
--- a/sites/nos.pt/nos.pt.test.js
+++ /dev/null
@@ -1,97 +0,0 @@
-const { parser, url } = require('./nos.pt.config.js')
-const fs = require('fs')
-const path = require('path')
-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('2023-01-28', 'YYYY-MM-DD').startOf('d')
-const channel = {
- site_id: '5',
- xmltv_id: 'RTP1.pt'
-}
-
-it('can generate valid url', () => {
- expect(url({ channel })).toBe(
- 'https://www.nos.pt/particulares/televisao/guia-tv/Pages/channel.aspx?channel=5'
- )
-})
-
-it('can parse response', async () => {
- const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'), 'utf8')
-
- axios.post.mockImplementation((url, data) => {
- if (
- url ===
- 'https://www.nos.pt/_layouts/15/Armstrong/ApplicationPages/EPGGetProgramsAndDetails.aspx/GetProgramDetails' &&
- JSON.stringify(data) ===
- JSON.stringify({
- programId: '81361',
- channelAcronym: 'RTP1',
- hour: 'undefined',
- startHour: 'undefined',
- endHour: 'undefined'
- })
- ) {
- return Promise.resolve({
- data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program_0.json')))
- })
- } else if (
- url ===
- 'https://www.nos.pt/_layouts/15/Armstrong/ApplicationPages/EPGGetProgramsAndDetails.aspx/GetProgramDetails' &&
- JSON.stringify(data) ===
- JSON.stringify({
- programId: '81382',
- channelAcronym: 'RTP1',
- hour: 'undefined',
- startHour: 'undefined',
- endHour: 'undefined'
- })
- ) {
- return Promise.resolve({
- data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program_21.json')))
- })
- } else {
- return Promise.resolve({ data: '' })
- }
- })
-
- let results = await parser({ content, date })
- results = results.map(p => {
- p.start = p.start.toJSON()
- p.stop = p.stop.toJSON()
- return p
- })
-
- expect(results[0]).toMatchObject({
- start: '2023-01-27T23:50:00.000Z',
- stop: '2023-01-28T00:36:00.000Z',
- title: 'Anatomia de Grey T.17 Ep.3',
- description:
- 'Os mÃĐdicos do Grey Sloan continuam a enfrentar a nova realidade do COVID-19 e lidam com um paciente conhecido e teimoso. Koracick fica encarregue dos internos e Link opera um terapeuta sexual.',
- icon: 'https://images.nos.pt/b6fd27f4bd0b404abd4c3fc4faa79024_resized_352x198.jpg'
- })
-
- expect(results[21]).toMatchObject({
- start: '2023-01-28T21:38:00.000Z',
- stop: '2023-01-29T00:05:00.000Z',
- title: 'MasterChef Portugal T.1 Ep.10',
- description:
- 'A maior competiçÃĢo de cozinha do mundo arranca ao comando de trÊs dos mais conceituados chefs portugueses: Pedro Pena Bastos, NoÃĐlia JerÃģnimo e Ricardo Costa, que nos vÃĢo transmitir os seus conhecimentos e a sua paixÃĢo pela cozinha.',
- icon: 'https://images.nos.pt/8aa511d697f0401a88a0cb1ec2718cc3_resized_352x198.jpg'
- })
-})
-
-it('can handle empty guide', async () => {
- const results = await parser({
- date,
- content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'), 'utf8')
- })
-
- expect(results).toMatchObject([])
-})
diff --git a/sites/nos.pt/readme.md b/sites/nos.pt/readme.md
deleted file mode 100644
index 81f3490a..00000000
--- a/sites/nos.pt/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# nos.pt
-
-https://nostv.pt/guia/
-
-### Download the guide
-
-```sh
-npm run grab -- --site=nos.pt
-```
-
-### Update channel list
-
-```sh
-npm run channels:parse -- --config=./sites/nos.pt/nos.pt.config.js --output=./sites/nos.pt/nos.pt.channels.xml
-```
-
-### Test
-
-```sh
-npm test -- nos.pt
-```
diff --git a/sites/nostv.pt/__data__/data.json b/sites/nostv.pt/__data__/data.json
new file mode 100644
index 00000000..205e5797
--- /dev/null
+++ b/sites/nostv.pt/__data__/data.json
@@ -0,0 +1 @@
+[{"CoreId":"2023121151009543","AssetId":"EPGE2023121151009543","ContentId":"epg@2023121151009543","ProgramId":"3011502","AggregatorId":"2967456","DateFullEventId":"2023121151009543","GridItemsLink":"/v2/browse/epg@2023121151009543/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121151009543/PlayListTray/items","UtcDateTimeStart":"2023-12-11T16:30:00Z","UtcDateTimeEnd":"2023-12-11T17:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Village Vets","SubTitle":"","RatingDisplay":"NC","GenreDisplay":"Reality TV","SeriesId":"142241","Description":"A histÃģria de dois melhores amigos veterinÃĄrios e o seu extraordinÃĄrio trabalho na AustrÃĄlia.","ReleaseYear":"2014","Rating":0,"Season":1,"Episode":12,"Duration":30,"ProgramId":3011502,"AggregatorId":2967456,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"8329ed1aec5d4c0faa2056972256ff9f","Url":"http://vip.pam.local.internal/PAM.Images/Store/8329ed1aec5d4c0faa2056972256ff9f","Type":1}]},{"CoreId":"2023121151009544","AssetId":"EPGE2023121151009544","ContentId":"epg@2023121151009544","ProgramId":"3161537","AggregatorId":"2165665","DateFullEventId":"2023121151009544","GridItemsLink":"/v2/browse/epg@2023121151009544/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121151009544/PlayListTray/items","UtcDateTimeStart":"2023-12-11T17:00:00Z","UtcDateTimeEnd":"2023-12-11T18:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"HistÃģrias ClÃnicas","SubTitle":"AssociaçÃĩes","RatingDisplay":"M12","GenreDisplay":"SaÚde","SeriesId":"102905","Description":"Processo de DecisÃĢo ClÃnica.","ReleaseYear":"2018","Rating":80,"Season":7,"Episode":13,"Duration":60,"ProgramId":3161537,"AggregatorId":2165665,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"818dba4817a7464f9e8433620270b01d","Url":"http://vip.pam.local.internal/PAM.Images/Store/818dba4817a7464f9e8433620270b01d","Type":1}]},{"CoreId":"2023121151009545","AssetId":"EPGE2023121151009545","ContentId":"epg@2023121151009545","ProgramId":"3357379","AggregatorId":"2182966","DateFullEventId":"2023121151009545","GridItemsLink":"/v2/browse/epg@2023121151009545/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121151009545/PlayListTray/items","UtcDateTimeStart":"2023-12-11T18:00:00Z","UtcDateTimeEnd":"2023-12-11T19:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Corpo ClÃnico","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"SaÚde","SeriesId":"103390","Description":"FarmacovigilÃĒncia.","ReleaseYear":"2018","Rating":1,"Season":12,"Episode":5,"Duration":60,"ProgramId":3357379,"AggregatorId":2182966,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"a060ca5930444d3a864ad20615e7df33","Url":"http://vip.pam.local.internal/PAM.Images/Store/a060ca5930444d3a864ad20615e7df33","Type":1}]},{"CoreId":"2023121151009546","AssetId":"EPGE2023121151009546","ContentId":"epg@2023121151009546","ProgramId":"3364579","AggregatorId":"3161534","DateFullEventId":"2023121151009546","GridItemsLink":"/v2/browse/epg@2023121151009546/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121151009546/PlayListTray/items","UtcDateTimeStart":"2023-12-11T19:00:00Z","UtcDateTimeEnd":"2023-12-11T20:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Caixa de Pandora","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"Talk-Show","SeriesId":"152921","Description":"Programa de 45 minutos, em estÚdio, que reÚne 4 mulheres de diversas idades e backgrounds que conversam todas as semanas sobre temas ligados à saÚde e bem-estar, mas tambÃĐm à sexualidade, vida em famÃlia, ao trabalho, etc. à uma tertÚlia no feminino.","ReleaseYear":"2023","Rating":80,"Season":4,"Episode":13,"Duration":60,"ProgramId":3364579,"AggregatorId":3161534,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"0ba7dccc8d1d459083c90666a2250776","Url":"http://vip.pam.local.internal/PAM.Images/Store/0ba7dccc8d1d459083c90666a2250776","Type":1}]},{"CoreId":"2023121151009547","AssetId":"EPGE2023121151009547","ContentId":"epg@2023121151009547","ProgramId":"3161541","AggregatorId":"2166905","DateFullEventId":"2023121151009547","GridItemsLink":"/v2/browse/epg@2023121151009547/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121151009547/PlayListTray/items","UtcDateTimeStart":"2023-12-11T20:00:00Z","UtcDateTimeEnd":"2023-12-11T21:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Anatomia De VÃĐnus","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"Entrevista","SeriesId":"102934","Description":"Sexualidade e DeficiÊncia.","ReleaseYear":"2018","Rating":80,"Season":7,"Episode":13,"Duration":60,"ProgramId":3161541,"AggregatorId":2166905,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"5a9c92a158084235901d63e0cda418df","Url":"http://vip.pam.local.internal/PAM.Images/Store/5a9c92a158084235901d63e0cda418df","Type":1}]},{"CoreId":"2023121151009548","AssetId":"EPGE2023121151009548","ContentId":"epg@2023121151009548","ProgramId":"3072059","AggregatorId":"3066918","DateFullEventId":"2023121151009548","GridItemsLink":"/v2/browse/epg@2023121151009548/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121151009548/PlayListTray/items","UtcDateTimeStart":"2023-12-11T21:00:00Z","UtcDateTimeEnd":"2023-12-11T22:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Heart Transplant: A Chance To Live","SubTitle":"","RatingDisplay":"NC","GenreDisplay":"SaÚde","SeriesId":"146850","Description":"Acompanhamos a vida de sete doentes criticos à espera para fazerem transplantes de coraçÃĢo.","ReleaseYear":"2018","Rating":0,"Season":1,"Episode":2,"Duration":60,"ProgramId":3072059,"AggregatorId":3066918,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"aba563a9ff3748de8a3551633f3bd1cb","Url":"http://vip.pam.local.internal/PAM.Images/Store/aba563a9ff3748de8a3551633f3bd1cb","Type":1}]},{"CoreId":"2023121151009549","AssetId":"EPGE2023121151009549","ContentId":"epg@2023121151009549","ProgramId":"3361332","AggregatorId":"3103070","DateFullEventId":"2023121151009549","GridItemsLink":"/v2/browse/epg@2023121151009549/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121151009549/PlayListTray/items","UtcDateTimeStart":"2023-12-11T22:00:00Z","UtcDateTimeEnd":"2023-12-11T22:30:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Entre Turnos","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"SaÚde","SeriesId":"149976","Description":"Vasco Lança (jogador de basquetebol e estudante de medicina).","ReleaseYear":"2022","Rating":80,"Season":1,"Episode":11,"Duration":30,"ProgramId":3361332,"AggregatorId":3103070,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"2e0fa1bc7d36404ab52dafcf450137d2","Url":"http://vip.pam.local.internal/PAM.Images/Store/2e0fa1bc7d36404ab52dafcf450137d2","Type":1}]},{"CoreId":"2023121151009550","AssetId":"EPGE2023121151009550","ContentId":"epg@2023121151009550","ProgramId":"3367957","AggregatorId":"3333429","DateFullEventId":"2023121151009550","GridItemsLink":"/v2/browse/epg@2023121151009550/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121151009550/PlayListTray/items","UtcDateTimeStart":"2023-12-11T22:30:00Z","UtcDateTimeEnd":"2023-12-11T23:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Fact Check","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Entretenimento","SeriesId":"164520","Description":"Ouviu dizer que nÃĢo deve misturar melancia e vinho na mesma refeiçÃĢo? Contaram-lhe que aquecer refeiçÃĩes no micro-ondas provoca cancro? No outro dia, viu nas redes sociais alguÃĐm afirmar que sÃģ vai ao psiquiatra quem tem doenças graves?","ReleaseYear":"2023","Rating":1,"Season":1,"Episode":11,"Duration":30,"ProgramId":3367957,"AggregatorId":3333429,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"6b08d78551e745899ff8db0fea2b8680","Url":"http://vip.pam.local.internal/PAM.Images/Store/6b08d78551e745899ff8db0fea2b8680","Type":1}]},{"CoreId":"2023121151009551","AssetId":"EPGE2023121151009551","ContentId":"epg@2023121151009551","ProgramId":"3365804","AggregatorId":"2165712","DateFullEventId":"2023121151009551","GridItemsLink":"/v2/browse/epg@2023121151009551/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121151009551/PlayListTray/items","UtcDateTimeStart":"2023-12-11T23:00:00Z","UtcDateTimeEnd":"2023-12-12T00:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Check Up","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Debate","SeriesId":"102906","Description":"Para debater o futuro da saÚde em Portugal, todas as semanas abrimos antena a âCheck upâ. O programa promete reunir os principais protagonistas do setor para discutirem em conjunto os grandes temas que preocupam este universo.","ReleaseYear":"2018","Rating":1,"Season":10,"Episode":14,"Duration":60,"ProgramId":3365804,"AggregatorId":2165712,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"5bf507f275934d369ceb7a790251bd1e","Url":"http://vip.pam.local.internal/PAM.Images/Store/5bf507f275934d369ceb7a790251bd1e","Type":1}]},{"CoreId":"2023121251009807","AssetId":"EPGE2023121251009807","ContentId":"epg@2023121251009807","ProgramId":"3364404","AggregatorId":"2460399","DateFullEventId":"2023121251009807","GridItemsLink":"/v2/browse/epg@2023121251009807/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009807/PlayListTray/items","UtcDateTimeStart":"2023-12-12T00:00:00Z","UtcDateTimeEnd":"2023-12-12T00:30:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Doutor Ajuda","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"SaÚde","SeriesId":"112361","Description":"O que ÃĐ a toxina botulÃnica e suas utilizaçÃĩes.","ReleaseYear":"2023","Rating":1,"Season":3,"Episode":9,"Duration":30,"ProgramId":3364404,"AggregatorId":2460399,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"dfc67678e6de4a2baf23cd16a039684b","Url":"http://vip.pam.local.internal/PAM.Images/Store/dfc67678e6de4a2baf23cd16a039684b","Type":1}]},{"CoreId":"2023121251009808","AssetId":"EPGE2023121251009808","ContentId":"epg@2023121251009808","ProgramId":"2207459","AggregatorId":"2165669","DateFullEventId":"2023121251009808","GridItemsLink":"/v2/browse/epg@2023121251009808/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009808/PlayListTray/items","UtcDateTimeStart":"2023-12-12T00:30:00Z","UtcDateTimeEnd":"2023-12-12T01:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Atendimento Permanente","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Reality TV","SeriesId":"102919","Description":"No Atendimento Permanente desta semana vamos conhecer o dia a dia de um fisiatra.","ReleaseYear":"2018","Rating":1,"Season":1,"Episode":6,"Duration":30,"ProgramId":2207459,"AggregatorId":2165669,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"7973715e80b449afaeea3a23aa830fa0","Url":"http://vip.pam.local.internal/PAM.Images/Store/7973715e80b449afaeea3a23aa830fa0","Type":1}]},{"CoreId":"2023121251009809","AssetId":"EPGE2023121251009809","ContentId":"epg@2023121251009809","ProgramId":"3161541","AggregatorId":"2166905","DateFullEventId":"2023121251009809","GridItemsLink":"/v2/browse/epg@2023121251009809/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009809/PlayListTray/items","UtcDateTimeStart":"2023-12-12T01:00:00Z","UtcDateTimeEnd":"2023-12-12T02:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Anatomia De VÃĐnus","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"Entrevista","SeriesId":"102934","Description":"Sexualidade e DeficiÊncia.","ReleaseYear":"2018","Rating":80,"Season":7,"Episode":13,"Duration":60,"ProgramId":3161541,"AggregatorId":2166905,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"5a9c92a158084235901d63e0cda418df","Url":"http://vip.pam.local.internal/PAM.Images/Store/5a9c92a158084235901d63e0cda418df","Type":1}]},{"CoreId":"2023121251009810","AssetId":"EPGE2023121251009810","ContentId":"epg@2023121251009810","ProgramId":"3047405","AggregatorId":"140870","DateFullEventId":"2023121251009810","GridItemsLink":"/v2/browse/epg@2023121251009810/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009810/PlayListTray/items","UtcDateTimeStart":"2023-12-12T02:00:00Z","UtcDateTimeEnd":"2023-12-12T03:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Sete Vidas","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Entrevista","SeriesId":"116562","Description":"Anorexia, perturbaçÃĢo bipolar, depressÃĢo, comportamentos aditivos, dor crÃģnica ou comportamento obsessivo-compulsivo sÃĢo patologias psicolÃģgicas que a conhecida psicÃģloga clÃnica Joana Amaral Dias vai retratar atravÃĐs de uma conversa com uma figura pÚblica que tenha vivenciado e superado o problema.","ReleaseYear":"2022","Rating":1,"Season":3,"Episode":8,"Duration":60,"ProgramId":3047405,"AggregatorId":140870,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"245f7c92250d443dbfa923d4a7cdda30","Url":"http://vip.pam.local.internal/PAM.Images/Store/245f7c92250d443dbfa923d4a7cdda30","Type":1}]},{"CoreId":"2023121251009811","AssetId":"EPGE2023121251009811","ContentId":"epg@2023121251009811","ProgramId":"2602834","AggregatorId":"2597243","DateFullEventId":"2023121251009811","GridItemsLink":"/v2/browse/epg@2023121251009811/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009811/PlayListTray/items","UtcDateTimeStart":"2023-12-12T03:00:00Z","UtcDateTimeEnd":"2023-12-12T04:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"HistÃģrias ClÃnicas: Dra. Sofia Braga","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"Talk-Show","SeriesId":"120596","Description":"Rastreio cancro prostata.","ReleaseYear":"2020","Rating":80,"Season":6,"Episode":5,"Duration":60,"ProgramId":2602834,"AggregatorId":2597243,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"818dba4817a7464f9e8433620270b01d","Url":"http://vip.pam.local.internal/PAM.Images/Store/818dba4817a7464f9e8433620270b01d","Type":1}]},{"CoreId":"2023121251009812","AssetId":"EPGE2023121251009812","ContentId":"epg@2023121251009812","ProgramId":"2554643","AggregatorId":"1059808","DateFullEventId":"2023121251009812","GridItemsLink":"/v2/browse/epg@2023121251009812/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009812/PlayListTray/items","UtcDateTimeStart":"2023-12-12T04:00:00Z","UtcDateTimeEnd":"2023-12-12T05:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Pura Vida","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Entrevista","SeriesId":"102883","Description":"JoÃĢo Paulo Freitas.","ReleaseYear":"2018","Rating":1,"Season":5,"Episode":9,"Duration":60,"ProgramId":2554643,"AggregatorId":1059808,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"c59c07b60101435a846e546633137b54","Url":"http://vip.pam.local.internal/PAM.Images/Store/c59c07b60101435a846e546633137b54","Type":1}]},{"CoreId":"2023121251009813","AssetId":"EPGE2023121251009813","ContentId":"epg@2023121251009813","ProgramId":"2581668","AggregatorId":"2527677","DateFullEventId":"2023121251009813","GridItemsLink":"/v2/browse/epg@2023121251009813/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009813/PlayListTray/items","UtcDateTimeStart":"2023-12-12T05:00:00Z","UtcDateTimeEnd":"2023-12-12T05:30:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Casos Singulares","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Entrevista","SeriesId":"116606","Description":"No mundo foram reconhecidas entre 5 a 8 mil doenças raras que afetam o prÃģprio e quem estÃĄ ao redor. O peso social do problema, o acesso à s terapÊuticas quando existem, a forma de lidar com o problema, sÃĢo aspetos a abordar no programa, que apresenta patologias e histÃģrias de vida diferentes.","ReleaseYear":"2019","Rating":1,"Season":1,"Episode":13,"Duration":30,"ProgramId":2581668,"AggregatorId":2527677,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"42a228cd013742ffa58e302d4706b401","Url":"http://vip.pam.local.internal/PAM.Images/Store/42a228cd013742ffa58e302d4706b401","Type":1}]},{"CoreId":"2023121251009814","AssetId":"EPGE2023121251009814","ContentId":"epg@2023121251009814","ProgramId":"2312607","AggregatorId":"2176405","DateFullEventId":"2023121251009814","GridItemsLink":"/v2/browse/epg@2023121251009814/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009814/PlayListTray/items","UtcDateTimeStart":"2023-12-12T05:30:00Z","UtcDateTimeEnd":"2023-12-12T06:30:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"HistÃģrias ClÃnicas: Dra. Rita Gama","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"Talk-Show","SeriesId":"103212","Description":"Prematuridade e doenças pulmonares crÃģnicas obstrutivas.","ReleaseYear":"2018","Rating":80,"Season":2,"Episode":3,"Duration":60,"ProgramId":2312607,"AggregatorId":2176405,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"818dba4817a7464f9e8433620270b01d","Url":"http://vip.pam.local.internal/PAM.Images/Store/818dba4817a7464f9e8433620270b01d","Type":1}]},{"CoreId":"2023121251009815","AssetId":"EPGE2023121251009815","ContentId":"epg@2023121251009815","ProgramId":"2944028","AggregatorId":"2165663","DateFullEventId":"2023121251009815","GridItemsLink":"/v2/browse/epg@2023121251009815/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009815/PlayListTray/items","UtcDateTimeStart":"2023-12-12T06:30:00Z","UtcDateTimeEnd":"2023-12-12T07:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Ajudar Quem Ajuda","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Entrevista","SeriesId":"102898","Description":"Hoje apresentamos a AssociaçÃĢo Careca Power.","ReleaseYear":"2018","Rating":1,"Season":7,"Episode":11,"Duration":30,"ProgramId":2944028,"AggregatorId":2165663,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"a655dbeb67b745418e40096827581a69","Url":"http://vip.pam.local.internal/PAM.Images/Store/a655dbeb67b745418e40096827581a69","Type":1}]},{"CoreId":"2023121251009816","AssetId":"EPGE2023121251009816","ContentId":"epg@2023121251009816","ProgramId":"2554639","AggregatorId":"2165680","DateFullEventId":"2023121251009816","GridItemsLink":"/v2/browse/epg@2023121251009816/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009816/PlayListTray/items","UtcDateTimeStart":"2023-12-12T07:00:00Z","UtcDateTimeEnd":"2023-12-12T08:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Tenho um bebÃĐ. E agora?","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Magazine","SeriesId":"102886","Description":"Obesidade Infantil - EstratÃĐgias de combate em casa e na escola.","ReleaseYear":"2018","Rating":1,"Season":5,"Episode":9,"Duration":60,"ProgramId":2554639,"AggregatorId":2165680,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"293d91056a424619b904d93cd60e8db5","Url":"http://vip.pam.local.internal/PAM.Images/Store/293d91056a424619b904d93cd60e8db5","Type":1}]},{"CoreId":"2023121251009817","AssetId":"EPGE2023121251009817","ContentId":"epg@2023121251009817","ProgramId":"2383511","AggregatorId":"2303539","DateFullEventId":"2023121251009817","GridItemsLink":"/v2/browse/epg@2023121251009817/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009817/PlayListTray/items","UtcDateTimeStart":"2023-12-12T08:00:00Z","UtcDateTimeEnd":"2023-12-12T09:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"HistÃģrias ClÃnicas: Dr. Luis Sousa","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"Talk-Show","SeriesId":"106734","Description":"Medicina DentÃĄria em Portugal.","ReleaseYear":"2018","Rating":80,"Season":3,"Episode":1,"Duration":60,"ProgramId":2383511,"AggregatorId":2303539,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"818dba4817a7464f9e8433620270b01d","Url":"http://vip.pam.local.internal/PAM.Images/Store/818dba4817a7464f9e8433620270b01d","Type":1}]},{"CoreId":"2023121251009818","AssetId":"EPGE2023121251009818","ContentId":"epg@2023121251009818","ProgramId":"3364579","AggregatorId":"3161534","DateFullEventId":"2023121251009818","GridItemsLink":"/v2/browse/epg@2023121251009818/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009818/PlayListTray/items","UtcDateTimeStart":"2023-12-12T09:00:00Z","UtcDateTimeEnd":"2023-12-12T10:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Caixa de Pandora","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"Talk-Show","SeriesId":"152921","Description":"Programa de 45 minutos, em estÚdio, que reÚne 4 mulheres de diversas idades e backgrounds que conversam todas as semanas sobre temas ligados à saÚde e bem-estar, mas tambÃĐm à sexualidade, vida em famÃlia, ao trabalho, etc. à uma tertÚlia no feminino.","ReleaseYear":"2023","Rating":80,"Season":4,"Episode":13,"Duration":60,"ProgramId":3364579,"AggregatorId":3161534,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"0ba7dccc8d1d459083c90666a2250776","Url":"http://vip.pam.local.internal/PAM.Images/Store/0ba7dccc8d1d459083c90666a2250776","Type":1}]},{"CoreId":"2023121251009819","AssetId":"EPGE2023121251009819","ContentId":"epg@2023121251009819","ProgramId":"3357379","AggregatorId":"2182966","DateFullEventId":"2023121251009819","GridItemsLink":"/v2/browse/epg@2023121251009819/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009819/PlayListTray/items","UtcDateTimeStart":"2023-12-12T10:00:00Z","UtcDateTimeEnd":"2023-12-12T11:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Corpo ClÃnico","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"SaÚde","SeriesId":"103390","Description":"FarmacovigilÃĒncia.","ReleaseYear":"2018","Rating":1,"Season":12,"Episode":5,"Duration":60,"ProgramId":3357379,"AggregatorId":2182966,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"a060ca5930444d3a864ad20615e7df33","Url":"http://vip.pam.local.internal/PAM.Images/Store/a060ca5930444d3a864ad20615e7df33","Type":1}]},{"CoreId":"2023121251009820","AssetId":"EPGE2023121251009820","ContentId":"epg@2023121251009820","ProgramId":"3365186","AggregatorId":"3120338","DateFullEventId":"2023121251009820","GridItemsLink":"/v2/browse/epg@2023121251009820/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009820/PlayListTray/items","UtcDateTimeStart":"2023-12-12T11:00:00Z","UtcDateTimeEnd":"2023-12-12T12:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Tenho Um Adolescente. E Agora?","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"SaÚde","SeriesId":"150432","Description":"Como lidar com a rejeiçÃĢo.","ReleaseYear":"2022","Rating":80,"Season":2,"Episode":3,"Duration":60,"ProgramId":3365186,"AggregatorId":3120338,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"d0b53e8f6f644939a11be96ac28aae07","Url":"http://vip.pam.local.internal/PAM.Images/Store/d0b53e8f6f644939a11be96ac28aae07","Type":1}]},{"CoreId":"2023121251009821","AssetId":"EPGE2023121251009821","ContentId":"epg@2023121251009821","ProgramId":"3031742","AggregatorId":"2967454","DateFullEventId":"2023121251009821","GridItemsLink":"/v2/browse/epg@2023121251009821/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009821/PlayListTray/items","UtcDateTimeStart":"2023-12-12T12:00:00Z","UtcDateTimeEnd":"2023-12-12T13:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"One Born Every Minute","SubTitle":"","RatingDisplay":"NC","GenreDisplay":"SaÚde","SeriesId":"142171","Description":"Saiba quais os segredos de uma boa relaçÃĢo.","ReleaseYear":"2018","Rating":0,"Season":9,"Episode":5,"Duration":60,"ProgramId":3031742,"AggregatorId":2967454,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"746a4552819c485aba07aed59fcca49d","Url":"http://vip.pam.local.internal/PAM.Images/Store/746a4552819c485aba07aed59fcca49d","Type":1}]},{"CoreId":"2023121251009822","AssetId":"EPGE2023121251009822","ContentId":"epg@2023121251009822","ProgramId":"3361332","AggregatorId":"3103070","DateFullEventId":"2023121251009822","GridItemsLink":"/v2/browse/epg@2023121251009822/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009822/PlayListTray/items","UtcDateTimeStart":"2023-12-12T13:00:00Z","UtcDateTimeEnd":"2023-12-12T13:30:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Entre Turnos","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"SaÚde","SeriesId":"149976","Description":"Vasco Lança (jogador de basquetebol e estudante de medicina).","ReleaseYear":"2022","Rating":80,"Season":1,"Episode":11,"Duration":30,"ProgramId":3361332,"AggregatorId":3103070,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"2e0fa1bc7d36404ab52dafcf450137d2","Url":"http://vip.pam.local.internal/PAM.Images/Store/2e0fa1bc7d36404ab52dafcf450137d2","Type":1}]},{"CoreId":"2023121251009823","AssetId":"EPGE2023121251009823","ContentId":"epg@2023121251009823","ProgramId":"3367957","AggregatorId":"3333429","DateFullEventId":"2023121251009823","GridItemsLink":"/v2/browse/epg@2023121251009823/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009823/PlayListTray/items","UtcDateTimeStart":"2023-12-12T13:30:00Z","UtcDateTimeEnd":"2023-12-12T14:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Fact Check","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Entretenimento","SeriesId":"164520","Description":"Ouviu dizer que nÃĢo deve misturar melancia e vinho na mesma refeiçÃĢo? Contaram-lhe que aquecer refeiçÃĩes no micro-ondas provoca cancro? No outro dia, viu nas redes sociais alguÃĐm afirmar que sÃģ vai ao psiquiatra quem tem doenças graves?","ReleaseYear":"2023","Rating":1,"Season":1,"Episode":11,"Duration":30,"ProgramId":3367957,"AggregatorId":3333429,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"6b08d78551e745899ff8db0fea2b8680","Url":"http://vip.pam.local.internal/PAM.Images/Store/6b08d78551e745899ff8db0fea2b8680","Type":1}]},{"CoreId":"2023121251009824","AssetId":"EPGE2023121251009824","ContentId":"epg@2023121251009824","ProgramId":"3206760","AggregatorId":"3161538","DateFullEventId":"2023121251009824","GridItemsLink":"/v2/browse/epg@2023121251009824/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009824/PlayListTray/items","UtcDateTimeStart":"2023-12-12T14:00:00Z","UtcDateTimeEnd":"2023-12-12T15:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Guia da Vida SaudÃĄvel","SubTitle":"","RatingDisplay":"M12","GenreDisplay":"Magazine","SeriesId":"152938","Description":"Programa de estÚdio de 45 minutos, onde vamos mostrar exemplos e prÃĄticas que podem determinar uma vida mais saudÃĄvel. Queremos condensar toda a informaçÃĢo disponÃvel. O objetivo do programa ÃĐ âprevenir primeiro, para nÃĢo ter que remediar depoisâ.","ReleaseYear":"2023","Rating":80,"Season":1,"Episode":12,"Duration":60,"ProgramId":3206760,"AggregatorId":3161538,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"0082754b26bb4bc4978b9e324cccd8f6","Url":"http://vip.pam.local.internal/PAM.Images/Store/0082754b26bb4bc4978b9e324cccd8f6","Type":1}]},{"CoreId":"2023121251009825","AssetId":"EPGE2023121251009825","ContentId":"epg@2023121251009825","ProgramId":"3365804","AggregatorId":"2165712","DateFullEventId":"2023121251009825","GridItemsLink":"/v2/browse/epg@2023121251009825/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009825/PlayListTray/items","UtcDateTimeStart":"2023-12-12T15:00:00Z","UtcDateTimeEnd":"2023-12-12T16:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"Check Up","SubTitle":"","RatingDisplay":"Todos","GenreDisplay":"Debate","SeriesId":"102906","Description":"Para debater o futuro da saÚde em Portugal, todas as semanas abrimos antena a âCheck upâ. O programa promete reunir os principais protagonistas do setor para discutirem em conjunto os grandes temas que preocupam este universo.","ReleaseYear":"2018","Rating":1,"Season":10,"Episode":14,"Duration":60,"ProgramId":3365804,"AggregatorId":2165712,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"5bf507f275934d369ceb7a790251bd1e","Url":"http://vip.pam.local.internal/PAM.Images/Store/5bf507f275934d369ceb7a790251bd1e","Type":1}]},{"CoreId":"2023121251009826","AssetId":"EPGE2023121251009826","ContentId":"epg@2023121251009826","ProgramId":"3161537","AggregatorId":"2165665","DateFullEventId":"2023121251009826","GridItemsLink":"/v2/browse/epg@2023121251009826/grid/items","PlayListTrayItemLink":"/v1/contents/epg@2023121251009826/PlayListTray/items","UtcDateTimeStart":"2023-12-12T16:00:00Z","UtcDateTimeEnd":"2023-12-12T17:00:00Z","Type":4,"IsAdult":false,"AiringChannel":{"IsOnline":true,"IsTimeWarpable":true,"IsRestartable":true,"ServiceId":"510","ChannelId":"510","AssetId":"EPGC510","Name":"S+ HD","RatingDisplay":"M3","DvbLocator":"dvb://36.4C.835","Rating":20,"Position":129,"QualityVersion":2,"Images":[{"ImageId":"SAUDEMAIS.png","Url":"http://vip.repositories.local.internal/Repositories.EPG/OttChannelIcons/SAUDEMAIS.png","Type":16}]},"Metadata":{"Title":"HistÃģrias ClÃnicas","SubTitle":"AssociaçÃĩes","RatingDisplay":"M12","GenreDisplay":"SaÚde","SeriesId":"102905","Description":"Processo de DecisÃĢo ClÃnica.","ReleaseYear":"2018","Rating":80,"Season":7,"Episode":13,"Duration":60,"ProgramId":3161537,"AggregatorId":2165665,"IsNPVR":true,"IsStartOver":true},"Images":[{"ImageId":"818dba4817a7464f9e8433620270b01d","Url":"http://vip.pam.local.internal/PAM.Images/Store/818dba4817a7464f9e8433620270b01d","Type":1}]}]
\ No newline at end of file
diff --git a/sites/nostv.pt/nostv.pt.channels.xml b/sites/nostv.pt/nostv.pt.channels.xml
new file mode 100644
index 00000000..3ecd3fd0
--- /dev/null
+++ b/sites/nostv.pt/nostv.pt.channels.xml
@@ -0,0 +1,171 @@
+
+
+ Rai Italia
+ Canal 180
+ BNT World
+ Caça e Pesca
+ TPA NotÃcias
+ TVE 24h
+ BTV1 HD
+ STV NotÃcias
+ Sport TV NBA
+ Canal Galeria
+ ELEVEN EXTRA 1
+ ELEVEN EXTRA 2
+ ELEVEN EXTRA 3
+ ELEVEN EXTRA 4
+ UnifÃĐ TV
+ OneToro TV
+ New Brasil
+ Dizi
+ 1+1
+ 24Kitchen HD
+ Afro Music Channel
+ Al Jazeera
+ AMC HD
+ AMC Break HD
+ AMC Crime
+ AMC Crime HD
+ ARTE
+ ARTV
+ AXN HD
+ AXN Movies HD
+ AXN White HD
+ Baby TV
+ Biggs
+ Bloomberg
+ BVN
+ Canal 11 HD
+ Canal Hollywood HD
+ Canal NOS HD
+ Canal Panda HD
+ Canal Q
+ Cartoon Network HD
+ Casa e Cozinha HD
+ CCTV 4
+ CGTN
+ CMTV HD
+ CNBC
+ CNN
+ CNN Portugal HD
+ CubavisiÃģn Internacional
+ Discovery Channel
+ Discovery HD
+ Disney Channel HD
+ Disney Junior HD
+ DOGTV
+ DW (AlemÃĢo)
+ DW
+ E! Entertainment HD
+ ELEVEN SPORTS 1
+ ELEVEN SPORTS 2
+ ELEVEN SPORTS 3
+ ELEVEN SPORTS 4
+ ELEVEN SPORTS 5
+ ELEVEN SPORTS 6
+ Euronews
+ Eurosport 1 HD
+ Eurosport 2
+ Eurosport 2 HD
+ FTV
+ FTV HD
+ Fight Network HD
+ Food Network HD
+ FOX HD
+ FOX Comedy HD
+ FOX Crime
+ FOX Crime HD
+ FOX Life HD
+ FOX Movies
+ FOX Movies HD
+ France 24 (I)
+ France 24 (F)
+ Fuel TV HD
+ TV Galicia
+ Globo News
+ Globo HD
+ Canal HistÃģria
+ Canal HistÃģria HD
+ Horse TV
+ ID Investigation Discovery
+ KBS World HD
+ Kuriakos TV
+ LocalvisÃĢo TV HD
+ M6
+ MCM Pop
+ MCM Top
+ Mezzo
+ Mezzo Live HD
+ Motorvision HD
+ MTV 00s
+ MTV Portugal HD
+ MTV Live
+ MyZen TV
+ National Geographic HD
+ National Geographic WILD HD
+ Nautical Channel
+ NHK World TV
+ Nickelodeon
+ Nick Jr.
+ NOS Studios HD
+ ODISSEIA HD
+ Panda KIDS
+ PFC
+ Phoenix CNE
+ Phoenix Infonews
+ Porto Canal HD
+ Record News
+ Record TV HD
+ Russia Today
+ RTL
+ Super RTL
+ RTP 1 HD
+ RTP 2 HD
+ RTP 3 HD
+ RTP Açores
+ RTP Ãfrica
+ RTP Madeira
+ RTP MemÃģria
+ RTR Planeta
+ SIC HD
+ SIC Caras HD
+ SIC K HD
+ SIC Mulher HD
+ SIC NotÃcias HD
+ SIC Radical HD
+ Sky News
+ SET Asia
+ MAX
+ S+ HD
+ Sporting TV HD
+ SPORT TV1 HD
+ SPORT TV2 HD
+ SPORT TV3 HD
+ SPORT TV4 HD
+ SPORT TV5 HD
+ Sport TV 6 HD
+ SPORT TV+ HD
+ Stingray iConcerts HD
+ Syfy HD
+ TCV Internacional
+ TeleSUR
+ TLC
+ Trace Toca
+ Trace Urban HD
+ Travel Channel
+ Travel Channel HD
+ TV5 Monde
+ CançÃĢo Nova
+ TVCine ACTION HD
+ TVCine EDITION HD
+ TVCine EMOTION HD
+ TVCine TOP HD
+ TVEi
+ TVI HD
+ TVI FicçÃĢo HD
+ TVI Reality HD
+ TVR Internacional
+ W-Sport
+ ZAP Viva HD
+ Zee TV
+
diff --git a/sites/nostv.pt/nostv.pt.config.js b/sites/nostv.pt/nostv.pt.config.js
new file mode 100644
index 00000000..0f829594
--- /dev/null
+++ b/sites/nostv.pt/nostv.pt.config.js
@@ -0,0 +1,60 @@
+const axios = require('axios')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+
+dayjs.extend(utc)
+
+const headers = {
+ 'X-Apikey': 'xe1dgrShwdR1DVOKGmsj8Ut4QLlGyOFI',
+ 'X-Core-Appversion': '2.14.0.1',
+ 'X-Core-Contentratinglimit': '0',
+ 'X-Core-Deviceid': '',
+ 'X-Core-Devicetype': 'web',
+ 'Origin': 'https://nostv.pt',
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
+}
+
+module.exports = {
+ site: 'nostv.pt',
+ days: 2,
+ url({ channel, date }) {
+ return `https://tyr-prod.apigee.net/nostv/ott/schedule/range/contents/guest?channels=${channel.site_id}&minDate=${date.format('YYYY-MM-DD')}T00:00:00Z&maxDate=${date.format('YYYY-MM-DD')}T23:59:59Z&isDateInclusive=true&client_id=${headers['X-Apikey']}`
+ },
+ request: { headers },
+ parser({ content }) {
+ const programs = []
+ if (content) {
+ const items = Array.isArray(content) ? content : JSON.parse(content)
+ items.forEach(item => {
+ programs.push({
+ title: item.Metadata?.Title,
+ sub_title: item.Metadata?.SubTitle ? item.Metadata?.SubTitle : null,
+ description: item.Metadata?.Description,
+ season: item.Metadata?.Season,
+ episode: item.Metadata?.Episode,
+ icon: item.Images ?
+ `https://mage.stream.nos.pt/v1/nostv_mage/Images?sourceUri=${item.Images[0].Url}&profile=ott_1_452x340&client_id=${headers['X-Apikey']}` :
+ null,
+ start: dayjs.utc(item.UtcDateTimeStart),
+ stop: dayjs.utc(item.UtcDateTimeEnd)
+ })
+ })
+ }
+
+ return programs
+ },
+ async channels() {
+ const result = await axios
+ .get(`https://tyr-prod.apigee.net/nostv/ott/channels/guest?client_id=${headers['X-Apikey']}`, { headers })
+ .then(r => r.data)
+ .catch(console.error)
+
+ return result.map(item => {
+ return {
+ lang: 'pt',
+ site_id: item.ServiceId,
+ name: item.Name
+ }
+ })
+ }
+}
diff --git a/sites/nostv.pt/nostv.pt.test.js b/sites/nostv.pt/nostv.pt.test.js
new file mode 100644
index 00000000..76259a56
--- /dev/null
+++ b/sites/nostv.pt/nostv.pt.test.js
@@ -0,0 +1,51 @@
+const { parser, url } = require('./nostv.pt.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('2023-12-11').startOf('d')
+const channel = {
+ site_id: '510',
+ xmltv_id: 'SPlus.pt'
+}
+
+it('can generate valid url', () => {
+ expect(url({ channel, date })).toBe(
+ 'https://tyr-prod.apigee.net/nostv/ott/schedule/range/contents/guest?channels=510&minDate=2023-12-11T00:00:00Z&maxDate=2023-12-11T23:59:59Z&isDateInclusive=true&client_id=xe1dgrShwdR1DVOKGmsj8Ut4QLlGyOFI'
+ )
+})
+
+it('can parse response', () => {
+ const content = fs.readFileSync(path.resolve(__dirname, '__data__/data.json'))
+ const results = parser({ content })
+ .map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(results[0]).toMatchObject({
+ start: '2023-12-11T16:30:00.000Z',
+ stop: '2023-12-11T17:00:00.000Z',
+ title: 'Village Vets',
+ description:
+ 'A histÃģria de dois melhores amigos veterinÃĄrios e o seu extraordinÃĄrio trabalho na AustrÃĄlia.',
+ season: 1,
+ episode: 12,
+ icon: 'https://mage.stream.nos.pt/v1/nostv_mage/Images?sourceUri=http://vip.pam.local.internal/PAM.Images/Store/8329ed1aec5d4c0faa2056972256ff9f&profile=ott_1_452x340&client_id=xe1dgrShwdR1DVOKGmsj8Ut4QLlGyOFI'
+ })
+})
+
+it('can handle empty guide', async () => {
+ const results = await parser({
+ date,
+ content: '[]'
+ })
+
+ expect(results).toMatchObject([])
+})
diff --git a/sites/nostv.pt/readme.md b/sites/nostv.pt/readme.md
new file mode 100644
index 00000000..d3f21b7d
--- /dev/null
+++ b/sites/nostv.pt/readme.md
@@ -0,0 +1,21 @@
+# nostv.pt
+
+https://nostv.pt/guia/
+
+### Download the guide
+
+```sh
+npm run grab -- --site=nostv.pt
+```
+
+### Update channel list
+
+```sh
+npm run channels:parse -- --config=./sites/nostv.pt/nostv.pt.config.js --output=./sites/nostv.pt/nostv.pt.channels.xml
+```
+
+### Test
+
+```sh
+npm test -- nostv.pt
+```
diff --git a/sites/pickx.be/__data__/data.json b/sites/pickx.be/__data__/data.json
new file mode 100644
index 00000000..24c5e219
--- /dev/null
+++ b/sites/pickx.be/__data__/data.json
@@ -0,0 +1 @@
+[{"channelId":"UID0118","duration":20,"programReferenceNumber":"51632189","programScheduleStart":"2023-12-12T23:55:00.000Z","programScheduleEnd":"2023-12-13T00:15:00.000Z","onRewind":false,"scheduleTrailId":202312052657806,"fetchOnRewind":true,"category":"C.News","subCategory":"C.Magazine","program":{"actors":[],"VCHIP":"","blacklist":false,"blacklistInterval":0,"blacklistOTT":false,"blacklistOTTInterval":0,"catchupGracePeriod":0,"category":"C.News","description":"Le journal de vivre ici.","director":"","disableNPVR":false,"episodeNumber":null,"episodeTitle":"","extRatingCodes":"","facebookObjID":"","posterFileName":"250_250_4B990CC58066A7B2A660AFA0BDDE5C41.jpg","programReferenceNumber":"51632189","programType":"NE","releaseYear":null,"seasonNumber":null,"seriesGID":"","seriesID":"","subCategory":"C.Magazine","title":"Le 22h30","trueDuration":20,"supportForVisuallyImpaired":false,"supportForHearingImpaired":true,"translatedCategory":{"fr":"Info","nl":"Nieuws"},"translatedSubCategory":{"fr":"Magazine","nl":"Magazine"}}}]
\ No newline at end of file
diff --git a/sites/pickx.be/pickx.be.config.js b/sites/pickx.be/pickx.be.config.js
new file mode 100644
index 00000000..1b61a64b
--- /dev/null
+++ b/sites/pickx.be/pickx.be.config.js
@@ -0,0 +1,111 @@
+const axios = require('axios')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+
+dayjs.extend(utc)
+
+module.exports = {
+ site: 'pickx.be',
+ days: 2,
+ url({ channel, date }) {
+ return `https://px-epg.azureedge.net/airings/11702375189765v.4.2/${date.format('YYYY-MM-DD')}/channel/${channel.site_id}?timezone=Europe%2FBrussels`
+ },
+ request: {
+ headers: {
+ Origin: 'https://www.pickx.be',
+ Referer: 'https://www.pickx.be/'
+ }
+ },
+ parser({ channel, content }) {
+ const programs = []
+ if (content) {
+ const items = JSON.parse(content)
+ items.forEach(item => {
+ programs.push({
+ title: item.program.title,
+ sub_title: item.program.episodeTitle,
+ description: item.program.description,
+ category: item.program.translatedCategory?.[channel.lang] ?
+ item.program.translatedCategory[channel.lang] : item.program.category.split('.')[1],
+ icon: item.program.posterFileName ?
+ `https://experience-cache.proximustv.be/posterserver/poster/EPG/w-166_h-110/${item.program.posterFileName}` : null,
+ season: item.program.seasonNumber,
+ episode: item.program.episodeNumber,
+ actors: item.program.actors,
+ director: item.program.director ? [item.program.director] : null,
+ start: dayjs.utc(item.programScheduleStart),
+ stop: dayjs.utc(item.programScheduleEnd)
+ })
+ })
+ }
+
+ return programs
+ },
+ async channels({ lang = ''}) {
+ const query = {
+ operationName: 'getChannels',
+ variables: {
+ language: lang,
+ queryParams: {},
+ 'id': '0',
+ params: {
+ shouldReadFromCache: true
+ }
+ },
+ query:
+ `query getChannels($language: String!, $queryParams: ChannelQueryParams, $id: String, $params: ChannelParams) {
+ channels(language: $language, queryParams: $queryParams, id: $id, params: $params) {
+ id
+ channelReferenceNumber
+ name
+ callLetter
+ number
+ logo {
+ key
+ url
+ __typename
+ }
+ language
+ hd
+ radio
+ replayable
+ ottReplayable
+ playable
+ ottPlayable
+ recordable
+ subscribed
+ cloudRecordable
+ catchUpWindowInHours
+ isOttNPVREnabled
+ ottNPVRStart
+ subscription {
+ channelRef
+ subscribed
+ upselling {
+ upsellable
+ packages
+ __typename
+ }
+ __typename
+ }
+ packages
+ __typename
+ }
+ }`
+ }
+ const result = await axios
+ .post('https://api.proximusmwc.be/tiams/v2/graphql', query)
+ .then(r => r.data)
+ .catch(console.error)
+
+ return result?.data?.channels
+ .filter(channel => !channel.radio && (!lang || channel.language === (lang === 'de' ? 'ger' : lang)))
+ .map(channel => {
+ return {
+ lang: channel.language === 'ger' ? 'de' : channel.language,
+ site_id: channel.id,
+ name: channel.name
+ }
+ }) || []
+ }
+}
\ No newline at end of file
diff --git a/sites/pickx.be/pickx.be.test.js b/sites/pickx.be/pickx.be.test.js
new file mode 100644
index 00000000..66a4b3a6
--- /dev/null
+++ b/sites/pickx.be/pickx.be.test.js
@@ -0,0 +1,54 @@
+const { parser, url, request } = require('./pickx.be.config.js')
+const fs = require('fs')
+const path = require('path')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+
+dayjs.extend(utc)
+
+const date = dayjs.utc('2023-12-13').startOf('d')
+const channel = {
+ lang: 'fr',
+ site_id: 'UID0118',
+ xmltv_id: 'Vedia.be'
+}
+
+it('can generate valid url', () => {
+ expect(url({channel, date}))
+ .toBe('https://px-epg.azureedge.net/airings/11702375189765v.4.2/2023-12-13/channel/UID0118?timezone=Europe%2FBrussels')
+})
+
+it('can generate valid request headers', () => {
+ expect(request.headers).toMatchObject({
+ Origin: 'https://www.pickx.be',
+ Referer: 'https://www.pickx.be/'
+ })
+})
+
+it('can parse response', () => {
+ const content = fs.readFileSync(path.resolve(__dirname, '__data__/data.json'))
+ const result = parser({ content, channel, date }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result[0]).toMatchObject({
+ start: '2023-12-12T23:55:00.000Z',
+ stop: '2023-12-13T00:15:00.000Z',
+ title: 'Le 22h30',
+ description:
+ 'Le journal de vivre ici.',
+ category: 'Info',
+ icon: 'https://experience-cache.proximustv.be/posterserver/poster/EPG/w-166_h-110/250_250_4B990CC58066A7B2A660AFA0BDDE5C41.jpg'
+ })
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ date,
+ channel,
+ content: ''
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/pickx.be/pickx.be_de.channels.xml b/sites/pickx.be/pickx.be_de.channels.xml
new file mode 100644
index 00000000..6d7f2890
--- /dev/null
+++ b/sites/pickx.be/pickx.be_de.channels.xml
@@ -0,0 +1,11 @@
+
+
+ BRF TV HD
+ BRF TV
+ Das Erste
+ Das Erste HD
+ RTL
+ RTL Deutschland HD
+ ZDF
+ ZDF HD
+
diff --git a/sites/pickx.be/pickx.be_en.channels.xml b/sites/pickx.be/pickx.be_en.channels.xml
new file mode 100644
index 00000000..c7112d10
--- /dev/null
+++ b/sites/pickx.be/pickx.be_en.channels.xml
@@ -0,0 +1,23 @@
+
+
+ Netflix
+ BBC Ent
+ BBC First
+ BBC News HD
+ BBC News
+ BBC One HD
+ BBC One
+ BBC Two HD
+ BBC Two
+ CNN HD
+ CNN
+ Euronews E HD
+ Euronews E
+ Fashion TV HD
+ FashionTV
+ Motorvision+
+ Motorvision+ HD
+ MTV Live HD
+ Penthouse Gold
+ W Sports
+
diff --git a/sites/pickx.be/pickx.be_fr.channels.xml b/sites/pickx.be/pickx.be_fr.channels.xml
new file mode 100644
index 00000000..627495fc
--- /dev/null
+++ b/sites/pickx.be/pickx.be_fr.channels.xml
@@ -0,0 +1,196 @@
+
+
+ Disney+
+ Studio PXS F
+ RegInfo F
+ 13ÃĻ Rue HD
+ 13ÃĻ Rue
+ AB3 HD
+ AB3
+ ABXPLO HD
+ ABXPLORE
+ Action HD
+ Action
+ Antenne Centre HD
+ Antenne C
+ Animaux HD
+ Animaux
+ arte HD
+ Arte
+ AUTOMOTO HD
+ AUTOMOTO
+ Baby TV F HD
+ Baby TV F
+ Be1
+ Be CinÃĐ
+ bel RTL HD
+ Be SÃĐries
+ Boom F HD
+ Boomerang F
+ BoukÃĐ HD
+ BoukÃĐ
+ bx1 HD
+ bx1
+ C8
+ Canal J HD
+ Canal J
+ Canal Z HD
+ Canal Z
+ Canal Zoom HD
+ Canal Zoom
+ Cartoon F HD
+ Cartoon F
+ CinÃĐ+Classic
+ CinÃĐ+Frisson
+ CinÃĐ+Premier
+ RTL club
+ RTL club HD
+ Comedy Central F
+ Crime District
+ Discovery F
+ Disc HD F
+ Disn Ch HD F
+ Disn Ch F
+ Disn Jr F HD
+ Disn Jr F
+ Dobbit TV F
+ Dorcel XXX HD
+ Dorcel XXX
+ E! HD F
+ E! F
+ ES1 F
+ ES1 F HD
+ ES2 F
+ ES2 F HD
+ ES3 F
+ ES3 F HD
+ Eleven Pro League 1 (FR) [HD]
+ Eleven Pro League 1 (FR)
+ Eleven Pro League 2 (FR) [HD]
+ Eleven Pro League 2 (FR)
+ Eleven Pro League 3 (FR) [HD]
+ Eleven Pro League 3 (FR)
+ Euronews F
+ Euronews F HD
+ Eurosp F
+ Eurosp HD F
+ Eurosp2 HD F
+ Eurosp2 F
+ France 2
+ France 2 HD
+ France 3 HD
+ France 3
+ France 4 HD
+ France 4
+ France 5 HD
+ France 5
+ France 24 HD
+ France 24 F
+ Game One
+ Gulli HD
+ Histoire HD
+ Histoire
+ KTO
+ La Trois
+ La Trois HD
+ La Une
+ La Une HD
+ LCI HD
+ LCI
+ LN24
+ Mangas HD
+ Mangas
+ MaTÃĐlÃĐ
+ MaTÃĐlÃĐ HD
+ Melody.tv HD
+ Melody.tv
+ MezzoLive
+ MTV F
+ MTV Hits HD
+ MTV Hits
+ Museum TV
+ MyZen.tv
+ NGC F
+ NGC HD F
+ NGC Wild F
+ nick F
+ nick jr F
+ No TÃĐlÃĐ HD
+ No TÃĐlÃĐ
+ Paramount Channel
+ PickxLive F HD
+ PickxLive F HD
+ PickxLive F
+ PickxLive F
+ Pickx+ F
+ Pickx+ F HD
+ Pickx+ F HD
+ Pickx+ F HD
+ Pickx+ Sports 1 F HD
+ Pickx+ Sports 1 F HD
+ Pickx+ Sports 1 F
+ Pickx+ Sports 2 F
+ Pickx+ Sports 2 F HD
+ Pickx+ Sports 3 F
+ Pickx+ Sports 3 F HD
+ Pickx+ Sports 4 F
+ Pickx+ Sports 4 F HD
+ Pickx+ Sports 5 F
+ Pickx+ Sports 5 F HD
+ Pickx+ Sports 6 F
+ Pickx+ Sports 6 F HD
+ Pickx+ Sports 7 F
+ Pickx+ Sports 7 F HD
+ Pickx+ Sports 8 F HD
+ Pickx+ Sports 8 F
+ Pickx+ Sports 9 F HD
+ Pickx+ Sports 9 F
+ Pickx+ Sports 10 F HD
+ Pickx+ Sports 10 F
+ Pink HD
+ Pink
+ RTL plug HD
+ RTL plug
+ ContactV
+ RFM TV HD
+ RFM TV
+ RTC LiÃĻge HD
+ RTC LiÃĻge
+ RTL tvi HD
+ RTL tvi
+ Sc et Vie TV HD
+ Sc et Vie TV
+ SyFy HD F
+ SyFy F
+ TCM CinÃĐma HD
+ TCM cinÃĐma
+ TÃĐlÃĐ MB HD
+ TÃĐlÃĐ MB
+ TÃĐlÃĐ Sambre
+ TÃĐlÃĐ Sambre HD
+ TF1
+ TF1 HD
+ TF1 SÃĐries Films
+ Tiji HD
+ Tiji
+ TIPIK HD
+ TIPIK
+ TIPIK vision
+ TMC HD
+ Trace HD
+ TraceUrban
+ TREK HD
+ TREK
+ TV5 Monde HD
+ TV5 Monde
+ TV Breizh HD
+ TV Breizh
+ TV Com
+ TV Com HD
+ TV Lux
+ TV Lux HD
+ UshuaÃŊa
+ UshuaÃŊa HD
+ Vedia
+ VÃĐdia HD
+
diff --git a/sites/pickx.be/pickx.be_nl.channels.xml b/sites/pickx.be/pickx.be_nl.channels.xml
new file mode 100644
index 00000000..50dae1fe
--- /dev/null
+++ b/sites/pickx.be/pickx.be_nl.channels.xml
@@ -0,0 +1,160 @@
+
+
+ WTV HD
+ Studio PXS N
+ WTV
+ RegInfo N
+ Animal Pl HD
+ Animal Pl
+ ATV HD
+ ATV
+ AVS HD
+ AVS Gent
+ Baby TV N HD
+ Baby TV N
+ BRUZZ HD
+ BRUZZ
+ VRT Canvas
+ VRT Canvas HD
+ Cartoonito HD
+ Cartoonito
+ Cartoon N HD
+ Cartoon N
+ Comedy Central N HD
+ Comedy Central N
+ Discovery N
+ Disc HD N
+ Disc Sc HD
+ Disc Science
+ Disn Ch HD N
+ Disn Ch N
+ DisnJr N
+ Dobbit TV N
+ Dobbit N HD
+ Dusk
+ Eclips
+ VRT 1
+ VRT 1 HD
+ E! HD N
+ E! N
+ ES1 N
+ ES1 N HD
+ ES2 N
+ ES2 N HD
+ ES3 N
+ ES3 N HD
+ Eleven Pro League 1 (NL) [HD]
+ Eleven Pro League 1 (NL)
+ Eleven Pro League 2 (NL) [HD]
+ Eleven Pro League 2 (NL)
+ Eleven Pro League 3 (NL) [HD]
+ Eleven Pro League 3 (NL)
+ Eurosp N
+ Eurosp HD N
+ Eurosp2 HD N
+ Eurosp2 N
+ Focus TV HD
+ Focus TV
+ STAR Channel HD
+ History HD
+ History
+ INPLUS
+ Inv Disc HD
+ Inv Disc
+ Kanaal Z HD
+ Kanaal Z
+ Ketnet HD
+ Ketnet
+ Ment TV HD
+ Ment TV
+ MTV 80s
+ MTV N HD
+ MTV N
+ NGC HD N
+ NGC N
+ NGC Wild N
+ nick N HD
+ nick N
+ nick jr N
+ nick Toons
+ Njam! HD
+ Njam!
+ NPO 1 HD
+ NPO 1
+ NPO 2 HD
+ NPO 2
+ NPO 3 HD
+ NPO 3
+ OUT tv
+ Passie XXX HD
+ Passie XXX
+ PickxLive N HD
+ PickxLive N HD
+ PickxLive N
+ PickxLive N
+ Pickx+ N
+ Pickx+ N HD
+ Pickx+ N HD
+ Pickx+ N HD
+ Pickx+ Sports 1 N
+ Pickx+ Sports 1 N HD
+ Pickx+ Sports 1 N HD
+ Pickx+ Sports 2 N
+ Pickx+ Sports 2 N HD
+ Pickx+ Sports 3 N
+ Pickx+ Sports 3 N HD
+ Pickx+ Sports 4 N
+ Pickx+ Sports 4 N HD
+ Pickx+ Sports 5 N
+ Pickx+ Sports 5 N HD
+ Pickx+ Sports 6 N
+ Pickx+ Sports 6 N HD
+ Pickx+ Sports 7 N
+ Pickx+ Sports 7 N HD
+ Pickx+ Sports 8 N HD
+ Pickx+ Sports 8 N
+ Pickx+ Sports 9 N HD
+ Pickx+ Sports 9 N
+ Pickx+ Sports 10 N HD
+ Pickx+ Sports 10 N
+ Plattelands
+ Play4 HD
+ Play4
+ Play5 HD
+ Play5
+ Play6
+ Play6 HD
+ Play7 HD
+ Q-Music Kijk Live
+ Ring TV HD
+ Ring TV
+ ROBTV HD
+ ROB TV
+ RTV Kempen HD
+ RTV Kempen O
+ RTV Mech HD
+ RTV Mech
+ Sport 10
+ Sport 10 HD
+ Classica
+ StuBru
+ ST100TV HD N
+ ST100TV N
+ TLC
+ TV Limburg HD
+ TVLimbC
+ TV Oost HD
+ TV Oost
+ Vlaamsparlement.tv
+ VTM 2 HD
+ VTM 2
+ VTM 3 HD
+ VTM 3
+ VTM 4 HD
+ VTM 4
+ VTM
+ VTM HD
+ VTM Gold
+ VTM NON-STOP DOKTERS HD
+ VTM NON-STOP DOKTERS
+
diff --git a/sites/pickx.be/readme.md b/sites/pickx.be/readme.md
new file mode 100644
index 00000000..9c9077ef
--- /dev/null
+++ b/sites/pickx.be/readme.md
@@ -0,0 +1,61 @@
+# pickx.be
+
+https://www.pickx.be/fr/television/programme-tv
+
+### Download the guide
+
+Dutch:
+
+```sh
+npm run grab -- --site=pickx.be --lang=nl
+```
+
+English:
+
+```sh
+npm run grab -- --site=pickx.be --lang=en
+```
+
+French:
+
+```sh
+npm run grab -- --site=pickx.be --lang=fr
+```
+
+German:
+
+```sh
+npm run grab -- --site=pickx.be --lang=de
+```
+
+### Update channel list
+
+Dutch:
+
+```sh
+npm run channels:parse -- --config=./sites/pickx.be/pickx.be.config.js --output=./sites/pickx.be/pickx.be_nl.channels.xml --set=lang:nl
+```
+
+English:
+
+```sh
+npm run channels:parse -- --config=./sites/pickx.be/pickx.be.config.js --output=./sites/pickx.be/pickx.be_en.channels.xml --set=lang:en
+```
+
+French:
+
+```sh
+npm run channels:parse -- --config=./sites/pickx.be/pickx.be.config.js --output=./sites/pickx.be/pickx.be_fr.channels.xml --set=lang:fr
+```
+
+German:
+
+```sh
+npm run channels:parse -- --config=./sites/pickx.be/pickx.be.config.js --output=./sites/pickx.be/pickx.be_de.channels.xml --set=lang:de
+```
+
+### Test
+
+```sh
+npm test -- pickx.be
+```
diff --git a/sites/proximusmwc.be/proximusmwc.be.channels.xml b/sites/proximusmwc.be/proximusmwc.be.channels.xml
deleted file mode 100644
index 905a9c45..00000000
--- a/sites/proximusmwc.be/proximusmwc.be.channels.xml
+++ /dev/null
@@ -1,210 +0,0 @@
-
-
- BRF TV HD
- Das Erste
- RTL
- ZDF
- BBC Ent
- BBC First
- BBC One
- BBC Two
- BBC World
- CNN
- eSportsONE
- Euronews E
- Extreme
- FashionTV
- MVTV
- MTV Live HD
- Penthouse Gold
- TVE Int
- 13ÃĻ Rue HD
- 2M Monde
- AB3
- ABXPLO HD
- Action
- Antenne Centre HD
- Al Aoula
- Al Jazeera
- Animaux
- Arte
- AUTOMOTO
- Be1
- Be CinÃĐ
- Bel RTL
- Be SÃĐries
- Boomerang F
- BoukÃĐ HD
- bx1
- C8
- Canal J
- Canal Zoom
- Cartoon F
- CinÃĐ+Classic
- CinÃĐ+Frisson
- CinÃĐ+Premier
- ClubRTL
- Comedy Central F
- Crime District
- Discovery F
- Disn Ch HD F
- Disn Jr F
- Dobbit TV F
- Dorcel XXX
- E! F
- Euronews F
- Eurosp F
- Eurosp2 F
- France 2
- France 24 F
- France 3
- France 4
- France 5
- Game One
- Gulli HD
- Histoire
- KTO
- La Trois
- La Une
- LCI
- LN24
- Maghreb TV
- Mangas
- MaTÃĐlÃĐ
- Melody.tv
- MezzoLive
- MTV F
- MTV Hits
- Museum TV
- MyZen.tv
- NGC F
- NGC Wild F
- nick F
- nick jr F
- No TÃĐlÃĐ HD
- Paramount Channel
- PickxLive F HD
- Pickx+ F
- Pickx+ Sports 10 F HD
- Pickx+ Sports 1 F
- Pickx+ Sports 3 F
- Pickx+ Sports 4 F
- Pickx+ Sports 5 F
- Pickx+ Sports 6 F
- Pickx+ Sports 7 F
- Pickx+ Sports 8 F HD
- Pickx+ Sports 9 F HD
- Pink
- PlugRTL
- ContactV
- RFM TV
- RTC LiÃĻge HD
- RTL-TVI
- Sc et Vie TV
- ST100TV F
- SyFy F
- TCM cinÃĐma
- TÃĐlÃĐ MB HD
- TÃĐlÃĐ Sambre
- TF1
- Tiji
- TIPIK
- TIPIK vision
- TMC HD
- TraceUrban
- TREK
- TV5 Monde
- TV Breizh
- TV Com
- TV Lux
- UshuaÃŊa
- Vedia
- Mediaset
- RAI Uno
- RAI Due
- RAI Tre
- Animal Pl
- ATV
- AVS HD
- AVS Gent
- Baby TV N
- Boomerang N
- BRUZZ HD
- Canvas
- Cartoon N
- Comedy Central N
- Discovery N
- Disc Science
- Disn Ch N
- DisnJr N
- Dobbit TV N
- Dusk
- Eclips
- ÃĐÃĐn
- E! N
- ES1 N
- ES2 N
- ES3 N
- Eleven Pro League 1 (NL)
- Eleven Pro League 2 (NL)
- Eleven Pro League 3 (NL)
- Eurosp N
- Eurosp2 N
- Focus TV HD
- FOX
- History
- Insight TV
- Inv Disc
- Kanaal Z
- Ketnet
- Ment TV
- MTV 80s
- MTV N
- NGC N
- NGC Wild N
- nick N
- nick jr N
- nick Toons
- Njam! HD
- NPO 1
- NPO 2
- NPO 3
- OUT tv
- Passie XXX
- Pebble TV
- PickxLive N HD
- Pickx+ N
- Pickx+ Sports 10 N
- Pickx+ Sports 1 N
- Pickx+ Sports 2 N
- Pickx+ Sports 3 N
- Pickx+ Sports 4 N
- Pickx+ Sports 5 N
- Pickx+ Sports 6 N
- Pickx+ Sports 7 N
- Pickx+ Sports 8 N
- Pickx+ Sports 9 N
- Plattelands
- Play4
- Play5
- Play6
- Play7 HD
- Ring TV HD
- ROB TV
- RTV Kempen HD
- RTV Mech HD
- Sport 10
- Classica
- ST100 Hits
- ST100TV N
- TLC
- TVLimbC
- TV Oost
- Vlaamsparlement.tv
- VTM
- VTM 2
- VTM 3
- VTM 4
- VTM Gold
- VTM Kids
-
diff --git a/sites/proximusmwc.be/proximusmwc.be.config.js b/sites/proximusmwc.be/proximusmwc.be.config.js
deleted file mode 100644
index c07899ff..00000000
--- a/sites/proximusmwc.be/proximusmwc.be.config.js
+++ /dev/null
@@ -1,80 +0,0 @@
-const axios = require('axios')
-const dayjs = require('dayjs')
-
-module.exports = {
- site: 'proximusmwc.be',
- days: 2,
- url: 'https://api.proximusmwc.be/v2/graphql',
- request: {
- headers: {
- 'Content-Type': 'application/json'
- },
- data({ channel, date }) {
- return {
- query:
- 'query ($language: String!, $startTime: Int!, $endTime: Int!, $options: SchedulesByIntervalOptions) { schedulesByInterval(language: $language, startTime: $startTime, endTime: $endTime, options: $options) { trailId programReferenceNumber channelId title category startTime endTime image { key url __typename } parentalRating detailUrl grouped description shortDescription category categoryId subCategory links { episodeNumber id seasonId seasonName seriesId seriesTitle title type __typename } seriesId __typename }}',
- variables: {
- startTime: date.unix(),
- endTime: date.add(1, 'd').unix(),
- language: 'fr',
- options: { channelIds: [channel.site_id] }
- }
- }
- }
- },
- parser: function ({ content }) {
- const programs = []
- const items = parseItems(content)
- items.forEach(item => {
- programs.push({
- title: item.title,
- description: item.description,
- icon: parseIcon(item),
- category: parseCategory(item),
- start: dayjs.unix(item.startTime),
- stop: dayjs.unix(item.endTime)
- })
- })
-
- return programs
- },
- async channels() {
- const query = {
- operationName: 'getPlayableChannels',
- variables: { language: 'fr', id: '0' },
- query:
- 'query getPlayableChannels($language: String!, $queryParams: ChannelQueryParams, $id: String) { playableChannels(language: $language, queryParams: $queryParams, id: $id) { id name language radio }}'
- }
- const data = await axios
- .post('https://api.proximusmwc.be/v2/graphql', query)
- .then(r => r.data)
- .catch(console.log)
-
- const channels = []
- for (let item of data.data.playableChannels) {
- if (item.radio) continue
- channels.push({
- lang: item.language,
- site_id: item.id,
- name: item.name
- })
- }
-
- return channels
- }
-}
-
-function parseCategory(item) {
- return item.category ? item.category.replace(/^C\./, '') : null
-}
-
-function parseIcon(item) {
- return item.image[0] ? item.image[0].url : null
-}
-
-function parseItems(content) {
- const data = JSON.parse(content)
- if (!data || !data.data || !Array.isArray(data.data.schedulesByInterval)) return []
-
- return data.data.schedulesByInterval
-}
diff --git a/sites/proximusmwc.be/proximusmwc.be.test.js b/sites/proximusmwc.be/proximusmwc.be.test.js
deleted file mode 100644
index c692bb33..00000000
--- a/sites/proximusmwc.be/proximusmwc.be.test.js
+++ /dev/null
@@ -1,66 +0,0 @@
-const { parser, url, request } = require('./proximusmwc.be.config.js')
-const dayjs = require('dayjs')
-const utc = require('dayjs/plugin/utc')
-const customParseFormat = require('dayjs/plugin/customParseFormat')
-dayjs.extend(customParseFormat)
-dayjs.extend(utc)
-
-const date = dayjs.utc('2022-03-04', 'YYYY-MM-DD').startOf('d')
-const channel = {
- site_id: 'UID0024',
- xmltv_id: 'DasErste.de'
-}
-
-it('can generate valid url', () => {
- expect(url).toBe('https://api.proximusmwc.be/v2/graphql')
-})
-
-it('can generate valid request headers', () => {
- expect(request.headers).toMatchObject({
- 'Content-Type': 'application/json'
- })
-})
-
-it('can generate valid request data', () => {
- expect(request.data({ channel, date })).toMatchObject({
- query:
- 'query ($language: String!, $startTime: Int!, $endTime: Int!, $options: SchedulesByIntervalOptions) { schedulesByInterval(language: $language, startTime: $startTime, endTime: $endTime, options: $options) { trailId programReferenceNumber channelId title category startTime endTime image { key url __typename } parentalRating detailUrl grouped description shortDescription category categoryId subCategory links { episodeNumber id seasonId seasonName seriesId seriesTitle title type __typename } seriesId __typename }}',
- variables: {
- endTime: 1646438400,
- language: 'fr',
- options: { channelIds: ['UID0024'] },
- startTime: 1646352000
- }
- })
-})
-
-it('can parse response', () => {
- const content =
- '{"data":{"schedulesByInterval":[{"trailId":"UID0024_202202225537","programReferenceNumber":"107504040014","channelId":"UID0024","title":"Der Bozen-Krimi","category":"C.Magazine","startTime":1646350800,"endTime":1646356200,"description":"Chiara Schoras alias \\"Capo\\" Sonja Schwarz muss im 14. Bozen-Krimi nicht nur einen widersprÞchlichen Mordfall aufklÃĪren, sondern auch ein Geheimnis ans Licht bringen, das zwei Familien auf schmerzhafte Weise untrennbar verbindet.","image":[{"key":"source","url":"https://experience-cache.proximustv.be:443/posterserver/poster/EPG/250_250_BF6BF77FC28F72FA23EAEA6CAAE98B60.jpg","__typename":"Image"},{"key":"custom","url":"https://experience-cache.proximustv.be:443/posterserver/poster/EPG/w-%width%_h-%height%/250_250_BF6BF77FC28F72FA23EAEA6CAAE98B60.jpg","__typename":"Image"}]}]}}'
- const result = parser({ content, channel, date }).map(p => {
- p.start = p.start.toJSON()
- p.stop = p.stop.toJSON()
- return p
- })
-
- expect(result).toMatchObject([
- {
- start: '2022-03-03T23:40:00.000Z',
- stop: '2022-03-04T01:10:00.000Z',
- title: 'Der Bozen-Krimi',
- description:
- 'Chiara Schoras alias "Capo" Sonja Schwarz muss im 14. Bozen-Krimi nicht nur einen widersprÞchlichen Mordfall aufklÃĪren, sondern auch ein Geheimnis ans Licht bringen, das zwei Familien auf schmerzhafte Weise untrennbar verbindet.',
- category: 'Magazine',
- icon: 'https://experience-cache.proximustv.be:443/posterserver/poster/EPG/250_250_BF6BF77FC28F72FA23EAEA6CAAE98B60.jpg'
- }
- ])
-})
-
-it('can handle empty guide', () => {
- const result = parser({
- date,
- channel,
- content: '{"data":{"schedulesByInterval":[]}}'
- })
- expect(result).toMatchObject([])
-})
diff --git a/sites/proximusmwc.be/readme.md b/sites/proximusmwc.be/readme.md
deleted file mode 100644
index 4fb66f5c..00000000
--- a/sites/proximusmwc.be/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# proximusmwc.be
-
-http://proximusmwc.be/
-
-### Download the guide
-
-```sh
-npm run grab -- --site=proximusmwc.be
-```
-
-### Update channel list
-
-```sh
-npm run channels:parse -- --config=./sites/proximusmwc.be/proximusmwc.be.config.js --output=./sites/proximusmwc.be/proximusmwc.be.channels.xml
-```
-
-### Test
-
-```sh
-npm test -- proximusmwc.be
-```
diff --git a/sites/rotana.net/__data__/content_ar.html b/sites/rotana.net/__data__/content_ar.html
index 4c72c90d..fb783989 100644
--- a/sites/rotana.net/__data__/content_ar.html
+++ b/sites/rotana.net/__data__/content_ar.html
@@ -1,203 +1,51 @@
\ No newline at end of file
diff --git a/sites/rotana.net/__data__/content_en.html b/sites/rotana.net/__data__/content_en.html
index 893fd79c..9a9e9ecf 100644
--- a/sites/rotana.net/__data__/content_en.html
+++ b/sites/rotana.net/__data__/content_en.html
@@ -1,203 +1,51 @@
- Karim and Jihan separate after a year of marriage due to her discovering his betrayal in her home. Karim tries to get his wife back, but she refuses. Karim calls his old colleague Maha to help him. Ho...
-
- Country
- :
- Egypt
-
-
- Release Year
- :
- 2005
-
-
- Category
- :
- Movie
-
-
- Language
- :
- Arabic
-
-
-
-
-
\ No newline at end of file
diff --git a/sites/rotana.net/__data__/program_ar.html b/sites/rotana.net/__data__/program_ar.html
new file mode 100644
index 00000000..2da8a525
--- /dev/null
+++ b/sites/rotana.net/__data__/program_ar.html
@@ -0,0 +1,240 @@
+
+
+ In a comic framework, the events of the film revolve around (Katkoot) Al-Saedi, whose aunt, the eldest of the Al-Saedi family, tries to force him to kill himself in order to ransom his family. A time...
+