diff --git a/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.channels.xml b/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.channels.xml index 0c3030c1..0a0c431c 100644 --- a/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.channels.xml +++ b/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.channels.xml @@ -1,298 +1,348 @@ - LA CHAINE DU PERE NOEL - FRANCE 3 ALPES - FRANCE 3 ALSACE - FRANCE 3 AQUITAINE - FRANCE 3 AUVERGNE - FRANCE 3 NORMANDIE CAEN - FRANCE 3 BOURGOGNE - FRANCE 3 BRETAGNE - FRANCE 3 CENTRE - FRANCE 3 CHAMPAGNE ARDENNE - FRANCE 3 COTE D'AZUR - FRANCE 3 FRANCHE COMTE - FRANCE 3 NORMANDIE ROUEN - FRANCE 3 LANGUEDOC - FRANCE 3 LIMOUSIN - FRANCE 3 LORRAINE - FRANCE 3 MIDI-PYRENEES - FRANCE 3 NORD P. CALAIS - FRANCE 3 PARIS IDF - FRANCE 3 PAYS DE LA LOIRE - FRANCE 3 PICARDIE - FRANCE 3 POITOU CHARENTES - FRANCE 3 PROVENCE ALPES - FRANCE 3 RHONE ALPES - WARNER TV NEXT - BOOMERANG (VO) - TCM CINEMA (VO) - TF1 4K - NCI - TECH&CO - DISNEY CHANNEL +1 - TOP SANTE TV - CANAL+ LIGUE1 UBER EATS - M6 4K - FRANCE 24 Arabe - CANAL+FOOT - CANAL+SPORT360 - L'ESPRIT SORCIER TV - FRANCE 24 Espagnol - CARTOONITO - SQOOL TV - CANAL+BOX OFFICE - TVMONACO - DAZN 1 - TRACE URBAN - STAR ACADEMY, LE LIVE - RFM TV - TRACE CARIBBEAN - TRACE LATINA - TRACE VANILLA - CSTAR HITS FRANCE - MEN'S UP TV - SOUVENIRS FROM EARTH - PUBLIC SENAT 24/24 - B SMART - LA CHAINE METEO - SKYNEWS - AFRICA 24 - AL JAZEERA Arabic - MEDI 1 TV - TRT WORLD - CANAL 10 Guadeloupe - TAHITI NUI TELEVISION - TELE ANTILLES - MADRAS FM TV - TRAVEL CHANNEL - FOOD NETWORK - FOXNEWS - ANTENA 3 - STAR TVE - A3 SERIES - CANAL 24 HORAS - ALL FLAMENCO - TV3 CATALUNYA - ETB BASQUE - TV DE GALICIA - REAL MADRID TV - RTP 3 - TVI INTERNACIONAL - SIC NOTICIAS - SIC INTERNACIONAL - TV RECORD - TVI FICCAO - ALMA LUSA - A BOLA TV - CORREIO DA MANHA TV - RAI STORIA - RAI SCUOLA - MEDIASET ITALIA - AL ARABIYA - ALARABY TELEVISION - AL AOULA - CANAL ALGERIE - MBC - ROTANA CLASSIC - ROTANA CLIP - ENNAHAR TV - ECHOROUK TV - NESSMA EU - EL HIWAR ETTOUNSI - AL RESALAH - IQRAA - IQRAA INTERNATIONAL - SAMIRA TV - ROTANA MUSICA - ECHOROUK NEWS - ROTANA KHALIJIA - ROTANA CINEMA - ROTANA COMEDY - ROTANA DRAMA - EL BILAD TV - PANORAMA DRAMA - MBC DRAMA - MBC MASR - AL RAWDA - NTD TV - CCTV 4 - PHOENIX CNE - PHOENIX INFONEWS - CHINA MOVIE CHANNEL - CCTV DIVERTISSEMENT - ZHEJIANG INTERNATIONAL TV - SHANGHAI DRAGON TV - BEIJING TV - HUNAN WORLD TV - JIANGSU INTERNATIONAL TV - GRT GBA Satellite TV - GREAT WALL ELITE - RTS - 2STV - ORTM - RTI1 - CRTV - RTNC - TELE CONGO - ORTB - A+ - AFRICABLE - CANAL 2 INT. - TVT - RTG - TFM - TRACE AFRICA - TRACE GOSPEL - SEN TV - TRACE TERANGA - 2M MONDE - 6TER - AB1 - ACTION - AL JAZEERA Anglais - ANIMAUX - ARTE - AUTOMOTO, la chaine - BBC ENTERTAINMENT - BBC NEWS - BEIN SPORTS 1 - BEIN SPORTS 2 - BEIN SPORTS 3 - BEIN SPORTS MAX 10 - BEIN SPORTS MAX 4 - BEIN SPORTS MAX 5 - BEIN SPORTS MAX 6 - BEIN SPORTS MAX 7 - BEIN SPORTS MAX 8 - BEIN SPORTS MAX 9 - BET - BFM BUSINESS - BFM TV - BLOOMBERG EUROPE - BOOMERANG - BOOMERANG +1 - CANAL J - CANAL+ - CANAL+CINEMA(S) - CANAL+DOCS - CANAL+GRAND ECRAN - CANAL+kids - CANAL+SERIES - CANAL+SPORT - CHASSE PECHE - CHERIE 25 - CINE+CLASSIC - CINE+CLUB - CINE+EMOTION - CINE+FAMIZ - CINE+FRISSON - CINE+PREMIER - CLUBBING TV - CNBC - CNEWS - CNN INTERNATIONAL - COMEDIE+ - COMEDY CENTRAL - CRIME DISTRICT - CSTAR - DEMAIN - DISNEY CHANNEL - DISNEY JUNIOR - DEUTSCHE WELLE - EQUIDIA - EUROCHANNEL - EURONEWS Français - FASHIONTV PARIS - FRANCE 2 - FRANCE 24 Anglais - FRANCE 24 Français - FRANCE 3 - FRANCE 3 CORSE VIA STELLA - FRANCE 4 - FRANCE 5 - FRANCEINFO: - GAME ONE - GAME ONE +1 - GOLF CHANNEL - GULLI - HISTOIRE TV - I24NEWS - J-ONE - KTO - LCI - LCP 100% - LA CHAINE L'EQUIPE - LUCKY JACK - LUXE TV - M6 - M6MUSIC - MAISON ET TRAVAUX TV - MANGAS - MCM - MELODY - MELODY D'AFRIQUE - MEZZO - MEZZO LIVE - MGG TV - MTV - MTV HITS - MUSEUM TV - MY ZEN TV - NATIONAL GEOGRAPHIC - NATIONAL GEOGRAPHIC WILD - NHK WORLD - JAPAN - NICKELODEON - NICKELODEON JUNIOR - NICKELODEON +1 - NICKELODEON TEEN - NOLLYWOOD TV - NOVELAS TV - NRJ HITS - OCS PULP - OCS GEANTS - OCS MAX - OLYMPIA TV - PARAMOUNT CHANNEL - PARAMOUNT CHANNEL DECALE - PARIS PREMIERE - PIWI+ - PLANETE+ - PLANETE+AVENTURE - PLANETE+CRIME - POLAR+ - LCP/PS - RAI UNO - RAI DUE - RAI TRE - RAI NEWS 24 - RMC DECOUVERTE - RMC STORY - RTL9 - RTPI - SCIENCE & VIE TV - SERIE CLUB - SPORT EN FRANCE - STINGRAY CLASSICA - SUNU YEUF - T18 - TCM CINEMA - TELETOON+ - TELETOON +1 - TEVA - TF1 - TF1 +1 - TF1 SERIES FILMS - TFX - TIJI - TMC - TMC +1 - TOUTE L'HISTOIRE - TV5MONDE - TV BREIZH - TVE INTERNACIONAL - TV PITCHOUN - USHUAIA TV - VOXAFRICA - W9 + AL JAZEERA Anglais + BBC NEWS + BLOOMBERG EUROPE + CNBC + CNN INTERNATIONAL + LUXE TV + NHK WORLD - JAPAN + TVE INTERNACIONAL + LBC SAT + 2M MONDE + 2STV + 6TER + 13EME RUE + 20 MINUTES TV IDF + CANAL 24 HORAS + AB1 + A BOLA TV + ACTION + AFRICA 24 + AL AOULA + AL ARABIYA + ALARABY TELEVISION + AL JAZEERA Arabic + ALL FLAMENCO + AL MAGHRIBIA + ALMA LUSA + ALPE D'HUEZ TELEVISION + AL RAWDA + AL RESALAH + ANGERS TELE + ANIMAUX + ANTENA 3 + A+ + ARIRANG TV + ARMENIA 1 + ARRYADIA + ARTE + ARTE Allemand + ASHARQ NEWS + ASTRO CENTER + ATHAQAFIA + A3 SERIES + AUTOMOTO, la chaine + BEIJING TV + BEIN SPORTS 1 + BEIN SPORTS 2 + BEIN SPORTS 3 + BEIN SPORTS MAX 4 + BEIN SPORTS MAX 5 + BEIN SPORTS MAX 6 + BEIN SPORTS MAX 7 + BEIN SPORTS MAX 8 + BEIN SPORTS MAX 9 + BEIN SPORTS MAX 10 + BET + BEUR FM TV + BFM BUSINESS + BFM LYON + BFM MARSEILLE PROVENCE + BFM TV + BOOMERANG + BOOMERANG +1 + BOOMERANG (VO) + BSMART 4CHANGE + CANAL 2 INT. + CANAL 10 Guadeloupe + CANAL J + CANAL+ + CANAL+BOX OFFICE + CANAL+CINEMA(S) + CANAL+DOCS + CANAL+FOOT + CANAL+GRAND ECRAN + CANAL+kids + CANAL+SPORT360 + CANAL+SPORT + CARTOONITO + CCTV 4 + CCTV DIVERTISSEMENT + CGTN Français + CHASSE PECHE + CHERIE 25 + CHINA MOVIE CHANNEL + CINÉ+classic + CINÉ+émotion + CINÉ+family + CINÉ+festival + CINÉ+frisson + OCS + CLUBBING TV + CNEWS + COMEDIE+ + COMEDY CENTRAL + CRIME DISTRICT + CRTV + CSTAR + CSTAR HITS FRANCE + DEMAIN + DISCOVERY INVESTIGATION + DISNEY CHANNEL + SHANGHAI DRAGON TV + DREAMWORKS + DUBAI TV + DEUTSCHE WELLE + E! + ECHOROUK NEWS + ECHOROUK TV + EL BILAD TV + EL HIWAR ETTOUNSI + ENNAHAR TV + EQUIDIA + EQUINOXE TELEVISION + ESPACE TV + ETB BASQUE + EUROCHANNEL + EURONEWS Français + FASHIONTV PARIS + FOOD NETWORK + FRANCE 2 + FRANCE 3 + FRANCE 3 ALPES + FRANCE 3 ALSACE + FRANCE 3 AQUITAINE + FRANCE 3 AUVERGNE + FRANCE 3 BOURGOGNE + FRANCE 3 BRETAGNE + FRANCE 3 CENTRE + FRANCE 3 CHAMPAGNE ARDENNE + FRANCE 3 CORSE VIA STELLA + FRANCE 3 COTE D'AZUR + FRANCE 3 FRANCHE COMTE + FRANCE 3 LANGUEDOC + FRANCE 3 LIMOUSIN + FRANCE 3 LORRAINE + FRANCE 3 MIDI-PYRENEES + FRANCE 3 NoA + FRANCE 3 NORD P. CALAIS + FRANCE 3 NORMANDIE CAEN + FRANCE 3 NORMANDIE ROUEN + FRANCE 3 PARIS IDF + FRANCE 3 PAYS DE LA LOIRE + FRANCE 3 PICARDIE + FRANCE 3 POITOU CHARENTES + FRANCE 3 PROVENCE ALPES + FRANCE 3 RHONE ALPES + FRANCE 4 + FRANCE 5 + FRANCE 24 Arabe + FRANCE 24 Anglais + FRANCE 24 Espagnol + FRANCE 24 Français + FRANCEINFO: + FUSION TV + GAME ONE + GAME ONE +1 + GREAT WALL ELITE + GRT GBA Satellite TV + GULLI + HABERTURK + HISTOIRE TV + HLIVE + HUNAN WORLD TV + I24NEWS + IMEARTH + IO TV + IQRAA INTERNATIONAL + IQRAA + JIANGSU INTERNATIONAL TV + J-ONE + JOURNAL DU GOLF TV + KANAL AUSTRAL.TV + KANALDUDE + KBS WORLD + KMT + KTO + KOUROU TELEVISION + LA CHAINE METEO + LCI + LCP/PS + LCP 100% + LE FIGARO TV IDF + LA CHAINE L'EQUIPE + L'ESPRIT SORCIER TV + LMTV SARTHE + LUCKY JACK + M6 + M6 4K + M6MUSIC + MABOKE TV + MADRAS FM TV + MAISON ET TRAVAUX TV + MANDARIN TV + MANGAS + MARMITON TV + MATÉLÉ + MBC + MBC 5 + MCM + MEDI 1 TV + MEDIASET ITALIA + MELODY + MELODY D'AFRIQUE + MEN'S UP TV + MEZZO + MEZZO LIVE + MGG TV + MOSELLE TV + MTV + MTV HITS + MUSEUM TV + MYTV CARAIBES + MY ZEN TV + NATIONAL GEOGRAPHIC + NCI + NESSMA EL JADIDA + NICKELODEON + NICKELODEON +1 + NICKELODEON JUNIOR + NICKELODEON TEEN + NOLLYWOOD TV + NOLLYWOOD TV EPIC + NOVELAS TV + NRJ HITS + NTD TV + OLYMPIA TV + BENIN TV + ORTM + PARAMOUNT NETWORK + PARAMOUNT NETWORK DECALE + PARIS PREMIERE + PHOENIX CNE + PHOENIX INFONEWS + PIWI+ + PLANETE+ + PLANETE+AVENTURE + PLANETE+CRIME + POLAR+ + PUBLIC SENAT 24/24 + PULAAGU + ETV: Télévision Caraïbéenne + RAI 1 + RAI 2 + RAI 3 + RAI ITALIA + RAI SCUOLA + RAI STORIA + REAL MADRID TV + RECORD NEWS + TV RECORD + RFM TV + RMC DECOUVERTE + RMC STORY + ROTANA CINEMA + ROTANA CLASSIC + ROTANA CLIP + ROTANA COMEDY + ROTANA DRAMA + ROTANA KHALIJIA + ROTANA MUSICA + RTG + RTI1 + RTL9 + RTNC + RTP 3 + RTS + SAMIRA TV + SCIENCE & VIE TV + SEN TV + SERIE CLUB + SIC INTERNACIONAL + SIC NOTICIAS + SKYNEWS + SOUVENIRS FROM EARTH + SPORT EN FRANCE + SQOOL TV + STINGRAY CLASSICA + SUNU YEUF + SYFY + T18 + TAMAZIGHT + TCM CINEMA + TCM CINEMA (VO) + TV BRETAGNE OUEST + TECH&CO + TELE ANTILLES + TELE CONGO + TELEGRENOBLE + TELE KREOL + TELENANTES + TELETOON+ + TELETOON +1 + TV DE GALICIA + TRACE TERANGA + TEVA + TF1 + TF1 4K + TF1 SERIES FILMS + TFM + TFX + TIJI + TLC + TMC + TAHITI NUI TELEVISION + TOP SANTE TV + TOUTE L'HISTOIRE + TRACE AFRICA + TRACE CARIBBEAN + TRACE GOSPEL + TRACE LATINA + TRACE URBAN + TRACE VANILLA + TRAVEL CHANNEL + TRT WORLD + CANAL ALGERIE + TV3 CATALUNYA + TV5 TURKEY + TV5MONDE + TV7 BORDEAUX + 8 MONT-BLANC + TV BREIZH + CORREIO DA MANHA TV + STAR TVE + V+ TVI + TVI INTERNACIONAL + TVMONACO + PANORAMA DRAMA + TV PITCHOUN + TV PITCHOUN KIDS MUSIC + TVR RENNES 35 + TVRI + TVT + VAL DE LOIRE TV + USHUAIA TV + VIAOCCITANIE Montpellier + VOSGES TV + VOXAFRICA + W9 + WARNER TV + WARNER TV NEXT + WEO La Voix du Nord + ZHEJIANG INTERNATIONAL TV + ZITATA TV + RAI NEWS 24 + TGCOM24 + RTPI diff --git a/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.config.js b/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.config.js index 80f232d2..68f2d241 100644 --- a/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.config.js +++ b/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.config.js @@ -9,12 +9,29 @@ module.exports = { .add(1, 'd') .valueOf()}&after=${channel.site_id}&limit=1` }, - parser: function ({ content, channel }) { + async parser({ content, channel }) { let programs = [] const items = parseItems(content, channel) - items.forEach(item => { + + for (const item of items) { const start = parseStart(item) const stop = parseStop(item, start) + const url = parseDetailURL(item) + let itemDetails = null + if (url) { + try { + const response = await axios.get(url, {}, { + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + }) + itemDetails = response.data + } catch (err) { + console.error(`Error fetching details for item: ${url}`, err) + } + } + programs.push({ title: item.title, subTitle: item.season?.serie?.title, @@ -24,34 +41,87 @@ module.exports = { episode: parseEpisode(item), image: parseImage(item), start: start.toJSON(), - stop: stop.toJSON() + stop: stop.toJSON(), + date: itemDetails?.productionDate, + directors: parseDirectors(itemDetails), + actors: parseActors(itemDetails), + country: itemDetails?.productionCountries }) - }) - + } return programs }, async channels() { - const html = await axios - .get('https://chaines-tv.orange.fr/programme-tv?filtres=all') + const token = await getTVToken() + const json = await axios + .get('https://mediation-tv.orange.fr/all/api-gw/bff-live-player-rights/v1/auth/accountToken/livePlayerRights?customerOrangePopulation=OTT_Metro&deviceCategory=W_PC',{ + headers: {'tv_token': 'Bearer ' + token, + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36' + }}) .then(r => r.data) .catch(console.log) - const [, nuxtFunc] = html.match(/window\.__NUXT__=([^<]+)/) || [null, null] - const func = new Function(`"use strict";return ${nuxtFunc}`) - - const data = func() - const items = data.state.channels.channels + const data = json + const items = data.channels return items.map(item => { return { lang: 'fr', - site_id: item.idEPG, - name: item.name + site_id: item.epgId, + name: item.name, + logo: item.logos[0]?.logoImageUrl.replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') } }) } } +async function getTVToken() { + try { + const response = await axios.get('https://tv.orange.fr/') + const html = response.data + + // Look for window.__pinia = {...} specifically + const match = html.match(/window\.__pinia\s*=\s*({[^;]+})/) + + if (!match) { + console.log('__pinia pattern not found') + return null + } + + const [, piniaData] = match + const data = JSON.parse(piniaData) + return data.authStore?.authInitEw?.token + } catch (error) { + console.error('Error:', error) + return null + } +} + +function parseDetailURL(item) { + return item?.links && item?.links.length ? item?.links[0]?.href : null +} + +function parseDirectors(itemDetails) { + if (!itemDetails) return [] + if (!itemDetails?.contributors) return [] + if (!itemDetails?.contributors?.directors) return [] + // Add value in the array of directors instead of firstName + lastName see: + // https://www.npmjs.com/package/epg-grabber + return itemDetails?.contributors?.directors.map(director => ({value: `${director.firstName} ${director.lastName}`})) +} + +function parseActors(itemDetails) { + if (!itemDetails) return [] + if (!itemDetails?.contributors) return [] + if (!itemDetails?.contributors?.actors) return [] + // Add value in the array of actors instead of firstName + lastName see: + // https://www.npmjs.com/package/epg-grabber + return itemDetails?.contributors?.actors.map(actor => ({value: `${actor.firstName} ${actor.lastName}`})) +} + function parseImage(item) { return item.covers && item.covers.length ? item.covers[0].url : null } diff --git a/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.test.js b/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.test.js index 3a832c35..6f174b63 100644 --- a/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.test.js +++ b/sites/chaines-tv.orange.fr/chaines-tv.orange.fr.test.js @@ -1,6 +1,4 @@ const { parser, url } = require('./chaines-tv.orange.fr.config.js') -const fs = require('fs') -const path = require('path') const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') const customParseFormat = require('dayjs/plugin/customParseFormat') @@ -12,6 +10,8 @@ const channel = { site_id: '192', xmltv_id: 'TF1.fr' } +const content = + '{"192":[{"id":1635062528017,"programType":"EPISODE","title":"Tête de liste","channelId":"192","channelZappingNumber":11,"covers":[{"format":"RATIO_16_9","url":"https://proxymedia.woopic.com/340/p/169_EMI_9697669.jpg"},{"format":"RATIO_4_3","url":"https://proxymedia.woopic.com/340/p/43_EMI_9697669.jpg"}],"diffusionDate":1636328100,"duration":2700,"csa":2,"synopsis":"Un tueur en série prend un plaisir pervers à prévenir les autorités de Tallahassee avant chaque nouveau meurtre. Rossi apprend le décès d\'un de ses vieux amis.","languageVersion":"VM","hearingImpaired":true,"audioDescription":false,"season":{"number":10,"episodesCount":23,"serie":{"title":"Esprits criminels"}},"episodeNumber":12,"definition":"SD","dayPart":"OTHER","catchupId":null,"genre":"Série","genreDetailed":"Série Suspense"}]}' it('can generate valid url', () => { const result = url({ channel, date }) @@ -20,9 +20,8 @@ it('can generate valid url', () => { ) }) -it('can parse response', () => { - const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json')) - const result = parser({ date, channel, content }) +it('can parse response', async () => { + const result = await parser({ date, channel, content }) expect(result).toMatchObject([ { start: '2021-11-07T23:35:00.000Z', @@ -39,11 +38,12 @@ 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.json')) + content: + '{"code":60,"message":"Resource not found","param":{},"description":"L\'URI demandé ou la ressource demandée n\'existe pas.","stackTrace":null}' }) expect(result).toMatchObject([]) })