From b0bb86376b328641fe065db47d42dc20cf6dd36b Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Tue, 4 Oct 2022 00:41:41 +0300 Subject: [PATCH] Create reportv.com.ar.config.js --- sites/reportv.com.ar/reportv.com.ar.config.js | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 sites/reportv.com.ar/reportv.com.ar.config.js diff --git a/sites/reportv.com.ar/reportv.com.ar.config.js b/sites/reportv.com.ar/reportv.com.ar.config.js new file mode 100644 index 00000000..4836492d --- /dev/null +++ b/sites/reportv.com.ar/reportv.com.ar.config.js @@ -0,0 +1,168 @@ +require('dayjs/locale/es') +const axios = require('axios') +const dayjs = require('dayjs') +const cheerio = require('cheerio') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +const customParseFormat = require('dayjs/plugin/customParseFormat') +const _ = require('lodash') + +dayjs.extend(utc) +dayjs.extend(timezone) +dayjs.extend(customParseFormat) + +module.exports = { + site: 'reportv.com.ar', + request: { + cache: { + ttl: 60 * 60 * 1000 // 1 hour + }, + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data({ channel, date }) { + const formData = new URLSearchParams() + formData.append('idSenial', channel.site_id) + formData.append('Alineacion', '2694') + formData.append('DiaDesde', date.format('YYYY/MM/DD')) + formData.append('HoraDesde', '00:00:00') + + return formData + } + }, + url: `https://www.reportv.com.ar/buscador/ProgXSenial.php`, + parser: async function ({ content, date }) { + let programs = [] + const items = parseItems(content, date) + for (let item of items) { + const $item = cheerio.load(item) + const start = parseStart($item, date) + const duration = parseDuration($item) + const stop = start.add(duration, 's') + const details = await loadProgramDetails($item) + programs.push({ + title: parseTitle($item), + category: parseCategory($item), + icon: details.icon, + description: details.description, + directors: details.directors, + actors: details.actors, + start, + stop + }) + } + + return programs + }, + async channels() { + const content = await axios + .get(`https://www.reportv.com.ar/buscador/Buscador.php?aid=2694`) + .then(r => r.data) + .catch(console.log) + const $ = cheerio.load(content) + const items = $('#tr_home_2 > td:nth-child(1) > select > option').toArray() + + return items.map(item => { + return { + site_id: $(item).attr('value'), + name: $(item).text() + } + }) + } +} + +async function loadProgramDetails($item) { + const onclick = $item('*').attr('onclick') + const regexp = /detallePrograma\((\d+),(\d+),(\d+),(\d+),'([^']+)'\);/g + const match = [...onclick.matchAll(regexp)] + const [_, id, idc, id_alineacion, idp, title] = match[0] + if (!id || !idc || !id_alineacion || !idp || !title) return Promise.resolve({}) + const formData = new URLSearchParams() + formData.append('id', id) + formData.append('idc', idc) + formData.append('id_alineacion', id_alineacion) + formData.append('idp', idp) + formData.append('title', title) + const content = await axios + .post(`https://www.reportv.com.ar/buscador/DetallePrograma.php`, formData) + .then(r => r.data.toString()) + .catch(console.error) + if (!content) return Promise.resolve({}) + + const $ = cheerio.load(content) + + return Promise.resolve({ + icon: parseIcon($), + actors: parseActors($), + directors: parseDirectors($), + description: parseDescription($) + }) +} + +function parseActors($) { + const section = $('#Ficha > div') + .html() + .split('
') + .find(str => str.includes('Actores:')) + if (!section) return null + const $section = cheerio.load(section) + + return $section('span') + .map((i, el) => $(el).text().trim()) + .get() +} + +function parseDirectors($) { + const section = $('#Ficha > div') + .html() + .split('
') + .find(str => str.includes('Directores:')) + if (!section) return null + const $section = cheerio.load(section) + + return $section('span') + .map((i, el) => $(el).text().trim()) + .get() +} + +function parseDescription($) { + return $('#Sinopsis > div').text().trim() +} + +function parseIcon($) { + const src = $('#ImgProg').attr('src') + const url = new URL(src, 'https://www.reportv.com.ar/buscador/') + + return url.href +} + +function parseTitle($item) { + const [_, title] = $item('div:nth-child(1) > span').text().split(' - ') + + return title +} + +function parseCategory($item) { + return $item('div:nth-child(3) > span').text() +} + +function parseStart($item, date) { + const [time, _] = $item('div:nth-child(1) > span').text().split(' - ') + + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'America/Caracas') +} + +function parseDuration($item) { + const [hh, mm, ss] = $item('div:nth-child(4) > span').text().split(':') + + return parseInt(hh) * 3600 + parseInt(mm) * 60 + parseInt(ss) +} + +function parseItems(content, date) { + if (!content) return [] + const $ = cheerio.load(content) + const d = _.startCase(date.locale('es').format('DD MMMM YYYY')) + + return $(`.trProg[title*="${d}"]`).toArray() +}