From 8736114213339d4e272890bb5646f81630eaeb96 Mon Sep 17 00:00:00 2001
From: David Claeys <dcl@centexbel.be>
Date: Mon, 13 Jan 2025 11:00:37 +0100
Subject: [PATCH] update orangetv.orange.es

---
 .../orangetv.orange.es.config.js              | 120 ++++++++----------
 1 file changed, 53 insertions(+), 67 deletions(-)

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