mirror of
https://github.com/iptv-org/epg.git
synced 2025-05-09 16:40:07 -04:00
105 lines
2.7 KiB
JavaScript
105 lines
2.7 KiB
JavaScript
const cheerio = require('cheerio')
|
|
const dayjs = require('dayjs')
|
|
const utc = require('dayjs/plugin/utc')
|
|
const timezone = require('dayjs/plugin/timezone')
|
|
const customParseFormat = require('dayjs/plugin/customParseFormat')
|
|
|
|
dayjs.extend(utc)
|
|
dayjs.extend(timezone)
|
|
dayjs.extend(customParseFormat)
|
|
|
|
module.exports = {
|
|
site: 'meuguia.tv',
|
|
days: 2,
|
|
url({ channel }) {
|
|
return `https://meuguia.tv/programacao/canal/${channel.site_id}`
|
|
},
|
|
parser({ content, date }) {
|
|
const programs = []
|
|
parseItems(content, date).forEach(item => {
|
|
if (dayjs.utc(item.start).isSame(date, 'day')) {
|
|
programs.push(item)
|
|
}
|
|
})
|
|
|
|
return programs
|
|
},
|
|
async channels() {
|
|
const channels = []
|
|
const axios = require('axios')
|
|
const baseUrl = 'https://meuguia.tv'
|
|
|
|
let seq = 0
|
|
const queues = [baseUrl]
|
|
while (true) {
|
|
if (!queues.length) {
|
|
break
|
|
}
|
|
const url = queues.shift()
|
|
const content = await axios
|
|
.get(url)
|
|
.then(response => response.data)
|
|
.catch(console.error)
|
|
|
|
if (content) {
|
|
const [$, items] = getItems(content)
|
|
if (seq === 0) {
|
|
queues.push(...items.map(category => baseUrl + $(category).attr('href')))
|
|
} else {
|
|
items.forEach(item => {
|
|
const href = $(item).attr('href')
|
|
channels.push({
|
|
lang: 'pt',
|
|
site_id: href.substr(href.lastIndexOf('/') + 1),
|
|
name: $(item).find('.licontent h2').text().trim()
|
|
})
|
|
})
|
|
}
|
|
}
|
|
seq++
|
|
}
|
|
|
|
return channels
|
|
}
|
|
}
|
|
|
|
function getItems(content) {
|
|
const $ = cheerio.load(content)
|
|
return [$, $('div.mw ul li a').toArray()]
|
|
}
|
|
|
|
function parseItems(content, date) {
|
|
const result = []
|
|
const $ = cheerio.load(content)
|
|
|
|
let lastDate
|
|
for (const item of $('ul.mw li').toArray()) {
|
|
const $item = $(item)
|
|
if ($item.hasClass('subheader')) {
|
|
lastDate = `${$item.text().split(', ')[1]}/${date.format('YYYY')}`
|
|
} else if ($item.hasClass('divider')) {
|
|
// ignore
|
|
} else if (lastDate) {
|
|
const data = { title: $item.find('a').attr('title').trim() }
|
|
const ep = data.title.match(/T(\d+) EP(\d+)/)
|
|
if (ep) {
|
|
data.season = parseInt(ep[1])
|
|
data.episode = parseInt(ep[2])
|
|
}
|
|
data.start = dayjs.tz(
|
|
`${lastDate} ${$item.find('.time').text()}`,
|
|
'DD/MM/YYYY HH:mm',
|
|
'America/Sao_Paulo'
|
|
)
|
|
result.push(data)
|
|
}
|
|
}
|
|
// use stop time from next item
|
|
if (result.length > 1) {
|
|
for (let i = 0; i < result.length - 1; i++) {
|
|
result[i].stop = result[i + 1].start
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|