diff --git a/sites/tvguide.com/tvguide.com.config.js b/sites/tvguide.com/tvguide.com.config.js index 14f72092..271bac6e 100644 --- a/sites/tvguide.com/tvguide.com.config.js +++ b/sites/tvguide.com/tvguide.com.config.js @@ -1,3 +1,4 @@ +const axios = require('axios') const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') const timezone = require('dayjs/plugin/timezone') @@ -8,37 +9,62 @@ dayjs.extend(timezone) module.exports = { site: 'tvguide.com', url: function ({ date, channel }) { - const parts = channel.site_id.split('#') - const start = date.startOf('d') - const duration = date.endOf('d').diff(start, 'm') - const url = `https://cmg-prod.apigee.net/v1/xapi/tvschedules/tvguide/${ - parts[0] - }/web?start=${start.unix()}&duration=${duration}&channelSourceIds=${parts[1]}` + const [providerId, channelSourceIds] = channel.site_id.split('#') + const url = `https://cmg-prod.apigee.net/v1/xapi/tvschedules/tvguide/${providerId}/web?start=${date + .startOf('d') + .unix()}&duration=1440&channelSourceIds=${channelSourceIds}` return url }, - parser: function ({ content }) { + async parser({ content, channel }) { const programs = [] const items = parseItems(content) - items.forEach(item => { + for (let item of items) { + const details = await loadProgramDetails(item) programs.push({ title: item.title, + sub_title: details.episodeTitle, + description: details.description, + season: details.seasonNumber, + episode: details.episodeNumber, + rating: parseRating(item), + categories: parseCategories(details), start: parseTime(item.startTime), stop: parseTime(item.endTime) }) - }) + } return programs } } +function parseRating(item) { + return item.rating ? { system: 'MPA', value: item.rating } : null +} + +function parseCategories(details) { + return Array.isArray(details.genres) ? details.genres.map(g => g.name) : [] +} + function parseTime(timestamp) { return dayjs.unix(timestamp) } function parseItems(content) { const data = JSON.parse(content) - if (!Array.isArray(data.data.items) || !data.data.items.length) return [] + if (!data.data || !Array.isArray(data.data.items) || !data.data.items.length) return [] return data.data.items[0].programSchedules } + +async function loadProgramDetails(item) { + const data = await axios + .get(item.programDetails) + .then(r => r.data) + .catch(err => { + console.log(err.message) + }) + if (!data || !data.data || !data.data.item) return {} + + return data.data.item +}