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')
|
const utc = require('dayjs/plugin/utc')
|
||||||
|
|
||||||
dayjs.extend(utc)
|
dayjs.extend(utc)
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
site: 'astro.com.my',
|
site: 'astro.com.my',
|
||||||
url: function ({ date, channel }) {
|
url: function ({ channel }) {
|
||||||
return `http://ams-api.astro.com.my/ams/v3/getEvents?periodStart=${date.format(
|
return `https://contenthub-api.eco.astro.com.my/channel/${channel.site_id}.json`
|
||||||
'YYYY-MM-DD'
|
|
||||||
)}:00:00:00&periodEnd=${date.format('YYYY-MM-DD')}:23:59:59&channelId=${channel.site_id}`
|
|
||||||
},
|
},
|
||||||
parser: function ({ content }) {
|
parser: function ({ content, date }) {
|
||||||
const programs = []
|
const programs = []
|
||||||
const data = JSON.parse(content)
|
const items = parseItems(content, date)
|
||||||
const items = data.getevent
|
|
||||||
if (!items.length) return programs
|
|
||||||
|
|
||||||
items.forEach(item => {
|
items.forEach(item => {
|
||||||
if (item.programmeTitle && item.displayDateTimeUtc && item.displayDuration) {
|
const start = dayjs.utc(item.datetimeInUtc)
|
||||||
const start = dayjs.utc(item.displayDateTimeUtc)
|
const duration = parseDuration(item.duration)
|
||||||
const duration = parseDuration(item.displayDuration)
|
const stop = start.add(duration, 's')
|
||||||
const stop = start.add(duration, 's')
|
programs.push({
|
||||||
programs.push({
|
title: item.title,
|
||||||
title: item.programmeTitle,
|
start: start,
|
||||||
description: item.shortSynopsis,
|
stop: stop
|
||||||
category: item.subGenre,
|
})
|
||||||
icon: item.epgEventImage,
|
|
||||||
start: start.toString(),
|
|
||||||
stop: stop.toString()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return programs
|
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) {
|
function parseDuration(duration) {
|
||||||
const match = duration.match(/(\d{2}):(\d{2}):(\d{2})/)
|
const match = duration.match(/(\d{2}):(\d{2}):(\d{2})/)
|
||||||
const hours = parseInt(match[1])
|
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