const axios = require('axios') const iconv = require('iconv-lite') const parser = require('epg-parser') const { ungzip } = require('pako') let cachedContent module.exports = { site: 'epgshare01.online', days: 2, url({ channel }) { const [tag] = channel.site_id.split('#') return `https://epgshare01.online/epgshare01/epg_ripper_${tag}.xml.gz` }, request: { cache: { ttl: 24 * 60 * 60 * 1000 // 1 day }, maxContentLength: 100000000 // 100 MB }, parser({ buffer, channel, date, cached }) { if (!cached) cachedContent = undefined let programs = [] const items = parseItems(buffer, channel, date) items.forEach(item => { programs.push({ title: item.title?.[0]?.value, description: item.desc?.[0]?.value, start: item.start, stop: item.stop }) }) return programs }, async channels({ tag }) { const buffer = await axios .get(`https://epgshare01.online/epgshare01/epg_ripper_${tag}.xml.gz`, { responseType: 'arraybuffer' }) .then(r => r.data) .catch(console.error) const content = ungzip(buffer) const encoded = iconv.decode(content, 'utf8') const { channels } = parser.parse(encoded) return channels.map(channel => { const displayName = channel.displayName[0] return { lang: displayName.lang || 'en', site_id: `${tag}#${channel.id}`, name: displayName.value } }) } } function parseItems(buffer, channel, date) { if (!buffer) return [] if (!cachedContent) { const content = ungzip(buffer) const encoded = iconv.decode(content, 'utf8') cachedContent = parser.parse(encoded) } const { programs } = cachedContent const [, channelId] = channel.site_id.split('#') return programs.filter(p => p.channel === channelId && date.isSame(p.start, 'day')) }