diff --git a/.github/workflows/magentatv.de.yml b/.github/workflows/magentatv.de.yml new file mode 100644 index 00000000..011ec02e --- /dev/null +++ b/.github/workflows/magentatv.de.yml @@ -0,0 +1,17 @@ +name: magentatv.de +on: + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + workflow_run: + workflows: [_trigger] + types: + - completed +jobs: + load: + uses: ./.github/workflows/_load.yml + with: + site: ${{github.workflow}} + secrets: + APP_ID: ${{ secrets.APP_ID }} + APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }} diff --git a/sites/magentatv.de/magentatv.de.config.js b/sites/magentatv.de/magentatv.de.config.js new file mode 100644 index 00000000..0c180b0e --- /dev/null +++ b/sites/magentatv.de/magentatv.de.config.js @@ -0,0 +1,123 @@ +const axios = require('axios') +const dayjs = require('dayjs') + +const X_CSRFTOKEN = 'e0a032d1c9df6c3fb8c8352399d32c40ddb17ccceb5142fe' +const COOKIE = + 'JSESSIONID=93892A98DBCCEBD83EDC4C23EBEB23B6; CSESSIONID=4A36799EF09D80539BBA8E8211FA80D3; CSRFSESSION=e0a032d1c9df6c3fb8c8352399d32c40ddb17ccceb5142fe; JSESSIONID=93892A98DBCCEBD83EDC4C23EBEB23B6' + +module.exports = { + site: 'magentatv.de', + ignore: true, // the site uses a constantly updated session ID + url: `https://api.prod.sngtv.magentatv.de/EPG/JSON/PlayBillList`, + request: { + method: 'POST', + headers: { + X_CSRFToken: X_CSRFTOKEN, + 'Content-Type': 'application/json', + Cookie: COOKIE + }, + data({ channel, date }) { + return { + count: -1, + isFillProgram: 1, + offset: 0, + properties: [ + { + include: 'endtime,genres,id,name,starttime,channelid,pictures,introduce', + name: 'playbill' + } + ], + type: 2, + begintime: date.format('YYYYMMDD000000'), + channelid: channel.site_id, + endtime: date.add(1, 'd').format('YYYYMMDD000000') + } + } + }, + parser: function ({ content }) { + let programs = [] + const items = parseItems(content) + items.forEach(item => { + programs.push({ + title: item.name, + description: item.introduce, + icon: parseIcon(item), + category: parseCategory(item), + start: parseStart(item), + stop: parseStop(item) + }) + }) + + return programs + }, + async channels() { + const data = await axios + .post( + `https://api.prod.sngtv.magentatv.de/EPG/JSON/AllChannel`, + { + channelNamespace: 2, + filterlist: [ + { + key: 'IsHide', + value: '-1' + } + ], + metaDataVer: 'Channel/1.1', + properties: [ + { + include: '/channellist/logicalChannel/contentId,/channellist/logicalChannel/name', + name: 'logicalChannel' + } + ], + returnSatChannel: 0 + }, + { + headers: { + X_CSRFToken: X_CSRFTOKEN, + 'Content-Type': 'application/json', + Cookie: COOKIE + } + } + ) + .then(r => r.data) + .catch(console.log) + + return data.channellist.map(item => { + return { + lang: 'de', + site_id: item.contentId, + name: item.name + } + }) + } +} + +function parseCategory(item) { + return item.genres + ? item.genres + .replace('und', ',') + .split(',') + .map(i => i.trim()) + : [] +} + +function parseIcon(item) { + if (!Array.isArray(item.pictures) || !item.pictures.length) return null + + return item.pictures[0].href +} + +function parseStart(item) { + return dayjs(item.starttime) +} + +function parseStop(item) { + return dayjs(item.endtime) +} + +function parseItems(content) { + const data = JSON.parse(content) + if (!data || !Array.isArray(data.playbilllist)) return [] + + return data.playbilllist +} diff --git a/sites/magentatv.de/magentatv.de.test.js b/sites/magentatv.de/magentatv.de.test.js new file mode 100644 index 00000000..104a3105 --- /dev/null +++ b/sites/magentatv.de/magentatv.de.test.js @@ -0,0 +1,78 @@ +// npm run channels:parse -- --config=./sites/magentatv.de/magentatv.de.config.js --output=./sites/magentatv.de/magentatv.de_de.channels.xml +// npx epg-grabber --config=sites/magentatv.de/magentatv.de.config.js --channels=sites/magentatv.de/magentatv.de_de.channels.xml --output=guide.xml --days=2 + +const { parser, url, request } = require('./magentatv.de.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('2022-03-09', 'YYYY-MM-DD').startOf('d') +const channel = { + site_id: '255', + xmltv_id: '13thStreetDeutschland.us' +} + +it('can generate valid url', () => { + expect(url).toBe('https://api.prod.sngtv.magentatv.de/EPG/JSON/PlayBillList') +}) + +it('can generate valid request method', () => { + expect(request.method).toBe('POST') +}) + +it('can generate valid request headers', () => { + expect(request.headers).toMatchObject({ + X_CSRFToken: 'e0a032d1c9df6c3fb8c8352399d32c40ddb17ccceb5142fe', + 'Content-Type': 'application/json', + Cookie: + 'JSESSIONID=93892A98DBCCEBD83EDC4C23EBEB23B6; CSESSIONID=4A36799EF09D80539BBA8E8211FA80D3; CSRFSESSION=e0a032d1c9df6c3fb8c8352399d32c40ddb17ccceb5142fe; JSESSIONID=93892A98DBCCEBD83EDC4C23EBEB23B6' + }) +}) + +it('can generate valid request data', () => { + expect(request.data({ channel, date })).toMatchObject({ + count: -1, + isFillProgram: 1, + offset: 0, + properties: [ + { + include: 'endtime,genres,id,name,starttime,channelid,pictures,introduce', + name: 'playbill' + } + ], + type: 2, + begintime: '20220309000000', + channelid: '255', + endtime: '20220310000000' + }) +}) + +it('can parse response', () => { + const content = `{"playbilllist":[{"id":"30021745","name":"FBI: Special Crime Unit","introduce":"Nachdem ein Mann von einem Sprengstoffpaket getötet wurde, das zu ihm nach Hause geschickt wurde, versucht das Team, den Absender zu fassen und sein neuestes tödliches Paket abzufangen. Maggie hat Mühe, ihrer jüngeren Schwester zu vertrauen.","channelid":"255","starttime":"2022-03-09 01:00:00 UTC+01:00","endtime":"2022-03-09 01:45:00 UTC+01:00","genres":"Wissen,Natur und Tiere","pictures":[{"rel":"image","href":"http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/9/p19740197_e_h9_af.jpg","description":"Brother's Keeper","imageType":"1","copyrightNotice":"(c) ProSiebenSat.1","mimeType":"image/jpeg","resolution":["1440","1080"]},{"rel":"image","href":"http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/5/p15528073_i_h9_ae.jpg","description":"FBI","imageType":"13","copyrightNotice":"(c) ProSiebenSat.1","mimeType":"image/jpeg","resolution":["1440","1080"]},{"rel":"image","href":"http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/9/p19740197_e_h8_af.jpg","description":"Brother's Keeper","imageType":"17","copyrightNotice":"(c) ProSiebenSat.1","mimeType":"image/jpeg","resolution":["1920","1080"]},{"rel":"image","href":"http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/5/p15528073_i_h10_af.jpg","description":"FBI","imageType":"18","copyrightNotice":"(c) ProSiebenSat.1","mimeType":"image/jpeg","resolution":["1920","1080"]}]}]}` + const result = parser({ content }).map(p => { + p.start = p.start.toJSON() + p.stop = p.stop.toJSON() + return p + }) + + expect(result).toMatchObject([ + { + start: '2022-03-09T00:00:00.000Z', + stop: '2022-03-09T00:45:00.000Z', + title: 'FBI: Special Crime Unit', + description: + 'Nachdem ein Mann von einem Sprengstoffpaket getötet wurde, das zu ihm nach Hause geschickt wurde, versucht das Team, den Absender zu fassen und sein neuestes tödliches Paket abzufangen. Maggie hat Mühe, ihrer jüngeren Schwester zu vertrauen.', + icon: 'http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/9/p19740197_e_h9_af.jpg', + category: ['Wissen', 'Natur', 'Tiere'] + } + ]) +}) + +it('can handle empty guide', () => { + const result = parser({ + content: `{"counttotal":"0"}` + }) + expect(result).toMatchObject([]) +}) diff --git a/sites/magentatv.de/magentatv.de_de.channels.xml b/sites/magentatv.de/magentatv.de_de.channels.xml new file mode 100644 index 00000000..83d4fa9d --- /dev/null +++ b/sites/magentatv.de/magentatv.de_de.channels.xml @@ -0,0 +1,265 @@ + + + + 1-2-3.tv + 13TH STREET + 3sat + ALEX Berlin + allgäu.tv + altenburg.tv + Animal Planet + ANIXE HD Serie + ANIXE+ + ARD-alpha + ARTE + a.tv + auto motor und sport + Baby TV + Baden TV + Baden TV Süd + BBC World + Beate-Uhse.TV (Sky) + beIN iZ + beIN Movies Turk + Bergblick + Bibel TV + BILD + Blue Hustler + BonGusto + Boomerang + BR Fernsehen Nord + BR Fernsehen Süd + Cartoon Network + CEM TV + CHANNEL21 + Chemnitz Fernsehen + Classica (Sky) + CNN International + Comedy Central + Nick/Comedy Central+1 + Crime+Investigation + #dabeiTV + Das Erste + DELUXE MUSIC + Deutsches Musik Fernsehen + Discovery Channel + Disney Channel + DMAX + Dresden Fernsehen + DW + E! Entertainment + ems TV + eSPORTS1 + Euro D + Euronews Deutsch + Euronews Italiano + Euronews Russki + Eurosport 1 + Eurosport 2 + Eurostar TV + Extreme Sports + Fashion TV + FC BAYERN.TV LIVE + France 24 francais + Franken Fernsehen + Friesischer Rundfunk + GEO Television + Habertürk TV + Hamburg 1 + HAUPTSTADT.TV + Heimatkanal + HGTV + The HISTORY Channel + hr-fernsehen + HSE + iTVN + Jukebox + Junior (Sky) + Juwelo + Kabel Eins CLASSICS + Kabel Eins + Kabel Eins Doku + Kanal 7 + KiKA + KinoweltTV + K-TV + LAUSITZWELLE + Leipzig Fernsehen + L-TV + Lust pur + MagentaSport + Marco Polo TV + MDF.1 Fernsehen + MDR-Fernsehen Sachsen + MDR-Fernsehen Sachsen-Anhalt + MDR-Fernsehen Thüringen + More Than Sports TV + MOTORVISION.TV + MTV + münchen.tv + N24 Doku + Kinomir + National Geographic + National Geographic Wild + NDR Fernsehen Hamburg + NDR Fernsehen Mecklenburg-Vorpommern + NDR Fernsehen Niedersachsen + NDR Fernsehen Schleswig-Holstein + Nick Jr. + Nicktoons (Sky) + NIEDERBAYERN TV - DEG + NIEDERBAYERN TV - LA + NIEDERBAYERN TV - PA + NITRO + nrwision + n-tv + Oberpfalz TV + OF-TV + OK4 + OK54 Trier + OK-TV Ludwigshafen + OK:TV Mainz + OK Weinstraße + ONE + OstWest + Penthouse Passion + phoenix + Playboy Europe + ProSieben + ProSieben FUN + ProSieben MAXX + QVC + Radio Bremen TV + Rai 1 + Rai 2 + Rai 3 + rbb fernsehen Berlin + rbb fernsehen Brandenburg + Red Bull TV + Regio TV + Rennsteig.TV + RFH Regionalfernsehen Harz + RFO + Rhein-Main TV + RNF + Romance TV + RTL Crime + RTL + RTL Hessen + RTL Living + RTL HH SH + RTL HB NDS + RTL Passion + RTLup + RTL NRW + RTLZWEI + RTR Planeta + salve.tv + SAT.1 Bayern + SAT.1 + SAT.1 emotions + SAT.1 GOLD + SAT.1 HH SH + SAT.1 NDS Bremen + SAT.1 NRW + SAT.1 RhlPf Hessen + ServusTV + Shop LC + Show Max + Show Turk + sixx + SkyAtlantic + Sky Cinema Action + Sky Cinema Best of + Sky Cinema Classics + Sky Cinema Family + Sky Cinema Fun + Sky Cinema Mittelerde + Sky Cinema Premieren + Sky Cinema Premieren +24 + Sky Cinema Thriller + Sky Comedy + Sky Crime + Sky Documentaries + SkyKrimi + Sky Nature + Sky One + Sky Replay + Sky Sport 1 + Sky Sport 10 + Sky Sport 11 + Sky Sport 2 + Sky Sport 3 + Sky Sport 4 + Sky Sport 5 + Sky Sport 6 + Sky Sport 7 + Sky Sport 8 + Sky Sport 9 + Sky Sport Bundesliga 1 + Sky Sport Bundesliga 10 + Sky Sport Bundesliga 2 + Sky Sport Bundesliga 3 + Sky Sport Bundesliga 4 + Sky Sport Bundesliga 5 + Sky Sport Bundesliga 6 + Sky Sport Bundesliga 7 + Sky Sport Bundesliga 8 + Sky Sport Bundesliga 9 + Sky Sport F1 + Sky Sport News + sonnenklar.TV + SONY AXN + SONY CHANNEL + Spiegel Geschichte + Spiegel TV Wissen + SPORT1 + SPORT1+ + SPORTDIGITAL FUSSBALL + SR Fernsehen + Studio 47 + Super RTL + SWR Fernsehen BW + SWR Fernsehen RP + SYFY + tagesschau24 + TELE 5 + TeleBom/TeleDom + TLC + TOGGO plus + TV8 Int + TVA Ostbayern + tv.berlin + tv.ingolstadt + TV Mainfranken + TV Mittelrhein + TV Oberfranken + TV Polonia + TV Westsachsen + ÜLKE TV + Universal TV + VOX + VOXup + Warner TV Comedy + Warner TV Film + Warner TV Serie + WDR Fernsehen Aachen + WDR Fernsehen Bielefeld + WDR Fernsehen Bonn + WDR Fernsehen Dortmund + WDR Fernsehen Duisburg + WDR Fernsehen Düsseldorf + WDR Fernsehen Essen + WDR Fernsehen Köln + WDR Fernsehen Münster + WDR Fernsehen Siegen + WDR Fernsehen Wuppertal + WELT + Welt der Wunder + wetter.com TV + WWTV + ZDF + ZDFinfo + ZDFneo + +