Merge pull request #2771 from nickleby/nickleby-patch-1

Update movistarplus.es.config.js
This commit is contained in:
PopeyeTheSai10r
2025-05-30 18:40:38 -07:00
committed by GitHub
5 changed files with 2158 additions and 407 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -6,21 +6,40 @@ module.exports = {
site: 'movistarplus.es',
days: 2,
url({ channel, date }) {
return `https://www.movistarplus.es/programacion-tv/${channel.site_id}/${date.format(
'YYYY-MM-DD'
)}`
return `https://www.movistarplus.es/programacion-tv/${channel.site_id}/${date.format('YYYY-MM-DD')}`
},
parser({ content }) {
async parser({ content }) {
let programs = []
let items = parseItems(content)
if (!items.length) return programs
items.forEach(el => {
const $ = cheerio.load(content)
const programElements = $('div[id^="ele-"]').get()
for (let i = 0; i < items.length; i++) {
const el = items[i]
let description = null
if (programElements[i]) {
const programDiv = $(programElements[i])
const programLink = programDiv.find('a').attr('href')
if (programLink) {
const idMatch = programLink.match(/id=(\d+)/)
if (idMatch && idMatch[1]) {
description = await getProgramDescription(programLink).catch(() => null)
}
}
}
programs.push({
title: el.item.name,
description: description,
start: dayjs(el.item.startDate),
stop: dayjs(el.item.endDate)
})
})
}
return programs
},
async channels() {
@@ -58,3 +77,21 @@ function parseItems(content) {
return []
}
}
async function getProgramDescription(programUrl) {
try {
const response = await axios.get(programUrl, {
headers: {
'Referer': 'https://www.movistarplus.es/programacion-tv/'
}
})
const $ = cheerio.load(response.data)
const description = $('.show-content .text p').first().text().trim() || null
return description
} catch (error) {
console.error(`Error fetching description from ${programUrl}:`, error.message)
return null
}
}

View File

@@ -6,8 +6,10 @@ const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
const axios = require('axios')
jest.mock('axios')
const date = dayjs.utc('2025-01-23', 'YYYY-MM-DD').startOf('d')
const date = dayjs.utc('2025-05-30', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'sexta',
xmltv_id: 'LaSexta.es'
@@ -15,36 +17,64 @@ const channel = {
it('can generate valid url', () => {
expect(url({ channel, date })).toBe(
'https://www.movistarplus.es/programacion-tv/sexta/2025-01-23'
'https://www.movistarplus.es/programacion-tv/sexta/2025-05-30'
)
})
it('can parse response', () => {
it('can parse response', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'))
const results = parser({ content, date }).map(p => {
axios.get.mockImplementation(url => {
if (
url ===
'https://www.movistarplus.es/entretenimiento/venta-prime-t1/ficha?tipo=E&id=3414523'
) {
return Promise.resolve({
data: fs.readFileSync(path.resolve(__dirname, '__data__/program1.html'))
})
} else if (
url ===
'https://www.movistarplus.es/deportes/programa/pokerstars-casino-1/ficha?tipo=E&id=2057641'
) {
return Promise.resolve({
data: fs.readFileSync(path.resolve(__dirname, '__data__/program2.html'))
})
} else {
return Promise.resolve({ data: '' })
}
})
let results = await parser({ content, date })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results.length).toBe(20)
expect(results.length).toBe(23)
expect(results[0]).toMatchObject({
start: '2025-01-23T05:00:00.000Z',
stop: '2025-01-23T05:45:00.000Z',
title: 'Venta Prime'
start: '2025-05-30T03:15:00.000Z',
stop: '2025-05-30T04:25:00.000Z',
title: 'Venta Prime',
description:
'Espacio de televenta.'
})
expect(results[19]).toMatchObject({
start: '2025-01-24T03:31:00.000Z',
stop: '2025-01-24T05:00:00.000Z',
title: 'Minutos musicales'
start: '2025-05-31T00:45:00.000Z',
stop: '2025-05-31T01:25:00.000Z',
title: 'Pokerstars casino',
description:
'El programa trae cada día toda la emoción de su ruleta en vivo, Spin & Win, una versión exclusiva del clásico juego de casino.'
})
})
it('can handle empty guide', () => {
const result = parser({
it('can handle empty guide', async () => {
const results = await parser({
date,
channel,
content: ''
channel,
content: '[]'
})
expect(result).toMatchObject([])
expect(results).toMatchObject([])
})