From 452c91c5bb2b51955d8107c2e821bf180f7d08b2 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Thu, 1 Dec 2022 13:51:00 +0300 Subject: [PATCH 1/5] Create content.json --- sites/rtp.pt/__data__/content.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 sites/rtp.pt/__data__/content.json diff --git a/sites/rtp.pt/__data__/content.json b/sites/rtp.pt/__data__/content.json new file mode 100644 index 00000000..77bc60c5 --- /dev/null +++ b/sites/rtp.pt/__data__/content.json @@ -0,0 +1 @@ +{"_info": {"name":"RTP1","skin":"rtp-1","logoUrl":"https:\/\/cdn-images.rtp.pt\/common\/img\/channels\/logos\/color\/horizontal\/rtp1.png?f=png","epgUrl":"https:\/\/www.rtp.pt\/rtp1\/","timeZone":"lis"}, "result":{"morning":[{"date":"2022-12-02 06:30:00","id":"41585","name":"Bom Dia Portugal","series":"","description":"E porque é de manhã que começa o dia, então inicie-o na nossa companhia!","symbols":[{"symbol_id":"21","symbol_description":"Direto"},{"symbol_id":"05","symbol_description":"Teletexto"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"15","symbol_description":"Língua Gestual"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p41585","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/38084_57380_28384.png?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/38084_57380_28384.png?w=384&h=216"}]},{"date":"2022-12-02 10:00:00","id":"41651","name":"Praça da Alegria","series":"","description":"Otimismo, entusiasmo e muita energia nas manhãs de Portugal!","symbols":[{"symbol_id":"21","symbol_description":"Direto"},{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"15","symbol_description":"Língua Gestual"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p41651","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/36375_51571_10521.png?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/36375_51571_10521.png?w=384&h=216"}]},{"date":"2022-12-02 12:59:00","id":"41588","name":"Jornal da Tarde","series":"","description":"Assim que a tarde começa, nós já temos para si as notícias do dia","symbols":[{"symbol_id":"21","symbol_description":"Direto"},{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"15","symbol_description":"Língua Gestual"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p41588","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/32531_39576_60708.jpg?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/32531_39576_60708.jpg?w=384&h=216"}]}],"afternoon":[{"date":"2022-12-02 14:23:00","id":"31710","name":"Os Nossos Dias","series":"2","description":"É mais do que uma história de vingança. Uma luta constante pela verdade e justiça. Um jogo onde ninguém pode confiar em ninguém ","symbols":[{"symbol_id":"05","symbol_description":"Teletexto"},{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"02","symbol_description":"10AP"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p31710\/e156","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/30353_34201_77012.jpg?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/30353_34201_77012.jpg?w=384&h=216"}]},{"date":"2022-12-02 15:05:00","id":"41652","name":"A Nossa Tarde","series":"","description":"A Nossa Tarde é o seu lugar","symbols":[{"symbol_id":"21","symbol_description":"Direto"},{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"15","symbol_description":"Língua Gestual"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"http:\/\/media.rtp.pt\/anossatarde\/","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/37127_53815_22501.png?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/37127_53815_22501.png?w=384&h=216"}]},{"date":"2022-12-02 17:30:00","id":"41640","name":"Portugal em Direto","series":"","description":"Dina Aguiar dá-lhe a conhecer tudo o que de mais importante se passa no país","symbols":[{"symbol_id":"21","symbol_description":"Direto"},{"symbol_id":"05","symbol_description":"Teletexto"},{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"15","symbol_description":"Língua Gestual"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p41640","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/35188_47472_19659.png?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/35188_47472_19659.png?w=384&h=216"}]},{"date":"2022-12-02 18:51:00","id":"43098","name":"FIFA Campeonato do Mundo de Futebol 2022 - Camarões x Brasil","series":"","description":"O Mundial 2022 é na sua RTP","symbols":[{"symbol_id":"21","symbol_description":"Direto"},{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"16","symbol_description":"16:9"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p43098","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/39822_60238_80160.jpg?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/39822_60238_80160.jpg?w=384&h=216"}]}],"evening":[{"date":"2022-12-02 21:07:00","id":"41587","name":"Telejornal","series":"","description":"A mais rigorosa seleção de notícias, todos os dias às 20h00","symbols":[{"symbol_id":"21","symbol_description":"Direto"},{"symbol_id":"05","symbol_description":"Teletexto"},{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"15","symbol_description":"Língua Gestual"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p41587","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/41587_67027_2285.png?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/41587_67027_2285.png?w=384&h=216"}]},{"date":"2022-12-02 21:45:00","id":"42690","name":"Porquinho Mealheiro","series":"1","description":"Apresentado por Vasco Palmeirim, um concurso divertido onde a família joga em equipa","symbols":[{"symbol_id":"05","symbol_description":"Teletexto"},{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p42690\/e83","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/42690_66287_57332.jpg?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/42690_66287_57332.jpg?w=384&h=216"}]},{"date":"2022-12-02 22:54:00","id":"42547","name":"Em Casa d´ Amália","series":"4","description":"Programa inspirado nas célebres noites em que Amália Rodrigues recebia em sua casa, poetas, cantores, pintores, músicos, atores para tertúlias infindáveis","symbols":[{"symbol_id":"05","symbol_description":"Teletexto"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p42547\/e8","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/38712_57580_79750.jpg?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/38712_57580_79750.jpg?w=384&h=216"}]},{"date":"2022-12-03 00:11:00","id":"43092","name":"Catar 2022 - Noites do Mundial","series":"","description":"Acompanhe todo o Mundial do Catar 2022 na RTP3","symbols":[{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p43092\/e14","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/43092_67198_16123.png?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/43092_67198_16123.png?w=384&h=216"}]},{"date":"2022-12-03 01:47:00","id":"40487","name":"300 Milhões de Anos","series":"","description":"A Grande Colisão","symbols":[{"symbol_id":"05","symbol_description":"Teletexto"},{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"16","symbol_description":"16:9"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p40487\/e1","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/40487_61517_20001.jpg?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/40487_61517_20001.jpg?w=384&h=216"}]},{"date":"2022-12-03 02:44:00","id":"41652","name":"A Nossa Tarde","series":"","description":"A Nossa Tarde é o seu lugar","symbols":[{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"http:\/\/media.rtp.pt\/anossatarde\/","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/37127_53815_22501.png?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/37127_53815_22501.png?w=384&h=216"}]},{"date":"2022-12-03 05:01:00","id":"1132","name":"Televendas","series":"","description":"Um mundo de produtos, à distância de um telefone ","symbols":[{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"17","symbol_description":"4:3"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p1132","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/1132_35764_19125.jpg?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/1132_35764_19125.jpg?w=384&h=216"}]},{"date":"2022-12-03 06:17:00","id":"42817","name":"A Vida Privada dos Livros","series":"4","description":"História de livros com a jornalista Ana Daniela Soares o bibliófilo Alberto Manguel","symbols":[{"symbol_id":"19","symbol_description":"HD"},{"symbol_id":"01","symbol_description":"Todos"},{"symbol_id":"16","symbol_description":"16:9"},{"symbol_id":"18","symbol_description":"RTP Play"}],"url":"https:\/\/www.rtp.pt\/programa\/tv\/p42817\/e5","rights":{"program_name":null,"rule":null},"image":[{"width":"160","height":"65","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/42817_66549_1587.png?w=160"},{"width":"384","height":"216","src":"https:\/\/cdn-images.rtp.pt\/EPG\/imagens\/42817_66549_1587.png?w=384&h=216"}]}]}} \ No newline at end of file From 721e0598cdeb9c4a6aa18e57bc8206ed2e30da42 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Thu, 1 Dec 2022 13:51:05 +0300 Subject: [PATCH 2/5] Create rtp.pt.test.js --- sites/rtp.pt/rtp.pt.test.js | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 sites/rtp.pt/rtp.pt.test.js diff --git a/sites/rtp.pt/rtp.pt.test.js b/sites/rtp.pt/rtp.pt.test.js new file mode 100644 index 00000000..f5759d41 --- /dev/null +++ b/sites/rtp.pt/rtp.pt.test.js @@ -0,0 +1,45 @@ +// npm run channels:parse -- --config=./sites/rtp.pt/rtp.pt.config.js --output=./sites/rtp.pt/rtp.pt_pt.channels.xml +// npx epg-grabber --config=sites/rtp.pt/rtp.pt.config.js --channels=sites/rtp.pt/rtp.pt_pt.channels.xml --output=guide.xml --days=2 + +const { parser, url } = require('./rtp.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('2022-12-02', 'YYYY-MM-DD').startOf('d') +const channel = { + site_id: '1', + xmltv_id: 'RTP1.pt' +} + +it('can generate valid url', () => { + expect(url({ channel, date })).toBe( + 'https://www.rtp.pt/EPG/json/rtp-channels-page/list-grid/tv/1/2-12-2022' + ) +}) + +it('can parse response', () => { + const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json')) + let results = parser({ content }).map(p => { + p.start = p.start.toJSON() + p.stop = p.stop.toJSON() + return p + }) + + expect(results[0]).toMatchObject({ + start: '2022-12-02T06:30:00.000Z', + stop: '2022-12-02T10:00:00.000Z', + title: 'Bom Dia Portugal', + description: 'E porque é de manhã que começa o dia, então inicie-o na nossa companhia!', + icon: 'https://cdn-images.rtp.pt/EPG/imagens/38084_57380_28384.png?w=384&h=216' + }) +}) + +it('can handle empty guide', () => { + const result = parser({ content: '', channel, date }) + expect(result).toMatchObject([]) +}) From b3e30bbed0f8640bc08899397be31e12fb38967c Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Thu, 1 Dec 2022 13:51:11 +0300 Subject: [PATCH 3/5] Create rtp.pt.config.js --- sites/rtp.pt/rtp.pt.config.js | 72 +++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 sites/rtp.pt/rtp.pt.config.js diff --git a/sites/rtp.pt/rtp.pt.config.js b/sites/rtp.pt/rtp.pt.config.js new file mode 100644 index 00000000..13a19b46 --- /dev/null +++ b/sites/rtp.pt/rtp.pt.config.js @@ -0,0 +1,72 @@ +const _ = require('lodash') +const axios = require('axios') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +const customParseFormat = require('dayjs/plugin/customParseFormat') + +dayjs.extend(utc) +dayjs.extend(timezone) +dayjs.extend(customParseFormat) + +module.exports = { + site: 'rtp.pt', + url({ channel, date }) { + return `https://www.rtp.pt/EPG/json/rtp-channels-page/list-grid/tv/${ + channel.site_id + }/${date.format('D-M-YYYY')}` + }, + parser({ content }) { + let programs = [] + const items = parseItems(content) + items.forEach(item => { + const prev = programs[programs.length - 1] + let start = parseStart(item) + if (!start) return + if (prev) { + prev.stop = start + } + const stop = start.add(30, 'm') + programs.push({ + title: item.name, + description: item.description, + icon: parseIcon(item), + start, + stop + }) + }) + + return programs + }, + async channels() { + const items = await axios + .get('https://www.rtp.pt/EPG/json/rtp-home-page/list-channels/tv') + .then(r => r.data.result) + .catch(console.error) + + return items.map(i => { + return { + lang: 'pt', + site_id: i.channel_code, + name: i.channel_name + } + }) + } +} + +function parseIcon(item) { + const last = item.image.pop() + + return last?.src +} + +function parseStart(item) { + return dayjs.tz(item.date, 'YYYY-MM-DD HH:mm:ss', 'Europe/Lisbon') +} + +function parseItems(content) { + if (!content) return [] + const data = JSON.parse(content) + + return _.flatten(Object.values(data.result)) +} From f3583dc8e4c3fe93822107ba4b4ce5378dde822f Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Thu, 1 Dec 2022 13:51:16 +0300 Subject: [PATCH 4/5] Create rtp.pt_pt.channels.xml --- sites/rtp.pt/rtp.pt_pt.channels.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 sites/rtp.pt/rtp.pt_pt.channels.xml diff --git a/sites/rtp.pt/rtp.pt_pt.channels.xml b/sites/rtp.pt/rtp.pt_pt.channels.xml new file mode 100644 index 00000000..fb6817e7 --- /dev/null +++ b/sites/rtp.pt/rtp.pt_pt.channels.xml @@ -0,0 +1,13 @@ + + + + RTP1 + RTP2 + RTP3 + RTP Memória + RTP África + RTP Internacional + RTP Açores + RTP Madeira + + From 225da2bfe78615e1684789109b187647362d6f34 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Thu, 1 Dec 2022 13:51:19 +0300 Subject: [PATCH 5/5] Create rtp.pt.yml --- .github/workflows/rtp.pt.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/rtp.pt.yml diff --git a/.github/workflows/rtp.pt.yml b/.github/workflows/rtp.pt.yml new file mode 100644 index 00000000..5dffd0d5 --- /dev/null +++ b/.github/workflows/rtp.pt.yml @@ -0,0 +1,17 @@ +name: rtp.pt +on: + schedule: + - cron: '0 3 * * *' + workflow_dispatch: + workflow_run: + workflows: [_trigger] + types: + - completed +jobs: + load: + uses: ./.github/workflows/_load.yml + with: + site: ${{github.workflow}} + secrets: + APP_ID: ${{ secrets.APP_ID }} + APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}