mirror of
https://github.com/iptv-org/epg
synced 2026-09-06 12:00:09 -04:00
121 lines
4.0 KiB
JavaScript
121 lines
4.0 KiB
JavaScript
const { parser, url, request } = require('./nowplayer.now.com.config.js')
|
|
const axios = require('axios')
|
|
const fs = require('fs')
|
|
const path = require('path')
|
|
const dayjs = require('dayjs')
|
|
const utc = require('dayjs/plugin/utc')
|
|
const customParseFormat = require('dayjs/plugin/customParseFormat')
|
|
|
|
process.env.EPG_DETAILED_GUIDE_DELAY = 0
|
|
|
|
dayjs.extend(customParseFormat)
|
|
dayjs.extend(utc)
|
|
|
|
jest.mock('axios')
|
|
|
|
const date = dayjs.utc().startOf('d')
|
|
const channel = {
|
|
lang: 'en',
|
|
site_id: '150',
|
|
xmltv_id: 'AnimaxAsia.sg@SD'
|
|
}
|
|
|
|
axios.get.mockImplementation(url => {
|
|
const urls = {
|
|
'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=150&day=1': 'content.json',
|
|
'https://nowplayer.now.com/tvguide/epgprogramdetail?programId=202606244351477': 'program01.json',
|
|
'https://nowplayer.now.com/tvguide/epgprogramdetail?programId=202606244351525': 'program02.json'
|
|
}
|
|
let data = ''
|
|
if (urls[url] !== undefined) {
|
|
data = JSON.parse(fs.readFileSync(path.join(__dirname, '__data__', urls[url])))
|
|
}
|
|
return Promise.resolve({ data })
|
|
})
|
|
|
|
|
|
it('can generate valid url for today', () => {
|
|
expect(url({ channel, date })).toBe(
|
|
'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=150&day=1'
|
|
)
|
|
})
|
|
|
|
it('can generate valid url for tomorrow', () => {
|
|
expect(url({ channel, date: date.add(1, 'd') })).toBe(
|
|
'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=150&day=2'
|
|
)
|
|
})
|
|
|
|
it('can generate valid request headers', () => {
|
|
expect(request.headers({ channel })).toMatchObject({
|
|
cookie: 'LANG=en'
|
|
})
|
|
})
|
|
|
|
it('can parse en response', async () => {
|
|
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
|
|
const result = (await parser({ content, channel, date }))
|
|
.map(p => {
|
|
p.start = p.start.toJSON()
|
|
p.stop = p.stop.toJSON()
|
|
return p
|
|
})
|
|
|
|
expect(result.length).toBe(49)
|
|
expect(result[0]).toMatchObject({
|
|
start: '2026-07-11T16:00:00.000Z',
|
|
stop: '2026-07-11T16:30:00.000Z',
|
|
title: 'Ragna Crimson S1E2 -The Beginning Of The Story',
|
|
description:
|
|
'Ragna uses his newly gained power to hunt dragons and makes a resolution to avoid the miserable future that awaits him.',
|
|
categories: ['Anime'],
|
|
year: '2023'
|
|
})
|
|
expect(result[48]).toMatchObject({
|
|
start: '2026-07-12T15:58:00.000Z',
|
|
stop: '2026-07-12T16:30:00.000Z',
|
|
title: 'Fruits Basket S2E25 -I\'m Different Now',
|
|
description:
|
|
'Kureno watches a copy of the Cinderella-ish play which Tohru prepared, hoping that he will realize Arisa\'s feelings for him.',
|
|
categories: ['Anime'],
|
|
year: '2020'
|
|
})
|
|
})
|
|
|
|
it('can parse zh response', async () => {
|
|
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
|
|
const result = (await parser({ content, channel: { ...channel, lang: 'zh' }, date }))
|
|
.map(p => {
|
|
p.start = p.start.toJSON()
|
|
p.stop = p.stop.toJSON()
|
|
return p
|
|
})
|
|
|
|
expect(result.length).toBe(49)
|
|
expect(result[0]).toMatchObject({
|
|
start: '2026-07-11T16:00:00.000Z',
|
|
stop: '2026-07-11T16:30:00.000Z',
|
|
title: '第2集 - The Beginning Of The Story',
|
|
description:
|
|
'翼之血族在各地發動全面進攻, 拉格納運用獲得的力量與新出現的上級龍梅古卜帝戰鬥, 而他在此時所遇見的少女又是何許人物?未來與現在的記憶混亂不清, 為了迴避自己曾經歷過的淒慘未來, 拉格納決定投入與龍族的戰鬥, 並下定決心與某人道別。',
|
|
categories: ['Anime'],
|
|
year: '2023'
|
|
})
|
|
expect(result[48]).toMatchObject({
|
|
start: '2026-07-12T15:58:00.000Z',
|
|
stop: '2026-07-12T16:30:00.000Z',
|
|
title: '第25集 - I\'m Different Now',
|
|
description:
|
|
'紅野看了小透準備的一個類似灰姑娘的故事, 並希望他能知道亞里紗對自己的感覺。',
|
|
categories: ['Anime'],
|
|
year: '2020'
|
|
})
|
|
})
|
|
|
|
it('can handle empty guide', async () => {
|
|
const result = await parser({
|
|
content: '[[]]'
|
|
})
|
|
expect(result).toMatchObject([])
|
|
})
|