Merge pull request #1388 from iptv-org/fix-dstv.com

Fix dstv.com
This commit is contained in:
Aleksandr Statciuk 2022-11-23 09:25:07 +03:00 committed by GitHub
commit 1e36a5d296
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 90 additions and 56 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"Id":"6d58931e-2192-486a-a202-14720136d204","ChannelTag":"H4N","Channel":"SuperSport Grandstand Nigeria HD","EventID":"H4N0000115474591","StartTime":"2022-11-22T01:00:00","EndTime":"2022-11-22T02:00:00","Duration":"01:00:00","Language":"eng","Title":"UFC FN HL: Nzechukwu v Cutelaba","Synopsis":"'UFC Fight Night Highlights - Heavyweight Bout: Kennedy Nzechukwu vs Ion Cutelaba'. From The UFC APEX Center - Las Vegas, USA.","Rating":null,"MainGenres":["Sport"],"SubGenres":["All Sport","Mixed Martial Arts"],"Items":[{"Key":"Source Key ID","Value":"200108412"}],"ThumbnailUri":"https://03mcdecdnimagerepository.blob.core.windows.net/epguideimage/img/271546_UFC Fight Night.png","MainContentID":"0x28E53D","MainGroupID":"0x00000000","SubGroupID":"0x00","LogLine":"MMA","StarRating":"0","AssociatedAd":false,"AssociatedApplication":false,"DolbyDigital":false,"Subtitles":false,"LastEpisodeFlag":false,"Series":false,"Special":false,"Macrovision":false,"PremierEvent":false,"FirstAiring":false,"Repeat":true,"LastRepeat":false,"LiveEvent":false,"DelayedEvent":false,"Recommendations":false,"HighDefinition":true,"Widescreen":false,"MultipleSountracks":false,"Captions":false,"SocialTags":false,"VidOnDemand":false,"VoDOnline":false,"BlockStream":false}

View file

@ -0,0 +1 @@
{"Id":"8b237235-aa17-4bb8-9ea6-097e7a813336","ChannelTag":"SH4","Channel":"SuperSport Grandstand HD","EventID":"SH40000115474622","StartTime":"2022-11-22T01:00:00","EndTime":"2022-11-22T02:00:00","Duration":"01:00:00","Language":"eng","Title":"UFC FN HL: Nzechukwu v Cutelaba","Synopsis":"'UFC Fight Night Highlights - Heavyweight Bout: Kennedy Nzechukwu vs Ion Cutelaba'. From The UFC APEX Center - Las Vegas, USA.","Rating":"16","MainGenres":["Sport"],"SubGenres":["All Sport","Mixed Martial Arts"],"Items":[{"Key":"Source Key ID","Value":"200108412"}],"ThumbnailUri":"https://03mcdecdnimagerepository.blob.core.windows.net/epguideimage/img/271546_UFC Fight Night.png","MainContentID":"0x28E53D","MainGroupID":"0x00873DD0","SubGroupID":"0x00","LogLine":"MMA","StarRating":"0","AssociatedAd":false,"AssociatedApplication":false,"DolbyDigital":false,"Subtitles":false,"LastEpisodeFlag":false,"Series":false,"Special":false,"Macrovision":false,"PremierEvent":false,"FirstAiring":false,"Repeat":true,"LastRepeat":false,"LiveEvent":false,"DelayedEvent":false,"Recommendations":false,"HighDefinition":true,"Widescreen":false,"MultipleSountracks":false,"Captions":false,"SocialTags":false,"VidOnDemand":false,"VoDOnline":false,"BlockStream":false}

View file

@ -8,21 +8,23 @@ dayjs.extend(utc)
dayjs.extend(timezone) dayjs.extend(timezone)
dayjs.extend(customParseFormat) dayjs.extend(customParseFormat)
const API_ENDPOINT = 'https://www.dstv.com/umbraco/api/TvGuide'
module.exports = { module.exports = {
site: 'dstv.com', site: 'dstv.com',
request: { request: {
cache: { cache: {
ttl: 6 * 60 * 60 * 1000, // 6h ttl: 3 * 60 * 60 * 1000, // 3h
interpretHeader: false interpretHeader: false
} }
}, },
url: function ({ channel, date }) { url: function ({ channel, date }) {
const [region] = channel.site_id.split('#') const [region] = channel.site_id.split('#')
const packageName = region === 'nga' ? 'DStv%20Premium' : '' const packageName = region === 'nga' ? '&package=DStv%20Premium' : ''
return `https://www.dstv.com/umbraco/api/TvGuide/GetProgrammes?d=${date.format( return `${API_ENDPOINT}/GetProgrammes?d=${date.format(
'YYYY-MM-DD' 'YYYY-MM-DD'
)}&package=${packageName}&country=${region}` )}${packageName}&country=${region}`
}, },
async parser({ content, channel, cached }) { async parser({ content, channel, cached }) {
let programs = [] let programs = []
@ -34,8 +36,8 @@ module.exports = {
description: parseDescription(details), description: parseDescription(details),
icon: parseIcon(details), icon: parseIcon(details),
category: parseCategory(details), category: parseCategory(details),
start: parseTime(item.StartTime), start: parseTime(item.StartTime, channel),
stop: parseTime(item.EndTime) stop: parseTime(item.EndTime, channel)
}) })
} }
@ -43,9 +45,7 @@ module.exports = {
}, },
async channels({ country }) { async channels({ country }) {
const data = await axios const data = await axios
.get( .get(`${API_ENDPOINT}/GetProgrammes?d=2022-03-10&package=DStv%20Premium&country=${country}`)
`https://www.dstv.com/umbraco/api/TvGuide/GetProgrammes?d=2022-03-10&package=DStv%20Premium&country=${country}`
)
.then(r => r.data) .then(r => r.data)
.catch(console.log) .catch(console.log)
@ -58,6 +58,16 @@ module.exports = {
} }
} }
function parseTime(time, channel) {
const [region] = channel.site_id.split('#')
const tz = {
zaf: 'Africa/Johannesburg',
nga: 'Africa/Lagos'
}
return dayjs.tz(time, 'YYYY-MM-DDTHH:mm:ss', tz[region])
}
function parseDescription(details) { function parseDescription(details) {
return details ? details.Synopsis : null return details ? details.Synopsis : null
} }
@ -71,7 +81,7 @@ function parseCategory(details) {
} }
async function loadProgramDetails(item) { async function loadProgramDetails(item) {
const url = `https://www.dstv.com/umbraco/api/TvGuide/GetProgramme?id=${item.Id}` const url = `${API_ENDPOINT}/GetProgramme?id=${item.Id}`
return axios return axios
.get(url) .get(url)
@ -79,10 +89,6 @@ async function loadProgramDetails(item) {
.catch(console.error) .catch(console.error)
} }
function parseTime(time) {
return dayjs.utc(time, 'YYYY-MM-DDTHH:mm:ss')
}
function parseItems(content, channel) { function parseItems(content, channel) {
const [_, channelId] = channel.site_id.split('#') const [_, channelId] = channel.site_id.split('#')
const data = JSON.parse(content) const data = JSON.parse(content)

View file

@ -5,6 +5,8 @@
const { parser, url } = require('./dstv.com.config.js') const { parser, url } = require('./dstv.com.config.js')
const axios = require('axios') const axios = require('axios')
const fs = require('fs')
const path = require('path')
const dayjs = require('dayjs') const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc') const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat') const customParseFormat = require('dayjs/plugin/customParseFormat')
@ -13,68 +15,90 @@ dayjs.extend(utc)
jest.mock('axios') jest.mock('axios')
const date = dayjs.utc('2022-03-11', 'YYYY-MM-DD').startOf('d') const API_ENDPOINT = 'https://www.dstv.com/umbraco/api/TvGuide'
const date = dayjs.utc('2022-11-22', 'YYYY-MM-DD').startOf('d')
const channelZA = { const channelZA = {
site_id: 'zaf#101', site_id: 'zaf#201',
xmltv_id: 'MNetWest.za' xmltv_id: 'SuperSportGrandstand.za'
} }
const channelNG = { const channelNG = {
site_id: 'nga#101', site_id: 'nga#201',
xmltv_id: 'MNetWest.za' xmltv_id: 'SuperSportGrandstand.za'
} }
it('can generate valid url for zaf', () => { it('can generate valid url for zaf', () => {
expect(url({ channel: channelZA, date })).toBe( expect(url({ channel: channelZA, date })).toBe(
'https://www.dstv.com/umbraco/api/TvGuide/GetProgrammes?d=2022-03-11&package=&country=zaf' `${API_ENDPOINT}/GetProgrammes?d=2022-11-22&country=zaf`
) )
}) })
it('can generate valid url for nga', () => { it('can generate valid url for nga', () => {
expect(url({ channel: channelNG, date })).toBe( expect(url({ channel: channelNG, date })).toBe(
'https://www.dstv.com/umbraco/api/TvGuide/GetProgrammes?d=2022-03-11&package=DStv%20Premium&country=nga' `${API_ENDPOINT}/GetProgrammes?d=2022-11-22&package=DStv%20Premium&country=nga`
) )
}) })
it('can parse response', done => { it('can parse response for ZA', async () => {
const content = `{"Total":4483,"Channels":[{"Number":"214","Tag":"S34","Name":"TENNIS","Programmes":[{"Id":"5c5a56e8-9959-4305-ae2f-7cc32ec39f5f","StartTime":"2022-03-11T09:00:00","EndTime":"2022-03-11T09:15:00","Title":"WTA 1000 HL '22: Indian Wells D2 M1"}]},{"Number":"101","Tag":"HDT","Name":"M-Net HD","Programmes":[{"Id":"a6ada4cd-93df-4eaf-bab4-041e2537ed23","StartTime":"2022-03-11T00:10:00","EndTime":"2022-03-11T00:50:00","Title":"Curb Your Enthusiasm"}]}]}` const content = fs.readFileSync(path.resolve(__dirname, '__data__/content_zaf.json'))
axios.get.mockImplementation(url => { axios.get.mockImplementation(url => {
if ( if (url === `${API_ENDPOINT}/GetProgramme?id=8b237235-aa17-4bb8-9ea6-097e7a813336`) {
url ===
'https://www.dstv.com/umbraco/api/TvGuide/GetProgramme?id=a6ada4cd-93df-4eaf-bab4-041e2537ed23'
) {
return Promise.resolve({ return Promise.resolve({
data: JSON.parse( data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program_zaf.json')))
`{"Id":"a6ada4cd-93df-4eaf-bab4-041e2537ed23","ChannelTag":"HDT","Channel":"M-Net Domestic HD","EventID":"HDT0000109067787","StartTime":"2022-03-11T00:10:00","EndTime":"2022-03-11T00:50:00","Duration":"00:40:00","Language":"eng","Title":"Curb Your Enthusiasm","Synopsis":"'S11/E6 of 10 - Man Fights Tiny Woman'. A general entertainment channel showcasing the best international content, focusing on scripted drama, comedy and talk.","Rating":"16","MainGenres":["Series"],"SubGenres":["Sitcom","Comedy"],"Items":[{"Key":"Year","Value":"2020"},{"Key":"Source Key ID","Value":"100338770"}],"ThumbnailUri":"https://03mcdecdnimagerepository.blob.core.windows.net/epguideimage/img/21893_curb_your_enthusiam169.jpg"}`
)
}) })
} else { } else {
return Promise.resolve({ data: '' }) return Promise.resolve({ data: '' })
} }
}) })
parser({ content, channel: channelZA }) let results = await parser({ content, channel: channelZA })
.then(result => { results = results.map(p => {
result = result.map(p => {
p.start = p.start.toJSON() p.start = p.start.toJSON()
p.stop = p.stop.toJSON() p.stop = p.stop.toJSON()
return p return p
}) })
expect(result).toMatchObject([ expect(results[1]).toMatchObject({
{ start: '2022-11-21T23:00:00.000Z',
start: '2022-03-11T00:10:00.000Z', stop: '2022-11-22T00:00:00.000Z',
stop: '2022-03-11T00:50:00.000Z', title: 'UFC FN HL: Nzechukwu v Cutelaba',
title: 'Curb Your Enthusiasm' description:
// description: "'UFC Fight Night Highlights - Heavyweight Bout: Kennedy Nzechukwu vs Ion Cutelaba'. From The UFC APEX Center - Las Vegas, USA.",
// "'S11/E6 of 10 - Man Fights Tiny Woman'. A general entertainment channel showcasing the best international content, focusing on scripted drama, comedy and talk.", icon: 'https://03mcdecdnimagerepository.blob.core.windows.net/epguideimage/img/271546_UFC Fight Night.png',
// icon: 'https://03mcdecdnimagerepository.blob.core.windows.net/epguideimage/img/21893_curb_your_enthusiam169.jpg', category: ['All Sport', 'Mixed Martial Arts']
// category: ['Sitcom', 'Comedy'] })
} })
])
done() it('can parse response for NG', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content_nga.json'))
axios.get.mockImplementation(url => {
if (url === `${API_ENDPOINT}/GetProgramme?id=6d58931e-2192-486a-a202-14720136d204`) {
return Promise.resolve({
data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program_nga.json')))
})
} else {
return Promise.resolve({ data: '' })
}
})
let results = await parser({ content, channel: channelNG })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2022-11-21T23:00:00.000Z',
stop: '2022-11-22T00:00:00.000Z',
title: 'UFC FN HL: Nzechukwu v Cutelaba',
description:
"'UFC Fight Night Highlights - Heavyweight Bout: Kennedy Nzechukwu vs Ion Cutelaba'. From The UFC APEX Center - Las Vegas, USA.",
icon: 'https://03mcdecdnimagerepository.blob.core.windows.net/epguideimage/img/271546_UFC Fight Night.png',
category: ['All Sport', 'Mixed Martial Arts']
}) })
.catch(done)
}) })
it('can handle empty guide', done => { it('can handle empty guide', done => {

View file

@ -30,7 +30,6 @@
<channel lang="en" xmltv_id="CCTVEntertainment.cn" site_id="nga#480">CCTV Entertainment Mandarin Entertainment Channel</channel> <channel lang="en" xmltv_id="CCTVEntertainment.cn" site_id="nga#480">CCTV Entertainment Mandarin Entertainment Channel</channel>
<channel lang="en" xmltv_id="CGTN.cn" site_id="nga#409">CGTN News</channel> <channel lang="en" xmltv_id="CGTN.cn" site_id="nga#409">CGTN News</channel>
<channel lang="en" xmltv_id="CGTNDocumentary.cn" site_id="nga#448">CGTN Documentary</channel> <channel lang="en" xmltv_id="CGTNDocumentary.cn" site_id="nga#448">CGTN Documentary</channel>
<channel lang="fr" xmltv_id="CGTNFrench.cn" site_id="nga#449">CGTN French</channel>
<channel lang="en" xmltv_id="ChinaMovieChannel.cn" site_id="nga#481">China Movie Channel</channel> <channel lang="en" xmltv_id="ChinaMovieChannel.cn" site_id="nga#481">China Movie Channel</channel>
<channel lang="en" xmltv_id="CitiTV.gh" site_id="nga#363">Citi TV</channel> <channel lang="en" xmltv_id="CitiTV.gh" site_id="nga#363">Citi TV</channel>
<channel lang="en" xmltv_id="CNBCAfrica.za" site_id="nga#410">CNBC Africa</channel> <channel lang="en" xmltv_id="CNBCAfrica.za" site_id="nga#410">CNBC Africa</channel>
@ -51,9 +50,9 @@
<channel lang="en" xmltv_id="ESPN2Africa.za" site_id="nga#219">ESPN 2 HD</channel> <channel lang="en" xmltv_id="ESPN2Africa.za" site_id="nga#219">ESPN 2 HD</channel>
<channel lang="en" xmltv_id="ESPNAfrica.za" site_id="nga#218">ESPN</channel> <channel lang="en" xmltv_id="ESPNAfrica.za" site_id="nga#218">ESPN</channel>
<channel lang="en" xmltv_id="etvAfrica.za" site_id="nga#250">eTV Africa</channel> <channel lang="en" xmltv_id="etvAfrica.za" site_id="nga#250">eTV Africa</channel>
<channel lang="en" xmltv_id="EuronewsGerman.fr" site_id="nga#445">EuroNews German</channel>
<channel lang="en" xmltv_id="EuronewsEnglish.fr" site_id="nga#414">EuroNews</channel> <channel lang="en" xmltv_id="EuronewsEnglish.fr" site_id="nga#414">EuroNews</channel>
<channel lang="en" xmltv_id="EuronewsFrench.fr" site_id="nga#438">EuroNews French</channel> <channel lang="en" xmltv_id="EuronewsFrench.fr" site_id="nga#438">EuroNews French</channel>
<channel lang="en" xmltv_id="EuronewsGerman.fr" site_id="nga#445">EuroNews German</channel>
<channel lang="en" xmltv_id="EWTNAfricaAsia.us" site_id="nga#348">Eternal Word Television Network</channel> <channel lang="en" xmltv_id="EWTNAfricaAsia.us" site_id="nga#348">Eternal Word Television Network</channel>
<channel lang="en" xmltv_id="FaithAfrica.za" site_id="nga#341">FAITH</channel> <channel lang="en" xmltv_id="FaithAfrica.za" site_id="nga#341">FAITH</channel>
<channel lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="nga#175">Food Network</channel> <channel lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="nga#175">Food Network</channel>
@ -105,7 +104,6 @@
<channel lang="en" xmltv_id="Rok.uk" site_id="nga#168">ROK</channel> <channel lang="en" xmltv_id="Rok.uk" site_id="nga#168">ROK</channel>
<channel lang="en" xmltv_id="Rok2.uk" site_id="nga#169">ROK 2</channel> <channel lang="en" xmltv_id="Rok2.uk" site_id="nga#169">ROK 2</channel>
<channel lang="en" xmltv_id="RokGH.uk" site_id="nga#164">ROK GH</channel> <channel lang="en" xmltv_id="RokGH.uk" site_id="nga#164">ROK GH</channel>
<channel lang="pt" xmltv_id="RTPInternacional.pt" site_id="nga#525">RTPi (P)</channel>
<channel lang="en" xmltv_id="SABCNews.za" site_id="nga#404">SABC News</channel> <channel lang="en" xmltv_id="SABCNews.za" site_id="nga#404">SABC News</channel>
<channel lang="en" xmltv_id="SBNTVInternational.us" site_id="nga#345">SBN</channel> <channel lang="en" xmltv_id="SBNTVInternational.us" site_id="nga#345">SBN</channel>
<channel lang="en" xmltv_id="SilverbirdTV.ng" site_id="nga#252">SILVERBIRD</channel> <channel lang="en" xmltv_id="SilverbirdTV.ng" site_id="nga#252">SILVERBIRD</channel>
@ -150,5 +148,7 @@
<channel lang="en" xmltv_id="WWEChannel.za" site_id="nga#128">WWE Channel</channel> <channel lang="en" xmltv_id="WWEChannel.za" site_id="nga#128">WWE Channel</channel>
<channel lang="en" xmltv_id="ZeeWorld.za" site_id="nga#166">Zee World</channel> <channel lang="en" xmltv_id="ZeeWorld.za" site_id="nga#166">Zee World</channel>
<channel lang="en" xmltv_id="ZhejiangSatelliteTV.cn" site_id="nga#484">Zhejiang TV</channel> <channel lang="en" xmltv_id="ZhejiangSatelliteTV.cn" site_id="nga#484">Zhejiang TV</channel>
<channel lang="fr" xmltv_id="CGTNFrench.cn" site_id="nga#449">CGTN French</channel>
<channel lang="pt" xmltv_id="RTPInternacional.pt" site_id="nga#525">RTPi (P)</channel>
</channels> </channels>
</site> </site>

View file

@ -10,7 +10,6 @@
<channel lang="en" xmltv_id="BayTV.za" site_id="zaf#260">Bay TV</channel> <channel lang="en" xmltv_id="BayTV.za" site_id="zaf#260">Bay TV</channel>
<channel lang="en" xmltv_id="BBCBritAfrica.uk" site_id="zaf#120">BBC Brit HD</channel> <channel lang="en" xmltv_id="BBCBritAfrica.uk" site_id="zaf#120">BBC Brit HD</channel>
<channel lang="en" xmltv_id="BBCEarthAfrica.uk" site_id="zaf#184">BBC Earth HD</channel> <channel lang="en" xmltv_id="BBCEarthAfrica.uk" site_id="zaf#184">BBC Earth HD</channel>
<!-- <channel lang="en" xmltv_id="" site_id="zaf#119">BBC First HD</channel> -->
<channel lang="en" xmltv_id="BBCLifestyleAfrica.uk" site_id="zaf#174">BBC Lifestyle</channel> <channel lang="en" xmltv_id="BBCLifestyleAfrica.uk" site_id="zaf#174">BBC Lifestyle</channel>
<channel lang="en" xmltv_id="BBCWorldNewsAfrica.uk" site_id="zaf#400">BBC World News</channel> <channel lang="en" xmltv_id="BBCWorldNewsAfrica.uk" site_id="zaf#400">BBC World News</channel>
<channel lang="en" xmltv_id="BETAfrica.us" site_id="zaf#129">BET</channel> <channel lang="en" xmltv_id="BETAfrica.us" site_id="zaf#129">BET</channel>
@ -98,7 +97,6 @@
<channel lang="en" xmltv_id="RealTimeAfrica.us" site_id="zaf#155">Real Time</channel> <channel lang="en" xmltv_id="RealTimeAfrica.us" site_id="zaf#155">Real Time</channel>
<channel lang="en" xmltv_id="Rok.uk" site_id="zaf#168">ROK</channel> <channel lang="en" xmltv_id="Rok.uk" site_id="zaf#168">ROK</channel>
<channel lang="en" xmltv_id="RT.ru" site_id="zaf#407">Russia Today</channel> <channel lang="en" xmltv_id="RT.ru" site_id="zaf#407">Russia Today</channel>
<channel lang="pt" xmltv_id="RTPInternacional.pt" site_id="zaf#435">RTPI</channel>
<channel lang="en" xmltv_id="SABC1.za" site_id="zaf#191">SABC 1 HD</channel> <channel lang="en" xmltv_id="SABC1.za" site_id="zaf#191">SABC 1 HD</channel>
<channel lang="en" xmltv_id="SABC2.za" site_id="zaf#192">SABC 2 HD</channel> <channel lang="en" xmltv_id="SABC2.za" site_id="zaf#192">SABC 2 HD</channel>
<channel lang="en" xmltv_id="SABC3.za" site_id="zaf#193">SABC 3 HD</channel> <channel lang="en" xmltv_id="SABC3.za" site_id="zaf#193">SABC 3 HD</channel>
@ -146,5 +144,7 @@
<channel lang="en" xmltv_id="WildEarth.za" site_id="zaf#183">WildEarth</channel> <channel lang="en" xmltv_id="WildEarth.za" site_id="zaf#183">WildEarth</channel>
<channel lang="en" xmltv_id="WWEChannel.za" site_id="zaf#236">WWE</channel> <channel lang="en" xmltv_id="WWEChannel.za" site_id="zaf#236">WWE</channel>
<channel lang="en" xmltv_id="ZeeWorld.za" site_id="zaf#166">Zee World HD</channel> <channel lang="en" xmltv_id="ZeeWorld.za" site_id="zaf#166">Zee World HD</channel>
<channel lang="pt" xmltv_id="RTPInternacional.pt" site_id="zaf#435">RTPI</channel>
<!-- <channel lang="en" xmltv_id="" site_id="zaf#119">BBC First HD</channel> -->
</channels> </channels>
</site> </site>