From 1bef62556ef49ad5c47b83c827f288cc61dcc5ec Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Thu, 13 Jul 2023 03:05:32 +0300 Subject: [PATCH 1/5] Update content.json --- sites/canalplus.com/__data__/content.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sites/canalplus.com/__data__/content.json b/sites/canalplus.com/__data__/content.json index 72cdf1ea..f932bb8d 100644 --- a/sites/canalplus.com/__data__/content.json +++ b/sites/canalplus.com/__data__/content.json @@ -1 +1 @@ -{"timeSlices":[{"timeSlice":"0","contents":[{"contentID":"20482220_50001","title":"Le cercle","subtitle":"Emission du 06 janv. 2023","startTime":1673504880000,"onClick":{"displayTemplate":"detailSeason","displayName":"Le cercle","path":"/cinema/le-cercle/h/4501558_50001","URLPage":"https://hodor.canalplus.pro/api/v2/mycanal/detail/da2291af3b10e9900d1c55e1a65d3388/okapi/6564630_50001.json?detailType=detailSeason&objectType=season&broadcastID=PLM_1196447642&episodeId=20482220_50001&brandID=4501558_50001&fromDiff=true","parameters":[{"in":"parameters","id":"featureToggles","enum":["detailV5"]}]}}],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Matin","context_list_id":"198","context_list_type":"epgGrid","context_list_position":1}},{"timeSlice":"1","contents":[{"contentID":"17230453_50001","title":"Illusions perdues","subtitle":"Film Drame","startTime":1673525160000,"onClick":{"displayTemplate":"detailPage","displayName":"Illusions perdues","path":"/cinema/illusions-perdues-film-drame/h/17230453_50001","URLPage":"https://hodor.canalplus.pro/api/v2/mycanal/detail/da2291af3b10e9900d1c55e1a65d3388/okapi/17230453_50001.json?detailType=detailPage&objectType=unit&broadcastID=PLM_1196447637&fromDiff=true","parameters":[{"in":"parameters","id":"featureToggles","enum":["detailV5"]}]}}],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Apres-midi","context_list_id":"198","context_list_type":"epgGrid","context_list_position":2}},{"timeSlice":"2","contents":[],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Debut de soiree","context_list_id":"198","context_list_type":"epgGrid","context_list_position":3}},{"timeSlice":"3","contents":[],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Soiree","context_list_id":"198","context_list_type":"epgGrid","context_list_position":4}},{"timeSlice":"4","contents":[],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Nuit","context_list_id":"198","context_list_type":"epgGrid","context_list_position":5}}]} \ No newline at end of file +{"timeSlices":[{"timeSlice":"0","contents":[{"contentID":"20482220_50001","title":"Le cercle","subtitle":"Emission du 06 janv. 2023","startTime":1673504880000,"onClick":{"displayTemplate":"detailSeason","displayName":"Le cercle","path":"/cinema/le-cercle/h/4501558_50001","URLPage":"https://hodor.canalplus.pro/api/v2/mycanal/detail/f000c6f4ebf44647682b3a0fa66d7d99/okapi/6564630_50001.json?detailType=detailSeason&objectType=season&broadcastID=PLM_1196447642&episodeId=20482220_50001&brandID=4501558_50001&fromDiff=true","parameters":[{"in":"parameters","id":"featureToggles","enum":["detailV5"]}]}}],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Matin","context_list_id":"198","context_list_type":"epgGrid","context_list_position":1}},{"timeSlice":"1","contents":[{"contentID":"17230453_50001","title":"Illusions perdues","subtitle":"Film Drame","startTime":1673525160000,"onClick":{"displayTemplate":"detailPage","displayName":"Illusions perdues","path":"/cinema/illusions-perdues-film-drame/h/17230453_50001","URLPage":"https://hodor.canalplus.pro/api/v2/mycanal/detail/f000c6f4ebf44647682b3a0fa66d7d99/okapi/17230453_50001.json?detailType=detailPage&objectType=unit&broadcastID=PLM_1196447637&fromDiff=true","parameters":[{"in":"parameters","id":"featureToggles","enum":["detailV5"]}]}}],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Apres-midi","context_list_id":"198","context_list_type":"epgGrid","context_list_position":2}},{"timeSlice":"2","contents":[],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Debut de soiree","context_list_id":"198","context_list_type":"epgGrid","context_list_position":3}},{"timeSlice":"3","contents":[],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Soiree","context_list_id":"198","context_list_type":"epgGrid","context_list_position":4}},{"timeSlice":"4","contents":[],"context":{"context_type":"epg","context_page_title":"Guide - Grille TV - CANAL+ CINEMA","context_list_title":"CANAL+ CINEMA - J - Maintenant - Nuit","context_list_id":"198","context_list_type":"epgGrid","context_list_position":5}}]} \ No newline at end of file From a925cfb539e54736c79d6694bb9757cc8cff92c4 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Thu, 13 Jul 2023 03:05:55 +0300 Subject: [PATCH 2/5] Create programme-tv.html --- .../canalplus.com/__data__/programme-tv.html | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 sites/canalplus.com/__data__/programme-tv.html diff --git a/sites/canalplus.com/__data__/programme-tv.html b/sites/canalplus.com/__data__/programme-tv.html new file mode 100644 index 00000000..ab2af7fc --- /dev/null +++ b/sites/canalplus.com/__data__/programme-tv.html @@ -0,0 +1,29 @@ + +Programme TV : que regarder maintenant et ce soir ? | myCANAL Burundi

Programme TV

\ No newline at end of file From b71000d57687d4127e7be3f1d24e3b41d4ad14ae Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Thu, 13 Jul 2023 03:06:00 +0300 Subject: [PATCH 3/5] Update canalplus.com.test.js --- sites/canalplus.com/canalplus.com.test.js | 61 +++++++++++++++++------ 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/sites/canalplus.com/canalplus.com.test.js b/sites/canalplus.com/canalplus.com.test.js index b7fa1f18..b6c35b71 100644 --- a/sites/canalplus.com/canalplus.com.test.js +++ b/sites/canalplus.com/canalplus.com.test.js @@ -1,5 +1,5 @@ // npm run channels:parse -- --config=./sites/canalplus.com/canalplus.com.config.js --output=./sites/canalplus.com/canalplus.com.channels.xml -// npx epg-grabber --config=sites/canalplus.com/canalplus.com.config.js --channels=sites/canalplus.com/canalplus.com.channels.xml --output=guide.xml --days=2 +// npx epg-grabber --config=sites/canalplus.com/canalplus.com.config.js --channels=sites/canalplus.com/canalplus.com.channels.xml --output=guide.xml const { parser, url } = require('./canalplus.com.config.js') const fs = require('fs') @@ -13,39 +13,68 @@ dayjs.extend(utc) jest.mock('axios') const channel = { - site_id: '198', + site_id: 'bi#198', xmltv_id: 'CanalPlusCinemaFrance.fr' } +it('can generate valid url for today', done => { + axios.get.mockImplementation(url => { + if (url === 'https://www.canalplus.com/bi/programme-tv/') { + return Promise.resolve({ + data: fs.readFileSync(path.resolve(__dirname, '__data__/programme-tv.html')) + }) + } else { + return Promise.resolve({ data: '' }) + } + }) -it('can generate valid url for today', () => { const today = dayjs.utc().startOf('d') - expect(url({ channel, date: today })).toBe( - 'https://hodor.canalplus.pro/api/v2/mycanal/channels/da2291af3b10e9900d1c55e1a65d3388/198/broadcasts/day/0' - ) + url({ channel, date: today }) + .then(result => { + expect(result).toBe( + 'https://hodor.canalplus.pro/api/v2/mycanal/channels/f000c6f4ebf44647682b3a0fa66d7d99/198/broadcasts/day/0' + ) + done() + }) + .catch(done) }) -it('can generate valid url for tomorrow', () => { +it('can generate valid url for tomorrow', done => { + axios.get.mockImplementation(url => { + if (url === 'https://www.canalplus.com/bi/programme-tv/') { + return Promise.resolve({ + data: fs.readFileSync(path.resolve(__dirname, '__data__/programme-tv.html')) + }) + } else { + return Promise.resolve({ data: '' }) + } + }) + const tomorrow = dayjs.utc().startOf('d').add(1, 'd') - expect(url({ channel, date: tomorrow })).toBe( - 'https://hodor.canalplus.pro/api/v2/mycanal/channels/da2291af3b10e9900d1c55e1a65d3388/198/broadcasts/day/1' - ) + url({ channel, date: tomorrow }) + .then(result => { + expect(result).toBe( + 'https://hodor.canalplus.pro/api/v2/mycanal/channels/f000c6f4ebf44647682b3a0fa66d7d99/198/broadcasts/day/1' + ) + done() + }) + .catch(done) }) it('can parse response', done => { - const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json')) + const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json')) axios.get.mockImplementation(url => { if ( url === - 'https://hodor.canalplus.pro/api/v2/mycanal/detail/da2291af3b10e9900d1c55e1a65d3388/okapi/6564630_50001.json?detailType=detailSeason&objectType=season&broadcastID=PLM_1196447642&episodeId=20482220_50001&brandID=4501558_50001&fromDiff=true' + 'https://hodor.canalplus.pro/api/v2/mycanal/detail/f000c6f4ebf44647682b3a0fa66d7d99/okapi/6564630_50001.json?detailType=detailSeason&objectType=season&broadcastID=PLM_1196447642&episodeId=20482220_50001&brandID=4501558_50001&fromDiff=true' ) { return Promise.resolve({ data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program1.json'))) }) } else if ( url === - 'https://hodor.canalplus.pro/api/v2/mycanal/detail/da2291af3b10e9900d1c55e1a65d3388/okapi/17230453_50001.json?detailType=detailPage&objectType=unit&broadcastID=PLM_1196447637&fromDiff=true' + 'https://hodor.canalplus.pro/api/v2/mycanal/detail/f000c6f4ebf44647682b3a0fa66d7d99/okapi/17230453_50001.json?detailType=detailPage&objectType=unit&broadcastID=PLM_1196447637&fromDiff=true' ) { return Promise.resolve({ data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program2.json'))) @@ -110,7 +139,7 @@ it('can parse response', done => { }) it('can handle empty guide', async () => { - const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json')) - const result = await parser({ content }) - expect(result).toMatchObject([]) + const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json')) + const result = await parser({ content }) + expect(result).toMatchObject([]) }) From 8db4275be60ac6efceb98c666f7e918a198d6d72 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Thu, 13 Jul 2023 03:06:08 +0300 Subject: [PATCH 4/5] Update canalplus.com.config.js --- sites/canalplus.com/canalplus.com.config.js | 134 ++++++++++++++------ 1 file changed, 96 insertions(+), 38 deletions(-) diff --git a/sites/canalplus.com/canalplus.com.config.js b/sites/canalplus.com/canalplus.com.config.js index bb72e112..0b38a6ef 100644 --- a/sites/canalplus.com/canalplus.com.config.js +++ b/sites/canalplus.com/canalplus.com.config.js @@ -1,19 +1,20 @@ const dayjs = require('dayjs') const axios = require('axios') -// TODO: calculate API_KEY based on the current date -// -// const API_KEY = 'f55e5c7ddf0afba59d1c64581358910d' // 03.2022 -//const API_KEY = 'c71b6b8eb30125dab9d10a3850131ac6' // 05.2022 -const API_KEY = 'da2291af3b10e9900d1c55e1a65d3388' // 10.2022 - module.exports = { site: 'canalplus.com', days: 2, - url: function ({ channel, date }) { + url: async function ({ channel, date }) { + const [region, site_id] = channel.site_id.split('#') + const data = await axios + .get(`https://www.canalplus.com/${region}/programme-tv/`) + .then(r => r.data.toString()) + .catch(err => console.log(err)) + const token = parseToken(data) + const diff = date.diff(dayjs.utc().startOf('d'), 'd') - return `https://hodor.canalplus.pro/api/v2/mycanal/channels/${API_KEY}/${channel.site_id}/broadcasts/day/${diff}` + return `https://hodor.canalplus.pro/api/v2/mycanal/channels/${token}/${site_id}/broadcasts/day/${diff}` }, async parser({ content }) { let programs = [] @@ -29,11 +30,11 @@ module.exports = { title: item.title, description: parseDescription(info), icon: parseIcon(info), - actors: parseCast(info,"Avec :"), - director: parseCast(info,"De :"), - writer: parseCast(info,"Scénario :"), - composer: parseCast(info,"Musique :"), - presenter: parseCast(info,"Présenté par :"), + actors: parseCast(info, 'Avec :'), + director: parseCast(info, 'De :'), + writer: parseCast(info, 'Scénario :'), + composer: parseCast(info, 'Musique :'), + presenter: parseCast(info, 'Présenté par :'), date: parseDate(info), rating: parseRating(info), start, @@ -44,21 +45,78 @@ module.exports = { return programs }, async channels() { - const data = await axios - .get(`https://secure-webtv-static.canal-plus.com/metadata/cpfra/all/v2.2/globalchannels.json`) - .then(r => r.data) - .catch(console.log) + const endpoints = { + ad: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/ad/all/v2.2/globalchannels.json', + bf: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/bf/all/v2.2/globalchannels.json', + bi: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/bi/all/v2.2/globalchannels.json', + bj: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/bj/all/v2.2/globalchannels.json', + bl: 'https://secure-webtv-static.canal-plus.com/metadata/cpant/bl/all/v2.2/globalchannels.json', + cd: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/cd/all/v2.2/globalchannels.json', + cf: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/cf/all/v2.2/globalchannels.json', + cg: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/cg/all/v2.2/globalchannels.json', + ch: 'https://secure-webtv-static.canal-plus.com/metadata/cpche/all/v2.2/globalchannels.json', + ci: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/ci/all/v2.2/globalchannels.json', + cm: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/cm/all/v2.2/globalchannels.json', + cv: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/cv/all/v2.2/globalchannels.json', + dj: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/dj/all/v2.2/globalchannels.json', + fr: 'https://secure-webtv-static.canal-plus.com/metadata/cpfra/all/v2.2/globalchannels.json', + ga: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/ga/all/v2.2/globalchannels.json', + gf: 'https://secure-webtv-static.canal-plus.com/metadata/cpant/gf/all/v2.2/globalchannels.json', + gh: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/gh/all/v2.2/globalchannels.json', + gm: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/gm/all/v2.2/globalchannels.json', + gn: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/gn/all/v2.2/globalchannels.json', + gp: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/gp/all/v2.2/globalchannels.json', + gp: 'https://secure-webtv-static.canal-plus.com/metadata/cpant/gp/all/v2.2/globalchannels.json', + gw: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/gw/all/v2.2/globalchannels.json', + mf: 'https://secure-webtv-static.canal-plus.com/metadata/cpant/mf/all/v2.2/globalchannels.json', + mg: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/mg/all/v2.2/globalchannels.json', + ml: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/ml/all/v2.2/globalchannels.json', + mq: 'https://secure-webtv-static.canal-plus.com/metadata/cpant/mq/all/v2.2/globalchannels.json', + mr: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/mr/all/v2.2/globalchannels.json', + mu: 'https://secure-webtv-static.canal-plus.com/metadata/cpmus/mu/all/v2.2/globalchannels.json', + nc: 'https://secure-webtv-static.canal-plus.com/metadata/cpncl/nc/all/v2.2/globalchannels.json', + ne: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/ne/all/v2.2/globalchannels.json', + pl: 'https://secure-webtv-static.canal-plus.com/metadata/cppol/all/v2.2/globalchannels.json', + re: 'https://secure-webtv-static.canal-plus.com/metadata/cpreu/re/all/v2.2/globalchannels.json', + rw: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/rw/all/v2.2/globalchannels.json', + sl: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/sl/all/v2.2/globalchannels.json', + sn: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/sn/all/v2.2/globalchannels.json', + td: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/td/all/v2.2/globalchannels.json', + tg: 'https://secure-webtv-static.canal-plus.com/metadata/cpafr/tg/all/v2.2/globalchannels.json', + wf: 'https://secure-webtv-static.canal-plus.com/metadata/cpncl/wf/all/v2.2/globalchannels.json', + yt: 'https://secure-webtv-static.canal-plus.com/metadata/cpreu/yt/all/v2.2/globalchannels.json' + } - return data.channels.map(item => { - return { - lang: 'fr', - site_id: item.id, - name: item.name - } - }) + let channels = [] + for (let [region, url] of Object.entries(endpoints)) { + const data = await axios + .get(url) + .then(r => r.data) + .catch(console.log) + + data.channels.forEach(channel => { + const site_id = region === 'fr' ? `#${channel.id}` : `${region}#${channel.id}` + + if (channel.name === '.') return + + channels.push({ + lang: 'fr', + site_id, + name: channel.name + }) + }) + } + + return channels } } +function parseToken(data) { + const [, token] = data.match(/"token":"([^"]+)/) || [null, null] + + return token +} + function parseStart(item) { return item && item.startTime ? dayjs(item.startTime) : null } @@ -101,7 +159,7 @@ function parseCast(info, type) { if (info && info.personnalities) { const personnalities = info.personnalities.find(i => i.prefix == type) if (!personnalities) return people - for(let person of personnalities.personnalitiesList) { + for (let person of personnalities.personnalitiesList) { people.push(person.title) } } @@ -109,20 +167,20 @@ function parseCast(info, type) { } function parseDate(info) { - return (info && info.productionYear) ? info.productionYear : null + return info && info.productionYear ? info.productionYear : null } function parseRating(info) { - if (!info || !info.parentalRatings) return null - let rating = info.parentalRatings.find(i => i.authority === 'CSA') - if (!rating || Array.isArray(rating)) return null - if (rating.value === '1') return null - if (rating.value === '2') rating.value = '-10' - if (rating.value === '3') rating.value = '-12' - if (rating.value === '4') rating.value = '-16' - if (rating.value === '5') rating.value = '-18' - return { - system: rating.authority, - value: rating.value - } + if (!info || !info.parentalRatings) return null + let rating = info.parentalRatings.find(i => i.authority === 'CSA') + if (!rating || Array.isArray(rating)) return null + if (rating.value === '1') return null + if (rating.value === '2') rating.value = '-10' + if (rating.value === '3') rating.value = '-12' + if (rating.value === '4') rating.value = '-16' + if (rating.value === '5') rating.value = '-18' + return { + system: rating.authority, + value: rating.value + } } From 21e9385d2e5223053d3a050bab53262a03426fb0 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Thu, 13 Jul 2023 03:06:12 +0300 Subject: [PATCH 5/5] Update canalplus.com.channels.xml --- .../canalplus.com/canalplus.com.channels.xml | 547 ++++++++++-------- 1 file changed, 321 insertions(+), 226 deletions(-) diff --git a/sites/canalplus.com/canalplus.com.channels.xml b/sites/canalplus.com/canalplus.com.channels.xml index deed6bc6..14891e4a 100644 --- a/sites/canalplus.com/canalplus.com.channels.xml +++ b/sites/canalplus.com/canalplus.com.channels.xml @@ -1,231 +1,326 @@ - 6TER - AB1 - ACTION - AL JAZEERA ENG - ALTICE STUDIO - ANIMAUX - ARIRANG TV - ARTE - ASTROCENTER TV - AUTOMOTO LA CHAINE - BBC WORLD 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 TV - BLUE ZOOM - BOING - BOOMERANG - BSMART TV - C8 - CANAL ALPHA NE - CANAL J - CANAL+CINEMA - CANAL+DOCS - CANAL+FOOT - CANAL+FORMULA1 - CANAL+ - CANAL+GRAND ECRAN - CANAL+KIDS - CANAL+MOTOGP - CANAL+PREMIER LEAGUE - CANAL+SERIES - CANAL+ SPORT 2 (CH) - CANAL+SPORT360 - CANAL+SPORT - CANAL+TOP14 - CARTOON NETWORK - CHASSE ET PECHE - CHERIE 25 - CINE+ CLASSIC - CINE+ CLUB - CINE+ EMOTION - CINE+ FAMIZ - CINE+ FRISSON - CINE+ PREMIER - CLIQUE TV - CNBC - CNEWS - CNN INT. - COLMAX TV - COMEDIE+ - COMEDY CENTRAL - CSTAR - CSTAR HITS FRANCE - ARD DAS ERSTE - DISNEY CHANNEL - DISNEY CHANNEL+1 - DISNEY JUNIOR - DORCEL TV - DORCEL XXX - EQUIDIA - EURONEWS - EUROSPORT 1 - EUROSPORT 2 - EUROSPORT 3 - EUROSPORT 360 1 - EUROSPORT 360 2 - EUROSPORT 360 3 - EUROSPORT 360 4 - EUROSPORT 360 5 - EUROSPORT 360 6 - EUROSPORT 360 7 - EUROSPORT 360 8 - EUROSPORT 4 - EUROSPORT 5 - FOOT+ 24/24 - FRANCE 2 - FRANCE 24 ENG - FRANCE 24 - FRANCE 3 - F3 ALPES - F3 ALSACE - F3 AQUITAINE - F3 AUVERGNE - F3 BNORMANDIE - F3 BOURGOGNE - F3 BRETAGNE - F3 CENTRE - F3 CHAMP ARDENNE - F3 CORSEVIASTELLA - F3 COTE D'AZUR - F3 FRANCHE COMTE - F3 HNORMANDIE - F3 LANGUEDOCROU - F3 LIMOUSIN - F3 LORRAINE - F3 MIDI PYRENEES - F3 NORD PDC - F3 NOUVELLE AQUITAINE - F3 PARIS IDF - F3 PAYS DE LA LOIRE - F3 PICARDIE - F3 POITOUCHAR - F3 PROV ALPES - F3 RHONE ALPES - FRANCE 4 - FRANCE 5 - FRANCEINFO: - GAME ONE - GOLF+ - GULLI - HISTOIRE TV - I24 NEWS - INFOSPORT+ - JACQUIE & MICHEL TV - J-ONE - LA CHAINE METEO - LCI - LCP - L'EQUIPE - LFM TV - M6 - M6 MUSIC - MANGAS - MAN X - MCM - MELODY - MEZZO - MEZZO LIVE - MGG TV - MTV - MTV HITS - MULTISPORTS 1 - MULTISPORTS 2 - MULTISPORTS 3 - MULTISPORTS 4 - MULTISPORTS 5 - MULTISPORTS 6 - MUSEUM - MY ZEN TV - NATIONAL GEO - NATIONAL GEOGRAPHIC WILD - NHK WORLD-JAPAN - NICKELODEON - NICKELODEON JUNIOR - NICKELODEON TEEN - NOLLYWOOD TV - NON STOP PEOPLE - NOVELAS TV - NRJ 12 - NRJ HITS - OCS CHOC - OCS CITY - OCS GEANTS - OCS MAX - OLYMPIA TV - ONE TV - ORF 1 - PARAMOUNT CHANNEL - PARIS PREMIERE - PENTHOUSE BLACK - PENTHOUSE - PINK X - PIWI+ - PLANETE+ - PLANETE+AVENTURE - PLANETE+CRIME - POLAR+ - RAI UNO - RFM TV - RMC DECOUVERTE - RMC SPORT 1 - RMC SPORT 2 - RMC SPORT 3 - RMC SPORT 4 - RMC SPORT LIVE 5 - RMC SPORT LIVE 6 - RMC SPORT LIVE 7 - RMC SPORT LIVE 8 - RMC SPORT LIVE 9 - RMC SPORT LIVE 10 - RMC SPORT LIVE 11 - RMC SPORT LIVE 12 - RMC SPORT LIVE 13 - RMC SPORT LIVE 14 - RMC STORY - ROUGE TV - RT FRANCE - RTL9 - SCIENCE ET VIE TV - SEASONS - SERIE CLUB - SRF 1 - CLASSICA - DJAZZ - TCM CINEMA - TELEBIELINGUE - TELETOON+ - TELETOON+1 - TEVA - TF1 - TF1 SERIES FILMS - TFX - TIJI - TMC - TOONAMI - TOUTE L'HISTOIRE - TRACE URBAN - TV5 MONDE - TV BREIZH - USHUAIA TV - VICE TV - VIXEN - W9 - WARNER TV - XXL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AL JAZEERA ENG + BBC WORLD NEWS + CNN INT. + FRANCE 24 ENG + NHK WORLD-JAPAN + 2STV + 6TER + AB1 + ACTION + AL JAZEERA ENG + ALTICE STUDIO + ANIMAUX + ARIRANG TV + ARTE + ASTROCENTER TV + AUTOMOTO LA CHAINE + 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 TV + BLUE ZOOM + BOING + BOOMERANG + BSMART TV + C8 + CANAL ALPHA NE + CANAL J + CANAL+CINEMA + CANAL+DOCS + CANAL+FOOT + CANAL+FOOT + CANAL+FOOT + CANAL+FORMULA1 + CANAL+ + CANAL+ + CANAL+ + CANAL+GRAND ECRAN + CANAL+KIDS + CANAL+MOTOGP + CANAL+PREMIER LEAGUE + CANAL+SERIES + CANAL+ SPORT 2 (CH) + CANAL+SPORT360 + CANAL+SPORT360 + CANAL+SPORT + CANAL+SPORT + CANAL+TOP14 + CARTOON NETWORK + CHASSE ET PECHE + CHERIE 25 + CINE+ CLASSIC + CINE+ CLUB + CINE+ EMOTION + CINE+ FAMIZ + CINE+ FRISSON + CINE+ PREMIER + CLIQUE TV + CNBC + CNEWS + COLMAX TV + COMEDIE+ + COMEDY CENTRAL + CSTAR + CSTAR HITS FRANCE + ARD DAS ERSTE + DISNEY CHANNEL + DISNEY CHANNEL+1 + DISNEY JUNIOR + DORA TV + DORCEL TV + DORCEL XXX + EQUIDIA + EURONEWS + EUROSPORT 1 + EUROSPORT 2 + EUROSPORT 3 + EUROSPORT 360 1 + EUROSPORT 360 2 + EUROSPORT 360 3 + EUROSPORT 360 4 + EUROSPORT 360 5 + EUROSPORT 360 6 + EUROSPORT 360 7 + EUROSPORT 360 8 + EUROSPORT 4 + EUROSPORT 5 + EUROSPORT 6 + EUROSPORT 7 + EUROSPORT 8 + EUROSPORT 9 + FOOT+ 24/24 + FRANCE 2 + FRANCE 24 ENG + FRANCE 24 + FRANCE 3 + F3 ALPES + F3 ALSACE + F3 AQUITAINE + F3 AUVERGNE + F3 BNORMANDIE + F3 BOURGOGNE + F3 BRETAGNE + F3 CENTRE + F3 CHAMP ARDENNE + F3 CORSEVIASTELLA + F3 COTE D'AZUR + F3 FRANCHE COMTE + F3 HNORMANDIE + F3 LANGUEDOCROU + F3 LIMOUSIN + F3 LORRAINE + F3 MIDI PYRENEES + F3 NORD PDC + F3 NOUVELLE AQUITAINE + F3 PARIS IDF + F3 PAYS DE LA LOIRE + F3 PICARDIE + F3 POITOUCHAR + F3 PROV ALPES + F3 RHONE ALPES + FRANCE 4 + FRANCE 5 + FRANCEINFO: + GAME ONE + GOLF+ + GULLI + HISTOIRE TV + I24 NEWS + INFOSPORT+ + JACQUIE & MICHEL TV + J-ONE + LA CHAINE METEO + LA TELE + LCI + LCP + LEMAN BLEU + L'EQUIPE + LFM TV + M6 + M6 MUSIC + MANGAS + MAN X + MCM + MELODY + MEZZO + MEZZO LIVE + MGG TV + MTV + MTV HITS + MULTISPORTS 1 + MULTISPORTS 2 + MULTISPORTS 3 + MULTISPORTS 4 + MULTISPORTS 5 + MULTISPORTS 6 + MUSEUM + MY ZEN TV + NATIONAL GEO + NATIONAL GEOGRAPHIC WILD + NHK WORLD-JAPAN + NICKELODEON + NICKELODEON JUNIOR + NICKELODEON TEEN + NOLLYWOOD TV + NON STOP PEOPLE + NOVELAS TV + NRJ 12 + NRJ HITS + OCS CHOC + OCS CITY + OCS GEANTS + OCS MAX + OLYMPIA TV + ONE TV + ORF 1 + PARAMOUNT CHANNEL + PARIS PREMIERE + PENTHOUSE BLACK + PENTHOUSE + PINK X + PIWI+ + PLANETE+ + PLANETE+AVENTURE + PLANETE+CRIME + POLAR+ + RAI UNO + RFM TV + RMC DECOUVERTE + RMC SPORT 1 + RMC SPORT 2 + RMC SPORT 3 + RMC SPORT 4 + RMC SPORT LIVE 10 + RMC SPORT LIVE 11 + RMC SPORT LIVE 12 + RMC SPORT LIVE 13 + RMC SPORT LIVE 14 + RMC SPORT LIVE 5 + RMC SPORT LIVE 6 + RMC SPORT LIVE 7 + RMC SPORT LIVE 8 + RMC SPORT LIVE 9 + RMC STORY + ROUGE TV + RT FRANCE + RTL9 + SCIENCE ET VIE TV + SEASONS + SERIE CLUB + SRF 1 + CLASSICA + DJAZZ + TCM CINEMA + TELEBIELINGUE + TELETOON+ + TELETOON+1 + TEVA + TF1 + TF1 SERIES FILMS + TFX + TIJI + TMC + TOONAMI + TOUTE L'HISTOIRE + TRACE AFRICA + TRACE LATINA + TRACE URBAN + TV5 MONDE + TV BREIZH + USHUAIA TV + VICE TV + VIXEN + W9 + WARNER TV + XXL