mirror of
https://github.com/iptv-org/epg
synced 2026-05-09 19:07:03 -04:00
88 lines
3.1 KiB
JavaScript
88 lines
3.1 KiB
JavaScript
const axios = require('axios')
|
|
const dayjs = require('dayjs')
|
|
const utc = require('dayjs/plugin/utc')
|
|
const timezone = require('dayjs/plugin/timezone')
|
|
dayjs.extend(utc)
|
|
dayjs.extend(timezone)
|
|
|
|
const API_ENDPOINT = 'https://cdn.pt.vtv.vodafone.com/epg'
|
|
|
|
const headers = {
|
|
Origin: 'https://www.vodafone.pt',
|
|
Referer: 'https://www.vodafone.pt/',
|
|
'User-Agent': 'Mozilla/5.0 (compatible; tv_grab_pt_vodafone)',
|
|
Accept: 'application/json, text/javascript, */*; q=0.01',
|
|
'Accept-Language': 'pt-PT,pt;q=0.9,en;q=0.8'
|
|
}
|
|
|
|
module.exports = {
|
|
site: 'vodafone.pt',
|
|
days: 2,
|
|
request: {
|
|
headers
|
|
},
|
|
url: function ({ channel, date }) {
|
|
const datetime = dayjs(date.toDate()).tz('Europe/Lisbon')
|
|
const formattedMonth = datetime.month() + 1 < 10 ? `0${datetime.month() + 1}` : datetime.month() + 1
|
|
const formattedDay = datetime.date() < 10 ? `0${datetime.date()}` : datetime.date()
|
|
return `${API_ENDPOINT}/${channel.site_id}/${datetime.year()}/${formattedMonth}/${formattedDay}/00-06`
|
|
},
|
|
async parser({ content, date, channel }) {
|
|
let programs = []
|
|
let items = parseItems(content)
|
|
if (items.length === 0) return programs
|
|
|
|
const datetime = dayjs(date.toDate()).tz('Europe/Lisbon')
|
|
const formattedMonth = datetime.month() + 1 < 10 ? `0${datetime.month() + 1}` : datetime.month() + 1
|
|
const formattedDay = datetime.date() < 10 ? `0${datetime.date()}` : datetime.date()
|
|
|
|
// Fetch the remaining 3 periods to get a full day schedule
|
|
const promises = [
|
|
axios.get(`${API_ENDPOINT}/${channel.site_id}/${datetime.year()}/${formattedMonth}/${formattedDay}/06-12`, { headers }),
|
|
axios.get(`${API_ENDPOINT}/${channel.site_id}/${datetime.year()}/${formattedMonth}/${formattedDay}/12-18`, { headers }),
|
|
axios.get(`${API_ENDPOINT}/${channel.site_id}/${datetime.year()}/${formattedMonth}/${formattedDay}/18-00`, { headers })
|
|
]
|
|
|
|
await Promise.allSettled(promises).then(results => {
|
|
results.forEach(r => {
|
|
if (r.status === 'fulfilled') {
|
|
items = items.concat(parseItems(r.value.data))
|
|
}
|
|
})
|
|
})
|
|
|
|
for (let item of items) {
|
|
if (!item.startDate || !item.endDate) continue
|
|
let start = dayjs.unix(item.startDate).utc()
|
|
let stop = dayjs.unix(item.endDate).utc()
|
|
if (stop < start) {
|
|
stop = stop.add(1, 'day')
|
|
}
|
|
const prog = {
|
|
title: item.name || 'Sem título',
|
|
start,
|
|
stop
|
|
}
|
|
if (item.description) prog.description = item.description
|
|
if (item.metas?.year?.value) prog.year = item.metas.year.value
|
|
if (item.tags?.genre?.objects) {
|
|
prog.category = item.tags.genre.objects.map(g => g.value)
|
|
}
|
|
programs.push(prog)
|
|
}
|
|
return programs
|
|
}
|
|
}
|
|
|
|
function parseItems(content) {
|
|
let json
|
|
try {
|
|
json = typeof content === 'string' ? JSON.parse(content) : content
|
|
} catch {
|
|
return []
|
|
}
|
|
if (!json || !json.result) return []
|
|
const { result } = json
|
|
if (!Array.isArray(result.objects)) return []
|
|
return result.objects
|
|
} |