diff options
| -rw-r--r-- | build/server.js | 6 | ||||
| -rw-r--r-- | res/client.js | 106 | ||||
| -rw-r--r-- | src/client/Main.hx | 2 | ||||
| -rw-r--r-- | src/client/players/RawSubs.hx | 25 | ||||
| -rw-r--r-- | src/client/players/Youtube.hx | 2 | ||||
| -rw-r--r-- | src/server/HttpServer.hx | 6 |
6 files changed, 90 insertions, 57 deletions
diff --git a/build/server.js b/build/server.js index 93dec79..5f39892 100644 --- a/build/server.js +++ b/build/server.js @@ -3597,7 +3597,7 @@ server_HttpServer.serveFiles = function(req,res) { } if(StringTools.startsWith(url,"/proxy")) { if(!server_HttpServer.proxyUrl(req,res)) { - res.end("Cannot proxy " + req.url); + res.end("Proxy error: " + req.url); } return; } @@ -3690,7 +3690,7 @@ server_HttpServer.proxyUrl = function(req,res) { return false; }); if(proxy2 == null) { - res.end("Proxy error for redirected " + url); + res.end("Proxy error: multiple redirects for url " + url); return true; } req.pipe(proxy2,{ end : true}); @@ -3721,7 +3721,7 @@ server_HttpServer.proxyRequest = function(url,req,res,fn) { proxyReq.pipe(res,{ end : true}); }); proxy.on("error",function(err) { - res.end("Proxy error for " + url1.href); + res.end("Proxy error: " + url1.href); }); return proxy; }; diff --git a/res/client.js b/res/client.js index bad1a65..6347346 100644 --- a/res/client.js +++ b/res/client.js @@ -1105,6 +1105,41 @@ client_Main.__name__ = true; client_Main.main = function() { new client_Main(); }; +client_Main.serverMessage = function(type,text,isText) { + if(isText == null) { + isText = true; + } + var msgBuf = window.document.querySelector("#messagebuffer"); + var div = window.document.createElement("div"); + var time = HxOverrides.dateStr(new Date()).split(" ")[1]; + switch(type) { + case 1: + div.className = "server-msg-reconnect"; + div.textContent = Lang.get("msgConnected"); + break; + case 2: + div.className = "server-msg-disconnect"; + div.textContent = Lang.get("msgDisconnected"); + break; + case 3: + div.className = "server-whisper"; + div.textContent = time + text + " " + Lang.get("entered"); + break; + case 4: + div.className = "server-whisper"; + div.innerHTML = "<div class=\"head\">\n\t\t\t\t\t<div class=\"server-whisper\"></div>\n\t\t\t\t\t<span class=\"timestamp\">" + time + "</span>\n\t\t\t\t</div>"; + var textDiv = div.querySelector(".server-whisper"); + if(isText) { + textDiv.textContent = text; + } else { + textDiv.innerHTML = text; + } + break; + default: + } + msgBuf.appendChild(div); + msgBuf.scrollTop = msgBuf.scrollHeight; +}; client_Main.prototype = { settingsPatcher: function(data,version) { switch(version) { @@ -1142,12 +1177,12 @@ client_Main.prototype = { this.ws = new WebSocket("" + protocol + "//" + this.host + colonPort + path); this.ws.onmessage = $bind(this,this.onMessage); this.ws.onopen = function() { - _gthis.serverMessage(1); + client_Main.serverMessage(1); return _gthis.isConnected = true; }; this.ws.onclose = function() { if(_gthis.isConnected) { - _gthis.serverMessage(2); + client_Main.serverMessage(2); } _gthis.isConnected = false; _gthis.player.pause(); @@ -1293,7 +1328,7 @@ client_Main.prototype = { } this.player.getVideoData({ url : url, atEnd : atEnd},function(data) { if(data.duration == 0) { - _gthis.serverMessage(4,Lang.get("addVideoError")); + client_Main.serverMessage(4,Lang.get("addVideoError")); return; } if(data.title == null) { @@ -1322,7 +1357,7 @@ client_Main.prototype = { var isTemp = window.document.querySelector("#customembed").querySelector(".add-temp").checked; this.player.getIframeData({ url : iframe, atEnd : atEnd},function(data) { if(data.duration == 0) { - _gthis.serverMessage(4,Lang.get("addVideoError")); + client_Main.serverMessage(4,Lang.get("addVideoError")); return; } if(title.length > 0) { @@ -1495,7 +1530,7 @@ client_Main.prototype = { break; case "ServerMessage": var id = data.serverMessage.textId; - this.serverMessage(4,id == "usernameError" ? StringTools.replace(Lang.get(id),"$MAX","" + this.config.maxLoginLength) : Lang.get(id)); + client_Main.serverMessage(4,id == "usernameError" ? StringTools.replace(Lang.get(id),"$MAX","" + this.config.maxLoginLength) : Lang.get(id)); break; case "SetLeader": ClientTools.setLeader(this.clients,data.setLeader.clientName); @@ -1581,7 +1616,7 @@ client_Main.prototype = { this.setLeaderButton((this.personal.group & 4) != 0); this.setPlaylistLock(connected.isPlaylistOpen); this.clearChat(); - this.serverMessage(1); + client_Main.serverMessage(1); var _g = 0; var _g1 = connected.history; while(_g < _g1.length) { @@ -1720,41 +1755,6 @@ client_Main.prototype = { } this.ws.send(JSON.stringify(data)); } - ,serverMessage: function(type,text,isText) { - if(isText == null) { - isText = true; - } - var msgBuf = window.document.querySelector("#messagebuffer"); - var div = window.document.createElement("div"); - var time = HxOverrides.dateStr(new Date()).split(" ")[1]; - switch(type) { - case 1: - div.className = "server-msg-reconnect"; - div.textContent = Lang.get("msgConnected"); - break; - case 2: - div.className = "server-msg-disconnect"; - div.textContent = Lang.get("msgDisconnected"); - break; - case 3: - div.className = "server-whisper"; - div.textContent = time + text + " " + Lang.get("entered"); - break; - case 4: - div.className = "server-whisper"; - div.innerHTML = "<div class=\"head\">\n\t\t\t\t\t<div class=\"server-whisper\"></div>\n\t\t\t\t\t<span class=\"timestamp\">" + time + "</span>\n\t\t\t\t</div>"; - var textDiv = div.querySelector(".server-whisper"); - if(isText) { - textDiv.textContent = text; - } else { - textDiv.innerHTML = text; - } - break; - default: - } - msgBuf.appendChild(div); - msgBuf.scrollTop = msgBuf.scrollHeight; - } ,updateUserList: function() { window.document.querySelector("#usercount").textContent = this.clients.length + " " + Lang.get("online"); window.document.title = this.getPageTitle(); @@ -2826,6 +2826,10 @@ client_players_RawSubs.loadSubs = function(item,video) { } var url = encodeURI(item.subs); if(!StringTools.startsWith(url,"/")) { + var protocol = $global.location.protocol; + if(!StringTools.startsWith(url,"http")) { + url = "" + protocol + "//" + url; + } url = "/proxy?url=" + url; } switch(ext) { @@ -2844,6 +2848,9 @@ client_players_RawSubs.parseSrt = function(video,url) { window.fetch(url).then(function(response) { return response.text(); }).then(function(text) { + if(client_players_RawSubs.isProxyError(text)) { + return; + } var subs = []; var blocks = StringTools.replace(text,"\r\n","\n").split("\n\n"); var _g = 0; @@ -2875,6 +2882,9 @@ client_players_RawSubs.parseAss = function(video,url) { window.fetch(url).then(function(response) { return response.text(); }).then(function(text) { + if(client_players_RawSubs.isProxyError(text)) { + return; + } var subs = []; var lines = StringTools.replace(text,"\r\n","\n").split("\n"); var matchFormat = new EReg("^Format:",""); @@ -2965,12 +2975,20 @@ client_players_RawSubs.convertAssTime = function(time) { var ms = Std.parseInt(client_players_RawSubs.assTimeStamp.matched(4)) * 10; return "" + StringTools.lpad("" + h,"0",2) + ":" + StringTools.lpad("" + m,"0",2) + ":" + StringTools.lpad("" + s,"0",2) + "." + HxOverrides.substr(StringTools.lpad("" + ms,"0",3),0,3); }; +client_players_RawSubs.isProxyError = function(text) { + if(StringTools.startsWith(text,"Proxy error:")) { + client_Main.serverMessage(4,"Failed to add subs: proxy error"); + haxe_Log.trace("Failed to add subs: " + text,{ fileName : "src/client/players/RawSubs.hx", lineNumber : 191, className : "client.players.RawSubs", methodName : "isProxyError"}); + return true; + } + return false; +}; client_players_RawSubs.onParsed = function(video,name,dataUrl) { var trackEl = window.document.createElement("track"); + trackEl.kind = "captions"; trackEl.label = name; - trackEl.kind = "subtitles"; + trackEl.srclang = "en"; trackEl.src = dataUrl; - trackEl.default = true; video.appendChild(trackEl); trackEl.track.mode = "showing"; }; @@ -3125,7 +3143,7 @@ client_players_Youtube.prototype = { loadJson(dataUrl); } ,youtubeApiError: function(error) { - this.main.serverMessage(4,"Error " + error.code + ": " + error.message,false); + client_Main.serverMessage(4,"Error " + error.code + ": " + error.message,false); } ,getRemoteDataFallback: function(url,callback) { var _gthis = this; diff --git a/src/client/Main.hx b/src/client/Main.hx index 28fefe8..bfbe97e 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -692,7 +692,7 @@ class Main { ws.send(Json.stringify(data)); } - public function serverMessage(type:Int, ?text:String, isText = true):Void { + public static function serverMessage(type:Int, ?text:String, isText = true):Void { final msgBuf = ge("#messagebuffer"); final div = document.createDivElement(); final time = Date.now().toString().split(" ")[1]; diff --git a/src/client/players/RawSubs.hx b/src/client/players/RawSubs.hx index aa77bf8..eede788 100644 --- a/src/client/players/RawSubs.hx +++ b/src/client/players/RawSubs.hx @@ -5,6 +5,7 @@ import haxe.crypto.Base64; import haxe.io.Bytes; import js.Browser.document; import js.Browser.window; +import js.Browser; import js.html.VideoElement; using StringTools; @@ -24,6 +25,8 @@ class RawSubs { if (JsApi.hasSubtitleSupport(ext)) return; var url = encodeURI(item.subs); if (!url.startsWith("/")) { + final protocol = Browser.location.protocol; + if (!url.startsWith("http")) url = '$protocol//$url'; url = '/proxy?url=$url'; } @@ -42,6 +45,7 @@ class RawSubs { window.fetch(url).then(response -> { return response.text(); }).then(text -> { + if (isProxyError(text)) return; final subs:Array<{ counter:String, time:String, @@ -76,6 +80,7 @@ class RawSubs { window.fetch(url).then(response -> { return response.text(); }).then(text -> { + if (isProxyError(text)) return; final subs:Array<{ counter:Int, start:String, @@ -142,7 +147,6 @@ class RawSubs { data += '${sub.start} --> ${sub.end}\n'; data += '${sub.text}\n\n'; } - // trace(data); final textBase64 = "data:text/plain;base64,"; final url = textBase64 + Base64.encode(Bytes.ofString(data)); onParsed(video, "ASS subtitles", url); @@ -173,19 +177,30 @@ class RawSubs { } static function parseVtt(video:VideoElement, url:String):Void { - window.fetch(url).then(response -> response.text()).then(data -> { + window.fetch(url).then(response -> response.text()).then(text -> { + if (isProxyError(text)) return; final textBase64 = "data:text/plain;base64,"; - final url = textBase64 + Base64.encode(Bytes.ofString(data)); + final url = textBase64 + Base64.encode(Bytes.ofString(text)); onParsed(video, "VTT subtitles", url); }); } + static function isProxyError(text:String):Bool { + if (text.startsWith("Proxy error:")) { + Main.serverMessage(4, 'Failed to add subs: proxy error'); + trace('Failed to add subs: $text'); + return true; + } + return false; + } + static function onParsed(video:VideoElement, name:String, dataUrl:String) { final trackEl = document.createTrackElement(); + trackEl.kind = "captions"; trackEl.label = name; - trackEl.kind = "subtitles"; + trackEl.srclang = "en"; trackEl.src = dataUrl; - trackEl.default_ = true; + // trackEl.default_ = true; video.appendChild(trackEl); final track = trackEl.track; track.mode = SHOWING; diff --git a/src/client/players/Youtube.hx b/src/client/players/Youtube.hx index d4db8ed..23b2439 100644 --- a/src/client/players/Youtube.hx +++ b/src/client/players/Youtube.hx @@ -171,7 +171,7 @@ class Youtube implements IPlayer { function youtubeApiError(error:Dynamic):Void { final code:Int = error.code; final msg:String = error.message; - main.serverMessage(4, 'Error $code: $msg', false); + Main.serverMessage(4, 'Error $code: $msg', false); } function getRemoteDataFallback(url:String, callback:(data:VideoData) -> Void):Void { diff --git a/src/server/HttpServer.hx b/src/server/HttpServer.hx index 1198ca1..0edf4e3 100644 --- a/src/server/HttpServer.hx +++ b/src/server/HttpServer.hx @@ -74,7 +74,7 @@ class HttpServer { } if (url.startsWith("/proxy")) { - if (!proxyUrl(req, res)) res.end('Cannot proxy ${req.url}'); + if (!proxyUrl(req, res)) res.end('Proxy error: ${req.url}'); return; } @@ -167,7 +167,7 @@ class HttpServer { if (url == null) return false; final proxy2 = proxyRequest(url, req, res, proxyReq -> false); if (proxy2 == null) { - res.end('Proxy error for redirected $url'); + res.end('Proxy error: multiple redirects for url $url'); return true; } req.pipe(proxy2, {end: true}); @@ -200,7 +200,7 @@ class HttpServer { proxyReq.pipe(res, {end: true}); }); proxy.on("error", err -> { - res.end('Proxy error for ${url.href}'); + res.end('Proxy error: ${url.href}'); }); return proxy; } |
