mirror of
https://github.com/iptv-org/epg.git
synced 2025-05-10 17:10:07 -04:00
Merge branch 'master' of https://github.com/iptv-org/epg
This commit is contained in:
commit
1f162a2c52
3 changed files with 189 additions and 0 deletions
78
sites/tvheute.at/tvheute.at.config.js
Normal file
78
sites/tvheute.at/tvheute.at.config.js
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
const cheerio = require('cheerio')
|
||||||
|
const dayjs = require('dayjs')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
site: 'tvheute.at',
|
||||||
|
url({ channel, date }) {
|
||||||
|
return `https://tvheute.at/part/channel-shows/partial/${channel.site_id}/${date.format(
|
||||||
|
'DD-MM-YYYY'
|
||||||
|
)}`
|
||||||
|
},
|
||||||
|
logo({ content }) {
|
||||||
|
const $ = cheerio.load(content)
|
||||||
|
const imgSrc = $(`.station-info .logo`).attr('src')
|
||||||
|
|
||||||
|
return imgSrc ? `https://tvheute.at${imgSrc}` : null
|
||||||
|
},
|
||||||
|
parser: function ({ content, channel, date }) {
|
||||||
|
let programs = []
|
||||||
|
const items = parseItems(content)
|
||||||
|
items.forEach(item => {
|
||||||
|
programs.push({
|
||||||
|
title: parseTitle(item),
|
||||||
|
description: parseDescription(item),
|
||||||
|
icon: parseIcon(item),
|
||||||
|
category: parseCategory(item),
|
||||||
|
start: parseStart(item).toJSON(),
|
||||||
|
stop: parseStop(item).toJSON()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
return programs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseTitle(item) {
|
||||||
|
const $ = cheerio.load(item)
|
||||||
|
|
||||||
|
return $('.title-col strong').text()
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseDescription(item) {
|
||||||
|
const $ = cheerio.load(item)
|
||||||
|
|
||||||
|
return $('.title-col .description').text()
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseCategory(item) {
|
||||||
|
const $ = cheerio.load(item)
|
||||||
|
|
||||||
|
return $('.station-col > .type').text()
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseIcon(item) {
|
||||||
|
const $ = cheerio.load(item)
|
||||||
|
const imgSrc = $('.title-col .image img').data('src-desktop')
|
||||||
|
|
||||||
|
return imgSrc ? `https://tvheute.at${imgSrc}` : null
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseStart(item) {
|
||||||
|
const $ = cheerio.load(item)
|
||||||
|
const time = $('.end-col > .duration-wrapper').data('start')
|
||||||
|
|
||||||
|
return dayjs(time)
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseStop(item) {
|
||||||
|
const $ = cheerio.load(item)
|
||||||
|
const time = $('.end-col > .duration-wrapper').data('stop')
|
||||||
|
|
||||||
|
return dayjs(time)
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseItems(content) {
|
||||||
|
const $ = cheerio.load(content)
|
||||||
|
|
||||||
|
return $('#showListContainer > table > tbody > tr').toArray()
|
||||||
|
}
|
54
sites/tvheute.at/tvheute.at.test.js
Normal file
54
sites/tvheute.at/tvheute.at.test.js
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
// npx epg-grabber --config=sites/tvheute.at/tvheute.at.config.js --channels=sites/tvheute.at/tvheute.at_at.channels.xml --output=.gh-pages/guides/at/tvheute.at.epg.xml --days=2
|
||||||
|
|
||||||
|
const { parser, url, logo, request } = require('./tvheute.at.config.js')
|
||||||
|
const dayjs = require('dayjs')
|
||||||
|
const utc = require('dayjs/plugin/utc')
|
||||||
|
const customParseFormat = require('dayjs/plugin/customParseFormat')
|
||||||
|
dayjs.extend(customParseFormat)
|
||||||
|
dayjs.extend(utc)
|
||||||
|
|
||||||
|
const date = dayjs.utc('2021-11-08', 'YYYY-MM-DD').startOf('d')
|
||||||
|
const channel = { site_id: 'orf1', xmltv_id: 'ORF1.at' }
|
||||||
|
const content = `
|
||||||
|
<div class="station-info"> <a href="/orf1-programm/08-11-2021-im-tv"> <img class="logo" src="/images/channels/ORF1--1394099696-01.png" alt="ORF1"/> </a> <div class="info"><p>Das ORF1 Programm mit allen Sendungen live im TV von <a title="tv.orf.at" href="http://tv.orf.at" target="_blank">tv.orf.at</a>. Sie haben eine Sendung verpasst. In der ORF TVthek finden Sie viele Sendungen on demand zum Abruf als online Video und live stream.</p></div></div><div class="list channelpage swipeable" data-group="swipe-list" id="showListContainer"> <div class="section-head time-nav no-margin"> <div class="now"> <h1 class="text">ORF1 heute</h1> <a class="earlier" onclick="paging('/part/channel-shows/partial/skysp2/08-11-2021', 'maincontent')">SKYsp2</a> <a class="later" onclick="paging('/part/channel-shows/partial/orf2/08-11-2021', 'maincontent')">ORF2</a> </div><aside> <div class="text">Wiederholung</div></aside> </div><table class="closeOver"> <thead> <tr> <th style="width:95px;" class="pad station-col">Sender</th> <th style="width:60px;" class="start-col">Zeit</th> <th style="width:60px;" class="end-col"><span class="visible-xxs-inline">Zeit</span></th> <th class="pad title-col">Titel</th> <th style="width:70px;" class="splitter dark pad">Start</th> <th style="width:265px;" class="dark pad">Titel</th> </tr></thead> <tbody><tr> <td class="pad station-col"> <a class="station" href="/orf1-programm/heute-im-tv" style="" title="Programm anzeigen">ORF1</a> <span class="type" style="background-color:#ff00ff">Kids</span> </td><td class="start-col"> <time datetime='2021-11-08 06:00'>06:00</time> <time class="until" datetime='2021-11-08 06:10'>06:10</time> </td><td class="end-col"> <time datetime='2021-11-08 06:00'>06:00</time> <time class="until" datetime='2021-11-08 06:10'>06:10</time> <div class="duration-wrapper" data-start='2021-11-08T06:00:00+01:00' data-stop='2021-11-08T06:10:00+01:00' data-future-text="10'" data-future-class="runtime" title="Laufzeit in Minuten"></div></td><td class="pad relative title-col"> <a class="action-show-info" id="monchhichi-kids_520132493"> <strong title="Monchhichi (Wh.)">Monchhichi<span class="wh"> (Wh.)</span></strong> <span class="sub">ANIMATIONSSERIE Der Streiche-Wettbewerb</span> </a> <div class="info"> <div class="image "> <a href="/orf1-programm/sendung/monchhichi-kids_520132493"> <img data-src-desktop="/images/orf1/monchhichi_kids--1895216560-00.jpg" data-srcset-desktop="/images/orf1/monchhichi_kids--1895216560-00.jpg 1x, /images/orf1/monchhichi_kids--1895216560-01.jpg 2x" data-src-mobile="/images/orf1/monchhichi_kids--1895216560-01.jpg" data-srcset-mobile="/images/orf1/monchhichi_kids--1895216560-01.jpg 1x, /images/orf1/monchhichi_kids--1895216560-02.jpg 2x" data-imgloaded="0" alt="", "Der Streiche-Wettbewerb.""/> </a> </div><div class="text"> <div class="description">Roger hat sich Ärger mit Dr. Bellows eingehandelt, der ihn für einen Monat strafversetzen möchte. Einmal mehr hadert Roger mit dem Schicksal, dass er keinen eigenen Flaschengeist besitzt, der ihm aus der Patsche helfen kann. Jeannie schlägt vor, ihm Cousine Marilla zu schicken. Doch Tony ist strikt dagegen. Als ein Zaubererpärchen im exotischen Bühnenoutfit für die Zeit von Rogers Abwesenheit sein Apartment in Untermiete bezieht, glaubt Roger, Jeannie habe ihm ihre Verwandte doch noch gesandt.</div><div class="row"> <div class="col-sm-6"> <a href="/orf1-programm/sendung/monchhichi-kids_520132493" class="btn btn-success">Mehr zur Sendung</a> </div></div></div></div></td></tr><tr> <td class="pad station-col"> <a class="station" href="/orf1-programm/heute-im-tv" style="" title="Programm anzeigen">ORF1</a> <span class="type" style=""></span> </td><td class="start-col"> <time datetime='2021-11-08 18:00'>18:00</time> <time class="until" datetime='2021-11-08 18:10'>18:10</time> </td><td class="end-col"> <time datetime='2021-11-08 18:00'>18:00</time> <time class="until" datetime='2021-11-08 18:10'>18:10</time> <div class="duration-wrapper" data-start='2021-11-08T18:00:00+01:00' data-stop='2021-11-08T18:10:00+01:00' data-future-text="10'" data-future-class="runtime" title="Laufzeit in Minuten"></div></td><td class="pad relative title-col"> <strong title="ZIB 18 ">ZIB 18<span class="wh"></span></strong> <span class="sub">NACHRICHTEN</span> </td><td class="splitter dark pad" style="position: relative;"> <div class="adspace w234h60" style="position: absolute; top: 0px;"></div></td><td class="dark pad"></td></tr></tbody> </table></div>
|
||||||
|
`
|
||||||
|
|
||||||
|
it('can generate valid url', () => {
|
||||||
|
expect(url({ channel, date })).toBe(
|
||||||
|
'https://tvheute.at/part/channel-shows/partial/orf1/08-11-2021'
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('can get logo url', () => {
|
||||||
|
expect(logo({ content })).toBe('https://tvheute.at/images/channels/ORF1--1394099696-01.png')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('can parse response', () => {
|
||||||
|
expect(parser({ date, channel, content })).toMatchObject([
|
||||||
|
{
|
||||||
|
start: '2021-11-08T05:00:00.000Z',
|
||||||
|
stop: '2021-11-08T05:10:00.000Z',
|
||||||
|
title: 'Monchhichi (Wh.)',
|
||||||
|
category: 'Kids',
|
||||||
|
description:
|
||||||
|
'Roger hat sich Ärger mit Dr. Bellows eingehandelt, der ihn für einen Monat strafversetzen möchte. Einmal mehr hadert Roger mit dem Schicksal, dass er keinen eigenen Flaschengeist besitzt, der ihm aus der Patsche helfen kann. Jeannie schlägt vor, ihm Cousine Marilla zu schicken. Doch Tony ist strikt dagegen. Als ein Zaubererpärchen im exotischen Bühnenoutfit für die Zeit von Rogers Abwesenheit sein Apartment in Untermiete bezieht, glaubt Roger, Jeannie habe ihm ihre Verwandte doch noch gesandt.',
|
||||||
|
icon: 'https://tvheute.at/images/orf1/monchhichi_kids--1895216560-00.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
start: '2021-11-08T17:00:00.000Z',
|
||||||
|
stop: '2021-11-08T17:10:00.000Z',
|
||||||
|
title: 'ZIB 18'
|
||||||
|
}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it('can handle empty guide', () => {
|
||||||
|
const result = parser({
|
||||||
|
date,
|
||||||
|
channel,
|
||||||
|
content: `<html><head><title>Object moved</title></head><body>
|
||||||
|
<h2>Object moved to <a href="/">here</a>.</h2>
|
||||||
|
</body></html>`
|
||||||
|
})
|
||||||
|
expect(result).toMatchObject([])
|
||||||
|
})
|
57
sites/tvheute.at/tvheute.at_at.channels.xml
Normal file
57
sites/tvheute.at/tvheute.at_at.channels.xml
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<site site="tvheute.at">
|
||||||
|
<channels>
|
||||||
|
<channel lang="de" xmltv_id="3sat.de" site_id="3sat">3sat</channel>
|
||||||
|
<channel lang="de" xmltv_id="ARTEDeutsch.fr" site_id="arte">ARTE Deutsch</channel>
|
||||||
|
<channel lang="de" xmltv_id="ATV.at" site_id="atv">ATV</channel>
|
||||||
|
<channel lang="de" xmltv_id="ATV2.at" site_id="atv2">ATV 2</channel>
|
||||||
|
<channel lang="de" xmltv_id="BayerischesFernsehenSud.de" site_id="br">Bayerisches Fernsehen Süd</channel>
|
||||||
|
<channel lang="de" xmltv_id="DasErste.de" site_id="ard">Das Erste</channel>
|
||||||
|
<channel lang="de" xmltv_id="DAZN1Deutschland.uk" site_id="dazn">DAZN 1 Deutschland</channel>
|
||||||
|
<channel lang="de" xmltv_id="DisneyChannelDeutschland.us" site_id="disney">Disney Channel Deutschland</channel>
|
||||||
|
<channel lang="de" xmltv_id="DMAXAustria.us" site_id="dmax">DMAX Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="Eurosport1Germany.fr" site_id="euro">Eurosport 1 Germany</channel>
|
||||||
|
<channel lang="de" xmltv_id="HRFernsehen.de" site_id="hr">HR Fernsehen</channel>
|
||||||
|
<channel lang="de" xmltv_id="KabelEinsAustria.de" site_id="k1">Kabel Eins Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="KIKA.de" site_id="kika">KIKA</channel>
|
||||||
|
<channel lang="de" xmltv_id="MDRFernsehenSachsenAnhalt.de" site_id="mdr">MDR Fernsehen Sachsen-Anhalt</channel>
|
||||||
|
<channel lang="de" xmltv_id="NDRFernsehenNiedersachsen.de" site_id="ndr">NDR Fernsehen Niedersachsen</channel>
|
||||||
|
<channel lang="de" xmltv_id="NickelodeonAustria.us" site_id="nick">Nickelodeon Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="NitroAustria.de" site_id="nitro">Nitro Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="NTVAustria.de" site_id="ntv">N-TV Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="Oe24TV.at" site_id="oe24tv">Oe24 TV</channel>
|
||||||
|
<channel lang="de" xmltv_id="One.de" site_id="one">One</channel>
|
||||||
|
<channel lang="de" xmltv_id="ORF1.at" site_id="orf1">ORF 1</channel>
|
||||||
|
<channel lang="de" xmltv_id="ORF2.at" site_id="orf2">ORF 2</channel>
|
||||||
|
<channel lang="de" xmltv_id="ORFIII.at" site_id="orf_iii">ORF III</channel>
|
||||||
|
<channel lang="de" xmltv_id="ORFSportPlus.at" site_id="orf_+">ORF Sport +</channel>
|
||||||
|
<channel lang="de" xmltv_id="Phoenix.de" site_id="phoenix">Phoenix</channel>
|
||||||
|
<channel lang="de" xmltv_id="ProSiebenAustria.de" site_id="pro7">ProSieben Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="ProSiebenMaxxAustria.de" site_id="7maxx">ProSieben Maxx Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="Puls4.at" site_id="puls_4">Puls 4</channel>
|
||||||
|
<channel lang="de" xmltv_id="RBBBerlin.de" site_id="rbb">RBB Berlin</channel>
|
||||||
|
<channel lang="de" xmltv_id="RTLAustria.de" site_id="rtl">RTL Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="RTLCrimeDeutschland.de" site_id="rtlcrime">RTL Crime Deutschland</channel>
|
||||||
|
<channel lang="de" xmltv_id="RTLLivingDeutschland.de" site_id="rtlliving">RTL Living Deutschland</channel>
|
||||||
|
<channel lang="de" xmltv_id="RTLZweiAustria.de" site_id="rtl2">RTL Zwei Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="Sat1GoldOsterreich.de" site_id="sat1gold">Sat. 1 Gold Österreich</channel>
|
||||||
|
<channel lang="de" xmltv_id="Sat1Osterreich.de" site_id="sat1">Sat. 1 Österreich</channel>
|
||||||
|
<channel lang="de" xmltv_id="ServusTVOsterreich.at" site_id="servustv">Servus TV Österreich</channel>
|
||||||
|
<channel lang="de" xmltv_id="SixxAustria.de" site_id="sixx">Sixx Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="SkyCinemaPremieren.de" site_id="skyci">Sky Cinema Premieren</channel>
|
||||||
|
<channel lang="de" xmltv_id="SkySport1.de" site_id="skysp1">Sky Sport 1</channel>
|
||||||
|
<channel lang="de" xmltv_id="SkySport2.de" site_id="skysp2">Sky Sport 2</channel>
|
||||||
|
<channel lang="de" xmltv_id="SkySportAustria1.de" site_id="skyaut">Sky Sport Austria 1</channel>
|
||||||
|
<channel lang="de" xmltv_id="SkySportBundesliga1.de" site_id="skybl">Sky Sport Bundesliga 1</channel>
|
||||||
|
<channel lang="de" xmltv_id="Sport1.de" site_id="sport1">Sport 1</channel>
|
||||||
|
<channel lang="de" xmltv_id="SuperRTLAustria.de" site_id="rtls">Super RTL Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="SWRFernsehenBadenWurttemberg.de" site_id="swr">SWR Fernsehen Baden-Württemberg</channel>
|
||||||
|
<channel lang="de" xmltv_id="Tele5.de" site_id="tele_5">Tele 5</channel>
|
||||||
|
<channel lang="de" xmltv_id="VoxAustria.de" site_id="vox">Vox Austria</channel>
|
||||||
|
<channel lang="de" xmltv_id="WDRFernsehenKoln.de" site_id="wdr">WDR Fernsehen Köln</channel>
|
||||||
|
<channel lang="de" xmltv_id="Welt.de" site_id="welt">Welt</channel>
|
||||||
|
<channel lang="de" xmltv_id="ZDF.de" site_id="zdf">ZDF</channel>
|
||||||
|
<channel lang="de" xmltv_id="ZDFInfo.de" site_id="zdfinfo">ZDF Info</channel>
|
||||||
|
<channel lang="de" xmltv_id="ZDFNeo.de" site_id="zdfneo">ZDF Neo</channel>
|
||||||
|
</channels>
|
||||||
|
</site>
|
Loading…
Add table
Add a link
Reference in a new issue