diff --git a/sites/shahid.mbc.net/shahid.mbc.net.config.js b/sites/shahid.mbc.net/shahid.mbc.net.config.js index 88581a2e..bae07516 100644 --- a/sites/shahid.mbc.net/shahid.mbc.net.config.js +++ b/sites/shahid.mbc.net/shahid.mbc.net.config.js @@ -1,104 +1,104 @@ -const dayjs = require('dayjs') -const utc = require('dayjs/plugin/utc') -const timezone = require('dayjs/plugin/timezone') -const customParseFormat = require('dayjs/plugin/customParseFormat') - -dayjs.extend(utc) -dayjs.extend(timezone) -dayjs.extend(customParseFormat) - -module.exports = { - site: 'shahid.mbc.net', - days: 2, - url({ channel, date }) { - return `https://api2.shahid.net/proxy/v2.1/shahid-epg-api/?csvChannelIds=${ - channel.site_id - }&from=${date.format('YYYY-MM-DD')}T00:00:00.000Z&to=${date.format( - 'YYYY-MM-DD' - )}T23:59:59.999Z&country=SA&language=${channel.lang}&Accept-Language=${channel.lang}` - }, - parser({ content, channel }) { - const programs = parseItems(content, channel).map(item => { - return { - title: item.title, - description: item.description, - image: parseImage(item), - season: item.seasonNumber, - episode: item.episodeNumber, - category: item.genres, - start: dayjs.tz(item.actualFrom, 'UTC').toISOString(), - stop: dayjs.tz(item.actualTo, 'UTC').toISOString() - } - }) - - return programs - }, - async channels({ lang = 'en' }) { - const axios = require('axios') - const items = [] - const countryCodes = ['EG', 'SA', 'US'] - for (let country of countryCodes) { - let page = 0 - while (true) { - const result = await axios - .get( - `https://api2.shahid.net/proxy/v2.1/product/filter?filter=%7B"pageNumber":${page},"pageSize":100,"productType":"LIVESTREAM","productSubType":"LIVE_CHANNEL"%7D&country=${country}&language=${lang}&Accept-Language=${lang}` - ) - .then(response => response.data) - .catch(console.error) - if (result.productList) { - items.push(...result.productList.products) - if (result.productList.hasMore) { - page++ - continue - } - } - break - } - } - const uniqueItems = Array.from(new Map(items.map(item => [item.id, item])).values()) - const channels = uniqueItems.map(channel => { - return { - lang, - site_id: channel.id, - name: channel.title - } - }) - - return channels - } -} - -function parseItems(content, channel) { - const items = [] - content = content ? JSON.parse(content) : [] - if (content.items) { - content.items.forEach(schedules => { - if (schedules.channelId == channel.site_id) { - items.push(...schedules.items) - return true - } - }) - } - - return items -} - -function parseImage(item) { - // image may have params such as width that needs to be substituted or removed for it load - return removeParameters(item.productPoster) -} - -function removeParameters(url) { - if (url) { - try { - const urlObj = new URL(url) - urlObj.search = '' - urlObj.hash = '' - return urlObj.toString() - } catch { - return null - } - } - return url +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +const customParseFormat = require('dayjs/plugin/customParseFormat') + +dayjs.extend(utc) +dayjs.extend(timezone) +dayjs.extend(customParseFormat) + +module.exports = { + site: 'shahid.mbc.net', + days: 2, + url({ channel, date }) { + return `https://api2.shahid.net/proxy/v2.1/shahid-epg-api/?csvChannelIds=${ + channel.site_id + }&from=${date.format('YYYY-MM-DD')}T00:00:00.000Z&to=${date.format( + 'YYYY-MM-DD' + )}T23:59:59.999Z&country=SA&language=${channel.lang}&Accept-Language=${channel.lang}` + }, + parser({ content, channel }) { + const programs = parseItems(content, channel).map(item => { + return { + title: item.title, + description: item.description, + image: parseImage(item), + season: item.seasonNumber, + episode: item.episodeNumber, + category: item.genres, + start: dayjs.tz(item.actualFrom, 'UTC').toISOString(), + stop: dayjs.tz(item.actualTo, 'UTC').toISOString() + } + }) + + return programs + }, + async channels({ lang = 'en' }) { + const axios = require('axios') + const items = [] + const countryCodes = ['EG', 'SA', 'US'] + for (let country of countryCodes) { + let page = 0 + while (true) { + const result = await axios + .get( + `https://api2.shahid.net/proxy/v2.1/product/filter?filter=%7B"pageNumber":${page},"pageSize":100,"productType":"LIVESTREAM","productSubType":"LIVE_CHANNEL"%7D&country=${country}&language=${lang}&Accept-Language=${lang}` + ) + .then(response => response.data) + .catch(console.error) + if (result.productList) { + items.push(...result.productList.products) + if (result.productList.hasMore) { + page++ + continue + } + } + break + } + } + const uniqueItems = Array.from(new Map(items.map(item => [item.id, item])).values()) + const channels = uniqueItems.map(channel => { + return { + lang, + site_id: channel.id, + name: channel.title + } + }) + + return channels + } +} + +function parseItems(content, channel) { + const items = [] + content = content ? JSON.parse(content) : [] + if (content.items) { + content.items.forEach(schedules => { + if (schedules.channelId == channel.site_id) { + items.push(...schedules.items) + return true + } + }) + } + + return items +} + +function parseImage(item) { + // image may have params such as width that needs to be substituted or removed for it load + return removeParameters(item.productPoster) +} + +function removeParameters(url) { + if (url) { + try { + const urlObj = new URL(url) + urlObj.search = '' + urlObj.hash = '' + return urlObj.toString() + } catch { + return null + } + } + return url } \ No newline at end of file