Merge pull request #3083 from iptv-org/update-programtv.onet.pl

Update programtv.onet.pl
This commit is contained in:
PopeyeTheSai10r
2026-04-19 13:32:27 -07:00
committed by GitHub
3 changed files with 1130 additions and 9 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,4 @@
const axios = require('axios')
const cheerio = require('cheerio') const cheerio = require('cheerio')
const dayjs = require('dayjs') const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc') const utc = require('dayjs/plugin/utc')
@@ -15,10 +16,10 @@ module.exports = {
return `https://programtv.onet.pl/program-tv/${channel.site_id}?dzien=${day}` return `https://programtv.onet.pl/program-tv/${channel.site_id}?dzien=${day}`
}, },
parser: function ({ content, date }) { async parser({ content, date }) {
const programs = [] const programs = []
const items = parseItems(content) const items = parseItems(content)
items.forEach(item => { for (const item of items) {
const prev = programs[programs.length - 1] const prev = programs[programs.length - 1]
const $item = cheerio.load(item) const $item = cheerio.load(item)
let start = parseStart($item, date) let start = parseStart($item, date)
@@ -30,19 +31,27 @@ module.exports = {
prev.stop = start prev.stop = start
} }
const stop = start.add(1, 'hour') const stop = start.add(1, 'hour')
const programUrl = parseProgramUrl($item)
const details = await loadProgramDetails(programUrl)
let image
if (details) {
image = details.image
}
programs.push({ programs.push({
title: parseTitle($item), title: parseTitle($item),
description: parseDescription($item), description: parseDescription($item),
image,
category: parseCategory($item), category: parseCategory($item),
start, start,
stop stop
}) })
}) }
return programs return programs
}, },
async channels() { async channels() {
const axios = require('axios')
const data = await axios const data = await axios
.get('https://programtv.onet.pl/stacje') .get('https://programtv.onet.pl/stacje')
.then(r => r.data) .then(r => r.data)
@@ -67,6 +76,27 @@ module.exports = {
} }
} }
async function loadProgramDetails(url) {
const html = await axios
.get(url)
.then(r => r.data)
.catch(console.error)
if (!html) return
const $ = cheerio.load(html)
return {
image: $('meta[property="og:image"]').attr('content')
}
}
function parseProgramUrl($item) {
const href = $item('.titles > a').attr('href')
const url = new URL(href, 'https://programtv.onet.pl')
return url.href
}
function parseStart($item, date) { function parseStart($item, date) {
const timeString = $item('.hours > .hour').text() const timeString = $item('.hours > .hour').text()
const dateString = `${date.format('MM/DD/YYYY')} ${timeString}` const dateString = `${date.format('MM/DD/YYYY')} ${timeString}`

View File

@@ -1,4 +1,5 @@
const { parser, url } = require('./programtv.onet.pl.config.js') const { parser, url } = require('./programtv.onet.pl.config.js')
const axios = require('axios')
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const dayjs = require('dayjs') const dayjs = require('dayjs')
@@ -7,6 +8,20 @@ const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat) dayjs.extend(customParseFormat)
dayjs.extend(utc) dayjs.extend(utc)
jest.mock('axios')
axios.get.mockImplementation(url => {
if (url === 'https://programtv.onet.pl/tv/law-and-order-odcinek-15/rlmzu?entry=21970867') {
return Promise.resolve({
data: fs.readFileSync(path.resolve(__dirname, '__data__/entry.html'))
})
} else {
return Promise.resolve({
data: ''
})
}
})
const date = dayjs.utc('2021-11-24', 'YYYY-MM-DD').startOf('d') const date = dayjs.utc('2021-11-24', 'YYYY-MM-DD').startOf('d')
const channel = { const channel = {
site_id: '13th-street-250', site_id: '13th-street-250',
@@ -35,9 +50,9 @@ it('can generate valid url for next day', () => {
) )
}) })
it('can parse response', () => { it('can parse response', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html')) const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'))
const result = parser({ content, date }).map(p => { const result = (await parser({ content, date })).map(p => {
p.start = p.start.toJSON() p.start = p.start.toJSON()
p.stop = p.stop.toJSON() p.stop = p.stop.toJSON()
return p return p
@@ -50,7 +65,8 @@ it('can parse response', () => {
title: 'Law & Order, odc. 15: Letzte Worte', title: 'Law & Order, odc. 15: Letzte Worte',
category: 'Krimiserie', category: 'Krimiserie',
description: description:
'Bei einer Reality-TV-Show stirbt einer der Teilnehmer. Zunächst tappen Briscoe (Jerry Orbach) und Green (Jesse L....' 'Bei einer Reality-TV-Show stirbt einer der Teilnehmer. Zunächst tappen Briscoe (Jerry Orbach) und Green (Jesse L....',
image: 'https://ocdn.eu/ptv-imported-images/akpa4046117.jpg'
}, },
{ {
start: '2021-11-24T22:30:00.000Z', start: '2021-11-24T22:30:00.000Z',
@@ -71,8 +87,8 @@ it('can parse response', () => {
]) ])
}) })
it('can handle empty guide', () => { it('can handle empty guide', async () => {
const result = parser({ const result = await parser({
date, date,
channel, channel,
content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html')) content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'))