UNPKG

epg-grabber

Version:

Node.js CLI tool for grabbing EPG from different sites

79 lines (69 loc) 2.27 kB
import { escapeString, createXMLElement } from '../core/utils' import { ChannelData } from '../types/channel' import xmlJs from 'xml-js' export class Channel { xmltv_id: string name: string site: string site_id: string lang: string | null logo: string | null url: string | null lcn: string | null index: number constructor(data: ChannelData) { this.xmltv_id = data.xmltv_id this.name = data.name this.site = data.site this.site_id = data.site_id this.lang = data.lang this.logo = data.logo this.url = data.url this.lcn = data.lcn this.index = data.index !== undefined ? data.index : -1 } static fromXmlJsElement( site: string, element: xmlJs.Element, index: number ): Channel | undefined { if (!element.elements) return const textElement = element.elements.find((element: xmlJs.Element) => element.type === 'text') if (!textElement || !textElement.text) return const attributes = element.attributes if (!attributes) return const channel = new Channel({ xmltv_id: attributes.xmltv_id ? attributes.xmltv_id.toString() : '', name: textElement.text.toString(), site: attributes.site ? attributes.site.toString() : site, site_id: attributes.site_id ? attributes.site_id.toString() : '', lang: attributes.lang ? attributes.lang.toString() : null, logo: attributes.logo ? attributes.logo.toString() : null, url: attributes.url ? attributes.url.toString() : null, lcn: attributes.lcn ? attributes.lcn.toString() : null, index }) return channel } toXML() { const el = createXMLElement const children = [el('display-name', {}, [escapeString(this.name)])] if (this.logo) children.push(el('icon', { src: this.logo }, [])) if (this.url) children.push(el('url', {}, [escapeString(this.url)])) if (this.lcn) children.push(el('lcn', {}, [escapeString(this.lcn)])) return el('channel', { id: this.xmltv_id }, children) } toObject(): ChannelData { return { xmltv_id: this.xmltv_id, name: this.name, site: this.site, site_id: this.site_id, lang: this.lang, logo: this.logo, url: this.url, lcn: this.lcn, index: this.index } } }