stremio-addons
Version:
Stremio Add-on Server / Client
2 lines (1 loc) • 12.3 kB
JavaScript
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var emitter=require("events").EventEmitter;var extend=require("extend");var MAX_RETRIES=4;var SERVICE_RETRY_TIMEOUT=30*1e3;function bindDefaults(call){return{meta:{get:call.bind(null,"meta.get"),find:call.bind(null,"meta.find"),search:call.bind(null,"meta.search")},index:{get:call.bind(null,"index.get")},stream:{find:call.bind(null,"stream.find")},subtitles:{get:call.bind(null,"subtitles.get"),find:call.bind(null,"subtitles.find")}}}function checkArgs(args,manifest){var score=0;if(!args.query)return score;if((manifest.types||[]).indexOf(args.query.type)!=-1)score++;if(!manifest.idProperty&&manifest.filter)Object.keys(manifest.filter).some(function(k){if(k.match("_id$"))return manifest.idProperty=k.split(".").pop()});(Array.isArray(manifest.idProperty)?manifest.idProperty:[manifest.idProperty]).forEach(function(prop){if(args.query.hasOwnProperty(prop))score++});if(args.query.id&&args.query.id.toString().indexOf(manifest.idProperty)===0)score++;return score}function Addon(url,options,stremio,ready){var self=this;var client=options.client||Stremio.RPC;if(typeof url=="string"){this.client=client(url,{timeout:options.timeout||stremio.options.timeout||1e4,respTimeout:options.respTimeout||stremio.options.respTimeout},stremio.options);this.url=url}else{this.client={request:function(method,args,cb){url.request(method,args,function(err,res){cb(null,err,res)})}};this.url=url.toString()}if(ready)stremio.once("addon-meta:"+self.url,function(){ready(null,self)});this.priority=options.priority||0;this.initialized=false;this.initializing=false;this.manifest={};this.methods=[];this.retries=0;this.idx=stremio.count++;initialize();function initialize(){self.initializing=true;self.client.request("meta",[],function(err,error,res){self.initializing=false;self.networkErr=err;if(err){stremio.emit("network-error",err,self,self.url)}if(error){console.error(error);if(self.retries++<MAX_RETRIES)setTimeout(function(){self.initialized=false},SERVICE_RETRY_TIMEOUT)}self.initialized=true;self.retries=0;if(res&&res.methods)self.methods=[].concat(res.methods);if(res&&res.manifest)self.manifest=res.manifest;if(res)stremio.emit("addon-ready",self,self.url);stremio.emit("addon-meta:"+self.url,self,err,res);stremio.emit("addon-meta",self.url,self,err,res)})}this.call=function(method,args,cb){if(!self.initialized){if(!self.initializing)initialize();stremio.once("addon-meta:"+self.url,function(){self.call(method,args,cb)});return}if(self.methods.indexOf(method)==-1)return cb(1);self.client.request(method,args,function(err,error,res){cb(0,err,error,res)})};this.identifier=function(){return self.manifest&&self.manifest.id||self.url};this.isInitializing=function(){return!this.initialized&&!q.idle()};this.reinitialize=function(){this.retries=0;initialize()}}function Stremio(options){var self=this;emitter.call(this);Object.defineProperty(self,"supportedTypes",{enumerable:true,get:function(){var types={};self.get("meta.find").forEach(function(service){if(service.manifest.types)service.manifest.types.forEach(function(t){types[t]=true})});return types}});options=self.options=options||{};var services={};this.count=0;this.add=function(url,opts,cb){if(typeof opts==="function"){cb=opts;opts={}}cb=typeof cb==="function"?cb:function(){};if(services[url]){cb(null,services[url]);return services[url]}services[url]=new Addon(url,extend({},options,opts||{}),self,cb);return services[url]};this.remove=function(url){delete services[url]};this.removeAll=function(){services={}};this.get=function(forMethod,forArgs,noPicker){var res=Object.keys(services).map(function(k){return services[k]});if(forMethod)res=res.filter(function(x){return x.initialized?x.methods.indexOf(forMethod)!=-1:true});if(forMethod&&!noPicker)res=picker(res,forMethod);var cmp=function(a,b,fn){return fn(a)-fn(b)};return res.sort(function(a,b){return cmp(b,a,function(x){return x.initialized&&!x.networkErr})||cmp(b,a,function(x){return forArgs?checkArgs(forArgs,x.manifest):0})||cmp(b,a,function(x){return x.priority})||a.idx-b.idx})};function fallthrough(s,method,args,cb){var networkErr;function next(){var service=s.shift();if(!service)return cb(networkErr||new Error("no addon supplies this method / arguments"));service.call(method,[null,args],function(skip,err,error,res){networkErr=err;if(skip||err)return next();cb(error,res,service)})}next()}function call(method,args,cb){return fallthrough(self.get(method,args),method,args,cb)}function picker(s,method){var params={addons:s,method:method};if(options.picker)params.addons=options.picker(params.addons,params.method);self.emit("pick",params);return[].concat(params.addons)}this.fallthrough=fallthrough;this.call=call;this.checkArgs=checkArgs;extend(this,bindDefaults(call))}Stremio.super_=emitter;Stremio.prototype=new emitter;Stremio.prototype.constructor=Stremio;module.exports=Stremio},{events:2,extend:3}],2:[function(require,module,exports){function EventEmitter(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;EventEmitter.defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError("n must be a positive number");this._maxListeners=n;return this};EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(!this._events)this._events={};if(type==="error"){if(!this._events.error||isObject(this._events.error)&&!this._events.error.length){er=arguments[1];if(er instanceof Error){throw er}else{var err=new Error('Uncaught, unspecified "error" event. ('+er+")");err.context=er;throw err}}}handler=this._events[type];if(isUndefined(handler))return false;if(isFunction(handler)){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}}else if(isObject(handler)){args=Array.prototype.slice.call(arguments,1);listeners=handler.slice();len=listeners.length;for(i=0;i<len;i++)listeners[i].apply(this,args)}return true};EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events)this._events={};if(this._events.newListener)this.emit("newListener",type,isFunction(listener.listener)?listener.listener:listener);if(!this._events[type])this._events[type]=listener;else if(isObject(this._events[type]))this._events[type].push(listener);else this._events[type]=[this._events[type],listener];if(isObject(this._events[type])&&!this._events[type].warned){if(!isUndefined(this._maxListeners)){m=this._maxListeners}else{m=EventEmitter.defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);if(typeof console.trace==="function"){console.trace()}}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError("listener must be a function");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit("removeListener",type,listener)}else if(isObject(list)){for(i=length;i-- >0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1)}if(this._events.removeListener)this.emit("removeListener",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key==="removeListener")continue;this.removeAllListeners(key)}this.removeAllListeners("removeListener");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else if(listeners){while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.prototype.listenerCount=function(type){if(this._events){var evlistener=this._events[type];if(isFunction(evlistener))return 1;else if(evlistener)return evlistener.length}return 0};EventEmitter.listenerCount=function(emitter,type){return emitter.listenerCount(type)};function isFunction(arg){return typeof arg==="function"}function isNumber(arg){return typeof arg==="number"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],3:[function(require,module,exports){"use strict";var hasOwn=Object.prototype.hasOwnProperty;var toStr=Object.prototype.toString;var isArray=function isArray(arr){if(typeof Array.isArray==="function"){return Array.isArray(arr)}return toStr.call(arr)==="[object Array]"};var isPlainObject=function isPlainObject(obj){if(!obj||toStr.call(obj)!=="[object Object]"){return false}var hasOwnConstructor=hasOwn.call(obj,"constructor");var hasIsPrototypeOf=obj.constructor&&obj.constructor.prototype&&hasOwn.call(obj.constructor.prototype,"isPrototypeOf");if(obj.constructor&&!hasOwnConstructor&&!hasIsPrototypeOf){return false}var key;for(key in obj){}return typeof key==="undefined"||hasOwn.call(obj,key)};module.exports=function extend(){var options,name,src,copy,copyIsArray,clone;var target=arguments[0];var i=1;var length=arguments.length;var deep=false;if(typeof target==="boolean"){deep=target;target=arguments[1]||{};i=2}if(target==null||typeof target!=="object"&&typeof target!=="function"){target={}}for(;i<length;++i){options=arguments[i];if(options!=null){for(name in options){src=target[name];copy=options[name];if(target!==copy){if(deep&©&&(isPlainObject(copy)||(copyIsArray=isArray(copy)))){if(copyIsArray){copyIsArray=false;clone=src&&isArray(src)?src:[]}else{clone=src&&isPlainObject(src)?src:{}}target[name]=extend(deep,clone,copy)}else if(typeof copy!=="undefined"){target[name]=copy}}}}}return target}},{}],"stremio-addons":[function(require,module,exports){module.CENTRAL="http://api9.strem.io";module.exports.Client=require("./client");module.exports.Client.RPC=function(endpoint){var self={};self.request=function(method,params,callback){var body=JSON.stringify({params:params,method:method,id:1,jsonrpc:"2.0"});var request=new XMLHttpRequest;request.onreadystatechange=function(){if(request.readyState==XMLHttpRequest.DONE){if(request.status==200){var res;try{res=JSON.parse(request.responseText)}catch(e){callback(e)}callback(null,res.error,res.result)}else callback("network err "+request.status)}};request.open("GET",endpoint+"/q.json?b="+btoa(body),true);request.send()};return self}},{"./client":1}]},{},[]);