@iptv/xtream-api
Version:
Standardized access to Xtream compatible player API
2 lines (1 loc) • 6.52 kB
JavaScript
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("camelcase-keys").default,H=require("./index.cjs"),Q=H.defineSerializers("JSON:API",{profile:e=>{const{auth:o,expDate:s,maxConnections:i,activeCons:d,createdAt:a,...t}=y(e);return{data:{type:"user-profile",id:t.username,attributes:{...t,isTrial:t.isTrial==="1",maxConnections:Number(i),activeConnections:Number(d),createdAt:new Date(Number(a)*1e3),expiresAt:new Date(Number(s)*1e3)}}}},serverInfo:e=>{const{timestampNow:o,...s}=y(e);return{data:{type:"server-info",id:e.url,attributes:{...s,timeNow:new Date(Number(o)*1e3)}}}},channelCategories:e=>x(e,"channel-category"),movieCategories:e=>x(e,"movie-category"),showCategories:e=>x(e,"show-category"),channels:e=>({data:y(e).map(s=>{const{added:i,num:d,streamId:a,categoryIds:t,streamIcon:u,epgChannelId:p,tvArchive:c,name:m,tvArchiveDuration:b,url:v}=s;return{type:"channel",id:a.toString(),attributes:{name:m,number:d,tvArchive:c===1,tvArchiveDuration:b,logo:u,epgId:p,createdAt:new Date(Number(i)*1e3),url:v},...t.length>0&&{relationships:{categories:{data:t.map(h=>({type:"channel-category",id:h.toString()}))}}}}})}),movies:e=>({data:y(e).map(s=>{const{streamIcon:i,streamId:d,releaseDate:a,rating:t,added:u,categoryIds:p,episodeRunTime:c,genre:m,cast:b,director:v,youtubeTrailer:h,title:S,plot:N,url:w}=s;return{type:"movie",id:d.toString(),attributes:{name:S,plot:N,genre:m?.split(",").map(n=>n.trim())??[],cast:b?.split(",").map(n=>n.trim())??[],director:v?.split(",").map(n=>n.trim())??[],poster:i,voteAverage:Number(t),duration:Number(c)*60,youtubeId:h,releaseDate:a?new Date(a):null,createdAt:new Date(Number(u)*1e3),url:w},...p.length>0&&{relationships:{categories:{data:p.map(n=>({type:"movie-category",id:n.toString()}))}}}}})}),movie:e=>{const o=y(e,{deep:!0}),{director:s,actors:i,genre:d,cast:a,oName:t,releaseDate:u,mpaaRating:p,age:c,rating:m,duration:b,durationSecs:v,backdropPath:h,movieImage:S,kinopoiskUrl:N,youtubeTrailer:w,tmdbId:n,name:f,description:C,plot:D,country:O,subtitles:r,bitrate:I}=o.info,{categoryIds:g,streamId:T,added:A}=o.movieData;return{data:{type:"movie",id:T.toString(),attributes:{name:f,originalName:t,description:C,plot:D,informationUrl:N,cover:h[0],poster:S,duration:v,durationFormatted:b,country:O,voteAverage:m,director:s?.split(",").map(l=>l.trim())??[],actors:i?.split(",").map(l=>l.trim())??[],cast:a?.split(",").map(l=>l.trim())??[],genre:d?.split(",").map(l=>l.trim())??[],youtubeId:w,tmdbId:n?.toString(),rating:{mpaa:p,age:Number(c)},subtitles:r,bitrate:I,releaseDate:u?new Date(u):null,createdAt:new Date(Number(A)*1e3)},...g.length>0&&{relationships:{categories:{data:g.map(l=>({type:"movie-category",id:l.toString()}))}}}}}},shows:e=>({data:y(e).map(s=>{const{rating:i,seriesId:d,cover:a,categoryIds:t,backdropPath:u,releaseDate:p,episodeRunTime:c,lastModified:m,cast:b,director:v,genre:h,youtubeTrailer:S,title:N,plot:w}=s;return{type:"show",id:d.toString(),attributes:{name:N,plot:w,cast:b?.split(",").map(n=>n.trim())??[],director:v?.split(",").map(n=>n.trim())??[],genre:h?.split(",").map(n=>n.trim())??[],voteAverage:Number(i),poster:a,cover:u[0],duration:Number(c)*60,youtubeId:S,releaseDate:p?new Date(p):null,updatedAt:new Date(Number(m)*1e3)},...t.length>0&&{relationships:{categories:{data:t.map(n=>({type:"show-category",id:n.toString()}))}}}}})}),show:e=>{const{seasons:o,info:s,episodes:i}=y(e,{deep:!0}),{rating:d,seriesId:a,cover:t,categoryIds:u,backdropPath:p,releaseDate:c,episodeRunTime:m,lastModified:b,cast:v,director:h,genre:S,youtubeTrailer:N,title:w,plot:n}=s;if(typeof a>"u")throw new Error("seriesId is required");const f=Object.values(i).flat(),C=f.map(r=>{const{id:I,season:g,title:T,subtitles:A,url:l,episodeNum:k,added:P,info:E}=r,{releaseDate:B,rating:J,movieImage:M,coverBig:R,durationSecs:j,duration:q,tmdbId:z,plot:F,video:G,audio:L,bitrate:U}=E,K=o.find($=>$.seasonNumber===g)?.id.toString()||g.toString();return{type:"episode",id:I,attributes:{number:Number(k),title:T,plot:F,tmdbId:z?.toString(),poster:M,cover:R,voteAverage:Number(J),duration:j,durationFormatted:q,releaseDate:B?new Date(B):null,createdAt:new Date(Number(P)*1e3),subtitles:A,url:l,video:G,audio:L,bitrate:U},relationships:{season:{data:{type:"season",id:K}},show:{data:{type:"show",id:a.toString()}}}}});let D=o;D.length===0&&(D=Object.keys(i).map(r=>{const I=r,g=i[r][0];return{id:Number(I),name:`Season ${I}`,episodeCount:i[r].length,overview:"",airDate:g.info.releaseDate,cover:g.info.movieImage,seasonNumber:Number(I),voteAverage:Number(g.info.rating),coverBig:g.info.movieImage}}));const O=D.map(r=>{const{id:I,seasonNumber:g,cover:T,coverBig:A,airDate:l,...k}=r;return{type:"season",id:I.toString(),attributes:{...k,releaseDate:l?new Date(l):null,number:g,cover:A},relationships:{show:{data:{type:"show",id:a.toString()}},episodes:{data:f.filter(P=>P.season===g).map(P=>({type:"episode",id:P.id.toString()}))}}}});return{data:{type:"show",id:a.toString(),attributes:{name:w,plot:n,voteAverage:Number(d),poster:t,cover:p[0],duration:Number(m)*60,cast:v?.split(",").map(r=>r.trim())??[],director:h?.split(",").map(r=>r.trim())??[],genre:S?.split(",").map(r=>r.trim())??[],youtubeId:N,releaseDate:c?new Date(c):null,updatedAt:new Date(Number(b)*1e3)},relationships:{categories:{data:u.map(r=>({type:"show-category",id:r.toString()}))},seasons:{data:D.map(r=>({type:"season",id:r.id.toString()}))},episodes:{data:f.map(r=>({type:"episode",id:r.id.toString()}))}}},included:[...O,...C]}},shortEPG:e=>{const{epgListings:o}=y(e,{deep:!0});return{data:o.map(s=>{const{id:i,channelId:d,lang:a,start:t,end:u,title:p,description:c,epgId:m}=s;return{type:"epg-listing",id:i.toString(),attributes:{epgId:m,start:new Date(t),end:new Date(Number(u)*1e3),title:atob(p),description:atob(c),language:a},relationships:{channel:{data:{type:"channel",id:d.toString()}}}}})}},fullEPG:e=>{const{epgListings:o}=y(e,{deep:!0});return{data:o.map(s=>{const{id:i,channelId:d,start:a,end:t,title:u,description:p,nowPlaying:c,hasArchive:m,lang:b,epgId:v}=s;return{type:"epg-listing",id:i.toString(),attributes:{epgId:v,start:new Date(a),end:new Date(t),title:atob(u),description:atob(p),language:b,nowPlaying:!!c,hasArchive:!!m},relationships:{channel:{data:{type:"channel",id:d.toString()}}}}})}}});function x(e,o){return{data:y(e).map(i=>{const{categoryId:d,categoryName:a,parentId:t}=i;return{type:o,id:d.toString(),attributes:{name:a},...t&&{relationships:{parent:{data:{type:o,id:t.toString()}}}}}})}}exports.JSONAPISerializer=Q;