aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build/server.js84
-rw-r--r--res/client.js75
-rw-r--r--src/Lang.hx3
-rw-r--r--src/PathTools.hx2
-rw-r--r--src/Types.hx14
-rw-r--r--src/VideoList.hx2
-rw-r--r--src/client/Buttons.hx2
-rw-r--r--src/client/JsApi.hx2
-rw-r--r--src/client/Main.hx1
-rw-r--r--src/client/Player.hx7
-rw-r--r--src/client/players/Raw.hx2
-rw-r--r--src/client/players/RawSubs.hx2
-rw-r--r--src/client/players/Streamable.hx66
-rw-r--r--src/client/players/Youtube.hx4
-rw-r--r--src/import.hx2
-rw-r--r--src/server/ConsoleInput.hx2
-rw-r--r--src/server/HttpServer.hx2
-rw-r--r--src/server/Logger.hx3
-rw-r--r--src/server/Main.hx2
-rw-r--r--src/server/Utils.hx2
-rw-r--r--src/server/YoutubeFallback.hx2
21 files changed, 187 insertions, 94 deletions
diff --git a/build/server.js b/build/server.js
index c29204f..3868c84 100644
--- a/build/server.js
+++ b/build/server.js
@@ -1,4 +1,4 @@
-// Generated by Haxe 4.3.4
+// Generated by Haxe 4.3.5
(function ($global) { "use strict";
var $estr = function() { return js_Boot.__string_rec(this,''); },$hxEnums = $hxEnums || {},$_;
function $extend(from, fields) {
@@ -2609,6 +2609,17 @@ Lambda.find = function(it,f) {
}
return null;
};
+var haxe_IMap = function() { };
+haxe_IMap.__name__ = true;
+haxe_IMap.__isInterface__ = true;
+var haxe_ds_StringMap = function() {
+ this.h = Object.create(null);
+};
+haxe_ds_StringMap.__name__ = true;
+haxe_ds_StringMap.__interfaces__ = [haxe_IMap];
+haxe_ds_StringMap.prototype = {
+ __class__: haxe_ds_StringMap
+};
var Lang = function() { };
Lang.__name__ = true;
Lang.request = function(path,callback) {
@@ -2887,9 +2898,6 @@ VideoList.prototype = {
}
,__class__: VideoList
};
-var haxe_IMap = function() { };
-haxe_IMap.__name__ = true;
-haxe_IMap.__isInterface__ = true;
var haxe_Exception = function(message,previous,native) {
Error.call(this,message);
this.message = message;
@@ -3127,14 +3135,6 @@ haxe_crypto_Sha256.prototype = {
}
,__class__: haxe_crypto_Sha256
};
-var haxe_ds_StringMap = function() {
- this.h = Object.create(null);
-};
-haxe_ds_StringMap.__name__ = true;
-haxe_ds_StringMap.__interfaces__ = [haxe_IMap];
-haxe_ds_StringMap.prototype = {
- __class__: haxe_ds_StringMap
-};
var haxe_exceptions_PosException = function(message,previous,pos) {
haxe_Exception.call(this,message,previous);
if(pos == null) {
@@ -4119,7 +4119,7 @@ server_ConsoleInput.prototype = {
var name = args[0];
var password = args[1];
if(this.main.badNickName(name)) {
- haxe_Log.trace(StringTools.replace(Lang.get("usernameError"),"$MAX","" + this.main.config.maxLoginLength),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 115, className : "server.ConsoleInput", methodName : "parseLine"});
+ haxe_Log.trace(StringTools.replace(Lang.get("usernameError"),"$MAX","" + this.main.config.maxLoginLength),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 113, className : "server.ConsoleInput", methodName : "parseLine"});
return;
}
this.main.addAdmin(name,password);
@@ -4140,7 +4140,7 @@ server_ConsoleInput.prototype = {
}
}
var _g1 = 0;
- while(_g1 < _g.length) haxe_Log.trace(haxe_io_Path.withoutExtension(_g[_g1++]),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 142, className : "server.ConsoleInput", methodName : "parseLine"});
+ while(_g1 < _g.length) haxe_Log.trace(haxe_io_Path.withoutExtension(_g[_g1++]),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 140, className : "server.ConsoleInput", methodName : "parseLine"});
break;
case "removeAdmin":
this.main.removeAdmin(args[0]);
@@ -4149,7 +4149,7 @@ server_ConsoleInput.prototype = {
server_Utils.ensureDir(this.main.logsDir);
var path = haxe_io_Path.normalize("" + this.main.logsDir + "/" + args[0] + ".json");
if(!sys_FileSystem.exists(path)) {
- haxe_Log.trace("File \"" + path + "\" not found",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 129, className : "server.ConsoleInput", methodName : "parseLine"});
+ haxe_Log.trace("File \"" + path + "\" not found",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 127, className : "server.ConsoleInput", methodName : "parseLine"});
return;
}
var text = js_node_Fs.readFileSync(path,{ encoding : "utf8"});
@@ -4162,7 +4162,7 @@ server_ConsoleInput.prototype = {
var len = args.length;
var actual = this.commands.h[command].args.length;
if(len != actual) {
- haxe_Log.trace("Wrong count of arguments for command \"" + command + "\" (" + len + " instead of " + actual + ")",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 154, className : "server.ConsoleInput", methodName : "isValidArgs"});
+ haxe_Log.trace("Wrong count of arguments for command \"" + command + "\" (" + len + " instead of " + actual + ")",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 152, className : "server.ConsoleInput", methodName : "isValidArgs"});
return false;
}
return true;
@@ -4192,7 +4192,7 @@ server_ConsoleInput.prototype = {
var data = _g.value;
list.push("" + StringTools.rpad("/" + _g.key + " " + data.args.join(" ")," ",maxLength) + " | " + data.desc);
}
- haxe_Log.trace("Unknown command \"" + line + "\". List:\n" + list.join("\n"),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 173, className : "server.ConsoleInput", methodName : "printHelp"});
+ haxe_Log.trace("Unknown command \"" + line + "\". List:\n" + list.join("\n"),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 171, className : "server.ConsoleInput", methodName : "printHelp"});
}
,__class__: server_ConsoleInput
};
@@ -4578,7 +4578,7 @@ var server_Main = function(opts) {
preparePort = function() {
server_Utils.isPortFree(_gthis.port,function(isFree) {
if(!isFree && attempts > 0) {
- haxe_Log.trace("Warning: port " + _gthis.port + " is already in use. Changed to " + (_gthis.port + 1),{ fileName : "src/server/Main.hx", lineNumber : 115, className : "server.Main", methodName : "new"});
+ haxe_Log.trace("Warning: port " + _gthis.port + " is already in use. Changed to " + (_gthis.port + 1),{ fileName : "src/server/Main.hx", lineNumber : 113, className : "server.Main", methodName : "new"});
attempts -= 1;
_gthis.port++;
preparePort();
@@ -4596,13 +4596,13 @@ server_Main.main = function() {
server_Main.prototype = {
runServer: function() {
var _gthis = this;
- haxe_Log.trace("Local: http://" + this.localIp + ":" + this.port,{ fileName : "src/server/Main.hx", lineNumber : 128, className : "server.Main", methodName : "runServer"});
+ haxe_Log.trace("Local: http://" + this.localIp + ":" + this.port,{ fileName : "src/server/Main.hx", lineNumber : 126, className : "server.Main", methodName : "runServer"});
if(this.config.localNetworkOnly) {
- haxe_Log.trace("Global network is disabled in config",{ fileName : "src/server/Main.hx", lineNumber : 130, className : "server.Main", methodName : "runServer"});
+ haxe_Log.trace("Global network is disabled in config",{ fileName : "src/server/Main.hx", lineNumber : 128, className : "server.Main", methodName : "runServer"});
} else if(!this.isNoState) {
server_Utils.getGlobalIp(function(ip) {
_gthis.globalIp = ip;
- haxe_Log.trace("Global: http://" + _gthis.globalIp + ":" + _gthis.port,{ fileName : "src/server/Main.hx", lineNumber : 134, className : "server.Main", methodName : "runServer"});
+ haxe_Log.trace("Global: http://" + _gthis.globalIp + ":" + _gthis.port,{ fileName : "src/server/Main.hx", lineNumber : 132, className : "server.Main", methodName : "runServer"});
});
}
var dir = "" + this.rootDir + "/res";
@@ -4687,7 +4687,7 @@ server_Main.prototype = {
var field = _g1[_g];
++_g;
if(Reflect.field(config,field) == null) {
- haxe_Log.trace("Warning: config field \"" + field + "\" is unknown",{ fileName : "src/server/Main.hx", lineNumber : 203, className : "server.Main", methodName : "getUserConfig"});
+ haxe_Log.trace("Warning: config field \"" + field + "\" is unknown",{ fileName : "src/server/Main.hx", lineNumber : 201, className : "server.Main", methodName : "getUserConfig"});
}
config[field] = Reflect.field(customConfig,field);
}
@@ -4698,14 +4698,14 @@ server_Main.prototype = {
var emote = _g1[_g];
++_g;
if(emoteCopies_h[emote.name]) {
- haxe_Log.trace("Warning: emote name \"" + emote.name + "\" has copy",{ fileName : "src/server/Main.hx", lineNumber : 209, className : "server.Main", methodName : "getUserConfig"});
+ haxe_Log.trace("Warning: emote name \"" + emote.name + "\" has copy",{ fileName : "src/server/Main.hx", lineNumber : 207, className : "server.Main", methodName : "getUserConfig"});
}
emoteCopies_h[emote.name] = true;
if(!this.verbose) {
continue;
}
if(emoteCopies_h[emote.image]) {
- haxe_Log.trace("Warning: emote url of name \"" + emote.name + "\" has copy",{ fileName : "src/server/Main.hx", lineNumber : 213, className : "server.Main", methodName : "getUserConfig"});
+ haxe_Log.trace("Warning: emote url of name \"" + emote.name + "\" has copy",{ fileName : "src/server/Main.hx", lineNumber : 211, className : "server.Main", methodName : "getUserConfig"});
}
emoteCopies_h[emote.image] = true;
}
@@ -4743,7 +4743,7 @@ server_Main.prototype = {
js_node_Fs.writeFileSync("" + folder + "/users.json",JSON.stringify({ admins : users1, bans : _g, salt : users.salt},null,"\t"));
}
,saveState: function() {
- haxe_Log.trace("Saving state...",{ fileName : "src/server/Main.hx", lineNumber : 252, className : "server.Main", methodName : "saveState"});
+ haxe_Log.trace("Saving state...",{ fileName : "src/server/Main.hx", lineNumber : 250, className : "server.Main", methodName : "saveState"});
var json = JSON.stringify(this.getCurrentState(),null,"\t");
js_node_Fs.writeFileSync(this.statePath,json);
this.writeUsers(this.userList);
@@ -4758,7 +4758,7 @@ server_Main.prototype = {
if(!sys_FileSystem.exists(this.statePath)) {
return;
}
- haxe_Log.trace("Loading state...",{ fileName : "src/server/Main.hx", lineNumber : 275, className : "server.Main", methodName : "loadState"});
+ haxe_Log.trace("Loading state...",{ fileName : "src/server/Main.hx", lineNumber : 273, className : "server.Main", methodName : "loadState"});
var state = JSON.parse(js_node_Fs.readFileSync(this.statePath,{ encoding : "utf8"}));
this.videoList.setItems(state.videoList);
this.videoList.isOpen = state.isPlaylistOpen;
@@ -4777,7 +4777,7 @@ server_Main.prototype = {
this.videoTimer.pause();
}
,logError: function(type,data) {
- haxe_Log.trace(type,{ fileName : "src/server/Main.hx", lineNumber : 293, className : "server.Main", methodName : "logError", customParams : [data]});
+ haxe_Log.trace(type,{ fileName : "src/server/Main.hx", lineNumber : 291, className : "server.Main", methodName : "logError", customParams : [data]});
var crashesFolder = "" + this.rootDir + "/user/crashes";
server_Utils.ensureDir(crashesFolder);
var name = DateTools.format(new Date(),"%Y-%m-%d_%H_%M_%S") + "-" + type;
@@ -4795,7 +4795,7 @@ server_Main.prototype = {
if(_gthis.clients.length == 0) {
return;
}
- haxe_Log.trace("Ping " + url,{ fileName : "src/server/Main.hx", lineNumber : 310, className : "server.Main", methodName : "initIntergationHandlers"});
+ haxe_Log.trace("Ping " + url,{ fileName : "src/server/Main.hx", lineNumber : 308, className : "server.Main", methodName : "initIntergationHandlers"});
js_node_Http.get(url,null,function(r) {
});
};
@@ -4815,13 +4815,13 @@ server_Main.prototype = {
password += this.config.salt;
var hash = haxe_crypto_Sha256.encode(password);
this.userList.admins.push({ name : name, hash : hash});
- haxe_Log.trace("Admin " + name + " added.",{ fileName : "src/server/Main.hx", lineNumber : 333, className : "server.Main", methodName : "addAdmin"});
+ haxe_Log.trace("Admin " + name + " added.",{ fileName : "src/server/Main.hx", lineNumber : 331, className : "server.Main", methodName : "addAdmin"});
}
,removeAdmin: function(name) {
HxOverrides.remove(this.userList.admins,Lambda.find(this.userList.admins,function(item) {
return item.name == name;
}));
- haxe_Log.trace("Admin " + name + " removed.",{ fileName : "src/server/Main.hx", lineNumber : 340, className : "server.Main", methodName : "removeAdmin"});
+ haxe_Log.trace("Admin " + name + " removed.",{ fileName : "src/server/Main.hx", lineNumber : 338, className : "server.Main", methodName : "removeAdmin"});
}
,replayLog: function(events) {
var _gthis = this;
@@ -4865,7 +4865,7 @@ server_Main.prototype = {
var ip = this.clientIp(req);
var id = this.freeIds.length > 0 ? this.freeIds.shift() : this.clients.length;
var name = "Guest " + (id + 1);
- haxe_Log.trace(HxOverrides.dateStr(new Date()),{ fileName : "src/server/Main.hx", lineNumber : 378, className : "server.Main", methodName : "onConnect", customParams : ["" + name + " connected (" + ip + ")"]});
+ haxe_Log.trace(HxOverrides.dateStr(new Date()),{ fileName : "src/server/Main.hx", lineNumber : 376, className : "server.Main", methodName : "onConnect", customParams : ["" + name + " connected (" + ip + ")"]});
var isAdmin = this.config.localAdmins && req.socket.localAddress == ip;
var client = new Client(ws,req,id,name,0);
client.setGroupFlag(ClientGroup.Admin,isAdmin);
@@ -4878,7 +4878,7 @@ server_Main.prototype = {
var obj = _gthis.wsEventParser.fromJson(data.toString());
if(_gthis.wsEventParser.errors.length > 0 || _gthis.noTypeObj(obj)) {
var errors = "" + ("Wrong request for type \"" + obj.type + "\":") + "\n" + json2object_ErrorUtils.convertErrorArray(_gthis.wsEventParser.errors);
- haxe_Log.trace(errors,{ fileName : "src/server/Main.hx", lineNumber : 394, className : "server.Main", methodName : "onConnect"});
+ haxe_Log.trace(errors,{ fileName : "src/server/Main.hx", lineNumber : 392, className : "server.Main", methodName : "onConnect"});
_gthis.serverMessage(client,errors);
return;
}
@@ -5025,7 +5025,7 @@ server_Main.prototype = {
if(!internal) {
return;
}
- haxe_Log.trace(HxOverrides.dateStr(new Date()),{ fileName : "src/server/Main.hx", lineNumber : 454, className : "server.Main", methodName : "onMessage", customParams : ["Client " + client.name + " disconnected"]});
+ haxe_Log.trace(HxOverrides.dateStr(new Date()),{ fileName : "src/server/Main.hx", lineNumber : 452, className : "server.Main", methodName : "onMessage", customParams : ["Client " + client.name + " disconnected"]});
server_Utils.sortedPush(this.freeIds,client.id);
HxOverrides.remove(this.clients,client);
this.sendClientList();
@@ -5156,7 +5156,7 @@ server_Main.prototype = {
this.send(client,{ type : "LoginError"});
return;
}
- haxe_Log.trace(HxOverrides.dateStr(new Date()),{ fileName : "src/server/Main.hx", lineNumber : 540, className : "server.Main", methodName : "onMessage", customParams : ["Client " + client.name + " logged as " + name]});
+ haxe_Log.trace(HxOverrides.dateStr(new Date()),{ fileName : "src/server/Main.hx", lineNumber : 538, className : "server.Main", methodName : "onMessage", customParams : ["Client " + client.name + " logged as " + name]});
client.name = name;
client.setGroupFlag(ClientGroup.User,true);
this.checkBan(client);
@@ -5169,7 +5169,7 @@ server_Main.prototype = {
var oldName = client.name;
client.name = "Guest " + (this.clients.indexOf(client) + 1);
client.setGroupFlag(ClientGroup.User,false);
- haxe_Log.trace(HxOverrides.dateStr(new Date()),{ fileName : "src/server/Main.hx", lineNumber : 561, className : "server.Main", methodName : "onMessage", customParams : ["Client " + oldName + " logout to " + client.name]});
+ haxe_Log.trace(HxOverrides.dateStr(new Date()),{ fileName : "src/server/Main.hx", lineNumber : 559, className : "server.Main", methodName : "onMessage", customParams : ["Client " + oldName + " logout to " + client.name]});
this.send(client,{ type : data.type, logout : { oldClientName : oldName, clientName : client.name, clients : this.clientList()}});
this.sendClientListExcept(client);
break;
@@ -5484,7 +5484,7 @@ server_Main.prototype = {
client.setGroupFlag(ClientGroup.Banned,!isOutdated);
if(isOutdated) {
HxOverrides.remove(this.userList.bans,ban);
- haxe_Log.trace("" + client.name + " ban removed",{ fileName : "src/server/Main.hx", lineNumber : 973, className : "server.Main", methodName : "checkBan"});
+ haxe_Log.trace("" + client.name + " ban removed",{ fileName : "src/server/Main.hx", lineNumber : 971, className : "server.Main", methodName : "checkBan"});
this.sendClientList();
}
break;
@@ -5635,7 +5635,7 @@ server_Utils.isPortFree = function(port,callback) {
});
server.once("timeout",function() {
status = false;
- haxe_Log.trace("Timeout (" + timeout + "ms) occurred waiting for port " + port + " to be available",{ fileName : "src/server/Utils.hx", lineNumber : 49, className : "server.Utils", methodName : "isPortFree"});
+ haxe_Log.trace("Timeout (" + timeout + "ms) occurred waiting for port " + port + " to be available",{ fileName : "src/server/Utils.hx", lineNumber : 47, className : "server.Utils", methodName : "isPortFree"});
server.close();
});
server.once("listening",function() {
@@ -5649,7 +5649,7 @@ server_Utils.isPortFree = function(port,callback) {
};
server_Utils.getGlobalIp = function(callback) {
var onError = function(e) {
- haxe_Log.trace("Warning: connection error, server is local.",{ fileName : "src/server/Utils.hx", lineNumber : 62, className : "server.Utils", methodName : "getGlobalIp"});
+ haxe_Log.trace("Warning: connection error, server is local.",{ fileName : "src/server/Utils.hx", lineNumber : 60, className : "server.Utils", methodName : "getGlobalIp"});
callback("127.0.0.1");
};
var url = new js_node_url_URL("https://myexternalip.com/raw");
@@ -5798,8 +5798,8 @@ server_YoutubeFallback.httpsGet = function(url,options,callback) {
});
});
request.on("error",function(err) {
- haxe_Log.trace(url,{ fileName : "src/server/YoutubeFallback.hx", lineNumber : 26, className : "server.YoutubeFallback", methodName : "httpsGet"});
- haxe_Log.trace("request error: ",{ fileName : "src/server/YoutubeFallback.hx", lineNumber : 27, className : "server.YoutubeFallback", methodName : "httpsGet", customParams : [err]});
+ haxe_Log.trace(url,{ fileName : "src/server/YoutubeFallback.hx", lineNumber : 24, className : "server.YoutubeFallback", methodName : "httpsGet"});
+ haxe_Log.trace("request error: ",{ fileName : "src/server/YoutubeFallback.hx", lineNumber : 25, className : "server.YoutubeFallback", methodName : "httpsGet", customParams : [err]});
});
};
server_YoutubeFallback.resolvePlayerResponse = function(watchHtml) {
@@ -5877,13 +5877,13 @@ server_YoutubeFallback.buildDecoder = function(watchHtml,callback) {
server_YoutubeFallback.getInfo = function(url,callback) {
var videoId = utils_YoutubeUtils.extractVideoId(url);
if(videoId.length == 0) {
- haxe_Log.trace("youtube videoId is not found",{ fileName : "src/server/YoutubeFallback.hx", lineNumber : 87, className : "server.YoutubeFallback", methodName : "getInfo"});
+ haxe_Log.trace("youtube videoId is not found",{ fileName : "src/server/YoutubeFallback.hx", lineNumber : 85, className : "server.YoutubeFallback", methodName : "getInfo"});
callback(null);
return;
}
server_YoutubeFallback.httpsGet("https://www.youtube.com/watch?v=" + videoId,{ },function(status,data) {
if(status != 200 || data.length == 0) {
- haxe_Log.trace("Cannot get youtube video response",{ fileName : "src/server/YoutubeFallback.hx", lineNumber : 94, className : "server.YoutubeFallback", methodName : "getInfo"});
+ haxe_Log.trace("Cannot get youtube video response",{ fileName : "src/server/YoutubeFallback.hx", lineNumber : 92, className : "server.YoutubeFallback", methodName : "getInfo"});
callback(null);
return;
}
diff --git a/res/client.js b/res/client.js
index 35ed305..80f7597 100644
--- a/res/client.js
+++ b/res/client.js
@@ -1,4 +1,4 @@
-// Generated by Haxe 4.3.4
+// Generated by Haxe 4.3.5
(function ($hx_exports, $global) { "use strict";
$hx_exports["client"] = $hx_exports["client"] || {};
$hx_exports["client"]["JsApi"] = $hx_exports["client"]["JsApi"] || {};
@@ -1593,7 +1593,7 @@ client_Main.prototype = {
var data = JSON.parse(e.data);
if(this.config != null && this.config.isVerbose) {
var t = data.type;
- haxe_Log.trace("Event: " + data.type,{ fileName : "src/client/Main.hx", lineNumber : 405, className : "client.Main", methodName : "onMessage", customParams : [Reflect.field(data,t.charAt(0).toLowerCase() + HxOverrides.substr(t,1,null))]});
+ haxe_Log.trace("Event: " + data.type,{ fileName : "src/client/Main.hx", lineNumber : 404, className : "client.Main", methodName : "onMessage", customParams : [Reflect.field(data,t.charAt(0).toLowerCase() + HxOverrides.substr(t,1,null))]});
}
client_JsApi.fireOnceEvent(data);
switch(data.type) {
@@ -2342,7 +2342,7 @@ var client_Player = function(main) {
this.videoList = new VideoList();
this.main = main;
this.youtube = new client_players_Youtube(main,this);
- this.players = [this.youtube];
+ this.players = [this.youtube,new client_players_Streamable(main,this)];
this.iframePlayer = new client_players_Iframe(main,this);
this.rawPlayer = new client_players_Raw(main,this);
this.initItemButtons();
@@ -2829,7 +2829,7 @@ client_Player.prototype = {
}
};
http.onError = function(msg) {
- haxe_Log.trace(msg,{ fileName : "src/client/Player.hx", lineNumber : 485, className : "client.Player", methodName : "skipAd"});
+ haxe_Log.trace(msg,{ fileName : "src/client/Player.hx", lineNumber : 484, className : "client.Player", methodName : "skipAd"});
};
http.request();
}
@@ -3496,7 +3496,7 @@ client_players_RawSubs.convertAssTime = function(time) {
client_players_RawSubs.isProxyError = function(text) {
if(StringTools.startsWith(text,"Proxy error:")) {
client_Main.serverMessage("Failed to add subs: proxy error");
- haxe_Log.trace("Failed to add subs: " + text,{ fileName : "src/client/players/RawSubs.hx", lineNumber : 221, className : "client.players.RawSubs", methodName : "isProxyError"});
+ haxe_Log.trace("Failed to add subs: " + text,{ fileName : "src/client/players/RawSubs.hx", lineNumber : 219, className : "client.players.RawSubs", methodName : "isProxyError"});
return true;
}
return false;
@@ -3511,6 +3511,63 @@ client_players_RawSubs.onParsed = function(video,name,dataUrl) {
var track = trackEl.track;
track.mode = "showing";
};
+var client_players_Streamable = function(main,player) {
+ this.matchBadStreamableId = new EReg("[^0-9A-z-_]","g");
+ this.matchStreamable = new EReg("streamable\\.com/(.+)","g");
+ client_players_Raw.call(this,main,player);
+};
+client_players_Streamable.__name__ = true;
+client_players_Streamable.__super__ = client_players_Raw;
+client_players_Streamable.prototype = $extend(client_players_Raw.prototype,{
+ isSupportedLink: function(url) {
+ if(!this.matchStreamable.match(url)) {
+ return false;
+ }
+ var id = this.matchStreamable.matched(1);
+ if(this.matchBadStreamableId.match(id)) {
+ return false;
+ }
+ return true;
+ }
+ ,getVideoData: function(data,callback) {
+ var _gthis = this;
+ this.getStreamableVideoData(data.url,function(info) {
+ if(info == null) {
+ callback({ duration : 0});
+ return;
+ }
+ _gthis.getRawVideoData({ url : info.url, atEnd : data.atEnd},function(data) {
+ data.url = info.url;
+ data.title = info.title;
+ callback(data);
+ });
+ });
+ }
+ ,getRawVideoData: function(data,callback) {
+ client_players_Raw.prototype.getVideoData.call(this,data,callback);
+ }
+ ,getStreamableVideoData: function(url,callback) {
+ if(!this.matchStreamable.match(url)) {
+ callback(null);
+ return;
+ }
+ var http = new haxe_http_HttpJs("https://api.streamable.com/videos/" + this.matchStreamable.matched(1));
+ http.onData = function(text) {
+ try {
+ var json = JSON.parse(text);
+ var files = json != null ? json.files : null;
+ var item = files["mp4"];
+ if(item == null) {
+ item = files[Reflect.fields(files)[0]];
+ }
+ callback({ url : item.url, title : json.title});
+ } catch( _g ) {
+ callback(null);
+ }
+ };
+ http.request();
+ }
+});
var client_players_Youtube = function(main,player) {
this.matchSeconds = new EReg("([0-9]+)S","");
this.matchMinutes = new EReg("([0-9]+)M","");
@@ -3663,7 +3720,7 @@ client_players_Youtube.prototype = {
}
callback({ duration : _gthis.tempYoutube.getDuration()});
}, onError : function(e) {
- haxe_Log.trace("Error " + e.data,{ fileName : "src/client/players/Youtube.hx", lineNumber : 188, className : "client.players.Youtube", methodName : "getRemoteDataFallback"});
+ haxe_Log.trace("Error " + e.data,{ fileName : "src/client/players/Youtube.hx", lineNumber : 186, className : "client.players.Youtube", methodName : "getRemoteDataFallback"});
if(_gthis.playerEl.contains(video)) {
_gthis.playerEl.removeChild(video);
}
@@ -3711,7 +3768,7 @@ client_players_Youtube.prototype = {
}, onPlaybackRateChange : function(e) {
_gthis.player.onRateChange();
}, onError : function(e) {
- haxe_Log.trace("Error " + e.data,{ fileName : "src/client/players/Youtube.hx", lineNumber : 245, className : "client.players.Youtube", methodName : "loadVideo"});
+ haxe_Log.trace("Error " + e.data,{ fileName : "src/client/players/Youtube.hx", lineNumber : 243, className : "client.players.Youtube", methodName : "loadVideo"});
var tmp = _gthis.player.getCurrentItem();
if(tmp == null) {
return;
@@ -3725,8 +3782,8 @@ client_players_Youtube.prototype = {
var info = event.getYoutubeVideoInfo.response;
var tmp = _gthis.getBestStreamFormat(info);
if(tmp == null) {
- haxe_Log.trace("format not found in response info:",{ fileName : "src/client/players/Youtube.hx", lineNumber : 258, className : "client.players.Youtube", methodName : "rawSourceFallback"});
- haxe_Log.trace(info,{ fileName : "src/client/players/Youtube.hx", lineNumber : 259, className : "client.players.Youtube", methodName : "rawSourceFallback"});
+ haxe_Log.trace("format not found in response info:",{ fileName : "src/client/players/Youtube.hx", lineNumber : 256, className : "client.players.Youtube", methodName : "rawSourceFallback"});
+ haxe_Log.trace(info,{ fileName : "src/client/players/Youtube.hx", lineNumber : 257, className : "client.players.Youtube", methodName : "rawSourceFallback"});
return;
}
_gthis.player.changeVideoSrc(tmp.url);
diff --git a/src/Lang.hx b/src/Lang.hx
index a146e3d..597e4d9 100644
--- a/src/Lang.hx
+++ b/src/Lang.hx
@@ -2,9 +2,6 @@ package;
import haxe.Json;
import haxe.io.Path;
-
-using Lambda;
-
#if (sys || nodejs)
import sys.io.File;
#else
diff --git a/src/PathTools.hx b/src/PathTools.hx
index 69a0044..113715d 100644
--- a/src/PathTools.hx
+++ b/src/PathTools.hx
@@ -2,8 +2,6 @@ package;
import haxe.io.Path;
-using StringTools;
-
class PathTools {
public static function urlExtension(url:String) {
return Path.extension(~/[#?]/.split(url)[0]).trim().toLowerCase();
diff --git a/src/Types.hx b/src/Types.hx
index 27b2cce..a02b4a9 100644
--- a/src/Types.hx
+++ b/src/Types.hx
@@ -4,16 +4,16 @@ import Client.ClientData;
import utils.YoutubeUtils.YouTubeVideoInfo;
typedef VideoDataRequest = {
- url:String,
- atEnd:Bool
+ final url:String;
+ final atEnd:Bool;
}
typedef VideoData = {
- duration:Float,
- ?title:String,
- ?url:String,
- ?subs:String,
- ?isIframe:Bool
+ final duration:Float;
+ var ?title:String;
+ var ?url:String;
+ var ?subs:String;
+ var ?isIframe:Bool;
}
typedef Config = {
diff --git a/src/VideoList.hx b/src/VideoList.hx
index b677060..c5e92c8 100644
--- a/src/VideoList.hx
+++ b/src/VideoList.hx
@@ -2,8 +2,6 @@ package;
import Types.VideoItem;
-using Lambda;
-
class VideoList {
public var length(get, never):Int;
public var pos(default, null) = 0;
diff --git a/src/client/Buttons.hx b/src/client/Buttons.hx
index 7152a31..de3aa27 100644
--- a/src/client/Buttons.hx
+++ b/src/client/Buttons.hx
@@ -10,8 +10,6 @@ import js.html.InputElement;
import js.html.KeyboardEvent;
import js.html.VisualViewport;
-using StringTools;
-
class Buttons {
static inline var CHAT_MIN_SIZE = 200;
static var split:Split;
diff --git a/src/client/JsApi.hx b/src/client/JsApi.hx
index 09e6edb..1532231 100644
--- a/src/client/JsApi.hx
+++ b/src/client/JsApi.hx
@@ -7,8 +7,6 @@ import js.Browser.document;
import js.Browser.window;
import js.Syntax;
-using StringTools;
-
private typedef VideoChangeFunc = (item:VideoItem) -> Void;
private typedef OnceEventFunc = (event:WsEvent) -> Void;
diff --git a/src/client/Main.hx b/src/client/Main.hx
index 85db713..cb74ad8 100644
--- a/src/client/Main.hx
+++ b/src/client/Main.hx
@@ -23,7 +23,6 @@ import js.html.VideoElement;
import js.html.WebSocket;
using ClientTools;
-using StringTools;
class Main {
static inline var SETTINGS_VERSION = 4;
diff --git a/src/client/Player.hx b/src/client/Player.hx
index c250a34..bc64053 100644
--- a/src/client/Player.hx
+++ b/src/client/Player.hx
@@ -6,14 +6,12 @@ import Types.VideoItem;
import client.Main.ge;
import client.players.Iframe;
import client.players.Raw;
+import client.players.Streamable;
import client.players.Youtube;
import haxe.Http;
import haxe.Json;
import js.html.Element;
-using Lambda;
-using StringTools;
-
class Player {
final main:Main;
final youtube:Youtube;
@@ -32,7 +30,8 @@ class Player {
this.main = main;
youtube = new Youtube(main, this);
players = [
- youtube
+ youtube,
+ new Streamable(main, this)
];
iframePlayer = new Iframe(main, this);
rawPlayer = new Raw(main, this);
diff --git a/src/client/players/Raw.hx b/src/client/players/Raw.hx
index 08025eb..3f69958 100644
--- a/src/client/players/Raw.hx
+++ b/src/client/players/Raw.hx
@@ -13,8 +13,6 @@ import js.html.InputElement;
import js.html.URL;
import js.html.VideoElement;
-using StringTools;
-
class Raw implements IPlayer {
final main:Main;
final player:Player;
diff --git a/src/client/players/RawSubs.hx b/src/client/players/RawSubs.hx
index 8448dfd..a4404b0 100644
--- a/src/client/players/RawSubs.hx
+++ b/src/client/players/RawSubs.hx
@@ -8,8 +8,6 @@ import js.Browser.window;
import js.Browser;
import js.html.VideoElement;
-using StringTools;
-
private typedef Duration = {
h:Int,
m:Int,
diff --git a/src/client/players/Streamable.hx b/src/client/players/Streamable.hx
new file mode 100644
index 0000000..21ef0f0
--- /dev/null
+++ b/src/client/players/Streamable.hx
@@ -0,0 +1,66 @@
+package client.players;
+
+import Types.VideoData;
+import Types.VideoDataRequest;
+import haxe.DynamicAccess;
+import haxe.Http;
+import haxe.Json;
+
+class Streamable extends Raw {
+ final matchStreamable = ~/streamable\.com\/(.+)/g;
+ final matchBadStreamableId = ~/[^0-9A-z-_]/g;
+
+ override function isSupportedLink(url:String):Bool {
+ if (!matchStreamable.match(url)) return false;
+ final id = matchStreamable.matched(1);
+ if (matchBadStreamableId.match(id)) return false;
+ return true;
+ }
+
+ override function getVideoData(data:VideoDataRequest, callback:(data:VideoData) -> Void) {
+ getStreamableVideoData(data.url, info -> {
+ if (info == null) {
+ callback({duration: 0});
+ return;
+ }
+
+ getRawVideoData({url: info.url, atEnd: data.atEnd}, data -> {
+ // set new url instead of using input one to load video
+ data.url = info.url;
+ data.title = info.title;
+ callback(data);
+ });
+ });
+ }
+
+ function getRawVideoData(data:VideoDataRequest, callback:(data:VideoData) -> Void):Void {
+ super.getVideoData(data, callback);
+ }
+
+ function getStreamableVideoData(url:String, callback:(info:Null<{url:String, title:String}>) -> Void):Void {
+ if (!matchStreamable.match(url)) {
+ callback(null);
+ return;
+ }
+ final id = matchStreamable.matched(1);
+ final http = new Http('https://api.streamable.com/videos/$id');
+ http.onData = text -> {
+ try {
+ final json:{title:String, ?files:DynamicAccess<Dynamic>} = Json.parse(text);
+ final files = json?.files;
+ var item = files["mp4"];
+ if (item == null) {
+ final key = files.keys()[0];
+ item = files[key];
+ }
+ callback({
+ url: item.url,
+ title: json.title
+ });
+ } catch (e) {
+ callback(null);
+ }
+ }
+ http.request();
+ }
+}
diff --git a/src/client/players/Youtube.hx b/src/client/players/Youtube.hx
index 7c98b3f..cde2ef8 100644
--- a/src/client/players/Youtube.hx
+++ b/src/client/players/Youtube.hx
@@ -12,8 +12,6 @@ import js.youtube.Youtube as YtInit;
import js.youtube.YoutubePlayer;
import utils.YoutubeUtils;
-using StringTools;
-
class Youtube implements IPlayer {
final videosUrl = "https://www.googleapis.com/youtube/v3/videos";
final playlistUrl = "https://www.googleapis.com/youtube/v3/playlistItems";
@@ -133,7 +131,7 @@ class Youtube implements IPlayer {
function loadNextItem():Void {
final item = items.shift();
final id:String = item.snippet.resourceId.videoId;
- final obj = {
+ final obj:VideoDataRequest = {
url: 'https://youtu.be/$id',
atEnd: data.atEnd
};
diff --git a/src/import.hx b/src/import.hx
new file mode 100644
index 0000000..5517d1e
--- /dev/null
+++ b/src/import.hx
@@ -0,0 +1,2 @@
+using Lambda;
+using StringTools;
diff --git a/src/server/ConsoleInput.hx b/src/server/ConsoleInput.hx
index 4ae729c..cf88df6 100644
--- a/src/server/ConsoleInput.hx
+++ b/src/server/ConsoleInput.hx
@@ -9,8 +9,6 @@ import js.node.Readline;
import sys.FileSystem;
import sys.io.File;
-using StringTools;
-
private typedef CommandData = {
args:Array<String>,
desc:String
diff --git a/src/server/HttpServer.hx b/src/server/HttpServer.hx
index 1a0c4d5..66668a7 100644
--- a/src/server/HttpServer.hx
+++ b/src/server/HttpServer.hx
@@ -12,8 +12,6 @@ import js.node.http.ServerResponse;
import js.node.url.URL;
import sys.FileSystem;
-using StringTools;
-
class HttpServer {
static final mimeTypes = [
"html" => "text/html",
diff --git a/src/server/Logger.hx b/src/server/Logger.hx
index b3ebf53..bf06968 100644
--- a/src/server/Logger.hx
+++ b/src/server/Logger.hx
@@ -6,9 +6,6 @@ import haxe.io.Path;
import sys.FileSystem;
import sys.io.File;
-using Lambda;
-using StringTools;
-
class Logger {
final folder:String;
final maxCount:Int;
diff --git a/src/server/Main.hx b/src/server/Main.hx
index 4f09108..1560f53 100644
--- a/src/server/Main.hx
+++ b/src/server/Main.hx
@@ -23,8 +23,6 @@ import sys.FileSystem;
import sys.io.File;
using ClientTools;
-using Lambda;
-using StringTools;
private typedef MainOptions = {
loadState:Bool
diff --git a/src/server/Utils.hx b/src/server/Utils.hx
index 43160e6..8fcc4c6 100644
--- a/src/server/Utils.hx
+++ b/src/server/Utils.hx
@@ -6,8 +6,6 @@ import js.node.Os;
import js.node.url.URL;
import sys.FileSystem;
-using StringTools;
-
class Utils {
public static function parseArgs(args:Array<String>, caseSensitive = true):Map<String,
String> {
diff --git a/src/server/YoutubeFallback.hx b/src/server/YoutubeFallback.hx
index 34ea8a9..5360283 100644
--- a/src/server/YoutubeFallback.hx
+++ b/src/server/YoutubeFallback.hx
@@ -9,8 +9,6 @@ import js.node.Https.HttpsRequestOptions;
import js.node.url.URLSearchParams;
import utils.YoutubeUtils;
-using Lambda;
-
class YoutubeFallback {
static function httpsGet(
url:String,
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage