mirror of
https://github.com/iptv-org/epg.git
synced 2025-05-11 09:30:06 -04:00

Currently while fetching guide for every channels, there will be one additional connection used to set the language cookie. This optimization change this behaviour by setting the language cookie once and then use those cookie for the rest of the channels unless there's change in channel language. Assume there are 10 channels and each channel only use one connection. Before the optimization the connections made are 20 (1 for guide fetch, 1 for set language, then multiplied by 10), and after the optimization the connections made are 11 (1 for set language, 1 for guide fetch multiplied by 10). Signed-off-by: Toha <tohenk@yahoo.com>
129 lines
4.2 KiB
JavaScript
129 lines
4.2 KiB
JavaScript
// npm run channels:parse -- --config=./sites/mncvision.id/mncvision.id.config.js --output=./sites/mncvision.id/mncvision.id.channels.xml
|
|
// npm run grab -- --site=mncvision.id
|
|
|
|
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('2023-11-19').startOf('d')
|
|
const channel = {
|
|
site_id: '154',
|
|
xmltv_id: 'AXN.id',
|
|
lang: 'id'
|
|
}
|
|
const indonesiaHeaders = {
|
|
'set-cookie': [
|
|
's1nd0vL=uo6gsashc1rmloqbb50m6b13qkglfvpl; expires=Sat, 18-Nov-2023 20:45:02 GMT; Max-Age=7200; path=/; HttpOnly'
|
|
]
|
|
}
|
|
const englishHeaders = {
|
|
'set-cookie': [
|
|
's1nd0vL=imtot2v1cs0pbemaohj9fee3hlbqo699; expires=Sat, 18-Nov-2023 20:38:31 GMT; Max-Age=7200; path=/; HttpOnly'
|
|
]
|
|
}
|
|
|
|
axios.get.mockImplementation((url, opts) => {
|
|
if (url === 'https://www.mncvision.id/language_switcher/setlang/indonesia/') {
|
|
return Promise.resolve({
|
|
headers: indonesiaHeaders
|
|
})
|
|
}
|
|
if (url === 'https://www.mncvision.id/language_switcher/setlang/english/') {
|
|
return Promise.resolve({
|
|
headers: englishHeaders
|
|
})
|
|
}
|
|
if (
|
|
url ===
|
|
'https://www.mncvision.id/schedule/detail/20231119001500154/Blue-Bloods-S13-Ep-19/1'
|
|
) {
|
|
if (opts.headers['Cookie'] === indonesiaHeaders['set-cookie'][0]) {
|
|
return Promise.resolve({
|
|
data: fs.readFileSync(path.resolve(__dirname, '__data__/program_id.html'))
|
|
})
|
|
}
|
|
if (opts.headers['Cookie'] === englishHeaders['set-cookie'][0]) {
|
|
return Promise.resolve({
|
|
data: fs.readFileSync(path.resolve(__dirname, '__data__/program_en.html'))
|
|
})
|
|
}
|
|
}
|
|
|
|
return Promise.resolve({ data: '' })
|
|
})
|
|
|
|
it('can generate valid url', () => {
|
|
expect(url).toBe('https://www.mncvision.id/schedule/table')
|
|
})
|
|
|
|
it('can generate valid request method', () => {
|
|
expect(request.method).toBe('POST')
|
|
})
|
|
|
|
it('can generate valid request headers', async () => {
|
|
expect(await request.headers({ channel })).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('2023-11-19')
|
|
expect(data.get('fchannel')).toBe('154')
|
|
expect(data.get('submit')).toBe('Search')
|
|
})
|
|
|
|
it('can parse response', async () => {
|
|
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'))
|
|
const indonesiaResults = (await parser({ date, content, channel, headers: indonesiaHeaders }))
|
|
.map(p => {
|
|
p.start = p.start.toJSON()
|
|
p.stop = p.stop.toJSON()
|
|
return p
|
|
})
|
|
expect(indonesiaResults[0]).toMatchObject({
|
|
start: '2023-11-18T17:15:00.000Z',
|
|
stop: '2023-11-18T18:05:00.000Z',
|
|
title: 'Blue Bloods S13, Ep 19',
|
|
episode: 19,
|
|
description:
|
|
'Jamie bekerja sama dengan FDNY untuk menemukan pelaku pembakaran yang bertanggung jawab atas kebakaran hebat yang terjadi di fasilitas penyimpanan bukti milik NYPD.'
|
|
})
|
|
|
|
const englishResults = (await parser({ date, content, channel: { ...channel, lang: 'en' }, headers: englishHeaders }))
|
|
.map(p => {
|
|
p.start = p.start.toJSON()
|
|
p.stop = p.stop.toJSON()
|
|
return p
|
|
})
|
|
expect(englishResults[0]).toMatchObject({
|
|
start: '2023-11-18T17:15:00.000Z',
|
|
stop: '2023-11-18T18:05:00.000Z',
|
|
title: 'Blue Bloods S13, Ep 19',
|
|
episode: 19,
|
|
description:
|
|
'Jamie partners with the FDNY to find the arsonist responsible for a massive fire at an NYPD evidence storage facility.'
|
|
})
|
|
})
|
|
|
|
it('can handle empty guide', async () => {
|
|
const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'))
|
|
const results = await parser({
|
|
date,
|
|
channel,
|
|
content,
|
|
headers: indonesiaHeaders
|
|
})
|
|
expect(results).toMatchObject([])
|
|
})
|