UNPKG

m3u-parser-generator

Version:

Library to parse and generate m3u or m3u8 IPTV playlist files

8 lines (7 loc) 4.4 kB
var m3uParserGenerator=function(c){"use strict";class h{static generate(t){const r=t.title?`${e.PLAYLIST}:${t.title}`:void 0,s=this.getCustomDataDirective(t.customData),n=t.medias.map(i=>this.getMedia(i)).join(` `),u=this.getAttributes(t.attributes);return[e.EXTM3U+u,r,s,n].filter(i=>i).join(` `)}static getMedia(t){const r=this.getAttributes(t.attributes),s=this.shouldAddInfoDirective(t,r)?`${e.EXTINF}:${t.duration}${r},${t.name}`:null,n=t.group?`${e.EXTGRP}:${t.group}`:null,u=t.bytes?`${e.EXTBYT}:${t.bytes}`:null,i=t.image?`${e.EXTIMG}:${t.image}`:null,o=t.album?`${e.EXTALB}:${t.album}`:null,l=t.artist?`${e.EXTART}:${t.artist}`:null,g=t.genre?`${e.EXTGENRE}:${t.genre}`:null,P=t.extraAttributesFromUrl?`${e.EXTATTRFROMURL}:${t.extraAttributesFromUrl}`:null,M=t.extraHttpHeaders?`${e.EXTHTTP}:${JSON.stringify(t.extraHttpHeaders)}`:null,d=t.kodiProps?[...t.kodiProps].map(([E,R])=>`${e.KODIPROP}:${E}=${R}`).join(` `):null,$=this.getCustomDataDirective(t.customData);return[s,n,u,i,o,l,g,P,M,d,$,t.location].filter(E=>E).join(` `)}static getCustomDataDirective(t){return t.map(r=>`${r.directive}:${r.value}`).join(` `)}static getAttributes(t){const r=Object.keys(t);return r.length?" "+r.map(s=>`${s}="${t[s]}"`).join(" "):""}static shouldAddInfoDirective(t,r){return t.duration!==f||r!==""||t.name!==void 0}}const X="#",f=-1;var e=(a=>(a.EXTM3U="#EXTM3U",a.EXTINF="#EXTINF",a.PLAYLIST="#PLAYLIST",a.EXTGRP="#EXTGRP",a.EXTBYT="#EXTBYT",a.EXTIMG="#EXTIMG",a.EXTALB="#EXTALB",a.EXTART="#EXTART",a.EXTGENRE="#EXTGENRE",a.EXTATTRFROMURL="#EXTATTRFROMURL",a.EXTHTTP="#EXTHTTP",a.KODIPROP="#KODIPROP",a))(e||{});class p{constructor(){this.title="",this.attributes=new T,this.medias=[],this.customData=[]}get urlTvg(){return this.attributes["url-tvg"]}set urlTvg(t){this.attributes={...this.attributes,"url-tvg":t}}getM3uString(){return h.generate(this)}}class b{constructor(t){this.location=t,this.duration=f,this.attributes=new T,this.extraAttributesFromUrl=void 0,this.extraHttpHeaders=void 0,this.bytes=void 0,this.image=void 0,this.album=void 0,this.artist=void 0,this.genre=void 0,this.customData=[]}}class T{}class A{constructor(t){this.config=t}getAttributes(t){const r=new T;return t&&(t.match(/[^ ]*?=".*?"/g)??[]).forEach(n=>{const[u,i]=n.split('="');r[u]=i.replace('"',"")}),r}processMedia(t,r){const s=t.indexOf(","),n=t.substring(0,s);r.name=t.substring(s+1);const u=n.indexOf(" "),i=u>0?u:n.length;r.duration=Number(n.substring(0,i));const o=n.substring(i+1);r.attributes=this.getAttributes(o)}processDirective(t,r,s){const n=t.indexOf(":"),u=t.substring(0,n),i=t.substring(n+1);switch(u){case e.EXTINF:{this.processMedia(i,s);break}case e.EXTGRP:{s.group=i;break}case e.EXTBYT:{s.bytes=Number(i);break}case e.EXTIMG:{s.image=i;break}case e.EXTALB:{s.album=i;break}case e.EXTART:{s.artist=i;break}case e.EXTGENRE:{s.genre=i;break}case e.PLAYLIST:{r.title=i;break}case e.EXTATTRFROMURL:{s.extraAttributesFromUrl=i;break}case e.EXTHTTP:{s.extraHttpHeaders=JSON.parse(i);break}case e.KODIPROP:{const[o,...l]=i.split("="),g=l.join("=");s.kodiProps||(s.kodiProps=new Map),s.kodiProps.set(o,g);break}default:this.processCustomData(r,s,i,u)}}processCustomData(t,r,s,n){var u,i,o,l;(i=(u=this.config)==null?void 0:u.customDataMapping)!=null&&i.media&&this.config.customDataMapping.media.includes(n)?r.customData.push({directive:n,value:s}):(l=(o=this.config)==null?void 0:o.customDataMapping)!=null&&l.playlist&&this.config.customDataMapping.playlist.includes(n)&&t.customData.push({directive:n,value:s})}processExtM3uAttributes(t,r){if(t.startsWith(e.EXTM3U)){const s=t.indexOf(" ");if(s>0){const n=t.substring(s+1);r.attributes=this.getAttributes(n)}}}getPlaylist(t){const r=new p;let s=new b("");return this.processExtM3uAttributes(t[0],r),t.forEach(n=>{this.isDirective(n)?this.processDirective(n,r,s):(s.location=n,r.medias.push(s),s=new b(""))}),r}isDirective(t){return t[0]===X}isValidM3u(t){return t[0].startsWith(e.EXTM3U)}parse(t){var s,n;if(!((s=this.config)!=null&&s.ignoreErrors)&&!t)throw new Error("m3uString can't be null!");const r=t.split(` `).map(u=>u.trim()).filter(u=>u!="");if(!((n=this.config)!=null&&n.ignoreErrors)&&!this.isValidM3u(r))throw new Error(`Missing ${e.EXTM3U} directive!`);return this.getPlaylist(r)}}return c.M3uAttributes=T,c.M3uGenerator=h,c.M3uMedia=b,c.M3uParser=A,c.M3uPlaylist=p,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),c}({});