Merge pull request #589 from iptv-org/add-canalplus.com

Add guide from canalplus.com
This commit is contained in:
Aleksandr Statciuk 2022-03-07 18:26:23 +03:00 committed by GitHub
commit d44485cc6d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 423 additions and 0 deletions

17
.github/workflows/canalplus.com.yml vendored Normal file
View file

@ -0,0 +1,17 @@
name: canalplus.com
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 }}

View file

@ -0,0 +1,83 @@
const dayjs = require('dayjs')
const axios = require('axios')
module.exports = {
site: 'canalplus.com',
url: function ({ channel, date }) {
const diff = date.diff(dayjs.utc().startOf('d'), 'd')
return `https://hodor.canalplus.pro/api/v2/mycanal/channels/f55e5c7ddf0afba59d1c64581358910d/${channel.site_id}/broadcasts/day/${diff}`
},
async parser({ content }) {
let programs = []
const items = parseItems(content)
for (let item of items) {
const prev = programs[programs.length - 1]
const details = await loadProgramDetails(item)
const info = parseInfo(details)
const start = parseStart(item)
if (prev) prev.stop = start
const stop = start.add(1, 'h')
programs.push({
title: item.title,
description: parseDescription(info),
icon: parseIcon(info),
start,
stop
})
}
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)
return data.channels.map(item => {
return {
lang: 'fr',
site_id: item.id,
name: item.name
}
})
}
}
function parseStart(item) {
return item && item.startTime ? dayjs(item.startTime) : null
}
function parseIcon(info) {
return info ? info.URLImage : null
}
function parseDescription(info) {
return info ? info.summary : null
}
function parseInfo(data) {
if (!data || !data.detail || !data.detail.informations) return null
return data.detail.informations
}
async function loadProgramDetails(item) {
if (!item.onClick || !item.onClick.URLPage) return {}
return await axios
.get(item.onClick.URLPage)
.then(r => r.data)
.catch(console.error)
}
function parseItems(content) {
const data = JSON.parse(content)
if (!data || !Array.isArray(data.timeSlices)) return []
return data.timeSlices.reduce((acc, curr) => {
acc = acc.concat(curr.contents)
return acc
}, [])
}

View file

@ -0,0 +1,101 @@
// npm run channels:parse -- --config=./sites/canalplus.com/canalplus.com.config.js --output=./sites/canalplus.com/canalplus.com_fr.channels.xml
// npx epg-grabber --config=sites/canalplus.com/canalplus.com.config.js --channels=sites/canalplus.com/canalplus.com_fr.channels.xml --output=guide.xml --days=2
const { parser, url } = require('./canalplus.com.config.js')
const axios = require('axios')
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-07', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '312',
xmltv_id: 'TF1.fr'
}
jest.mock('axios')
it('can generate valid url for today', () => {
const today = dayjs.utc('2022-03-07', 'YYYY-MM-DD').startOf('d')
expect(url({ channel, date: today })).toBe(
'https://hodor.canalplus.pro/api/v2/mycanal/channels/f55e5c7ddf0afba59d1c64581358910d/312/broadcasts/day/0'
)
})
it('can generate valid url for tomorrow', () => {
const tomorrow = dayjs.utc('2022-03-08', 'YYYY-MM-DD').startOf('d')
expect(url({ channel, date: tomorrow })).toBe(
'https://hodor.canalplus.pro/api/v2/mycanal/channels/f55e5c7ddf0afba59d1c64581358910d/312/broadcasts/day/1'
)
})
it('can parse response', done => {
const content = `{"timeSlices":[{"timeSlice":"0","contents":[{"contentID":"18257183_50061","title":"TFou","subtitle":"Emission du 07 mars 2022","startTime":1646630700000,"onClick":{"displayTemplate":"detailSeason","displayName":"TFou","path":"/jeunesse/tfou/h/10709960_50061","URLPage":"https://hodor.canalplus.pro/api/v2/mycanal/detail/f55e5c7ddf0afba59d1c64581358910d/okapi/10709339_50061.json?detailType=detailSeason&objectType=season&broadcastID=PLM_1094261940&episodeId=18257183_50061&brandID=10709960_50061&fromDiff=true"}}]},{"timeSlice":"1","contents":[{"contentID":"18257202_50061","title":"Petits plats en équilibre","subtitle":"Mag. Gastronomie","startTime":1646654100000,"onClick":{"displayTemplate":"detailPage","displayName":"Petits plats en équilibre","path":"/divertissement/petits-plats-en-equilibre-mag-gastronomie/h/18257202_50061","URLPage":"https://hodor.canalplus.pro/api/v2/mycanal/detail/f55e5c7ddf0afba59d1c64581358910d/okapi/18257202_50061.json?detailType=detailPage&objectType=unit&broadcastID=PLM_1094380194&fromDiff=true"}}]}]}`
axios.get.mockImplementation(url => {
if (
url ===
'https://hodor.canalplus.pro/api/v2/mycanal/detail/f55e5c7ddf0afba59d1c64581358910d/okapi/10709339_50061.json?detailType=detailSeason&objectType=season&broadcastID=PLM_1094261940&episodeId=18257183_50061&brandID=10709960_50061&fromDiff=true'
) {
return Promise.resolve({
data: JSON.parse(
`{"detail":{"informations":{"URLImage":"https://thumb.canalplus.pro/http/unsafe/{resolutionXY}/filters:quality({imageQualityPercentage})/img-hapi.canalplus.pro:80/ServiceImage/ImageID/97215037","summary":"Une émission jeunesse qui propose les meilleures séries de dessins animés du moment."}}}`
)
})
} else if (
url ===
'https://hodor.canalplus.pro/api/v2/mycanal/detail/f55e5c7ddf0afba59d1c64581358910d/okapi/18257202_50061.json?detailType=detailPage&objectType=unit&broadcastID=PLM_1094380194&fromDiff=true'
) {
return Promise.resolve({
data: JSON.parse(
`{"detail":{"informations":{"URLImage":"https://thumb.canalplus.pro/http/unsafe/{resolutionXY}/filters:quality({imageQualityPercentage})/img-hapi.canalplus.pro:80/ServiceImage/ImageID/100841894","summary":"Chaque jour, Laurent Mariotte propose des recettes simples et savoureuses pour profiter des ingrédients de saison, en donnant la part belle aux produits locaux."}}}`
)
})
} else {
return Promise.resolve({ data: '' })
}
})
parser({ content })
.then(result => {
result.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
start: '2022-03-07T05:25:00.000Z',
stop: '2022-03-07T11:55:00.000Z',
title: 'TFou',
description:
'Une émission jeunesse qui propose les meilleures séries de dessins animés du moment.',
icon: 'https://thumb.canalplus.pro/http/unsafe/{resolutionXY}/filters:quality({imageQualityPercentage})/img-hapi.canalplus.pro:80/ServiceImage/ImageID/97215037'
},
{
start: '2022-03-07T11:55:00.000Z',
stop: '2022-03-07T12:55:00.000Z',
title: 'Petits plats en équilibre',
description:
'Chaque jour, Laurent Mariotte propose des recettes simples et savoureuses pour profiter des ingrédients de saison, en donnant la part belle aux produits locaux.',
icon: 'https://thumb.canalplus.pro/http/unsafe/{resolutionXY}/filters:quality({imageQualityPercentage})/img-hapi.canalplus.pro:80/ServiceImage/ImageID/100841894'
}
])
done()
})
.catch(done)
})
it('can handle empty guide', done => {
parser({
content: `{"currentPage":{"displayTemplate":"error","displayName":"Page introuvable","path":"/erreur","BOName":"Page introuvable","BOLayoutName":"Erreur 404"},"title":"Page introuvable","text":"La page que vous demandez est introuvable. Si le problème persiste, vous pouvez contacter l'assistance de CANAL+.","code":404}`
})
.then(result => {
expect(result).toMatchObject([])
done()
})
.catch(done)
})

View file

@ -0,0 +1,222 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="canalplus.com">
<channels>
<channel lang="fr" xmltv_id="3sat.de" site_id="780">3 SAT</channel>
<channel lang="fr" xmltv_id="6ter.fr" site_id="521">6TER</channel>
<channel lang="fr" xmltv_id="AB1.fr" site_id="611">AB1</channel>
<channel lang="fr" xmltv_id="Action.fr" site_id="504">ACTION</channel>
<channel lang="fr" xmltv_id="AlJazeeraEnglish.qa" site_id="675">AL JAZEERA ENG</channel>
<channel lang="fr" xmltv_id="AlticeStudio.fr" site_id="820">ALTICE STUDIO</channel>
<channel lang="fr" xmltv_id="Animaux.fr" site_id="503">ANIMAUX</channel>
<channel lang="fr" xmltv_id="ArirangWorld.kr" site_id="252">ARIRANG TV</channel>
<channel lang="fr" xmltv_id="ARTEFrancais.fr" site_id="154">ARTE</channel>
<channel lang="fr" xmltv_id="AstrocenterTV.fr" site_id="632">ASTROCENTER TV</channel>
<channel lang="fr" xmltv_id="Automotolachaine.fr" site_id="612">AUTOMOTO LA CHAINE</channel>
<channel lang="fr" xmltv_id="BBCWorldNewsEurope.uk" site_id="589">BBC WORLD NEWS</channel>
<channel lang="fr" xmltv_id="BeInSports1France.qa" site_id="381">BEIN SPORTS 1</channel>
<channel lang="fr" xmltv_id="BeInSports2France.qa" site_id="384">BEIN SPORTS 2</channel>
<channel lang="fr" xmltv_id="BeInSports3France.qa" site_id="516">BEIN SPORTS 3</channel>
<channel lang="fr" xmltv_id="BeInSportsMax10France.qa" site_id="605">BEIN SPORTS MAX 10</channel>
<channel lang="fr" xmltv_id="BeInSportsMax4France.qa" site_id="596">BEIN SPORTS MAX 4</channel>
<channel lang="fr" xmltv_id="BeInSportsMax5France.qa" site_id="597">BEIN SPORTS MAX 5</channel>
<channel lang="fr" xmltv_id="BeInSportsMax6France.qa" site_id="598">BEIN SPORTS MAX 6</channel>
<channel lang="fr" xmltv_id="BeInSportsMax7France.qa" site_id="599">BEIN SPORTS MAX 7</channel>
<channel lang="fr" xmltv_id="BeInSportsMax8France.qa" site_id="603">BEIN SPORTS MAX 8</channel>
<channel lang="fr" xmltv_id="BeInSportsMax9France.qa" site_id="604">BEIN SPORTS MAX 9</channel>
<channel lang="fr" xmltv_id="BETFrance.us" site_id="628">BET</channel>
<channel lang="fr" xmltv_id="BFMBusiness.fr" site_id="645">BFM BUSINESS</channel>
<channel lang="fr" xmltv_id="BFMTV.fr" site_id="633">BFM TV</channel>
<channel lang="fr" xmltv_id="BloombergTVEurope.us" site_id="47">BLOOMBERG TV</channel>
<channel lang="fr" xmltv_id="BlueZoomD.ch" site_id="893">BLUE ZOOM</channel>
<channel lang="fr" xmltv_id="BoingFrance.it" site_id="529">BOING</channel>
<channel lang="fr" xmltv_id="BoomerangFrance.us" site_id="530">BOOMERANG</channel>
<channel lang="fr" xmltv_id="BSmartTV.fr" site_id="849">BSMART TV</channel>
<channel lang="fr" xmltv_id="C8.fr" site_id="450">C8</channel>
<channel lang="fr" xmltv_id="CanalAlphaNE.ch" site_id="772">CANAL ALPHA NE</channel>
<channel lang="fr" xmltv_id="CanalJ.fr" site_id="525">CANAL J</channel>
<channel lang="fr" xmltv_id="CanalPlusCinemaFrance.fr" site_id="198">CANAL+CINEMA</channel>
<channel lang="fr" xmltv_id="CanalPlusDecale.fr" site_id="257">CANAL+DECALE</channel>
<channel lang="fr" xmltv_id="CanalPlusDocs.fr" site_id="899">CANAL+DOCS</channel>
<channel lang="fr" xmltv_id="CanalPlusFormula1.fr" site_id="824">CANAL+FORMULA1</channel>
<channel lang="fr" xmltv_id="CanalPlusFrance.fr" site_id="301">CANAL+</channel>
<channel lang="fr" xmltv_id="CanalPlusGrandEcranFrance.fr" site_id="900">CANAL+GRAND ECRAN</channel>
<channel lang="fr" xmltv_id="CanalPlusKids.fr" site_id="259">CANAL+KIDS</channel>
<channel lang="fr" xmltv_id="CanalPlusMotoGp.fr" site_id="823">CANAL+MOTOGP</channel>
<channel lang="fr" xmltv_id="CanalPlusPremierLeague.fr" site_id="815">CANAL+PREMIER LEAGUE</channel>
<channel lang="fr" xmltv_id="CanalPlusSeriesFrance.fr" site_id="481">CANAL+SERIES</channel>
<channel lang="fr" xmltv_id="CanalPlusSport2.fr" site_id="861">CANAL+ SPORT 2 (CH)</channel>
<channel lang="fr" xmltv_id="CanalPlusSportFrance.fr" site_id="177">CANAL+SPORT</channel>
<channel lang="fr" xmltv_id="CanalPlusTop14.fr" site_id="816">CANAL+TOP14</channel>
<channel lang="fr" xmltv_id="CartoonNetworkFrance.us" site_id="502">CARTOON NETWORK</channel>
<channel lang="fr" xmltv_id="ChassePeche.fr" site_id="681">CHASSE ET PECHE</channel>
<channel lang="fr" xmltv_id="Cherie25.fr" site_id="440">CHERIE 25</channel>
<channel lang="fr" xmltv_id="CinePlusClassic.fr" site_id="531">CINE+ CLASSIC</channel>
<channel lang="fr" xmltv_id="CinePlusClub.fr" site_id="532">CINE+ CLUB</channel>
<channel lang="fr" xmltv_id="CinePlusEmotion.fr" site_id="396">CINE+ EMOTION</channel>
<channel lang="fr" xmltv_id="CinePlusFamiz.fr" site_id="533">CINE+ FAMIZ</channel>
<channel lang="fr" xmltv_id="CinePlusFrisson.fr" site_id="398">CINE+ FRISSON</channel>
<channel lang="fr" xmltv_id="CinePlusPremier.fr" site_id="322">CINE+ PREMIER</channel>
<channel lang="fr" xmltv_id="CliqueTV.fr" site_id="665">CLIQUE TV</channel>
<channel lang="fr" xmltv_id="CNBCEurope.us" site_id="64">CNBC</channel>
<channel lang="fr" xmltv_id="CNews.fr" site_id="480">CNEWS</channel>
<channel lang="fr" xmltv_id="CNNInternationalEurope.us" site_id="30">CNN INT.</channel>
<channel lang="fr" xmltv_id="ColmaxTV.fr" site_id="643">COLMAX TV</channel>
<channel lang="fr" xmltv_id="ComediePlus.fr" site_id="534">COMEDIE+</channel>
<channel lang="fr" xmltv_id="ComedyCentralFrance.us" site_id="806">COMEDY CENTRAL</channel>
<channel lang="fr" xmltv_id="CStar.fr" site_id="513">CSTAR</channel>
<channel lang="fr" xmltv_id="CStarHitsFrance.fr" site_id="723">CSTAR HITS FRANCE</channel>
<channel lang="fr" xmltv_id="DasErste.de" site_id="781">ARD DAS ERSTE</channel>
<channel lang="fr" xmltv_id="DisneyChannelFrance.us" site_id="282">DISNEY CHANNEL</channel>
<channel lang="fr" xmltv_id="DisneyChannelFrancePlus1.us" site_id="535">DISNEY CHANNEL+1</channel>
<channel lang="fr" xmltv_id="DisneyCinema.us" site_id="340">DISNEY CINEMA</channel>
<channel lang="fr" xmltv_id="DisneyJuniorFrance.us" site_id="274">DISNEY JUNIOR</channel>
<channel lang="fr" xmltv_id="DorcelTV.nl" site_id="536">DORCEL TV</channel>
<channel lang="fr" xmltv_id="DorcelXXX.nl" site_id="537">DORCEL XXX</channel>
<channel lang="fr" xmltv_id="Equidia.fr" site_id="540">EQUIDIA</channel>
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="324">EURONEWS</channel>
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="101">EUROSPORT 1</channel>
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="436">EUROSPORT 2</channel>
<channel lang="fr" xmltv_id="Eurosport3.fr" site_id="985">EUROSPORT 3</channel>
<channel lang="fr" xmltv_id="Eurosport360HD1.fr" site_id="635">EUROSPORT 360 1</channel>
<channel lang="fr" xmltv_id="Eurosport360HD2.fr" site_id="636">EUROSPORT 360 2</channel>
<channel lang="fr" xmltv_id="Eurosport360HD3.fr" site_id="637">EUROSPORT 360 3</channel>
<channel lang="fr" xmltv_id="Eurosport360HD4.fr" site_id="638">EUROSPORT 360 4</channel>
<channel lang="fr" xmltv_id="Eurosport360HD5.fr" site_id="650">EUROSPORT 360 5</channel>
<channel lang="fr" xmltv_id="Eurosport360HD6.fr" site_id="651">EUROSPORT 360 6</channel>
<channel lang="fr" xmltv_id="Eurosport360HD7.fr" site_id="652">EUROSPORT 360 7</channel>
<channel lang="fr" xmltv_id="Eurosport360HD8.fr" site_id="653">EUROSPORT 360 8</channel>
<channel lang="fr" xmltv_id="Eurosport4.fr" site_id="986">EUROSPORT 4</channel>
<channel lang="fr" xmltv_id="Eurosport5.fr" site_id="987">EUROSPORT 5</channel>
<channel lang="fr" xmltv_id="FootPlus.fr" site_id="542">FOOT+ 24/24</channel>
<channel lang="fr" xmltv_id="France2.fr" site_id="26">FRANCE 2</channel>
<channel lang="fr" xmltv_id="France24English.fr" site_id="311">FRANCE 24 ENG</channel>
<channel lang="fr" xmltv_id="France24Francais.fr" site_id="310">FRANCE 24</channel>
<channel lang="fr" xmltv_id="France3.fr" site_id="543">FRANCE 3</channel>
<channel lang="fr" xmltv_id="France3Alpes.fr" site_id="926">F3 ALPES</channel>
<channel lang="fr" xmltv_id="France3Alsace.fr" site_id="941">F3 ALSACE</channel>
<channel lang="fr" xmltv_id="France3Aquitaine.fr" site_id="922">F3 AQUITAINE</channel>
<channel lang="fr" xmltv_id="France3Auvergne.fr" site_id="924">F3 AUVERGNE</channel>
<channel lang="fr" xmltv_id="France3BasseNormandie.fr" site_id="923">F3 BNORMANDIE</channel>
<channel lang="fr" xmltv_id="France3Bourgogne.fr" site_id="925">F3 BOURGOGNE</channel>
<channel lang="fr" xmltv_id="France3Bretagne.fr" site_id="939">F3 BRETAGNE</channel>
<channel lang="fr" xmltv_id="France3CentreValdeLoire.fr" site_id="935">F3 CENTRE</channel>
<channel lang="fr" xmltv_id="France3ChampagneArdenne.fr" site_id="938">F3 CHAMP ARDENNE</channel>
<channel lang="fr" xmltv_id="France3CorseViaStella.fr" site_id="943">F3 CORSEVIASTELLA</channel>
<channel lang="fr" xmltv_id="France3CotedAzur.fr" site_id="934">F3 COTE D&apos;AZUR</channel>
<channel lang="fr" xmltv_id="France3FrancheComte.fr" site_id="921">F3 FRANCHE COMTE</channel>
<channel lang="fr" xmltv_id="France3HauteNormandie.fr" site_id="940">F3 HNORMANDIE</channel>
<channel lang="fr" xmltv_id="France3LanguedocRoussillon.fr" site_id="931">F3 LANGUEDOCROU</channel>
<channel lang="fr" xmltv_id="France3Limousin.fr" site_id="928">F3 LIMOUSIN</channel>
<channel lang="fr" xmltv_id="France3Lorraine.fr" site_id="932">F3 LORRAINE</channel>
<channel lang="fr" xmltv_id="France3MidiPyrenees.fr" site_id="942">F3 MIDI PYRENEES</channel>
<channel lang="fr" xmltv_id="France3NordPasdeCalais.fr" site_id="927">F3 NORD PDC</channel>
<channel lang="fr" xmltv_id="France3NouvelleAquitaine.fr" site_id="998">F3 NOUVELLE AQUITAINE</channel>
<channel lang="fr" xmltv_id="France3ParisIledeFrance.fr" site_id="936">F3 PARIS IDF</channel>
<channel lang="fr" xmltv_id="France3PaysdelaLoire.fr" site_id="933">F3 PAYS DE LA LOIRE</channel>
<channel lang="fr" xmltv_id="France3Picardie.fr" site_id="920">F3 PICARDIE</channel>
<channel lang="fr" xmltv_id="France3PoitouCharentes.fr" site_id="937">F3 POITOUCHAR</channel>
<channel lang="fr" xmltv_id="France3ProvenceAlpes.fr" site_id="930">F3 PROV ALPES</channel>
<channel lang="fr" xmltv_id="France3RhoneAlpes.fr" site_id="929">F3 RHONE ALPES</channel>
<channel lang="fr" xmltv_id="France4.fr" site_id="544">FRANCE 4</channel>
<channel lang="fr" xmltv_id="France5.fr" site_id="545">FRANCE 5</channel>
<channel lang="fr" xmltv_id="Franceinfo.fr" site_id="670">FRANCEINFO:</channel>
<channel lang="fr" xmltv_id="GameOne.fr" site_id="592">GAME ONE</channel>
<channel lang="fr" xmltv_id="GolfPlus.fr" site_id="378">GOLF+</channel>
<channel lang="fr" xmltv_id="Gulli.fr" site_id="549">GULLI</channel>
<channel lang="fr" xmltv_id="HistoireTV.fr" site_id="550">HISTOIRE TV</channel>
<channel lang="fr" xmltv_id="I24NewsFrancais.il" site_id="362">I24 NEWS</channel>
<channel lang="fr" xmltv_id="InfoSportPlus.fr" site_id="551">INFOSPORT+</channel>
<channel lang="fr" xmltv_id="JacquieMichelTV.fr" site_id="850">JACQUIE &amp; MICHEL TV</channel>
<channel lang="fr" xmltv_id="JOne.fr" site_id="484">J-ONE</channel>
<channel lang="fr" xmltv_id="LaChaineMeteo.fr" site_id="552">LA CHAINE METEO</channel>
<channel lang="fr" xmltv_id="LCI.fr" site_id="553">LCI</channel>
<channel lang="fr" xmltv_id="LCPAssembleeNationale.fr" site_id="554">LCP</channel>
<channel lang="fr" xmltv_id="LEquipe.fr" site_id="451">L&apos;EQUIPE</channel>
<channel lang="fr" xmltv_id="LFMTV.ch" site_id="879">LFM TV</channel>
<channel lang="fr" xmltv_id="M6.fr" site_id="313">M6</channel>
<channel lang="fr" xmltv_id="M6Music.fr" site_id="352">M6 MUSIC</channel>
<channel lang="fr" xmltv_id="Mangas.fr" site_id="613">MANGAS</channel>
<channel lang="fr" xmltv_id="ManX.be" site_id="672">MAN X</channel>
<channel lang="fr" xmltv_id="MCMFrance.fr" site_id="556">MCM</channel>
<channel lang="fr" xmltv_id="Melody.fr" site_id="580">MELODY</channel>
<channel lang="fr" xmltv_id="Mezzo.fr" site_id="560">MEZZO</channel>
<channel lang="fr" xmltv_id="MezzoLiveHD.fr" site_id="268">MEZZO LIVE</channel>
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="819">MGG TV</channel>
<channel lang="fr" xmltv_id="MTVFrance.us" site_id="470">MTV</channel>
<channel lang="fr" xmltv_id="MTVHitsFrance.us" site_id="629">MTV HITS</channel>
<channel lang="fr" xmltv_id="MultiSports1.fr" site_id="562">MULTISPORTS 1</channel>
<channel lang="fr" xmltv_id="MultiSports2.fr" site_id="563">MULTISPORTS 2</channel>
<channel lang="fr" xmltv_id="MultiSports3.fr" site_id="564">MULTISPORTS 3</channel>
<channel lang="fr" xmltv_id="MultiSports4.fr" site_id="565">MULTISPORTS 4</channel>
<channel lang="fr" xmltv_id="MultiSports5.fr" site_id="566">MULTISPORTS 5</channel>
<channel lang="fr" xmltv_id="MultiSports6.fr" site_id="567">MULTISPORTS 6</channel>
<channel lang="fr" xmltv_id="Museum.fr" site_id="678">MUSEUM</channel>
<channel lang="fr" xmltv_id="MyZenTV.fr" site_id="656">MY ZEN TV</channel>
<channel lang="fr" xmltv_id="NationalGeographicFrance.us" site_id="302">NATIONAL GEO</channel>
<channel lang="fr" xmltv_id="NationalGeographicWildFrance.us" site_id="290">NATIONAL GEOGRAPHIC WILD</channel>
<channel lang="fr" xmltv_id="NHKWorldJapan.jp" site_id="654">NHK WORLD-JAPAN</channel>
<channel lang="fr" xmltv_id="NickelodeonFrance.us" site_id="591">NICKELODEON</channel>
<channel lang="fr" xmltv_id="NickelodeonJuniorFrance.us" site_id="593">NICKELODEON JUNIOR</channel>
<channel lang="fr" xmltv_id="NickelodeonTeen.us" site_id="518">NICKELODEON TEEN</channel>
<channel lang="fr" xmltv_id="NollywoodTV.fr" site_id="527">NOLLYWOOD TV</channel>
<channel lang="fr" xmltv_id="NonStopPeopleFrance.fr" site_id="434">NON STOP PEOPLE</channel>
<channel lang="fr" xmltv_id="NovelasTV.fr" site_id="693">NOVELAS TV</channel>
<channel lang="fr" xmltv_id="NRJ12.fr" site_id="568">NRJ 12</channel>
<channel lang="fr" xmltv_id="NRJHits.fr" site_id="569">NRJ HITS</channel>
<channel lang="fr" xmltv_id="OCSchoc.fr" site_id="466">OCS CHOC</channel>
<channel lang="fr" xmltv_id="OCSCity.fr" site_id="467">OCS CITY</channel>
<channel lang="fr" xmltv_id="OCSgeants.fr" site_id="468">OCS GEANTS</channel>
<channel lang="fr" xmltv_id="OCSmax.fr" site_id="372">OCS MAX</channel>
<channel lang="fr" xmltv_id="OlympiaTV.fr" site_id="813">OLYMPIA TV</channel>
<channel lang="fr" xmltv_id="OneTV.ch" site_id="880">ONE TV</channel>
<channel lang="fr" xmltv_id="ORF1.at" site_id="783">ORF 1</channel>
<channel lang="fr" xmltv_id="ParamountChannelFrance.us" site_id="487">PARAMOUNT CHANNEL</channel>
<channel lang="fr" xmltv_id="ParisPremiere.fr" site_id="294">PARIS PREMIERE</channel>
<channel lang="fr" xmltv_id="PenthouseBlack.us" site_id="686">PENTHOUSE BLACK</channel>
<channel lang="fr" xmltv_id="PenthouseGold.us" site_id="167">PENTHOUSE</channel>
<channel lang="fr" xmltv_id="PinkX.fr" site_id="575">PINK X</channel>
<channel lang="fr" xmltv_id="PiwiPlus.fr" site_id="576">PIWI+</channel>
<channel lang="fr" xmltv_id="PlanetePlus.fr" site_id="270">PLANETE+</channel>
<channel lang="fr" xmltv_id="PlanetePlusAE.fr" site_id="588">PLANETE+AVENTURE</channel>
<channel lang="fr" xmltv_id="PlanetePlusCI.fr" site_id="587">PLANETE+CRIME</channel>
<channel lang="fr" xmltv_id="PolarPlus.fr" site_id="692">POLAR+</channel>
<channel lang="fr" xmltv_id="Rai1.it" site_id="782">RAI UNO</channel>
<channel lang="fr" xmltv_id="RFMTV.fr" site_id="557">RFM TV</channel>
<channel lang="fr" xmltv_id="RMCDecouverte.fr" site_id="595">RMC DECOUVERTE</channel>
<channel lang="fr" xmltv_id="RMCSport1.fr" site_id="732">RMC SPORT 1</channel>
<channel lang="fr" xmltv_id="RMCSport2.fr" site_id="733">RMC SPORT 2</channel>
<channel lang="fr" xmltv_id="RMCStory.fr" site_id="571">RMC STORY</channel>
<channel lang="fr" xmltv_id="RougeTV.ch" site_id="878">ROUGE TV</channel>
<channel lang="fr" xmltv_id="RTFrance.ru" site_id="479">RT FRANCE</channel>
<channel lang="fr" xmltv_id="RTL9.lu" site_id="505">RTL9</channel>
<channel lang="fr" xmltv_id="ScienceVieTV.fr" site_id="614">SCIENCE ET VIE TV</channel>
<channel lang="fr" xmltv_id="Seasons.fr" site_id="577">SEASONS</channel>
<channel lang="fr" xmltv_id="SerieClub.fr" site_id="356">SERIE CLUB</channel>
<channel lang="fr" xmltv_id="SRF1.ch" site_id="778">SRF 1</channel>
<channel lang="fr" xmltv_id="StingrayClassica.ca" site_id="165">CLASSICA</channel>
<channel lang="fr" xmltv_id="StingrayDjazz.ca" site_id="407">DJAZZ</channel>
<channel lang="fr" xmltv_id="TCMCinema.us" site_id="374">TCM CINEMA</channel>
<channel lang="fr" xmltv_id="TeleBielingue.ch" site_id="775">TELEBIELINGUE</channel>
<channel lang="fr" xmltv_id="TeleToonPlus.fr" site_id="581">TELETOON+</channel>
<channel lang="fr" xmltv_id="TeleToonPlus1.fr" site_id="582">TELETOON+1</channel>
<channel lang="fr" xmltv_id="Teva.fr" site_id="292">TEVA</channel>
<channel lang="fr" xmltv_id="TF1.fr" site_id="312">TF1</channel>
<channel lang="fr" xmltv_id="TF1SeriesFilms.fr" site_id="526">TF1 SERIES FILMS</channel>
<channel lang="fr" xmltv_id="TFX.fr" site_id="570">TFX</channel>
<channel lang="fr" xmltv_id="Tiji.fr" site_id="583">TIJI</channel>
<channel lang="fr" xmltv_id="TMC.fr" site_id="584">TMC</channel>
<channel lang="fr" xmltv_id="ToonamiFrance.us" site_id="683">TOONAMI</channel>
<channel lang="fr" xmltv_id="ToutelHistoire.fr" site_id="620">TOUTE L&apos;HISTOIRE</channel>
<channel lang="fr" xmltv_id="TraceAfricaFrancais.fr" site_id="674">TRACE AFRICA</channel>
<channel lang="fr" xmltv_id="TraceLatina.fr" site_id="784">TRACE LATINA</channel>
<channel lang="fr" xmltv_id="TraceUrban.fr" site_id="585">TRACE URBAN</channel>
<channel lang="fr" xmltv_id="TV5MondeFranceBelgiqueSuisse.fr" site_id="520">TV5 MONDE</channel>
<channel lang="fr" xmltv_id="TVBreizh.fr" site_id="586">TV BREIZH</channel>
<channel lang="fr" xmltv_id="UshuaiaTV.fr" site_id="142">USHUAIA TV</channel>
<channel lang="fr" xmltv_id="ViceTVFrance.us" site_id="677">VICE TV</channel>
<channel lang="fr" xmltv_id="Vixen.us" site_id="547">VIXEN</channel>
<channel lang="fr" xmltv_id="W9.fr" site_id="296">W9</channel>
<channel lang="fr" xmltv_id="WarnerTVFrance.us" site_id="694">WARNER TV</channel>
<channel lang="fr" xmltv_id="XXL.fr" site_id="616">XXL</channel>
</channels>
</site>