Fixes linter errors

This commit is contained in:
freearhey
2023-10-15 14:08:23 +03:00
parent 57e508fc3b
commit 63c86a2b30
393 changed files with 28447 additions and 28443 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),
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
}
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),
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
}

View File

@@ -1,74 +1,74 @@
// npm run grab -- --site=programacion-tv.elpais.com
// 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.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([])
})
// npm run grab -- --site=programacion-tv.elpais.com
// 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.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([])
})