Merge pull request #2798 from leap0x7b/vidio-update

Update vidio.com
This commit is contained in:
Ismaël Moret
2025-07-12 13:22:04 +02:00
committed by GitHub
6 changed files with 121 additions and 117 deletions

View File

@@ -0,0 +1 @@
{"api_key":"eyJhbGciOiJIUzI1NiJ9.eyJkYXRhIjp7InR5cGUiOiJhcGlrZXkifSwiZXhwIjoxNzUxNDc4MDQ2fQ.kxcPR76NBdQYIrsUnmBpqzcSmPD-H7b_-I_SjFi1zY4","api_key_expires_at":"2025-07-03T00:40:46+07:00"}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"errors":[{"detail":"Livestreaming not found"}]}

View File

@@ -2,12 +2,14 @@
<channels> <channels>
<channel site="vidio.com" lang="id" xmltv_id="ABCAustralia.au" site_id="7150">ABC Australia</channel> <channel site="vidio.com" lang="id" xmltv_id="ABCAustralia.au" site_id="7150">ABC Australia</channel>
<channel site="vidio.com" lang="id" xmltv_id="AfricanewsEnglish.fr" site_id="12784">AFRICANEWS TV</channel> <channel site="vidio.com" lang="id" xmltv_id="AfricanewsEnglish.fr" site_id="12784">AFRICANEWS TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="AjwaTV.id" site_id="7464">Ajwa TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="AlJazeera.qa@English" site_id="6410">Aljazeera</channel> <channel site="vidio.com" lang="id" xmltv_id="AlJazeera.qa@English" site_id="6410">Aljazeera</channel>
<channel site="vidio.com" lang="id" xmltv_id="ANTV.id" site_id="782">ANTV</channel> <channel site="vidio.com" lang="id" xmltv_id="ANTV.id" site_id="782">ANTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="ArirangWorld.kr" site_id="6784">Arirang</channel> <channel site="vidio.com" lang="id" xmltv_id="ArirangWorld.kr" site_id="6784">Arirang</channel>
<channel site="vidio.com" lang="id" xmltv_id="beINSports1.qa@Indonesia" site_id="6299">Bein 1</channel> <channel site="vidio.com" lang="id" xmltv_id="beINSports1.qa@Indonesia" site_id="6299">Bein 1</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="17875">Bein 2</channel> <channel site="vidio.com" lang="id" xmltv_id="" site_id="17875">Bein 2</channel>
<channel site="vidio.com" lang="id" xmltv_id="beINSports3.qa@Indonesia" site_id="6317">Bein 3</channel> <channel site="vidio.com" lang="id" xmltv_id="beINSports3.qa@Indonesia" site_id="6317">Bein 3</channel>
<channel site="vidio.com" lang="id" xmltv_id="BeritaSatuEnglish.id" site_id="18280">BeritaSatu</channel>
<channel site="vidio.com" lang="id" xmltv_id="BTV.id" site_id="6165">BTV</channel> <channel site="vidio.com" lang="id" xmltv_id="BTV.id" site_id="6165">BTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTV1.id" site_id="6685">CTV 1</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTV1.id" site_id="6685">CTV 1</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTV2.id" site_id="6686">CTV 2</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTV2.id" site_id="6686">CTV 2</channel>
@@ -15,36 +17,44 @@
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTV5.id" site_id="9182">CTV 5</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTV5.id" site_id="9182">CTV 5</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTV6.id" site_id="9183">CTV 6</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTV6.id" site_id="9183">CTV 6</channel>
<channel site="vidio.com" lang="id" xmltv_id="ChampionsTVEPL.id" site_id="9353">Premier League TV</channel> <channel site="vidio.com" lang="id" xmltv_id="ChampionsTVEPL.id" site_id="9353">Premier League TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="18189">Champions Golf 1</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="18190">Champions Golf 2</channel>
<channel site="vidio.com" lang="id" xmltv_id="CNA.sg" site_id="6411">News Asia</channel> <channel site="vidio.com" lang="id" xmltv_id="CNA.sg" site_id="6411">News Asia</channel>
<channel site="vidio.com" lang="id" xmltv_id="DAAITV.id" site_id="6482">DAAI TV</channel> <channel site="vidio.com" lang="id" xmltv_id="DAAITV.id" site_id="6482">DAAI TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="DaystarTV.us" site_id="18622">Daystar TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="DW.de@English" site_id="5075">DW English</channel> <channel site="vidio.com" lang="id" xmltv_id="DW.de@English" site_id="5075">DW English</channel>
<channel site="vidio.com" lang="id" xmltv_id="ElshintaTV.id" site_id="10975">Elshinta TV</channel> <channel site="vidio.com" lang="id" xmltv_id="ElshintaTV.id" site_id="10975">Elshinta TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="EuronewsEnglish.fr" site_id="6412">Euro News</channel> <channel site="vidio.com" lang="id" xmltv_id="EuronewsEnglish.fr" site_id="6412">Euro News</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="18105">GGS TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="HipHipHoree.id" site_id="7052">Hip Hip Horee!</channel>
<channel site="vidio.com" lang="id" xmltv_id="Horee.id" site_id="6397">Horee</channel>
<channel site="vidio.com" lang="id" xmltv_id="Indosiar.id" site_id="205">Indosiar</channel> <channel site="vidio.com" lang="id" xmltv_id="Indosiar.id" site_id="205">Indosiar</channel>
<channel site="vidio.com" lang="id" xmltv_id="JakTV.id" site_id="5415">Jaktv</channel> <channel site="vidio.com" lang="id" xmltv_id="JakTV.id" site_id="5415">Jaktv</channel>
<channel site="vidio.com" lang="id" xmltv_id="JPMTV.id" site_id="9714">jawaposTV</channel> <channel site="vidio.com" lang="id" xmltv_id="JPMTV.id" site_id="9714">jawaposTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="JTV.id" site_id="9713">JTV</channel> <channel site="vidio.com" lang="id" xmltv_id="JTV.id" site_id="9713">JTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="KompasTV.id" site_id="874">Kompas TV</channel> <channel site="vidio.com" lang="id" xmltv_id="KompasTV.id" site_id="874">Kompas TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="MagnaChannel.id" site_id="7230">Magna TV</channel> <channel site="vidio.com" lang="id" xmltv_id="MagnaChannel.id" site_id="7230">Magna TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="MetroGlobeNetwork.id" site_id="8815">Metro Globe Network</channel> <channel site="vidio.com" lang="id" xmltv_id="MakkahTV.sa" site_id="6852">Makkah TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="NET.id" site_id="875">MDTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="MetroTV.id" site_id="777">Metro TV</channel> <channel site="vidio.com" lang="id" xmltv_id="MetroTV.id" site_id="777">Metro TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="Moji.id" site_id="206">Moji</channel> <channel site="vidio.com" lang="id" xmltv_id="Moji.id" site_id="206">Moji</channel>
<channel site="vidio.com" lang="id" xmltv_id="" site_id="7619">MUSICA</channel>
<channel site="vidio.com" lang="id" xmltv_id="NBATV.us" site_id="6717">NBA TV</channel> <channel site="vidio.com" lang="id" xmltv_id="NBATV.us" site_id="6717">NBA TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="NET.id" site_id="875">NET TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="NHKWorldJapan.jp" site_id="7968">NHK World Japan</channel> <channel site="vidio.com" lang="id" xmltv_id="NHKWorldJapan.jp" site_id="7968">NHK World Japan</channel>
<channel site="vidio.com" lang="id" xmltv_id="NusantaraTV.id" site_id="7432">Nusantara TV</channel> <channel site="vidio.com" lang="id" xmltv_id="NusantaraTV.id" site_id="7432">Nusantara TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="RajawaliTV.id" site_id="1561">RTV</channel> <channel site="vidio.com" lang="id" xmltv_id="RajawaliTV.id" site_id="1561">RTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="RANSEntertainment.id" site_id="8241">RANS Channel</channel>
<channel site="vidio.com" lang="id" xmltv_id="ROCKEntertainment.sg" site_id="8120">ROCK Entertainment</channel> <channel site="vidio.com" lang="id" xmltv_id="ROCKEntertainment.sg" site_id="8120">ROCK Entertainment</channel>
<channel site="vidio.com" lang="id" xmltv_id="ROCKExtreme.sg" site_id="8121">Rock Action</channel> <channel site="vidio.com" lang="id" xmltv_id="ROCKExtreme.sg" site_id="8121">Rock Action</channel>
<channel site="vidio.com" lang="id" xmltv_id="SCTV.id" site_id="204">SCTV</channel> <channel site="vidio.com" lang="id" xmltv_id="SCTV.id" site_id="204">SCTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="SEAToday.id" site_id="7687">SEA TODAY</channel>
<channel site="vidio.com" lang="id" xmltv_id="SPOTV2.id" site_id="17140">SPOTV 2</channel> <channel site="vidio.com" lang="id" xmltv_id="SPOTV2.id" site_id="17140">SPOTV 2</channel>
<channel site="vidio.com" lang="id" xmltv_id="SPOTV.id" site_id="17139">SPOTV</channel> <channel site="vidio.com" lang="id" xmltv_id="SPOTV.id" site_id="17139">SPOTV</channel>
<channel site="vidio.com" lang="id" xmltv_id="TawafTV.id" site_id="12607">Tawaf TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="Trans7.id" site_id="734">Trans7</channel> <channel site="vidio.com" lang="id" xmltv_id="Trans7.id" site_id="734">Trans7</channel>
<channel site="vidio.com" lang="id" xmltv_id="TransTV.id" site_id="733">TRANS TV</channel> <channel site="vidio.com" lang="id" xmltv_id="TransTV.id" site_id="733">TRANS TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="TV5MondeAsia.fr" site_id="17278">TV5Monde</channel> <channel site="vidio.com" lang="id" xmltv_id="TV5MondeAsia.fr" site_id="17278">TV5Monde</channel>
<channel site="vidio.com" lang="id" xmltv_id="tvNAsia.hk" site_id="6362">TVN</channel> <channel site="vidio.com" lang="id" xmltv_id="tvNAsia.hk" site_id="6362">TVN</channel>
<channel site="vidio.com" lang="id" xmltv_id="tvOne.id" site_id="783">TVOne</channel> <channel site="vidio.com" lang="id" xmltv_id="tvOne.id" site_id="783">TVOne</channel>
<channel site="vidio.com" lang="id" xmltv_id="TVRINasional.id" site_id="6441">TVRI</channel> <channel site="vidio.com" lang="id" xmltv_id="TVRI.id" site_id="6441">TVRI</channel>
<channel site="vidio.com" lang="id" xmltv_id="UChannel.id" site_id="6898">U-Channel TV</channel>
<channel site="vidio.com" lang="id" xmltv_id="ZooMoo.sg" site_id="6533">Zoomoo</channel>
</channels> </channels>

View File

@@ -1,112 +1,89 @@
const cheerio = require('cheerio') const axios = require('axios')
const dayjs = require('dayjs') const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc') const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone') const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat') const customParseFormat = require('dayjs/plugin/customParseFormat')
const crypto = require('crypto')
dayjs.extend(utc) dayjs.extend(utc)
dayjs.extend(timezone) dayjs.extend(timezone)
dayjs.extend(customParseFormat) dayjs.extend(customParseFormat)
const tz = 'Asia/Jakarta' const WEB_CLIENT_SECRET = Buffer.from('dPr0QImQ7bc5o9LMntNba2DOsSbZcjUh')
const WEB_CLIENT_IV = Buffer.from('C8RWsrtFsoeyCyPt')
module.exports = { module.exports = {
site: 'vidio.com', site: 'vidio.com',
days: 2, days: 2,
url({ channel }) { url({ date, channel }) {
return `https://www.vidio.com/live/${channel.site_id}/schedules` return `https://api.vidio.com/livestreamings/${channel.site_id}/schedules?filter[date]=${date.format('YYYY-MM-DD')}`
}, },
parser({ content, date }) { request: {
async headers() {
const session = await loadSessionDetails()
if (!session || !session.api_key) return null
var cipher = crypto.createCipheriv('aes-256-cbc', WEB_CLIENT_SECRET, WEB_CLIENT_IV)
return {
'X-API-Key': cipher.update(session.api_key, 'utf8', 'base64') + cipher.final('base64'),
'X-Secure-Level': 2
}
}
},
parser({ content }) {
const programs = [] const programs = []
const items = parseItems(content, date) const json = JSON.parse(content)
items.forEach(item => { if (Array.isArray(json?.data)) {
const prev = programs[programs.length - 1] for (const program of json.data) {
const $item = cheerio.load(item) programs.push({
let start = parseStart($item, date) title: program.attributes.title,
if (prev && start < prev.start) { description: program.attributes.description,
start = start.add(1, 'd') start: dayjs(program.attributes.start_time),
date = date.add(1, 'd') stop: dayjs(program.attributes.end_time),
image: program.attributes.image_landscape_url
})
} }
let stop = parseStop($item, date) }
if (stop < start) {
stop = stop.add(1, 'd')
date = date.add(1, 'd')
}
programs.push({
title: parseTitle($item),
start,
stop
})
})
return programs return programs
}, },
async channels() { async channels() {
const axios = require('axios') const channels = []
const cheerio = require('cheerio') const json = await axios
const result = await axios .get(
.get('https://www.vidio.com/categories/daftar-channel-tv-radio-live-sports') 'https://api.vidio.com/livestreamings?stream_type=tv_stream',
{
headers: await this.request.headers()
}
)
.then(response => response.data) .then(response => response.data)
.catch(console.error) .catch(console.error)
const $ = cheerio.load(result) if (Array.isArray(json?.data)) {
const itemGroups = $('div[data-variation="circle_horizontal"] ul').toArray() for (const channel of json.data) {
const channels = [] channels.push({
itemGroups.forEach(group => {
const $group = $(group)
let skip = false
const sites = []
const items = $group.find('a[data-testid="circle-card"]').toArray()
items.forEach(item => {
const name = $(item).find('span[data-testid="circle-title"]').text()
// skip radio channels
if (name.toLowerCase().indexOf('fm') >= 0 || name.toLowerCase().indexOf('radio') >= 0) {
skip = true
return true
}
let url = $(item).attr('href')
url = url.substr(url.lastIndexOf('/') + 1)
const matches = url.match(/(\d+)/)
sites.push({
lang: 'id', lang: 'id',
site_id: matches[0], site_id: channel.id,
name: name name: channel.attributes.title
}) })
})
if (!skip && sites.length) {
channels.push(...sites)
} }
}) }
return channels return channels
} }
} }
function parseStart($item, date) { function loadSessionDetails() {
const timeString = $item('div.b-livestreaming-daily-schedule__item-content-caption').text() return axios
const [, start] = timeString.match(/(\d{2}:\d{2}) -/) || [null, null] .post(
'https://www.vidio.com/auth',
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${start}`, 'YYYY-MM-DD HH:mm', tz) {},
} {
headers: {
function parseStop($item, date) { 'Content-Type': 'application/json'
const timeString = $item('div.b-livestreaming-daily-schedule__item-content-caption').text() }
const [, stop] = timeString.match(/- (\d{2}:\d{2}) WIB/) || [null, null] }
)
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${stop}`, 'YYYY-MM-DD HH:mm', tz) .then(r => r.data)
} .catch(console.log)
}
function parseTitle($item) {
return $item('div.b-livestreaming-daily-schedule__item-content-title').text()
}
function parseItems(content, date) {
const $ = cheerio.load(content)
return $(
`#schedule-content-${date.format(
'YYYYMMDD'
)} > .b-livestreaming-daily-schedule__scroll-container .b-livestreaming-daily-schedule__item`
).toArray()
}

View File

@@ -1,53 +1,67 @@
const { parser, url } = require('./vidio.com.config.js') const { parser, url, request } = require('./vidio.com.config.js')
const fs = require('fs')
const path = require('path')
const axios = require('axios')
const dayjs = require('dayjs') const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc') const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat') const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat) dayjs.extend(customParseFormat)
dayjs.extend(utc) dayjs.extend(utc)
const date = dayjs.utc('2021-11-24', 'YYYY-MM-DD').startOf('d') jest.mock('axios')
const date = dayjs.utc('2025-07-01', 'YYYY-MM-DD').startOf('d')
const channel = { const channel = {
site_id: '7464', site_id: '204',
xmltv_id: 'AjwaTV.id' xmltv_id: 'SCTV.id'
} }
it('can generate valid url', () => { it('can generate valid url', () => {
expect(url({ channel })).toBe('https://www.vidio.com/live/7464/schedules') expect(url({ channel, date })).toBe(
'https://api.vidio.com/livestreamings/204/schedules?filter[date]=2025-07-01'
)
})
it('can generate valid request headers', async () => {
axios.post.mockImplementation(url => {
if (url === 'https://www.vidio.com/auth') {
return Promise.resolve({
data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/auth.json')))
})
} else {
return Promise.resolve({ data: '' })
}
})
const result = await request.headers()
expect(result).toMatchObject({
'X-API-Key':
'CH1ZFsN4N/MIfAds1DL9mP151CNqIpWHqZGRr+LkvUyiq3FRPuP1Kt6aK+pG3nEC1FXt0ZAAJ5FKP8QU8CZ5/jQdSYLVeFwl9NoIkegVpR6b7W2ZwbaF00OPr6ON1/FpLQ3RiUzTPpAqe7f+fwhOr0KrKy8PpCa54OHogaEjI3w=',
'X-Secure-Level': 2,
})
}) })
it('can parse response', () => { it('can parse response', () => {
const content = const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
'<div class="b-livestreaming-daily-schedule__section b-livestreaming-daily-schedule__contents"> <div class="b-livestreaming-daily-schedule__content" id="schedule-content-20211124"> <div class="js-ahoy b-livestreaming-schedule__ahoy-impression" data-ahoy-component="Ahoy::Builder" data-ahoy-impression="true" data-ahoy-title="LIVESTREAMING" data-use-bounding-client-rect="true" ></div><div class="b-livestreaming-daily-schedule__scroll-container"> <a class="" href="/watch/2361692-30-hari-30-juz-24-november-2021" ><div class="b-livestreaming-daily-schedule__item js-ahoy" data-ahoy-click="true" data-ahoy-component="Ahoy::Builder" data-ahoy-props=\'{"section":"schedule","stream_type":"TvStream","livestreaming_id":7464,"schedule_day":-1,"schedule_id":1471806,"schedule_title":"30 Hari 30 Juz","action":"click"}\' data-ahoy-title="LIVESTREAMING" id="schedule-item-1471806" > <div class="b-livestreaming-daily-schedule__item-icon"> <div class="b-livestreaming-daily-schedule__item-icon-play"></div></div><div class="b-livestreaming-daily-schedule__item-content"> <div class="b-livestreaming-daily-schedule__item-content-caption"> 00:30 - 01:30 WIB </div><div class="b-livestreaming-daily-schedule__item-content-title">30 Hari 30 Juz</div></div></div></a ><a class="" href="/watch/2361785-makkah-live-24-november-2021" ><div class="b-livestreaming-daily-schedule__item js-ahoy" data-ahoy-click="true" data-ahoy-component="Ahoy::Builder" data-ahoy-props=\'{"section":"schedule","stream_type":"TvStream","livestreaming_id":7464,"schedule_day":-1,"schedule_id":1471807,"schedule_title":"Makkah Live","action":"click"}\' data-ahoy-title="LIVESTREAMING" id="schedule-item-1471807" > <div class="b-livestreaming-daily-schedule__item-icon"> <div class="b-livestreaming-daily-schedule__item-icon-play"></div></div><div class="b-livestreaming-daily-schedule__item-content"> <div class="b-livestreaming-daily-schedule__item-content-caption"> 01:30 - 04:00 WIB </div><div class="b-livestreaming-daily-schedule__item-content-title">Makkah Live</div></div></div></a ><a class="" href="/watch/2362889-ftv-islami-24-november-2021" ><div class="b-livestreaming-daily-schedule__item js-ahoy" data-ahoy-click="true" data-ahoy-component="Ahoy::Builder" data-ahoy-props=\'{"section":"schedule","stream_type":"TvStream","livestreaming_id":7464,"schedule_day":-1,"schedule_id":1473829,"schedule_title":"FTV Islami","action":"click"}\' data-ahoy-title="LIVESTREAMING" id="schedule-item-1473829" > <div class="b-livestreaming-daily-schedule__item-icon"> <div class="b-livestreaming-daily-schedule__item-icon-play"></div></div><div class="b-livestreaming-daily-schedule__item-content"> <div class="b-livestreaming-daily-schedule__item-content-caption"> 22:30 - 00:30 WIB </div><div class="b-livestreaming-daily-schedule__item-content-title">FTV Islami</div></div></div></a > </div></div><div class="b-livestreaming-daily-schedule__content tab-active" id="schedule-content-20211125"> <div class="js-ahoy b-livestreaming-schedule__ahoy-impression" data-ahoy-component="Ahoy::Builder" data-ahoy-impression="true" data-ahoy-title="LIVESTREAMING" data-use-bounding-client-rect="true" ></div><div class="b-livestreaming-daily-schedule__scroll-container"> <a class="" href="/watch/2362921-30-hari-30-juz-25-november-2021" ><div class="b-livestreaming-daily-schedule__item js-ahoy" data-ahoy-click="true" data-ahoy-component="Ahoy::Builder" data-ahoy-props=\'{"section":"schedule","stream_type":"TvStream","livestreaming_id":7464,"schedule_day":0,"schedule_id":1473830,"schedule_title":"30 Hari 30 Juz","action":"click"}\' data-ahoy-title="LIVESTREAMING" id="schedule-item-1473830" > <div class="b-livestreaming-daily-schedule__item-icon"> <div class="b-livestreaming-daily-schedule__item-icon-play"></div></div><div class="b-livestreaming-daily-schedule__item-content"> <div class="b-livestreaming-daily-schedule__item-content-caption"> 00:30 - 01:30 WIB </div><div class="b-livestreaming-daily-schedule__item-content-title">30 Hari 30 Juz</div></div></div></a > </div></div></div>' const results = parser({ content, channel, date }).map(p => {
const result = parser({ content, date }).map(p => {
p.start = p.start.toJSON() p.start = p.start.toJSON()
p.stop = p.stop.toJSON() p.stop = p.stop.toJSON()
return p return p
}) })
expect(result).toMatchObject([ expect(results.length).toBe(21)
{ expect(results[0]).toMatchObject({
start: '2021-11-23T17:30:00.000Z', start: '2025-06-30T15:57:00.000Z',
stop: '2021-11-23T18:30:00.000Z', stop: '2025-06-30T17:29:00.000Z',
title: '30 Hari 30 Juz' title: 'Ftv PrimeTime : Cinta Dodol Inilah Yang Membuatku Lengket Padamu',
}, description: 'Film televisi yang mengangkat kisah romantisme kehidupan dengan konflik yang menarik. tayang setiap hari'
{ })
start: '2021-11-23T18:30:00.000Z',
stop: '2021-11-23T21:00:00.000Z',
title: 'Makkah Live'
},
{
start: '2021-11-24T15:30:00.000Z',
stop: '2021-11-24T17:30:00.000Z',
title: 'FTV Islami'
}
])
}) })
it('can handle empty guide', () => { it('can handle empty guide', () => {
const result = parser({ const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json'))
date, const results = parser({ content, channel })
channel,
content: '<!DOCTYPE html><html><head></head><body></body></html>' expect(results).toMatchObject([])
})
expect(result).toMatchObject([])
}) })