diff --git a/sites/programtv.onet.pl/__data__/entry.html b/sites/programtv.onet.pl/__data__/entry.html new file mode 100644 index 000000000..11895baa9 --- /dev/null +++ b/sites/programtv.onet.pl/__data__/entry.html @@ -0,0 +1,1075 @@ + + + + + + + + + + + + + + + + + + + + + Komisarz Rex 11, odc. 9: Dawna sprawa. Il commissario Rex, s11e09 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+ + + + + +
+
+ +
+ + +

+ Komisarz Rex 11, odc. 9 - Dawna sprawa + + + + + +

+ + +
+ +
+ + Komisarz Rex 11 + + + + +
+ +
+ +
    +
  • + Sobota + 18.04.2026 +
  • +
  • + 06:00 + STOPKLATKA +
  • + +
  • + + + STOPKLATKA + + +
  • + +
  • + + serial kryminalny + + + + Włochy 2011, 60 min + + +
  • +
+ + +

Fabri poznaje młodą studentkę prawa z byłej Jugosławii, Ivanę, która tak jak on przyszła na przyjęcie do sąsiadki policjanta. Nazajutrz Ivana pojawia się na komisariacie. Prosi detektywa o ponowne otwarcie sprawy jej zmarłej przed 17 laty matki.

+ + + + + + + + +
    + + +
  • Reżyseria:
  • +
  • + + Marco Serafini + +
  • + + + +
  • Obsada:
  • +
  • + + Kaspar Capparoni, + + Fabio Ferri, + + Pilar Abella + +
  • + + + + + + + + + + + + + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ Najbliższe emisje: +
    + +
  • Brak powtórek w najbliższym czasie
  • + +
+
+
+ + + +
+ +
+

Co myślisz o tym artykule? Skomentuj!

+
+
+
+ Komentujcie na Facebooku i Twitterze. Wasze zdanie jest dla nas bardzo ważne, dlatego czekamy również na + Wasze listy. Już wiele razy nas zainspirowały. Najciekawsze zamieścimy w serwisie. +
+ Znajdziecie je tutaj. +
+
+
+ Skomentuj artykuł: +
+ + + + + + +
+
+
+ + + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + + +
+
+ +
+
+ +
+ +
+ +
+
+ +
+
+ + + + + +
+ + + +
+ Teraz w TV +

Program TV

+
+ + + + + + + +
+ + + + + + + + + + + + + + +
+ + + +
+ Strona główna +
+ +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sites/programtv.onet.pl/programtv.onet.pl.config.js b/sites/programtv.onet.pl/programtv.onet.pl.config.js index c15c99fc2..c6b6da146 100644 --- a/sites/programtv.onet.pl/programtv.onet.pl.config.js +++ b/sites/programtv.onet.pl/programtv.onet.pl.config.js @@ -1,3 +1,4 @@ +const axios = require('axios') const cheerio = require('cheerio') const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') @@ -15,10 +16,10 @@ module.exports = { return `https://programtv.onet.pl/program-tv/${channel.site_id}?dzien=${day}` }, - parser: function ({ content, date }) { + async parser({ content, date }) { const programs = [] const items = parseItems(content) - items.forEach(item => { + for (const item of items) { const prev = programs[programs.length - 1] const $item = cheerio.load(item) let start = parseStart($item, date) @@ -30,19 +31,27 @@ module.exports = { prev.stop = start } const stop = start.add(1, 'hour') + + const programUrl = parseProgramUrl($item) + const details = await loadProgramDetails(programUrl) + let image + if (details) { + image = details.image + } + programs.push({ title: parseTitle($item), description: parseDescription($item), + image, category: parseCategory($item), start, stop }) - }) + } return programs }, async channels() { - const axios = require('axios') const data = await axios .get('https://programtv.onet.pl/stacje') .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) { const timeString = $item('.hours > .hour').text() const dateString = `${date.format('MM/DD/YYYY')} ${timeString}` diff --git a/sites/programtv.onet.pl/programtv.onet.pl.test.js b/sites/programtv.onet.pl/programtv.onet.pl.test.js index 928f830be..72a2ae4bd 100644 --- a/sites/programtv.onet.pl/programtv.onet.pl.test.js +++ b/sites/programtv.onet.pl/programtv.onet.pl.test.js @@ -1,4 +1,5 @@ const { parser, url } = require('./programtv.onet.pl.config.js') +const axios = require('axios') const fs = require('fs') const path = require('path') const dayjs = require('dayjs') @@ -7,6 +8,20 @@ const customParseFormat = require('dayjs/plugin/customParseFormat') dayjs.extend(customParseFormat) 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 channel = { 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 result = parser({ content, date }).map(p => { + const result = (await parser({ content, date })).map(p => { p.start = p.start.toJSON() p.stop = p.stop.toJSON() return p @@ -50,7 +65,8 @@ it('can parse response', () => { title: 'Law & Order, odc. 15: Letzte Worte', category: 'Krimiserie', 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', @@ -71,8 +87,8 @@ it('can parse response', () => { ]) }) -it('can handle empty guide', () => { - const result = parser({ +it('can handle empty guide', async () => { + const result = await parser({ date, channel, content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'))