Initial Commit

This commit is contained in:
2023-09-10 21:48:48 +02:00
commit 227cca7d31
791 changed files with 165200 additions and 0 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,27 @@
<div id="id-schedule-detail" class="panel-body">
<h1 class="page-header">Synopsis</h1>
<div id="id-schedule-detail" class="tm-sinopsys-container">
<h2 class='page-header title text-info program-title'>Adventures With Miao Mi, Ep 1</h2>
<div class='text-warning showtime'><b>05 Oct 2022, 12:00 AM</b><br><small class="showtime-range">00:00 - 00:06 [duration:00:06]</small></div>
<blockquote class="bloquet synopsis">
When children begin to disappear, a group of young kids have to face their biggest fears when they square off against a murderous, evil clown. </blockquote>
<div class="tm-channel-info">
<img class="tm-channel-image" src="userfiles/image/channel/miawme150x150.jpg" alt="Miao Mi" title="Miao Mi #channel:38" />
<div class='tm-channel-label'>
<span class='tm-channel-label'>
Channel <span class='tm-channel-no'>38</span>
</span>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,27 @@
<div id="id-schedule-detail" class="panel-body">
<h1 class="page-header">Synopsis</h1>
<div id="id-schedule-detail" class="tm-sinopsys-container">
<h2 class='page-header title text-info program-title'>Adventures With Miao Mi, Ep 1</h2>
<div class='text-warning showtime'><b>05 Oct 2022, 12:00 AM</b><br><small class="showtime-range">00:00 - 00:06 [durasi:00:06]</small></div>
<blockquote class="bloquet synopsis">
Ketika anak-anak mulai menghilang, sekelompok anak kecil harus menghadapi ketakutan terbesar mereka ketika mereka melawan sesosok badut pembunuh yang jahat. </blockquote>
<div class="tm-channel-info">
<img class="tm-channel-image" src="userfiles/image/channel/miawme150x150.jpg" alt="Miao Mi" title="Miao Mi #channel:38" />
<div class='tm-channel-label'>
<span class='tm-channel-label'>
Channel <span class='tm-channel-no'>38</span>
</span>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="mncvision.id">
<channels>
<channel lang="en" xmltv_id="ABCAustralia.au" site_id="350">ABC Australia</channel>
<channel lang="en" xmltv_id="AlJazeeraEnglish.qa" site_id="331">Aljazeera</channel>
<channel lang="en" xmltv_id="AnimalPlanetSoutheastAsia.sg" site_id="203">Animal Planet</channel>
<channel lang="en" xmltv_id="AnimaxAsia.sg" site_id="157">Animax Asia</channel>
<channel lang="en" xmltv_id="ANTV.id" site_id="115">ANTV</channel>
<channel lang="en" xmltv_id="ArirangWorld.kr" site_id="351">Arirang</channel>
<channel lang="en" xmltv_id="AsianFoodNetwork.sg" site_id="240">Asian Food Network</channel>
<channel lang="en" xmltv_id="AXNIndonesia.id" site_id="154">AXN</channel>
<channel lang="en" xmltv_id="BabyTV.uk" site_id="40">Baby TV</channel>
<channel lang="en" xmltv_id="BBCEarthAsia.uk" site_id="200">BBC Earth</channel>
<channel lang="en" xmltv_id="BBCWorldNewsAsiaPacific.uk" site_id="332">BBC World News</channel>
<channel lang="en" xmltv_id="beINSports1Indonesia.id" site_id="305">BeIn Sports 1</channel>
<channel lang="en" xmltv_id="beINSports3Indonesia.id" site_id="306">BeIn Sports 3</channel>
<channel lang="en" xmltv_id="BeritaSatu.id" site_id="103">BTV</channel>
<channel lang="en" xmltv_id="Besmart.id" site_id="112">Besmart</channel>
<channel lang="en" xmltv_id="BloombergTVAsia.hk" site_id="338">Bloomberg TV</channel>
<channel lang="en" xmltv_id="BoomerangSoutheastAsia.us" site_id="39">Boomerang</channel>
<channel lang="en" xmltv_id="CartoonNetworkAsia.sg" site_id="47">Cartoon</channel>
<channel lang="en" xmltv_id="CBeebiesAsia.uk" site_id="41">CBeebies</channel>
<channel lang="en" xmltv_id="CCM.hk" site_id="22">Celestial Classic Movies</channel>
<channel lang="en" xmltv_id="CelestialMoviesIndonesia.id" site_id="20">Celestial Movies</channel>
<channel lang="en" xmltv_id="CGTN.cn" site_id="353">CGTN</channel>
<channel lang="en" xmltv_id="CGTNDocumentary.cn" site_id="205">CGTN Documentary</channel>
<channel lang="en" xmltv_id="CinemaxAsia.sg" site_id="8">Cinemax</channel>
<channel lang="en" xmltv_id="CNAInternational.sg" site_id="330">CNA</channel>
<channel lang="en" xmltv_id="CNBCAsia.sg" site_id="337">CNBC</channel>
<channel lang="en" xmltv_id="CNNInternationalAsiaPacific.hk" site_id="333">CNN International</channel>
<channel lang="en" xmltv_id="CrimePlusInvestigationAsia.sg" site_id="207">Crime + Investigation</channel>
<channel lang="en" xmltv_id="DiscoveryChannelIndonesia.id" site_id="201">Discovery Channel</channel>
<channel lang="en" xmltv_id="DWEnglish.de" site_id="357">DW English</channel>
<channel lang="en" xmltv_id="Entertainment.id" site_id="86">Ent</channel>
<channel lang="en" xmltv_id="FightSports.us" site_id="304">Fight Sports</channel>
<channel lang="en" xmltv_id="FMN.id" site_id="150">FMN</channel>
<channel lang="en" xmltv_id="FoxNewsChannel.us" site_id="335">Fox News Channel</channel>
<channel lang="en" xmltv_id="France24English.fr" site_id="352">France 24</channel>
<channel lang="en" xmltv_id="Galaxy.id" site_id="13">Galaxy</channel>
<channel lang="en" xmltv_id="GalaxyPremium.id" site_id="12">Galaxy Premium</channel>
<channel lang="en" xmltv_id="GTV.id" site_id="81">GTV</channel>
<channel lang="en" xmltv_id="HBOAsia.sg" site_id="7">HBO Asia</channel>
<channel lang="en" xmltv_id="HBOFamilyAsia.sg" site_id="9">HBO Family Asia</channel>
<channel lang="en" xmltv_id="HBOHitsAsia.sg" site_id="10">HBO Hits</channel>
<channel lang="en" xmltv_id="HBOSignatureAsia.sg" site_id="6">HBO Signature Asia</channel>
<channel lang="en" xmltv_id="HGTVAsia.us" site_id="245">HGTV Asia</channel>
<channel lang="en" xmltv_id="HistoryAsia.us" site_id="206">History</channel>
<channel lang="en" xmltv_id="HITS.sg" site_id="160">Hits</channel>
<channel lang="en" xmltv_id="HITSMovies.sg" site_id="11">Hits Movies</channel>
<channel lang="en" xmltv_id="IDXChannel.id" site_id="100">IDX Channel</channel>
<channel lang="en" xmltv_id="Ie.id" site_id="96">Ie</channel>
<channel lang="en" xmltv_id="IMC.id" site_id="14">IMC</channel>
<channel lang="en" xmltv_id="Indosiar.id" site_id="78">Indosiar</channel>
<channel lang="en" xmltv_id="INews.id" site_id="83">INews</channel>
<channel lang="en" xmltv_id="JakTV.id" site_id="113">Jak TV</channel>
<channel lang="en" xmltv_id="KidsTV.id" site_id="46">Kids TV</channel>
<channel lang="en" xmltv_id="KIX.hk" site_id="161">Kix</channel>
<channel lang="en" xmltv_id="KompasTV.id" site_id="106">Kompas TV</channel>
<channel lang="en" xmltv_id="Life.id" site_id="91">Life</channel>
<channel lang="en" xmltv_id="LifestyleFashion.id" site_id="90">Lifestyle &amp; Fashion</channel>
<channel lang="en" xmltv_id="LifetimeAsia.us" site_id="167">Lifetime Asia</channel>
<channel lang="en" xmltv_id="MetroTV.id" site_id="107">Metro TV</channel>
<channel lang="en" xmltv_id="MiaoMi.hk" site_id="38">Miao Mi</channel>
<channel lang="en" xmltv_id="MNCNews.id" site_id="84">MNC News</channel>
<channel lang="en" xmltv_id="MNCSports.id" site_id="102">MNC Sports</channel>
<channel lang="en" xmltv_id="MNCSports2.id" site_id="98">MNC Sports 2</channel>
<channel lang="en" xmltv_id="MNCSports3.id" site_id="99">MNC Sports 3</channel>
<channel lang="en" xmltv_id="MNCTV.id" site_id="82">MNC TV</channel>
<channel lang="en" xmltv_id="MShopSignature.id" site_id="88">M Shop Signature</channel>
<channel lang="en" xmltv_id="MShopSuperSale.id" site_id="79">M Shop Super Sale!</channel>
<channel lang="en" xmltv_id="MusicTV.id" site_id="111">Music TV</channel>
<channel lang="en" xmltv_id="MuslimTV.id" site_id="92">Muslim TV</channel>
<channel lang="en" xmltv_id="NationalGeographicIndonesia.id" site_id="202">National Geographic</channel>
<channel lang="en" xmltv_id="NationalGeographicWildIndonesia.id" site_id="204">National Geographic Wild</channel>
<channel lang="en" xmltv_id="NET.id" site_id="116">NET</channel>
<channel lang="en" xmltv_id="NHKWorldJapan.jp" site_id="355">NHK World Japan</channel>
<channel lang="en" xmltv_id="NHKWorldPremium.jp" site_id="354">NHK World Premium</channel>
<channel lang="en" xmltv_id="NickelodeonAsia.sg" site_id="49">Nickelodeon</channel>
<channel lang="en" xmltv_id="NickJrAsia.sg" site_id="37">Nick Jr Asia</channel>
<channel lang="en" xmltv_id="OKTV.id" site_id="95">OK TV</channel>
<channel lang="en" xmltv_id="OneTVAsia.sg" site_id="164">One</channel>
<channel lang="en" xmltv_id="QuranTV.sa" site_id="93">Quran TV</channel>
<channel lang="en" xmltv_id="RCTI.id" site_id="80">RCTI</channel>
<channel lang="en" xmltv_id="SCTV.id" site_id="89">SCTV</channel>
<channel lang="en" xmltv_id="SEAToday.id" site_id="336">SEA Today</channel>
<channel lang="en" xmltv_id="SoccerChannel.id" site_id="101">Soccer Channel</channel>
<channel lang="en" xmltv_id="SPOTV.kr" site_id="307">SPOTV</channel>
<channel lang="en" xmltv_id="SPOTV2.kr" site_id="308">SPOTV 2</channel>
<channel lang="en" xmltv_id="TawafTV.id" site_id="105">Tawaf TV</channel>
<channel lang="en" xmltv_id="Thrill.hk" site_id="19">Thrill</channel>
<channel lang="en" xmltv_id="TLCSoutheastAsia.sg" site_id="248">TLC</channel>
<channel lang="en" xmltv_id="Trans7.id" site_id="110">Trans 7</channel>
<channel lang="en" xmltv_id="TransTV.id" site_id="87">Trans TV</channel>
<channel lang="en" xmltv_id="tvNAsia.hk" site_id="158">tvN</channel>
<channel lang="en" xmltv_id="tvNMoviesAsia.hk" site_id="25">tvN Movies</channel>
<channel lang="en" xmltv_id="tvOne.id" site_id="97">TVOne</channel>
<channel lang="en" xmltv_id="TVRINasional.id" site_id="118">TVRI Nasional</channel>
<channel lang="en" xmltv_id="VisionPrime.id" site_id="94">Vision Prime</channel>
<channel lang="en" xmltv_id="WarnerTVAsia.us" site_id="163">Warner TV</channel>
<channel lang="en" xmltv_id="ZeeBioskop.id" site_id="23">Zee Bioskop</channel>
<channel lang="id" xmltv_id="ABCAustralia.au" site_id="350">ABC Australia</channel>
<channel lang="id" xmltv_id="AlJazeeraEnglish.qa" site_id="331">Aljazeera</channel>
<channel lang="id" xmltv_id="AnimalPlanetSoutheastAsia.sg" site_id="203">Animal Planet</channel>
<channel lang="id" xmltv_id="AnimaxAsia.sg" site_id="157">Animax</channel>
<channel lang="id" xmltv_id="ANTV.id" site_id="115">ANTV</channel>
<channel lang="id" xmltv_id="ArirangWorld.kr" site_id="351">Arirang World</channel>
<channel lang="id" xmltv_id="AsianFoodNetwork.sg" site_id="240">Asian Food Network</channel>
<channel lang="id" xmltv_id="AXNIndonesia.id" site_id="154">AXN</channel>
<channel lang="id" xmltv_id="BabyTV.uk" site_id="40">Baby TV</channel>
<channel lang="id" xmltv_id="BBCEarthAsia.uk" site_id="200">BBC Earth</channel>
<channel lang="id" xmltv_id="BBCWorldNewsAsiaPacific.uk" site_id="332">BBC World News</channel>
<channel lang="id" xmltv_id="beINSports1Indonesia.id" site_id="305">BeIn Sports 1</channel>
<channel lang="id" xmltv_id="beINSports3Indonesia.id" site_id="306">BeIn Sports 3</channel>
<channel lang="id" xmltv_id="BeritaSatu.id" site_id="103">BTV</channel>
<channel lang="id" xmltv_id="Besmart.id" site_id="112">Besmart</channel>
<channel lang="id" xmltv_id="BloombergTVAsia.hk" site_id="338">Bloomberg TV</channel>
<channel lang="id" xmltv_id="BoomerangSoutheastAsia.us" site_id="39">Boomerang</channel>
<channel lang="id" xmltv_id="CartoonNetworkAsia.sg" site_id="47">Cartoon Network</channel>
<channel lang="id" xmltv_id="CBeebiesAsia.uk" site_id="41">CBeebies Asia</channel>
<channel lang="id" xmltv_id="CCM.hk" site_id="22">Celestial Classic Movies</channel>
<channel lang="id" xmltv_id="CelestialMoviesIndonesia.id" site_id="20">Celestial Movies</channel>
<channel lang="id" xmltv_id="CGTN.cn" site_id="353">CGTN</channel>
<channel lang="id" xmltv_id="CGTNDocumentary.cn" site_id="205">CGTN Documentary</channel>
<channel lang="id" xmltv_id="CinemaxAsia.sg" site_id="8">Cinemax Asia</channel>
<channel lang="id" xmltv_id="CNAInternational.sg" site_id="330">CNA</channel>
<channel lang="id" xmltv_id="CNBCAsia.sg" site_id="337">CNBC</channel>
<channel lang="id" xmltv_id="CNNInternationalAsiaPacific.hk" site_id="333">CNN International</channel>
<channel lang="id" xmltv_id="CrimePlusInvestigationAsia.sg" site_id="207">Crime + Investigation</channel>
<channel lang="id" xmltv_id="DiscoveryChannelIndonesia.id" site_id="201">Discovery Channel</channel>
<channel lang="id" xmltv_id="DWEnglish.de" site_id="357">DW English</channel>
<channel lang="id" xmltv_id="Entertainment.id" site_id="86">Ent</channel>
<channel lang="id" xmltv_id="FightSports.us" site_id="304">Fight Sports</channel>
<channel lang="id" xmltv_id="FMN.id" site_id="150">FMN</channel>
<channel lang="id" xmltv_id="FoxNewsChannel.us" site_id="335">Fox News Channel</channel>
<channel lang="id" xmltv_id="France24English.fr" site_id="352">France 24</channel>
<channel lang="id" xmltv_id="Galaxy.id" site_id="13">Galaxy</channel>
<channel lang="id" xmltv_id="GalaxyPremium.id" site_id="12">Galaxy Premium</channel>
<channel lang="id" xmltv_id="GTV.id" site_id="81">GTV</channel>
<channel lang="id" xmltv_id="HBOAsia.sg" site_id="7">HBO</channel>
<channel lang="id" xmltv_id="HBOFamilyAsia.sg" site_id="9">HBO Family</channel>
<channel lang="id" xmltv_id="HBOHitsAsia.sg" site_id="10">HBO Hits</channel>
<channel lang="id" xmltv_id="HBOSignatureAsia.sg" site_id="6">HBO Signature</channel>
<channel lang="id" xmltv_id="HGTVAsia.us" site_id="245">HGTV</channel>
<channel lang="id" xmltv_id="HistoryAsia.us" site_id="206">History</channel>
<channel lang="id" xmltv_id="HITS.sg" site_id="160">Hits</channel>
<channel lang="id" xmltv_id="HITSMovies.sg" site_id="11">Hits Movies</channel>
<channel lang="id" xmltv_id="IDXChannel.id" site_id="100">IDX Channel</channel>
<channel lang="id" xmltv_id="Ie.id" site_id="96">Ie</channel>
<channel lang="id" xmltv_id="IMC.id" site_id="14">IMC</channel>
<channel lang="id" xmltv_id="Indosiar.id" site_id="78">Indosiar</channel>
<channel lang="id" xmltv_id="INews.id" site_id="83">INews</channel>
<channel lang="id" xmltv_id="JakTV.id" site_id="113">Jak TV</channel>
<channel lang="id" xmltv_id="KidsTV.id" site_id="46">Kids TV</channel>
<channel lang="id" xmltv_id="KIX.hk" site_id="161">Kix</channel>
<channel lang="id" xmltv_id="KompasTV.id" site_id="106">Kompas TV</channel>
<channel lang="id" xmltv_id="Life.id" site_id="91">Life</channel>
<channel lang="id" xmltv_id="LifestyleFashion.id" site_id="90">Lifestyle &amp; Fashion</channel>
<channel lang="id" xmltv_id="LifetimeAsia.us" site_id="167">Lifetime</channel>
<channel lang="id" xmltv_id="MetroTV.id" site_id="107">Metro TV</channel>
<channel lang="id" xmltv_id="MiaoMi.hk" site_id="38">Miao Mi</channel>
<channel lang="id" xmltv_id="MNCNews.id" site_id="84">MNC News</channel>
<channel lang="id" xmltv_id="MNCSports.id" site_id="102">MNC Sports</channel>
<channel lang="id" xmltv_id="MNCSports2.id" site_id="98">MNC Sports 2</channel>
<channel lang="id" xmltv_id="MNCSports3.id" site_id="99">MNC Sports 3</channel>
<channel lang="id" xmltv_id="MNCTV.id" site_id="82">MNC TV</channel>
<channel lang="id" xmltv_id="MShopSignature.id" site_id="88">M Shop Signature</channel>
<channel lang="id" xmltv_id="MShopSuperSale.id" site_id="79">M Shop Super Sale!</channel>
<channel lang="id" xmltv_id="MusicTV.id" site_id="111">Music TV</channel>
<channel lang="id" xmltv_id="MuslimTV.id" site_id="92">Muslim TV</channel>
<channel lang="id" xmltv_id="NationalGeographicIndonesia.id" site_id="202">National Geographic</channel>
<channel lang="id" xmltv_id="NationalGeographicWildIndonesia.id" site_id="204">National Geographic Wild</channel>
<channel lang="id" xmltv_id="NET.id" site_id="116">NET</channel>
<channel lang="id" xmltv_id="NHKWorldJapan.jp" site_id="355">NHK World Japan</channel>
<channel lang="id" xmltv_id="NHKWorldPremium.jp" site_id="354">NHK World Premium</channel>
<channel lang="id" xmltv_id="NickelodeonAsia.sg" site_id="49">Nickelodeon</channel>
<channel lang="id" xmltv_id="NickJrAsia.sg" site_id="37">Nick Jr</channel>
<channel lang="id" xmltv_id="OKTV.id" site_id="95">OK TV</channel>
<channel lang="id" xmltv_id="OneTVAsia.sg" site_id="164">One</channel>
<channel lang="id" xmltv_id="QuranTV.sa" site_id="93">Quran TV</channel>
<channel lang="id" xmltv_id="RCTI.id" site_id="80">RCTI</channel>
<channel lang="id" xmltv_id="SCTV.id" site_id="89">SCTV</channel>
<channel lang="id" xmltv_id="SEAToday.id" site_id="336">SEA Today</channel>
<channel lang="id" xmltv_id="SoccerChannel.id" site_id="101">Soccer Channel</channel>
<channel lang="id" xmltv_id="SPOTV.kr" site_id="307">SPOTV</channel>
<channel lang="id" xmltv_id="SPOTV2.kr" site_id="308">SPOTV 2</channel>
<channel lang="id" xmltv_id="TawafTV.id" site_id="105">Tawaf TV</channel>
<channel lang="id" xmltv_id="Thrill.hk" site_id="19">Thrill</channel>
<channel lang="id" xmltv_id="TLCSoutheastAsia.sg" site_id="248">TLC</channel>
<channel lang="id" xmltv_id="Trans7.id" site_id="110">Trans 7</channel>
<channel lang="id" xmltv_id="TransTV.id" site_id="87">Trans TV</channel>
<channel lang="id" xmltv_id="tvNAsia.hk" site_id="158">tvN</channel>
<channel lang="id" xmltv_id="tvNMoviesAsia.hk" site_id="25">tvN Movies</channel>
<channel lang="id" xmltv_id="tvOne.id" site_id="97">TVOne</channel>
<channel lang="id" xmltv_id="TVRINasional.id" site_id="118">TVRI Nasional</channel>
<channel lang="id" xmltv_id="VisionPrime.id" site_id="94">Vision Prime</channel>
<channel lang="id" xmltv_id="WarnerTVAsia.us" site_id="163">Warner TV</channel>
<channel lang="id" xmltv_id="ZeeBioskop.id" site_id="23">Zee Bioskop</channel>
</channels>
</site>

View File

@@ -0,0 +1,184 @@
const _ = require('lodash')
const axios = require('axios')
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: 'mncvision.id',
days: 2,
url: 'https://mncvision.id/schedule/table',
request: {
method: 'POST',
data: function ({ channel, date }) {
const formData = new URLSearchParams()
formData.append('search_model', 'channel')
formData.append('af0rmelement', 'aformelement')
formData.append('fdate', date.format('YYYY-MM-DD'))
formData.append('fchannel', channel.site_id)
formData.append('submit', 'Search')
return formData
},
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
jar: null
},
async parser({ content, date, headers, channel }) {
const programs = []
const cookies = parseCookies(headers)
if (!cookies) return programs
let items = parseItems(content)
if (!items.length) return programs
const pages = parsePages(content)
for (let url of pages) {
items = items.concat(parseItems(await loadNextPage(url, cookies)))
}
const langCookies = await loadLangCookies(channel)
if (!langCookies) return programs
for (const item of items) {
const $item = cheerio.load(item)
const start = parseStart($item, date)
const duration = parseDuration($item)
const stop = start.add(duration, 'm')
const description = await loadDescription($item, langCookies)
programs.push({
title: parseTitle($item),
season: parseSeason($item),
episode: parseEpisode($item),
description,
start,
stop
})
}
return programs
},
async channels() {
const data = await axios
.get('https://www.mncvision.id/schedule')
.then(response => response.data)
.catch(console.error)
const $ = cheerio.load(data)
const items = $('select[name="fchannel"] option').toArray()
const channels = items.map(item => {
const $item = cheerio.load(item)
return {
lang: 'id',
site_id: $item('*').attr('value'),
name: $item('*').text()
}
})
return channels
}
}
function parseSeason($item) {
const title = parseTitle($item)
const [_, season] = title.match(/ S(\d+)/) || [null, null]
return season ? parseInt(season) : null
}
function parseEpisode($item) {
const title = parseTitle($item)
const [_, episode] = title.match(/ Ep (\d+)/) || [null, null]
return episode ? parseInt(episode) : null
}
function parseDuration($item) {
let duration = $item('td:nth-child(3)').text()
const match = duration.match(/(\d{2}):(\d{2})/)
const hours = parseInt(match[1])
const minutes = parseInt(match[2])
return hours * 60 + minutes
}
function parseStart($item, date) {
let time = $item('td:nth-child(1)').text()
time = `${date.format('DD/MM/YYYY')} ${time}`
return dayjs.tz(time, 'DD/MM/YYYY HH:mm', 'Asia/Jakarta')
}
function parseTitle($item) {
return $item('td:nth-child(2) > a').text()
}
function parseItems(content) {
const $ = cheerio.load(content)
return $('tr[valign="top"]').toArray()
}
function parsePages(content) {
const $ = cheerio.load(content)
const links = $('#schedule > div.schedule_search_result_container > div.box.well > a')
.map((i, el) => {
return $(el).attr('href')
})
.get()
return _.uniq(links)
}
function loadNextPage(url, cookies) {
return axios
.get(url, { headers: { Cookie: cookies }, timeout: 30000 })
.then(r => r.data)
.catch(err => {
console.log(err.message)
return null
})
}
function loadLangCookies(channel) {
const languages = {
en: 'english',
id: 'indonesia'
}
const url = `https://www.mncvision.id/language_switcher/setlang/${languages[channel.lang]}/`
return axios
.get(url, { timeout: 30000 })
.then(r => parseCookies(r.headers))
.catch(err => null)
}
async function loadDescription($item, cookies) {
const url = $item('a').attr('href')
if (!url) return null
const content = await axios
.get(url, {
headers: { 'X-Requested-With': 'XMLHttpRequest', Cookie: cookies },
timeout: 30000
})
.then(r => r.data)
.catch(err => null)
if (!content) return null
const $page = cheerio.load(content)
const description = $page('.synopsis').text().trim()
return description !== '-' ? description : null
}
function parseCookies(headers) {
return Array.isArray(headers['set-cookie']) ? headers['set-cookie'].join(';') : null
}

View File

@@ -0,0 +1,150 @@
// npm run channels:parse --config=./sites/mncvision.id/mncvision.id.config.js --output=./sites/mncvision.id/mncvision.id.channels.xml
// npx epg-grabber --config=sites/mncvision.id/mncvision.id.config.js --channels=sites/mncvision.id/mncvision.id.channels.xml --output=guide.xml --timeout=30000 --days=2
const { parser, url, request } = require('./mncvision.id.config.js')
const fs = require('fs')
const path = require('path')
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
jest.mock('axios')
const date = dayjs.utc('2022-10-05', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '38',
xmltv_id: 'MiaoMi.hk',
lang: 'id'
}
const headers = {
'set-cookie': [
's1nd0vL=05e9pr6gi112tdmutsn7big93o75r0b0; expires=Wed, 05-Oct-2022 14:18:22 GMT; Max-Age=7200; path=/; HttpOnly'
]
}
it('can generate valid url', () => {
expect(url).toBe('https://mncvision.id/schedule/table')
})
it('can generate valid request method', () => {
expect(request.method).toBe('POST')
})
it('can generate valid request headers', () => {
expect(request.headers).toMatchObject({
'Content-Type': 'application/x-www-form-urlencoded'
})
})
it('can generate valid request data', () => {
const data = request.data({ channel, date })
expect(data.get('search_model')).toBe('channel')
expect(data.get('af0rmelement')).toBe('aformelement')
expect(data.get('fdate')).toBe('2022-10-05')
expect(data.get('fchannel')).toBe('38')
expect(data.get('submit')).toBe('Search')
})
it('can parse response', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'))
const indonesiaHeaders = {
'set-cookie': [
's1nd0vL=e3vjb0oaf9vijiqsg7cml4i7fdkq16db; expires=Wed, 05-Oct-2022 14:54:16 GMT; Max-Age=7200; path=/; HttpOnly'
]
}
const englishHeaders = {
'set-cookie': [
's1nd0vL=hfd6hpnpr6gvgart0d8rf7ef6t4gi7nr; expires=Wed, 05-Oct-2022 15:08:55 GMT; Max-Age=7200; path=/; HttpOnly'
]
}
axios.get.mockImplementation((url, opts) => {
if (
url === 'https://www.mncvision.id/schedule/table/startno/50' &&
opts.headers['Cookie'] === headers['set-cookie'][0]
) {
return Promise.resolve({
data: fs.readFileSync(path.resolve(__dirname, '__data__/content_p2.html'))
})
} else if (url === 'https://www.mncvision.id/language_switcher/setlang/indonesia/') {
return Promise.resolve({
headers: indonesiaHeaders
})
} else if (url === 'https://www.mncvision.id/language_switcher/setlang/english/') {
return Promise.resolve({
headers: englishHeaders
})
} else if (
url ===
'https://mncvision.id/schedule/detail/2022100500000038/Adventures-With-Miao-Mi-Ep-1/1' &&
opts.headers['Cookie'] === indonesiaHeaders['set-cookie'][0]
) {
return Promise.resolve({
data: fs.readFileSync(path.resolve(__dirname, '__data__/program_id.html'))
})
} else if (
url ===
'https://mncvision.id/schedule/detail/2022100500000038/Adventures-With-Miao-Mi-Ep-1/1' &&
opts.headers['Cookie'] === englishHeaders['set-cookie'][0]
) {
return Promise.resolve({
data: fs.readFileSync(path.resolve(__dirname, '__data__/program_en.html'))
})
}
return Promise.resolve({ data: '' })
})
let indonesiaResults = await parser({ date, content, channel, headers })
indonesiaResults = indonesiaResults.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(indonesiaResults[0]).toMatchObject({
start: '2022-10-04T17:00:00.000Z',
stop: '2022-10-04T17:06:00.000Z',
title: 'Adventures With Miao Mi, Ep 1',
episode: 1,
description:
'Ketika anak-anak mulai menghilang, sekelompok anak kecil harus menghadapi ketakutan terbesar mereka ketika mereka melawan sesosok badut pembunuh yang jahat.'
})
expect(indonesiaResults[4]).toMatchObject({
start: '2022-10-04T17:33:00.000Z',
stop: '2022-10-04T17:46:00.000Z',
title: 'Leo Wildlife Ranger S2, Ep 27',
season: 2,
episode: 27
})
let englishResults = await parser({ date, content, channel: { ...channel, lang: 'en' }, headers })
englishResults = englishResults.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(englishResults[0]).toMatchObject({
start: '2022-10-04T17:00:00.000Z',
stop: '2022-10-04T17:06:00.000Z',
title: 'Adventures With Miao Mi, Ep 1',
episode: 1,
description:
'When children begin to disappear, a group of young kids have to face their biggest fears when they square off against a murderous, evil clown.'
})
})
it('can handle empty guide', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'))
let results = await parser({
date,
channel,
content,
headers
})
expect(results).toMatchObject([])
})