mirror of
https://github.com/iptv-org/epg
synced 2026-05-08 10:27:06 -04:00
Replace LF endings with CRLF
This commit is contained in:
@@ -1,105 +1,105 @@
|
||||
const axios = require('axios')
|
||||
const dayjs = require('dayjs')
|
||||
const utc = require('dayjs/plugin/utc')
|
||||
const timezone = require('dayjs/plugin/timezone')
|
||||
|
||||
dayjs.extend(utc)
|
||||
dayjs.extend(timezone)
|
||||
|
||||
module.exports = {
|
||||
site: 'programacion-tv.elpais.com',
|
||||
days: 2,
|
||||
request: {
|
||||
cache: {
|
||||
ttl: 60 * 60 * 1000 // 1 hour
|
||||
}
|
||||
},
|
||||
url: function ({ date }) {
|
||||
return `https://programacion-tv.elpais.com/data/parrilla_${date.format('DDMMYYYY')}.json`
|
||||
},
|
||||
parser: async function ({ content, channel }) {
|
||||
const programs = []
|
||||
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),
|
||||
image: parseImage(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 parseImage(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
|
||||
}
|
||||
const axios = require('axios')
|
||||
const dayjs = require('dayjs')
|
||||
const utc = require('dayjs/plugin/utc')
|
||||
const timezone = require('dayjs/plugin/timezone')
|
||||
|
||||
dayjs.extend(utc)
|
||||
dayjs.extend(timezone)
|
||||
|
||||
module.exports = {
|
||||
site: 'programacion-tv.elpais.com',
|
||||
days: 2,
|
||||
request: {
|
||||
cache: {
|
||||
ttl: 60 * 60 * 1000 // 1 hour
|
||||
}
|
||||
},
|
||||
url: function ({ date }) {
|
||||
return `https://programacion-tv.elpais.com/data/parrilla_${date.format('DDMMYYYY')}.json`
|
||||
},
|
||||
parser: async function ({ content, channel }) {
|
||||
const programs = []
|
||||
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),
|
||||
image: parseImage(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 parseImage(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
|
||||
}
|
||||
|
||||
@@ -1,71 +1,71 @@
|
||||
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,
|
||||
image: 'https://programacion-tv.elpais.com/imagenes/programas/2099957.jpg'
|
||||
}
|
||||
])
|
||||
})
|
||||
|
||||
it('can handle empty guide', async () => {
|
||||
const result = await parser({
|
||||
content: '',
|
||||
channel
|
||||
})
|
||||
expect(result).toMatchObject([])
|
||||
})
|
||||
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,
|
||||
image: 'https://programacion-tv.elpais.com/imagenes/programas/2099957.jpg'
|
||||
}
|
||||
])
|
||||
})
|
||||
|
||||
it('can handle empty guide', async () => {
|
||||
const result = await parser({
|
||||
content: '',
|
||||
channel
|
||||
})
|
||||
expect(result).toMatchObject([])
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user