diff --git a/sites/tv.sfr.fr/tv.sfr.fr.config.js b/sites/tv.sfr.fr/tv.sfr.fr.config.js new file mode 100644 index 00000000..f5653573 --- /dev/null +++ b/sites/tv.sfr.fr/tv.sfr.fr.config.js @@ -0,0 +1,65 @@ +const axios = require('axios') +const dayjs = require('dayjs') + +module.exports = { + site: 'tv.sfr.fr', + days: 2, + url({ date }) { + return `https://static-cdn.tv.sfr.net/data/epg/gen8/guide_web_${date.format('YYYYMMDD')}.json` + }, + request: { + maxContentLength: 10 * 1024 * 1024, // 10Mb + cache: { + ttl: 24 * 60 * 60 * 1000 // 1 day + } + }, + parser({ content, channel }) { + let programs = [] + let items = parseItems(content, channel) + items.forEach(item => { + programs.push({ + start: dayjs(item.startDate), + stop: dayjs(item.endDate), + title: item.title, + subtitle: item.subTitle || null, + category: item.genre, + description: item.longSynopsis, + images: item.images.map(img => img.url), + season: item.seasonNumber || null, + episode: item.episodeNumber || null + }) + }) + + return programs + }, + async channels() { + const data = await axios + .get('https://api.sfr.fr/service-channel/api/rest/v2/channels') + .then(r => r.data) + .catch(console.error) + + let channels = {} + Object.values(data.data.chaines).forEach(channel => { + if (!channels[channel.epg_id]) { + channels[channel.epg_id] = { + lang: 'fr', + site_id: channel.epg_id, + name: channel.nom_chaine + } + } + }) + + return Object.values(channels) + } +} + +function parseItems(content, channel) { + try { + const data = JSON.parse(content) + if (!data || !data.epg || !Array.isArray(data.epg[channel.site_id])) return [] + + return data.epg[channel.site_id] + } catch { + return [] + } +}