Merge pull request #1149 from iptv-org/update-tv24.se

Update tv24.se
This commit is contained in:
Aleksandr Statciuk 2022-10-04 17:56:26 +03:00 committed by GitHub
commit c9abac7d66
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 80 additions and 16 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -12,10 +12,10 @@ module.exports = {
url: function ({ channel, date }) {
return `https://tv24.se/x/channel/${channel.site_id}/0/${date.format('YYYY-MM-DD')}`
},
parser: function ({ content, date }) {
parser: async function ({ content, date }) {
let programs = []
const items = parseItems(content)
items.forEach(item => {
for (let item of items) {
const prev = programs[programs.length - 1]
const $item = cheerio.load(item)
let start = parseStart($item, date)
@ -27,13 +27,17 @@ module.exports = {
prev.stop = start
}
const stop = start.add(30, 'm')
const details = await loadProgramDetails($item)
programs.push({
title: parseTitle($item),
description: parseDescription($item),
description: details.description,
actors: details.actors,
icon: details.icon,
category: details.category,
start,
stop
})
})
}
return programs
},
@ -71,12 +75,48 @@ module.exports = {
}
}
function parseTitle($item) {
return $item('h3').text()
async function loadProgramDetails($item) {
const programId = $item('a').attr('href')
const data = await axios
.get(`https://tv24.se/x${programId}/0/0`)
.then(r => r.data)
.catch(console.error)
if (!data) return Promise.resolve({})
const $ = cheerio.load(data.contentBefore + data.contentAfter)
return Promise.resolve({
icon: parseIcon($),
actors: parseActors($),
description: parseDescription($),
category: parseCategory($)
})
}
function parseDescription($item) {
return $item('p').text()
function parseIcon($) {
const style = $('.image > .actual').attr('style')
const [_, url] = style.match(/background-image\: url\('([^']+)'\)/)
return url
}
function parseCategory($) {
return $('.extras > dt:contains(Kategori)').next().text().trim().split(' / ')
}
function parseActors($) {
return $('.cast > li')
.map((i, el) => {
return $(el).find('.name').text().trim()
})
.get()
}
function parseDescription($) {
return $('.info > p').text().trim()
}
function parseTitle($item) {
return $item('h3').text()
}
function parseStart($item, date) {

View file

@ -4,12 +4,15 @@
const { parser, url } = require('./tv24.se.config.js')
const fs = require('fs')
const path = require('path')
const axios = require('axios')
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-08-26', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'svt1',
@ -20,9 +23,25 @@ it('can generate valid url', () => {
expect(url({ channel, date })).toBe('https://tv24.se/x/channel/svt1/0/2022-08-26')
})
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, data) => {
if (url === 'https://tv24.se/x/b/rh7f40-1hkm/0/0') {
return Promise.resolve({
data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program1.json')))
})
} else if (url === 'https://tv24.se/x/b/rh9dhc-1hkm/0/0') {
return Promise.resolve({
data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program2.json')))
})
} 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
@ -32,22 +51,25 @@ it('can parse response', () => {
start: '2022-08-26T04:00:00.000Z',
stop: '2022-08-26T07:10:00.000Z',
title: 'Morgonstudion',
icon: 'https://jrsy.tmsimg.com/assets/p14436175_i_h9_ad.jpg',
description:
'Dagens viktigaste nyheter och analyser med ständiga uppdateringar. Vi sänder direkt inrikes- och utrikesnyheter inklusive sport, kultur och nöje. Dessutom intervjuer med aktuella gäster. Nyhetssammanfattningar varje kvart med start kl 06.00.'
'Dagens viktigaste nyheter och analyser med ständiga uppdateringar. Vi sänder direkt inrikes- och utrikesnyheter inklusive sport, kultur och nöje. Dessutom intervjuer med aktuella gäster. Nyhetssammanfattningar varje kvart med start kl 06.00.',
actors: ['Carolina Neurath', 'Karin Magnusson', 'Pelle Nilsson', 'Ted Wigren']
})
expect(results[33]).toMatchObject({
start: '2022-08-27T05:20:00.000Z',
stop: '2022-08-27T05:50:00.000Z',
title: 'Uppdrag granskning',
icon: 'https://jrsy.tmsimg.com/assets/p22818697_e_h9_aa.jpg',
description:
'När samtliga sex män frias för ännu en skjutning växer vreden inom polisen. Ökningen av skjutningar i Sverige ligger i topp i Europa - och nu är våldsspiralen på väg mot ett nattsvart rekord. Hur blev Sverige landet där mördare går fria?'
'När samtliga sex män frias för ännu en skjutning växer vreden inom polisen. Ökningen av skjutningar i Sverige ligger i topp i Europa - och nu är våldsspiralen på väg mot ett nattsvart rekord. Hur blev Sverige landet där mördare går fria?',
actors: ['Karin Mattisson', 'Ali Fegan'],
category: ['Dokumentär', 'Samhällsfrågor']
})
})
it('can handle empty guide', () => {
const result = parser({
content: ''
})
it('can handle empty guide', async () => {
const result = await parser({ content: '' })
expect(result).toMatchObject([])
})