From 22ee2c7bd5319d0a33eede210e4910761fd69ad9 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 5 Oct 2022 00:31:42 +0300 Subject: [PATCH 1/5] Create content.json --- sites/programacion-tv.elpais.com/__data__/content.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 sites/programacion-tv.elpais.com/__data__/content.json diff --git a/sites/programacion-tv.elpais.com/__data__/content.json b/sites/programacion-tv.elpais.com/__data__/content.json new file mode 100644 index 00000000..9c6e60bb --- /dev/null +++ b/sites/programacion-tv.elpais.com/__data__/content.json @@ -0,0 +1 @@ +[{"idCanal":"3","programas":[{"id":"ME13368522","idCanal":"3","iniDate":"2022-10-04 01:30:00","endDate":"2022-10-04 02:25:00","idSection":"2","txtSection":"Otros","name":"","title":"Comerse el mundo","description":"El cocinero Javier Peña recorre diversos países mostrándonos su diversidad gastronómica.","recommended":"0","id_programa":"CF5266694","idCellnex":"202210040130","duracion":"005500","rating":"0"}]},{"idCanal":"4","programas":[{"id":"CF161485462","idCanal":"4","iniDate":"2022-10-04 00:35:00","endDate":"2022-10-04 01:15:00","idSection":"2","txtSection":"Otros","name":"","title":"Primeras Damas","description":"Eleanor Roosevelt y su esposo, Franklin Delano Roosevelt, formaron el mejor equipo político de la historia americana en la Casa Blanca.","recommended":"0","id_programa":"CF5812759","idCellnex":"202210040035","duracion":"004000","rating":"5"}]}] \ No newline at end of file From 3b5575ecba05715c691a5a3c2fc13bca9221ba79 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 5 Oct 2022 00:31:45 +0300 Subject: [PATCH 2/5] Create programs.json --- .../__data__/programs.json | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 sites/programacion-tv.elpais.com/__data__/programs.json diff --git a/sites/programacion-tv.elpais.com/__data__/programs.json b/sites/programacion-tv.elpais.com/__data__/programs.json new file mode 100644 index 00000000..78b65cc2 --- /dev/null +++ b/sites/programacion-tv.elpais.com/__data__/programs.json @@ -0,0 +1,40 @@ +[{ + "id_programa": "CF5266694", + "id_section": "2", + "txt_section": "Otros", + "title": "Comerse el mundo", + "description": "El cocinero Javier Peña recorre diversos países mostrándonos su diversidad gastronómica.", + "duration": "50", + "artistic": "0", + "commercial": "0", + "id_genre": "03", + "txt_genre": "Ocio-Cultura", + "id_subgenre": "223", + "txt_subgenre": "Cocina", + "id_parental": "0", + "txtParental": "Sin clasificar", + "season": "1", + "episode": "23", + "episode_title": "París", + "episode_description": "El chef Peña viaja hasta París, una de las capitales mundiales de la alta gastronomía. Allí visitará un viñedo muy especial en pleno corazón de la ciudad, probará los famosos caracoles, hará un queso y conocerá a chefs que llegaron a la capital gala para cumplir sus sueños y los consiguieron.", + "total_episodes": "0", + "country": "España", + "year": "", + "director": "Sergio Martín, Victor Arribas", + "script": "Filippo Gravino, Guido Iuculano, Michele Pellegrini", + "actors": "Pietro Sermonti, Maya Sansa, Ana Caterina Morariu", + "producer": "Javier Redondo", + "production": "", + "presented_by": "Javier Peña", + "photography": "", + "music": "Paco Musulén", + "creator": "", + "guest_actors": "Tobia de Angelis, Benedetta Porcaroli, Roberto Nocchi", + "image": "imagenes\/programas\/2099957.jpg", + "poster": "imagenes\/programas\/2099957.jpg", + "paisISO": "ESP", + "imagenPadre": "2099957", + "posterPadre": "2099957", + "seriado": false, + "multievento": false + }] \ No newline at end of file From 165a34c382675ddd91f84148a68da5eee48b2a5a Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 5 Oct 2022 00:31:50 +0300 Subject: [PATCH 3/5] Create programacion-tv.elpais.com.test.js --- .../programacion-tv.elpais.com.test.js | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 sites/programacion-tv.elpais.com/programacion-tv.elpais.com.test.js diff --git a/sites/programacion-tv.elpais.com/programacion-tv.elpais.com.test.js b/sites/programacion-tv.elpais.com/programacion-tv.elpais.com.test.js new file mode 100644 index 00000000..2bf6fa30 --- /dev/null +++ b/sites/programacion-tv.elpais.com/programacion-tv.elpais.com.test.js @@ -0,0 +1,74 @@ +// npx epg-grabber --config=sites/programacion-tv.elpais.com/programacion-tv.elpais.com.config.js --channels=sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml --output=guide.xml --days=2 +// npm run channels:parse -- --config=./sites/programacion-tv.elpais.com/programacion-tv.elpais.com.config.js --output=./sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml + +const { parser, url } = require('./programacion-tv.elpais.com.config.js') +const axios = require('axios') +const fs = require('fs') +const path = require('path') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const customParseFormat = require('dayjs/plugin/customParseFormat') +dayjs.extend(customParseFormat) +dayjs.extend(utc) + +jest.mock('axios') + +const date = dayjs.utc('2022-10-04', 'YYYY-MM-DD').startOf('d') +const channel = { + site_id: '3', + xmltv_id: 'La1.es' +} + +it('can generate valid url', () => { + expect(url({ date })).toBe('https://programacion-tv.elpais.com/data/parrilla_04102022.json') +}) + +it('can parse response', async () => { + const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json')) + axios.get.mockImplementation(url => { + if (url === 'https://programacion-tv.elpais.com/data/programas/3.json') { + return Promise.resolve({ + data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/programs.json'))) + }) + } else { + return Promise.resolve({ data: '' }) + } + }) + + let results = await parser({ content, channel }) + results = results.map(p => { + p.start = p.start.toJSON() + p.stop = p.stop.toJSON() + return p + }) + + expect(results).toMatchObject([ + { + start: '2022-10-03T23:30:00.000Z', + stop: '2022-10-04T00:25:00.000Z', + title: 'Comerse el mundo', + sub_title: 'París', + description: + 'El chef Peña viaja hasta París, una de las capitales mundiales de la alta gastronomía. Allí visitará un viñedo muy especial en pleno corazón de la ciudad, probará los famosos caracoles, hará un queso y conocerá a chefs que llegaron a la capital gala para cumplir sus sueños y los consiguieron.', + director: ['Sergio Martín', 'Victor Arribas'], + presenter: ['Javier Peña'], + writer: ['Filippo Gravino', 'Guido Iuculano', 'Michele Pellegrini'], + actors: ['Pietro Sermonti', 'Maya Sansa', 'Ana Caterina Morariu'], + guest: ['Tobia de Angelis', 'Benedetta Porcaroli', 'Roberto Nocchi'], + producer: ['Javier Redondo'], + composer: ['Paco Musulén'], + category: 'Ocio-Cultura/Cocina', + season: 1, + episode: 23, + icon: 'https://programacion-tv.elpais.com/imagenes/programas/2099957.jpg' + } + ]) +}) + +it('can handle empty guide', async () => { + const result = await parser({ + content: ``, + channel + }) + expect(result).toMatchObject([]) +}) From 1f93d62d72e6bc7f59303e72707777a70c9f8c1f Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 5 Oct 2022 00:31:59 +0300 Subject: [PATCH 4/5] Update programacion-tv.elpais.com.config.js --- .../programacion-tv.elpais.com.config.js | 104 +++++++++++++++--- 1 file changed, 86 insertions(+), 18 deletions(-) diff --git a/sites/programacion-tv.elpais.com/programacion-tv.elpais.com.config.js b/sites/programacion-tv.elpais.com/programacion-tv.elpais.com.config.js index d5bcd8cc..e369dd5d 100644 --- a/sites/programacion-tv.elpais.com/programacion-tv.elpais.com.config.js +++ b/sites/programacion-tv.elpais.com/programacion-tv.elpais.com.config.js @@ -1,3 +1,4 @@ +const axios = require('axios') const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') const timezone = require('dayjs/plugin/timezone') @@ -7,30 +8,97 @@ dayjs.extend(timezone) module.exports = { site: 'programacion-tv.elpais.com', + request: { + cache: { + ttl: 60 * 60 * 1000 // 1 hour + } + }, url: function ({ date }) { return `https://programacion-tv.elpais.com/data/parrilla_${date.format('DDMMYYYY')}.json` }, - parser: function ({ content, date, channel }) { + parser: async function ({ content, channel }) { const programs = [] - const data = JSON.parse(content) - const channelData = data.find(i => i.idCanal === channel.site_id) - if (!channelData) return programs - channelData.programas.forEach(item => { - if (item.title && item.iniDate && item.endDate) { - const startLocal = dayjs.utc(item.iniDate).toString() - const start = dayjs.tz(startLocal.toString(), 'Europe/Madrid') - const stopLocal = dayjs.utc(item.endDate).toString() - const stop = dayjs.tz(stopLocal.toString(), 'Europe/Madrid') - programs.push({ - title: item.title, - description: item.description, - category: item.txtSection, - start, - stop - }) - } + const items = parseItems(content, channel) + if (!items.length) return programs + const programsData = await loadProgramsData(channel) + items.forEach(item => { + const start = parseStart(item) + const stop = parseStop(item) + const details = programsData.find(p => p.id_programa === item.id_programa) || {} + programs.push({ + title: item.title, + sub_title: details.episode_title, + description: details.episode_description || item.description, + category: parseCategory(details), + icon: parseIcon(details), + director: parseList(details.director), + actors: parseList(details.actors), + writer: parseList(details.script), + producer: parseList(details.producer), + presenter: parseList(details.presented_by), + composer: parseList(details.music), + guest: parseList(details.guest_actors), + season: parseNumber(details.season), + episode: parseNumber(details.episode), + start, + stop + }) }) return programs + }, + async channels() { + const data = await axios + .get(`https://programacion-tv.elpais.com/data/canales.json`) + .then(r => r.data) + .catch(console.log) + + return Object.values(data).map(item => ({ + lang: 'es', + site_id: item.id, + name: item.nombre + })) } } + +function parseNumber(str) { + return typeof str === 'string' ? parseInt(str) : null +} + +function parseList(str) { + return typeof str === 'string' ? str.split(', ') : [] +} + +function parseIcon(details) { + const url = new URL(details.image, 'https://programacion-tv.elpais.com/') + + return url.href +} + +function parseCategory(details) { + return [details.txt_genre, details.txt_subgenre].filter(Boolean).join('/') +} + +async function loadProgramsData(channel) { + return await axios + .get(`https://programacion-tv.elpais.com/data/programas/${channel.site_id}.json`) + .then(r => r.data) + .catch(console.log) +} + +function parseStart(item) { + return dayjs.tz(item.iniDate, 'YYYY-MM-DD HH:mm:ss', 'Europe/Madrid') +} + +function parseStop(item) { + return dayjs.tz(item.endDate, 'YYYY-MM-DD HH:mm:ss', 'Europe/Madrid') +} + +function parseItems(content, channel) { + if (!content) return [] + const data = JSON.parse(content) + const channelData = data.find(i => i.idCanal === channel.site_id) + if (!channelData || !Array.isArray(channelData.programas)) return [] + + return channelData.programas +} From 2c0de5704f9853e616891606bb88bda77e49ce6a Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 5 Oct 2022 00:32:06 +0300 Subject: [PATCH 5/5] Update programacion-tv.elpais.com_es.channels.xml --- ...programacion-tv.elpais.com_es.channels.xml | 218 ++++++++++++------ 1 file changed, 153 insertions(+), 65 deletions(-) diff --git a/sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml b/sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml index e410295c..b55055b2 100644 --- a/sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml +++ b/sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml @@ -1,71 +1,66 @@ - 7 Televisión Región de Murcia - Aljazeera English - AMC España + 7 Región de Murcia + Al Jazeera English + AMC Antena 3 Aragón TV Atreseries - AXN España - AXN White España - Baby TV Latin America + AXN + AXN White + Baby TV Barça TV - BBC World News Europe - BeIn Sports en Español + BBC World + BeIN Sports Be Mad - Blaze España - Boing España + Boing Calle 13 - Canal 24 Horas + Canal 24 h Canal Cocina - Canal Extremadura Satélite - Canal Hollywood España - Canal Panda España + Canal Extremadura TV + Hollywood + Canal Panda Canal Parlamento Canal Sur Canal Sur Andalucía - Caracol TV Internacional + Caracol TV Caza y Pesca - CGTN Español Clan TVE - Club MTV - CNBC Europe - CNN International Europe - Comedy Central España - Cosmopolitan TV España - Crimen + Investigación + CNBC + CNN International + Comedy Central + Cosmopolitan Cuatro Cubavisión Internacional Dark Decasa - Discovery en Español - Disney Channel España - Disney Junior España + Discovery Channel + Disney Channel + Disney Junior Divinity - DW Español - El Trece Internacional + Deutsche Welle Energy ETB 1 ETB 3 - EuroNews Español - Eurosport 1 + EuroNews + Eurosport Eurosport 2 - EWTN España - Latinoamérica - Extreme Sports Channel - Factoria de Ficción - Fox España - Fox Life España - France 24 Español - Galicia TV Europa - Garage TV - Gol - Historia España - I24 News English - Iberalia TV - La Sexta + EWTN + Extreme Sports + FDF Telecinco + Fox Life + FOX + France 24 + Galicia TV + Gol TV + Historia + i24 News + Iberalia + La 1 + La 2 + laSexta Mezzo - Mezzo Live HD Movistar Acción Movistar Cine Español Movistar Comedia @@ -73,42 +68,135 @@ Movistar Estrenos Movistar Series MTV 90s + MTV Hits + MTV Live MTV España - MTV Hits Europe - MTV Live HD - National Geographic España - National Geographic Wild España + National Geographic Neox - Nickelodeon Iberia - Nick Jr España + Nickelodeon + Nick Junior Nova Odisea - Paramount Channel España Pro TV International - Real Madrid TV Español - Record TV Europa + Real Madrid TV + Record TV RT Español Sol Música Somos - Sundance TV España - Syfy España - Tarotéame - TCM España + Sundance Channel + Syfy + Taroteame + TCM Telecinco Teledeporte - Telesur - TNT España + teleSUR + TNT TV3 TV3CAT - TV5Monde Europe + TV5 Monde TV Chile TVE Internacional Asia - TVE Internacional Europa - TVE La 1 Madrid - TVE La 2 - Ve Plus Panregional - VH1 Europe + TVE Internacional + VE PLUS TV Viajar - Xtrm + XTRM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file