mirror of
https://github.com/iptv-org/epg
synced 2026-09-10 13:56:51 -04:00
Add files via upload
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
const cheerio = require('cheerio')
|
||||
const dayjs = require('dayjs')
|
||||
const utc = require('dayjs/plugin/utc')
|
||||
const customParseFormat = require('dayjs/plugin/customParseFormat')
|
||||
const timezone = require('dayjs/plugin/timezone')
|
||||
|
||||
dayjs.extend(customParseFormat)
|
||||
dayjs.extend(utc)
|
||||
dayjs.extend(timezone)
|
||||
|
||||
@@ -13,31 +15,54 @@ module.exports = {
|
||||
ttl: 60 * 60 * 1000 // 1 hour
|
||||
}
|
||||
},
|
||||
url({ date }) {
|
||||
const diff = date.diff(dayjs().utc().startOf('day'), 'd')
|
||||
|
||||
return `https://www.tivu.tv/epg_ajax_sat.aspx?d=${diff}`
|
||||
url({ channel, date }) {
|
||||
date = date.startOf('day')
|
||||
return `https://services.tivulaguida.it/api/epg/channels/${channel.site_id}/date/${date.format('YYYY-MM-DD')}`
|
||||
},
|
||||
parser: function ({ content, channel, date }) {
|
||||
parser: async function ({ content, channel, date }) {
|
||||
const axios = require('axios')
|
||||
let programs = []
|
||||
const items = parseItems(content, channel, date)
|
||||
items.forEach(item => {
|
||||
const $item = cheerio.load(item)
|
||||
const prev = programs[programs.length - 1]
|
||||
let start = parseStart($item, date)
|
||||
if (!start) return
|
||||
if (prev) {
|
||||
if (start < prev.start) {
|
||||
start = start.add(1, 'day')
|
||||
date = date.add(1, 'day')
|
||||
}
|
||||
prev.stop = start
|
||||
}
|
||||
const stop = start.add(30, 'minute')
|
||||
const items = JSON.parse(content)
|
||||
if (!items || !Array.isArray(items.events)) return programs
|
||||
|
||||
const previousDay = date.subtract(1, 'day')
|
||||
let urlDayBefore
|
||||
try {
|
||||
const response = await axios.get(
|
||||
`https://services.tivulaguida.it/api/epg/channels/${channel.site_id}/date/${previousDay.format('YYYY-MM-DD')}`
|
||||
)
|
||||
urlDayBefore = response?.data
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
const allEvents = [
|
||||
...(urlDayBefore?.events || []),
|
||||
...items.events
|
||||
]
|
||||
|
||||
const midnight = dayjs.tz(date.format('YYYY-MM-DD 00:00'), 'YYYY-MM-DD HH:mm', 'Europe/Rome')
|
||||
const nextMidnight = midnight.add(1, 'day')
|
||||
|
||||
const seen = new Set()
|
||||
allEvents.forEach(item => {
|
||||
if (!item.program) return
|
||||
|
||||
const start = dayjs.tz(item.date_start, 'DD-MM-YYYY HH:mm', 'Europe/Rome')
|
||||
const stop = dayjs.tz(item.date_end, 'DD-MM-YYYY HH:mm', 'Europe/Rome')
|
||||
|
||||
if (start.isBefore(midnight) || !start.isBefore(nextMidnight)) return
|
||||
|
||||
const key = `${start.format()}|${stop.format()}`
|
||||
if (seen.has(key)) return
|
||||
seen.add(key)
|
||||
|
||||
programs.push({
|
||||
title: parseTitle($item),
|
||||
title: item.program.title,
|
||||
start,
|
||||
stop
|
||||
stop,
|
||||
description: item.program.description,
|
||||
icon: item.program.url_poster
|
||||
})
|
||||
})
|
||||
|
||||
@@ -46,46 +71,22 @@ module.exports = {
|
||||
async channels() {
|
||||
const axios = require('axios')
|
||||
const html = await axios
|
||||
.get('https://www.tivu.tv/epg_ajax_sat.aspx?d=0')
|
||||
.get('https://services.tivulaguida.it/api/epg/channels.json')
|
||||
.then(r => r.data)
|
||||
.catch(console.log)
|
||||
|
||||
let channels = []
|
||||
|
||||
const $ = cheerio.load(html)
|
||||
$('.q').each((i, el) => {
|
||||
const site_id = $(el).attr('id')
|
||||
const name = $(el).find('a').first().data('channel')
|
||||
|
||||
if (!name) return
|
||||
|
||||
channels.push({
|
||||
lang: 'it',
|
||||
site_id,
|
||||
name
|
||||
if (html && html.channels) {
|
||||
html.channels.forEach(channel => {
|
||||
channels.push({
|
||||
lang: 'it',
|
||||
site_id: channel.id,
|
||||
name: channel.name,
|
||||
logo: 'https://services.tivulaguida.it/' + channel.icon
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
return channels
|
||||
}
|
||||
}
|
||||
|
||||
function parseTitle($item) {
|
||||
const [title] = $item('a').html().split('<br>')
|
||||
|
||||
return title
|
||||
}
|
||||
|
||||
function parseStart($item, date) {
|
||||
const [, , time] = $item('a').html().split('<br>')
|
||||
if (!time) return null
|
||||
|
||||
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'Europe/Rome').utc()
|
||||
}
|
||||
|
||||
function parseItems(content, channel) {
|
||||
if (!content) return []
|
||||
const $ = cheerio.load(content)
|
||||
|
||||
return $(`.q[id="${channel.site_id}"] > .p`).toArray()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user