epg/sites/rotana.net/rotana.net.test.js
Toha e09316dc63
Update rotana.net guide.
Test

```shell
npm test -- rotana.net

> test
> run-script-os rotana.net

> test:win32
> SET "TZ=Pacific/Nauru" && npx jest --runInBand rotana.net

 PASS  sites/rotana.net/rotana.net.test.js (6.081 s)
  √ can use defined user agent (3 ms)
  √ can generate valid english url (1 ms)
  √ can generate valid arabic url
  √ can parse english response (630 ms)
  √ can parse arabic response (560 ms)
  √ can handle empty guide (3 ms)

Test Suites: 1 passed, 1 total
Tests:       6 passed, 6 total
Snapshots:   0 total
Time:        6.406 s, estimated 8 s
Ran all test suites matching /rotana.net/i.
```

Grab

```shell
npm run grab -- --site=rotana.net --lang=en

> grab
> npx tsx scripts/commands/epg/grab.ts --site=rotana.net --lang=en

starting...
config:
  output: guide.xml
  maxConnections: 1
  gzip: false
  site: rotana.net
  lang: en
loading channels...
  found 16 channel(s)
run #1:
  [1/32] rotana.net (en) - 432 - Nov 26, 2024 (24 programs)
  [2/32] rotana.net (en) - 432 - Nov 27, 2024 (23 programs)
  [3/32] rotana.net (en) - 433 - Nov 27, 2024 (14 programs)
  [4/32] rotana.net (en) - LBC.sa - Nov 27, 2024 (19 programs)
  [5/32] rotana.net (en) - LBC.sa - Nov 26, 2024 (20 programs)
  [6/32] rotana.net (en) - 433 - Nov 26, 2024 (14 programs)
  [7/32] rotana.net (en) - AlResalah.sa - Nov 27, 2024 (54 programs)
  [8/32] rotana.net (en) - RotanaAflam.sa - Nov 26, 2024 (16 programs)
  [9/32] rotana.net (en) - AlResalah.sa - Nov 26, 2024 (57 programs)
  [10/32] rotana.net (en) - MPlusHD.sa - Nov 27, 2024 (2 programs)
  [11/32] rotana.net (en) - MPlusHD.sa - Nov 26, 2024 (240 programs)
  [12/32] rotana.net (en) - RotanaComedy.sa - Nov 26, 2024 (13 programs)
  [13/32] rotana.net (en) - RotanaClip.sa - Nov 27, 2024 (2 programs)
  [14/32] rotana.net (en) - RotanaClip.sa - Nov 26, 2024 (246 programs)
  [15/32] rotana.net (en) - RotanaClassic.sa - Nov 27, 2024 (18 programs)
  [16/32] rotana.net (en) - RotanaClassic.sa - Nov 26, 2024 (18 programs)
  [17/32] rotana.net (en) - RotanaCinemaKSA.sa - Nov 27, 2024 (13 programs)
  [18/32] rotana.net (en) - RotanaCinemaKSA.sa - Nov 26, 2024 (14 programs)
  [19/32] rotana.net (en) - RotanaCinemaEgypt.eg - Nov 27, 2024 (12 programs)
  [20/32] rotana.net (en) - RotanaCinemaEgypt.eg - Nov 26, 2024 (13 programs)
  [21/32] rotana.net (en) - RotanaAmerica.sa - Nov 27, 2024 (18 programs)
  [22/32] rotana.net (en) - RotanaAmerica.sa - Nov 26, 2024 (15 programs)
  [23/32] rotana.net (en) - RotanaAflam.sa - Nov 27, 2024 (16 programs)
  [24/32] rotana.net (en) - RotanaKids.sa - Nov 26, 2024 (83 programs)
  [25/32] rotana.net (en) - RotanaKhalijia.sa - Nov 26, 2024 (23 programs)
  [26/32] rotana.net (en) - RotanaDrama.sa - Nov 27, 2024 (26 programs)
  [27/32] rotana.net (en) - RotanaMusic.sa - Nov 27, 2024 (0 programs)
  [28/32] rotana.net (en) - RotanaMusic.sa - Nov 26, 2024 (0 programs)
  [29/32] rotana.net (en) - RotanaKhalijia.sa - Nov 27, 2024 (24 programs)
  [30/32] rotana.net (en) - RotanaDrama.sa - Nov 26, 2024 (26 programs)
  [31/32] rotana.net (en) - RotanaKids.sa - Nov 27, 2024 (83 programs)
  [32/32] rotana.net (en) - RotanaComedy.sa - Nov 27, 2024 (13 programs)
  saving to "guide.xml"...
  done in 00h 00m 49s
```

Signed-off-by: Toha <tohenk@yahoo.com>
2024-11-27 03:48:25 +07:00

109 lines
3.7 KiB
JavaScript

const { parser, url, request } = require('./rotana.net.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('2024-11-26').startOf('d')
const channel = {
lang: 'en',
site_id: '439',
xmltv_id: 'RotanaCinemaMasr.sa'
}
const channelAr = Object.assign({}, channel, { lang: 'ar' })
axios.get.mockImplementation((url, opts) => {
if (url === 'https://rotana.net/en/streams?channel=439&itemId=736970') {
return Promise.resolve({
data: fs.readFileSync(path.resolve(__dirname, '__data__/program_en.html'))
})
}
if (url === 'https://rotana.net/ar/streams?channel=439&itemId=736970') {
return Promise.resolve({
data: fs.readFileSync(path.resolve(__dirname, '__data__/program_ar.html'))
})
}
return Promise.resolve({ data: '' })
})
it('can use defined user agent', () => {
const result = request.headers['User-Agent']
expect(result).toBe(
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 OPR/104.0.0.0'
)
})
it('can generate valid english url', () => {
const result = url({ channel, date })
expect(result).toBe('https://rotana.net/en/streams?channel=439&tz=')
})
it('can generate valid arabic url', () => {
const result = url({ channel: channelAr, date })
expect(result).toBe('https://rotana.net/ar/streams?channel=439&tz=')
})
it('can parse english response', async () => {
let result = await parser({
channel,
date,
content: fs.readFileSync(path.join(__dirname, '/__data__/content_en.html'))
})
result = result.map(a => {
a.start = a.start.toJSON()
a.stop = a.stop.toJSON()
return a
})
expect(result.length).toBe(12)
expect(result[11]).toMatchObject({
start: '2024-11-26T20:00:00.000Z',
stop: '2024-11-26T22:00:00.000Z',
title: 'Khiyana Mashroua',
description:
'Hisham knows that his father has given all his wealth to his elder brother. This leads him to plan to kill his brother to make it look like a defense of honor, which he does by killing his wife along...',
image: 'https://s3.eu-central-1.amazonaws.com/rotana.website/spider_storage/1398X1000/1687084565',
category: 'Movie'
})
})
it('can parse arabic response', async () => {
let result = await parser({
channel: channelAr,
date,
content: fs.readFileSync(path.join(__dirname, '/__data__/content_ar.html'))
})
result = result.map(a => {
a.start = a.start.toJSON()
a.stop = a.stop.toJSON()
return a
})
expect(result.length).toBe(12)
expect(result[11]).toMatchObject({
start: '2024-11-26T20:00:00.000Z',
stop: '2024-11-26T22:00:00.000Z',
title: 'خيانة مشروعة',
description:
'يعلم هشام البحيري أن والده قد حرمه من الميراث، ووهب كل ثروته لشقيقه اﻷكبر، وهو ما يدفعه لتدبير جريمة قتل شقيقه لتبدو وكأنها دفاع عن الشرف، وذلك حين يقتل هشام زوجته مع شقيقه.',
image: 'https://s3.eu-central-1.amazonaws.com/rotana.website/spider_storage/1398X1000/1687084565',
category: 'فيلم'
})
})
it('can handle empty guide', async () => {
const result = await parser({
content: '<!DOCTYPE html><html><head></head><body></body></html>',
date,
channel
})
expect(result).toMatchObject([])
})