Files
epg/sites/meo.pt/meo.pt.config.js

109 lines
3.7 KiB
JavaScript
Raw Permalink Normal View History

2026-04-09 00:02:18 +02:00
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
dayjs.extend(utc)
dayjs.extend(timezone)
2025-09-28 17:55:05 +03:00
module.exports = {
site: 'meo.pt',
days: 2,
2026-01-23 18:28:27 +01:00
url: function ({ channel, date }) {
return `https://meogouser.apps.meo.pt/Services/GridTv/GridTv.svc/GetLiveChannelProgramsByDate?callLetter=${channel.site_id}&date=${date.format('YYYY-MM-DD')}&userAgent=IPTV_OFR_GTV`
},
2025-09-28 17:55:05 +03:00
request: {
2026-01-23 18:28:27 +01:00
method: 'GET',
2025-09-28 17:55:05 +03:00
headers: {
2026-01-23 18:28:27 +01:00
'accept': '*/*',
'accept-language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7,pt;q=0.6,cs;q=0.5',
'cache-control': 'no-cache',
'origin': 'https://www.meo.pt',
'pragma': 'no-cache',
'priority': 'u=1, i',
'referer': 'https://www.meo.pt/',
'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36'
2025-09-28 17:55:05 +03:00
}
},
2026-01-23 18:28:27 +01:00
async parser({ content, channel }) {
2025-09-28 17:55:05 +03:00
let programs = []
const items = parseItems(content)
if (!items.length) return programs
for (const item of items) {
const start = dayjs.tz(item.StartDate, 'Europe/Lisbon').utc()
const stop = dayjs.tz(item.EndDate, 'Europe/Lisbon').utc()
const prog = {
2026-01-23 18:28:27 +01:00
title: item.Title || 'Sem título',
2025-09-28 17:55:05 +03:00
start,
stop
}
2026-01-23 18:28:27 +01:00
if (item.Synopsis) {
prog.description = item.Synopsis
}
// Construct image URL using the same logic as before if possible
if (item.Title && channel.site_id) {
const encodedTitle = encodeURIComponent(item.Title)
2026-03-18 15:38:29 +00:00
const image = `https://cdn-er-images.online.meo.pt/eemstb/ImageHandler.ashx?chCallLetter=${channel.site_id}&progTitle=${encodedTitle}&profile=16_9&profileFallback=false&noFallback=true&appSource=PC_CHROME_PWA&width=1920&csf`
prog.icon = { src: image }
prog.image = image
}
2026-01-23 18:28:27 +01:00
programs.push(prog)
}
2025-09-28 17:55:05 +03:00
return programs
},
async channels() {
const axios = require('axios')
const data = await axios
2026-01-23 18:28:27 +01:00
.get('https://meogouser.apps.meo.pt/Services/GridTv/GridTv.svc/GetContentsForChannels?userAgent=IPTV_OFR_GTV', {
2025-09-28 17:55:05 +03:00
headers: {
2026-01-23 18:28:27 +01:00
'accept': '*/*',
'accept-language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7,pt;q=0.6,cs;q=0.5',
'cache-control': 'no-cache',
'origin': 'https://www.meo.pt',
'pragma': 'no-cache',
'priority': 'u=1, i',
'referer': 'https://www.meo.pt/',
'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36'
2025-09-28 17:55:05 +03:00
}
})
.then(r => r.data)
.catch(console.log)
2026-01-23 18:28:27 +01:00
return data.Result
2025-09-28 17:55:05 +03:00
.map(item => {
return {
lang: 'pt',
2026-01-23 18:28:27 +01:00
site_id: item.CallLetter,
name: item.Title
2025-09-28 17:55:05 +03:00
}
})
.filter(channel => channel.site_id)
}
}
function parseItems(content) {
if (!content) return []
try {
2026-01-23 18:28:27 +01:00
const data = typeof content === 'string' ? JSON.parse(content) : content
return Array.isArray(data.Result) ? data.Result : []
2025-10-28 00:16:07 +00:00
} catch {
2026-01-23 18:28:27 +01:00
return []
}
}