diff options
| author | RblSb <msrblsb@gmail.com> | 2024-08-02 06:25:45 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2024-08-02 06:25:45 +0300 |
| commit | 7ee893a287c8992196b0b5f51124074fa7c47f4f (patch) | |
| tree | ec32c22b059727ecdd6b909870f97da12aceb097 | |
| parent | 4df711e1568fedcccb45cd86737d89be6a02e7ad (diff) | |
Streamable support
closes #49
| -rw-r--r-- | build/server.js | 84 | ||||
| -rw-r--r-- | res/client.js | 75 | ||||
| -rw-r--r-- | src/Lang.hx | 3 | ||||
| -rw-r--r-- | src/PathTools.hx | 2 | ||||
| -rw-r--r-- | src/Types.hx | 14 | ||||
| -rw-r--r-- | src/VideoList.hx | 2 | ||||
| -rw-r--r-- | src/client/Buttons.hx | 2 | ||||
| -rw-r--r-- | src/client/JsApi.hx | 2 | ||||
| -rw-r--r-- | src/client/Main.hx | 1 | ||||
| -rw-r--r-- | src/client/Player.hx | 7 | ||||
| -rw-r--r-- | src/client/players/Raw.hx | 2 | ||||
| -rw-r--r-- | src/client/players/RawSubs.hx | 2 | ||||
| -rw-r--r-- | src/client/players/Streamable.hx | 66 | ||||
| -rw-r--r-- | src/client/players/Youtube.hx | 4 | ||||
| -rw-r--r-- | src/import.hx | 2 | ||||
| -rw-r--r-- | src/server/ConsoleInput.hx | 2 | ||||
| -rw-r--r-- | src/server/HttpServer.hx | 2 | ||||
| -rw-r--r-- | src/server/Logger.hx | 3 | ||||
| -rw-r--r-- | src/server/Main.hx | 2 | ||||
| -rw-r--r-- | src/server/Utils.hx | 2 | ||||
| -rw-r--r-- | src/server/YoutubeFallback.hx | 2 |
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, |
