Merge pull request #1045 from RevGear/master
Update URL/parser for astro.com.my
This commit is contained in:
4 files changed
+68
-23
No files matched your search
@@ -0,0 +1 @@
|
||||
{"responseCode":200,"responseMessage":"Channel Detail","response":{"id":235,"title":"Astro Arena HD","description":"The ultimate destination for Malaysian sporting events, as well as showcasing Malaysian athletes competing at the pinnacle stage of world sports, and also the latest information on sports in the country. The channel of Malaysian sports, for Malaysia.","isHd":true,"stbNumber":"801","language":"Malay","category":"Sports","originalImage":"http://linear-poster.astro.com.my/prod/logo/Astro_Arena_v1.png","backupImage":"http://linear-poster.astro.com.my/prod/poster/ivp_default_10000285_IVP_LAND_448x252_v2.jpg","imageUrl":"https://divign0fdw3sv.cloudfront.net/Images/ChannelLogo/contenthub/235_144.png","isAstroGoExclusive":false,"filters":["Set Top Box","Sports"],"schedule":{"2022-08-30":[{"eventId":"40197573","title":"BWF Kejohanan Dunia 2022","programmeId":"KAGFN","episodeId":"KDGUX","datetime":"2022-08-30 00:00:00.0","datetimeInUtc":"2022-08-29 16:00:00.0","duration":"05:15:00","siTrafficKey":"1:10000285:47489961","detailUrl":"/details/BWF-Kejohanan-Dunia-2022-1:10000285:47489961"},{"eventId":"40197574","title":"Piala Thanhnien 2022 B19: MAS lwn THA","programmeId":"KDAHI","episodeId":"KDAHJ","datetime":"2022-08-30 05:15:00.0","datetimeInUtc":"2022-08-29 21:15:00.0","duration":"01:45:00","siTrafficKey":"1:10000285:47489963","detailUrl":"/details/Piala-Thanhnien-2022-B19-MAS-lwn-THA-1:10000285:47489963"},{"eventId":"40197575","title":"Nadi Arena","programmeId":"JOPAR","episodeId":"JOPRQ","datetime":"2022-08-30 07:00:00.0","datetimeInUtc":"2022-08-29 23:00:00.0","duration":"01:00:00","siTrafficKey":"1:10000285:47489797","detailUrl":"/details/Nadi-Arena-1:10000285:47489797"},{"eventId":"40197576","title":"Piala Thanhnien 2022 B19: THA lwn MYA","programmeId":"KDAHI","episodeId":"KDAHP","datetime":"2022-08-30 08:00:00.0","datetimeInUtc":"2022-08-30 00:00:00.0","duration":"02:00:00","siTrafficKey":"1:10000285:47489979","detailUrl":"/details/Piala-Thanhnien-2022-B19-THA-lwn-MYA-1:10000285:47489979"},{"eventId":"40197577","title":"Nindia","programmeId":"JZQHD","episodeId":"KCTSN","datetime":"2022-08-30 10:00:00.0","datetimeInUtc":"2022-08-30 02:00:00.0","duration":"01:00:00","siTrafficKey":"1:10000285:47489886","detailUrl":"/details/Nindia-1:10000285:47489886"},{"eventId":"40197578","title":"Piala Thanhnien 2022 B19: VIE lwn MAS","programmeId":"KDAHI","episodeId":"KDAHQ","datetime":"2022-08-30 11:00:00.0","datetimeInUtc":"2022-08-30 03:00:00.0","duration":"02:00:00","siTrafficKey":"1:10000285:47489977","detailUrl":"/details/Piala-Thanhnien-2022-B19-VIE-lwn-MAS-1:10000285:47489977"},{"eventId":"40197579","title":"Nadi Arena","programmeId":"JOPAR","episodeId":"JOPRQ","datetime":"2022-08-30 13:00:00.0","datetimeInUtc":"2022-08-30 05:00:00.0","duration":"01:00:00","siTrafficKey":"1:10000285:47489807","detailUrl":"/details/Nadi-Arena-1:10000285:47489807"},{"eventId":"40197580","title":"BWF Kejohanan Dunia 2022: Akhir","programmeId":"KAGFN","episodeId":"KDGVD","datetime":"2022-08-30 14:00:00.0","datetimeInUtc":"2022-08-30 06:00:00.0","duration":"05:10:00","siTrafficKey":"1:10000285:47489916","detailUrl":"/details/BWF-Kejohanan-Dunia-2022-Akhir-1:10000285:47489916"},{"eventId":"40240935","title":"Sorotan Sukan Komanwel 2022","programmeId":"KALNW","episodeId":"KCMWL","datetime":"2022-08-30 19:10:00.0","datetimeInUtc":"2022-08-30 11:10:00.0","duration":"00:20:00","siTrafficKey":"1:10000285:47540288","detailUrl":"/details/Sorotan-Sukan-Komanwel-2022-1:10000285:47540288"},{"eventId":"40197582","title":"(L) Nadi Arena","programmeId":"HUMKK","episodeId":"HUMKM","datetime":"2022-08-30 19:30:00.0","datetimeInUtc":"2022-08-30 11:30:00.0","duration":"01:00:00","siTrafficKey":"1:10000285:47489877","detailUrl":"/details/L-Nadi-Arena-1:10000285:47489877"},{"eventId":"40197583","title":"Masa Tambahan 2022/23","programmeId":"KDCTS","episodeId":"KDCTW","datetime":"2022-08-30 20:30:00.0","datetimeInUtc":"2022-08-30 12:30:00.0","duration":"01:00:00","siTrafficKey":"1:10000285:47489906","detailUrl":"/details/Masa-Tambahan-202223-1:10000285:47489906"},{"eventId":"40197584","title":"Sorotan Sepak Takraw Tun Ali 2022: Akhir","programmeId":"KDANE","episodeId":"KDANM","datetime":"2022-08-30 21:30:00.0","datetimeInUtc":"2022-08-30 13:30:00.0","duration":"00:30:00","siTrafficKey":"1:10000285:47489993","detailUrl":"/details/Sorotan-Sepak-Takraw-Tun-Ali-2022-Akhir-1:10000285:47489993"},{"eventId":"40197585","title":"Nindia","programmeId":"JZQHD","episodeId":"KCTSN","datetime":"2022-08-30 22:00:00.0","datetimeInUtc":"2022-08-30 14:00:00.0","duration":"01:00:00","siTrafficKey":"1:10000285:47489884","detailUrl":"/details/Nindia-1:10000285:47489884"},{"eventId":"40197586","title":"Nadi Arena","programmeId":"JOPAR","episodeId":"JOPRR","datetime":"2022-08-30 23:00:00.0","datetimeInUtc":"2022-08-30 15:00:00.0","duration":"01:00:00","siTrafficKey":"1:10000285:47489785","detailUrl":"/details/Nadi-Arena-1:10000285:47489785"}],"2022-08-31":[{"eventId":Line truncated
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>F90SGHZYJ699VPE2</RequestId><HostId>FnSQQRmSgIWQjkrtu/JlD5UhB4sdDbjGxbxQi11+2LybUKavIk0RGzBxFU7imETDsT9eMoSvl8M=</HostId></Error>
|
||||
@@ -2,40 +2,40 @@ const dayjs = require('dayjs')
|
||||
const utc = require('dayjs/plugin/utc')
|
||||
|
||||
dayjs.extend(utc)
|
||||
|
||||
module.exports = {
|
||||
site: 'astro.com.my',
|
||||
url: function ({ date, channel }) {
|
||||
return `http://ams-api.astro.com.my/ams/v3/getEvents?periodStart=${date.format(
|
||||
'YYYY-MM-DD'
|
||||
)}:00:00:00&periodEnd=${date.format('YYYY-MM-DD')}:23:59:59&channelId=${channel.site_id}`
|
||||
url: function ({ channel }) {
|
||||
return `https://contenthub-api.eco.astro.com.my/channel/${channel.site_id}.json`
|
||||
},
|
||||
parser: function ({ content }) {
|
||||
parser: function ({ content, date }) {
|
||||
const programs = []
|
||||
const data = JSON.parse(content)
|
||||
const items = data.getevent
|
||||
if (!items.length) return programs
|
||||
|
||||
const items = parseItems(content, date)
|
||||
items.forEach(item => {
|
||||
if (item.programmeTitle && item.displayDateTimeUtc && item.displayDuration) {
|
||||
const start = dayjs.utc(item.displayDateTimeUtc)
|
||||
const duration = parseDuration(item.displayDuration)
|
||||
const stop = start.add(duration, 's')
|
||||
programs.push({
|
||||
title: item.programmeTitle,
|
||||
description: item.shortSynopsis,
|
||||
category: item.subGenre,
|
||||
icon: item.epgEventImage,
|
||||
start: start.toString(),
|
||||
stop: stop.toString()
|
||||
})
|
||||
}
|
||||
const start = dayjs.utc(item.datetimeInUtc)
|
||||
const duration = parseDuration(item.duration)
|
||||
const stop = start.add(duration, 's')
|
||||
programs.push({
|
||||
title: item.title,
|
||||
start: start,
|
||||
stop: stop
|
||||
})
|
||||
})
|
||||
|
||||
return programs
|
||||
}
|
||||
}
|
||||
|
||||
function parseItems(content, date) {
|
||||
try {
|
||||
const data = JSON.parse(content)
|
||||
const schedules = data.response.schedule
|
||||
|
||||
return schedules[date.format('YYYY-MM-DD')] || []
|
||||
} catch (e) {
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
function parseDuration(duration) {
|
||||
const match = duration.match(/(\d{2}):(\d{2}):(\d{2})/)
|
||||
const hours = parseInt(match[1])
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
// npx epg-grabber --config=sites/astro.com.my/astro.com.my.config.js --channels=sites/astro.com.my/astro.com.my_my.channels.xml --output=guide.xml --timeout=30000 --days=2
|
||||
|
||||
const { parser, url } = require('./astro.com.my.config.js')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const dayjs = require('dayjs')
|
||||
const utc = require('dayjs/plugin/utc')
|
||||
const customParseFormat = require('dayjs/plugin/customParseFormat')
|
||||
dayjs.extend(customParseFormat)
|
||||
dayjs.extend(utc)
|
||||
|
||||
const date = dayjs.utc('2022-08-30', 'YYYY-MM-DD').startOf('d')
|
||||
const channel = {
|
||||
site_id: '235',
|
||||
xmltv_id: 'AstroArena.my'
|
||||
}
|
||||
|
||||
it('can generate valid url', () => {
|
||||
expect(url({ channel })).toBe('https://contenthub-api.eco.astro.com.my/channel/235.json')
|
||||
})
|
||||
|
||||
it('can parse response', () => {
|
||||
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
|
||||
const results = parser({ content, date }).map(p => {
|
||||
p.start = p.start.toJSON()
|
||||
p.stop = p.stop.toJSON()
|
||||
return p
|
||||
})
|
||||
|
||||
expect(results.length).toBe(14)
|
||||
expect(results[0]).toMatchObject({
|
||||
start: '2022-08-29T16:00:00.000Z',
|
||||
stop: '2022-08-29T21:15:00.000Z',
|
||||
title: 'BWF Kejohanan Dunia 2022'
|
||||
})
|
||||
})
|
||||
|
||||
it('can handle empty guide', () => {
|
||||
const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'))
|
||||
const result = parser({ date, content })
|
||||
expect(result).toMatchObject([])
|
||||
})
|
||||
Reference in new issue
Block a user