Merge pull request #1045 from RevGear/master

Update URL/parser for astro.com.my
This commit is contained in:
Aleksandr Statciuk authored and GitHub committed 2022-08-29 20:38:40 +03:00
commit bab59c8195
4 files changed
+68 -23

No files matched your search

+1
View File
@@ -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>
+23 -23
View File
@@ -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])
+42
View File
@@ -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([])
})