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 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 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 +} 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([]) +}) 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