Replace LF endings with CRLF

This commit is contained in:
freearhey
2025-07-31 22:29:01 +03:00
parent 17e3b4ddda
commit 29aa427923
379 changed files with 29332 additions and 29332 deletions

View File

@@ -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
}

View File

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