Files
epg/sites/sky.co.nz/sky.co.nz.config.js
2025-12-15 00:45:10 +01:00

132 lines
3.3 KiB
JavaScript

const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const tz = require('dayjs/plugin/timezone')
const timezone = 'Pacific/Auckland'
dayjs.extend(utc)
dayjs.extend(tz)
module.exports = {
site: 'sky.co.nz',
days: 2,
url: 'https://api.skyone.co.nz/exp/graph',
request: {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
data({ date } = {}) {
return ({
query: `{
experience(appId: TV_GUIDE_WEB) {
channelGroup(id: "4b7LA20J4iHaThwky9iVqn") {
id
title
channels {
... on LinearChannel {
id
title
number
tileImage {
uri
}
slotsForDay(date: "${dayjs.tz(date || dayjs(), timezone).format('YYYY-MM-DD')}") {
slots {
id
startMs
endMs
live
nzBsaRatingString
programme {
... on Episode {
id
title
synopsis
}
... on Movie {
id
title
}
... on PayPerViewEventProgram {
id
title
}
}
}
}
}
}
}
}
}`
})
}
},
parser({ content, channel }) {
let programs = []
const items = parseItems(content, channel)
items.forEach(item => {
programs.push({
title: item.title,
description: item.synopsis,
rating: parseRating(item),
start: dayjs(parseInt(item.start)),
stop: dayjs(parseInt(item.end))
})
})
return programs
},
async channels() {
const data = await axios
.get('https://skywebconfig.msl-prod.skycloud.co.nz/sky/json/channels.prod.json')
.then(r => r.data)
.catch(console.log)
return data.map(item => {
return {
lang: 'en',
site_id: parseInt(item.number).toString(),
name: item.sort
}
})
}
}
function parseItems(content, channel) {
if (!channel?.site_id) return []
let data
try {
data = JSON.parse(content)
} catch {
return []
}
const channels = data?.data?.experience?.channelGroup?.channels
if (!Array.isArray(channels)) return []
const channelData = channels.find(i => i.number === parseInt(channel.site_id))
if (!channelData?.slotsForDay?.slots) return []
return channelData.slotsForDay.slots.map(slot => ({
title: slot.programme.title || null,
synopsis: slot.programme.synopsis || null,
rating: slot.nzBsaRatingString || null,
start: slot.startMs,
end: slot.endMs
}))
}
function parseRating(item) {
if (!item.rating) return null
return {
system: 'OFLC',
value: item.rating
}
}