diff --git a/fixes/orangetv.orange.es/orangetv.orange.es.config.js b/fixes/orangetv.orange.es/orangetv.orange.es.config.js index d218a17..080c45c 100644 --- a/fixes/orangetv.orange.es/orangetv.orange.es.config.js +++ b/fixes/orangetv.orange.es/orangetv.orange.es.config.js @@ -1,11 +1,15 @@ const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') -const axios = require('axios') +const doFetch = require('@ntlab/sfetch') +const debug = require('debug')('site:orangetv.orange.es') dayjs.extend(utc) +doFetch.setDebugger(debug) + const API_PROGRAM_ENDPOINT = 'https://epg.orangetv.orange.es/epg/Smartphone_Android/1_PRO' -const API_CHANNEL_ENDPOINT = 'https://pc.orangetv.orange.es/pc/api/rtv/v1/GetChannelList?bouquet_id=1&model_external_id=PC&filter_unsupported_channels=false&client=json' +const API_CHANNEL_ENDPOINT = + 'https://pc.orangetv.orange.es/pc/api/rtv/v1/GetChannelList?bouquet_id=1&model_external_id=PC&filter_unsupported_channels=false&client=json' const API_IMAGE_ENDPOINT = 'https://pc.orangetv.orange.es/pc/api/rtv/v1/images' module.exports = { @@ -13,53 +17,39 @@ module.exports = { days: 2, request: { cache: { - ttl: 60 * 60 * 1000 // 1 hour + ttl: 24 * 60 * 60 * 1000 // 1 day } }, - url({ date }) { - return `${API_PROGRAM_ENDPOINT}/${date.format('YYYYMMDD')}_8h_1.json` + url({ date, segment = 1 }) { + return `${API_PROGRAM_ENDPOINT}/${date.format('YYYYMMDD')}_8h_${segment}.json` }, async parser({ content, channel, date }) { - let programs = [] - let items = parseItems(content, channel) - if (!items.length) return programs - - const promises = [ - axios.get( - `${API_PROGRAM_ENDPOINT}/${date.format('YYYYMMDD')}_8h_1.json`, - ), - axios.get( - `${API_PROGRAM_ENDPOINT}/${date.format('YYYYMMDD')}_8h_2.json`, - ), - axios.get( - `${API_PROGRAM_ENDPOINT}/${date.format('YYYYMMDD')}_8h_3.json`, - ), - ] - - await Promise.allSettled(promises) - .then(results => { - results.forEach(r => { - if (r.status === 'fulfilled') { - const parsed = parseItems(r.value.data, channel) - - items = items.filter((item, index) => items.findIndex(oi => oi.id === item.id) === index).concat(parsed) + const programs = [] + const items = parseItems(content, channel) + if (items.length) { + const queues = [ + module.exports.url({ date, segment: 2 }), + module.exports.url({ date, segment: 3 }) + ] + await doFetch(queues, (url, res) => { + items.push(...parseItems(res, channel)) + }) + programs.push( + ...items.map(item => { + return { + title: item.name, + sub_title: item.seriesName, + description: item.description, + category: parseGenres(item), + season: item.seriesSeason ? parseInt(item.seriesSeason) : null, + episode: item.episodeId ? parseInt(item.episodeId) : null, + icon: parseIcon(item), + start: dayjs.utc(item.startDate), + stop: dayjs.utc(item.endDate) } }) - }) - .catch(console.error) - - items.forEach(item => { - programs.push({ - title: item.name, - description: item.description, - category: parseGenres(item), - season: item.seriesSeason || null, - episode: item.episodeId || null, - icon: parseIcon(item), - start: dayjs.utc(item.startDate) || null, - stop: dayjs.utc(item.endDate) || null, - }) - }) + ) + } return programs }, @@ -68,46 +58,42 @@ module.exports = { const data = await axios .get(API_CHANNEL_ENDPOINT) .then(r => r.data) - .catch(console.log) + .catch(console.error) + return data.response.map(item => { return { lang: 'es', - name: item.name, + name: item.name, site_id: item.externalChannelId } }) } } -function parseIcon(item){ - - if(item.attachments.length > 0){ - const cover = item.attachments.find(i => i.name === "COVER" || i.name === "cover") - - if(cover) - { - return `${API_IMAGE_ENDPOINT}${cover.value}`; +function parseIcon(item) { + if (item.attachments.length) { + const cover = item.attachments.find(i => i.name.match(/cover/i)) + if (cover) { + return `${API_IMAGE_ENDPOINT}${cover.value}` } } - - return '' } -function parseGenres(item){ - return item.genres.map(i => i.name); +function parseGenres(item) { + return item.genres.map(i => i.name) } function parseItems(content, channel) { - const json = typeof content === 'string' ? JSON.parse(content) : Array.isArray(content) ? content : [] - - if (!Array.isArray(json)) { - return []; + const result = [] + const json = + typeof content === 'string' ? JSON.parse(content) : Array.isArray(content) ? content : [] + if (Array.isArray(json)) { + json + .filter(i => i.channelExternalId === channel.site_id) + .forEach(i => { + result.push(...i.programs) + }) } - const channelData = json.find(i => i.channelExternalId == channel.site_id); - - if(!channelData) - return []; - - return channelData.programs; + return result } \ No newline at end of file