Fetch detailed guide.

Signed-off-by: Toha <tohenk@yahoo.com>
This commit is contained in:
Toha
2024-12-07 23:49:27 +07:00
parent 81509d07c5
commit aa04d9482e
4 changed files with 1724 additions and 12 deletions

View File

@@ -9,9 +9,9 @@ dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
const detailedGuide = false
const detailedGuide = true
const tz = 'Europe/London'
const nworker = 10
const nworker = 25
module.exports = {
site: 'mytelly.co.uk',
@@ -37,8 +37,7 @@ module.exports = {
} else {
const subtitle = td.find('h6')
const time = $(el).find('td:eq(0)')
const dateString = `${date.format('YYYY-MM-DD')} ${time.text().trim()}`
let start = dayjs.tz(dateString, 'YYYY-MM-DD H:mm a', tz)
let start = parseTime(date, time.text().trim())
const prev = programs[programs.length - 1]
if (prev) {
if (start.isBefore(prev.start)) {
@@ -56,6 +55,53 @@ module.exports = {
})
}
})
if (queues.length) {
await doFetch(queues, (url, res) => {
const $ = cheerio.load(res)
const time = $('center > h5 > b').text()
const title = parseText($('.inner-heading.sub h2'))
const subTitle = parseText($('.tab-pane > h5 > strong'))
const description = parseText($('.tab-pane > .tvbody > p'))
const image = $('.program-media-image img').attr('src')
const category = $('.schedule-attributes-genres span').toArray()
.map(el => $(el).text())
const casts = $('.single-cast-head:not([id])').toArray()
.map(el => {
const cast = { name: parseText($(el).find('a')) }
const [, role] = $(el).text().match(/\((.*)\)/) || [null, null]
if (role) {
cast.role = role
}
return cast
})
const [start, stop] = parseStartStop(date, time)
let season, episode
if (subTitle) {
const [, ses, epi] = subTitle.match(/Season (\d+), Episode (\d+)/) || [null, null]
if (ses) {
season = parseInt(ses)
}
if (epi) {
episode = parseInt(epi)
}
}
programs.push({
title,
subTitle,
description,
image,
category,
season,
episode,
actor: casts.filter(c => c.role === 'Actor').map(c => c.name),
director: casts.filter(c => c.role === 'Director').map(c => c.name),
presenter: casts.filter(c => c.role === 'Presenter').map(c => c.name),
start,
stop
})
})
}
}
return programs
@@ -115,12 +161,35 @@ module.exports = {
}
}
function parseStartStop(date, time) {
const [s, e] = time.split(' - ')
const start = parseTime(date, s)
let stop = parseTime(date, e)
if (stop.isBefore(start)) {
stop = stop.add(1, 'd')
}
return [start, stop]
}
function parseTime(date, time) {
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD H:mm a', tz)
}
function parseText($item) {
return $item.text()
let text = $item.text()
.replace(/\t/g, '')
.replace(/\n/g, ' ')
.replace(/ /g, ' ')
.trim()
while (true) {
if (text.match(/ /)) {
text = text.replace(/ /g, ' ')
continue
}
break
}
return text
}
async function doFetch(queues, cb) {