From ddd7f1aa6ed7b7480e2bd3a59a8734065050182f Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Sat, 8 Feb 2025 10:22:34 +0300 Subject: [PATCH] Create epgshare01.online.config.js --- .../epgshare01.online.config.js | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 sites/epgshare01.online/epgshare01.online.config.js diff --git a/sites/epgshare01.online/epgshare01.online.config.js b/sites/epgshare01.online/epgshare01.online.config.js new file mode 100644 index 00000000..7e5cd253 --- /dev/null +++ b/sites/epgshare01.online/epgshare01.online.config.js @@ -0,0 +1,74 @@ +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 + } + }, + 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')) +}