diff options
| author | RblSb <msrblsb@gmail.com> | 2021-07-12 18:32:53 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2021-07-12 18:32:53 +0300 |
| commit | 6397cc81227c52ad0caf43885c20c00175cf1cc4 (patch) | |
| tree | 83794c1ab6dc9bed4056a15fd819c54219088f08 /res | |
| parent | afc010aeb7b7bdf750eaeb5c47db0fe345b492f5 (diff) | |
Basic ass subs support
Diffstat (limited to 'res')
| -rw-r--r-- | res/client.js | 108 |
1 files changed, 103 insertions, 5 deletions
diff --git a/res/client.js b/res/client.js index acc335f..11b6094 100644 --- a/res/client.js +++ b/res/client.js @@ -407,6 +407,25 @@ StringTools.rtrim = function(s) { StringTools.trim = function(s) { return StringTools.ltrim(StringTools.rtrim(s)); }; +StringTools.lpad = function(s,c,l) { + if(c.length <= 0) { + return s; + } + var buf_b = ""; + l -= s.length; + while(buf_b.length < l) buf_b += c == null ? "null" : "" + c; + buf_b += s == null ? "null" : "" + s; + return buf_b; +}; +StringTools.rpad = function(s,c,l) { + if(c.length <= 0) { + return s; + } + var buf_b = ""; + buf_b = "" + (s == null ? "null" : "" + s); + while(buf_b.length < l) buf_b += c == null ? "null" : "" + c; + return buf_b; +}; StringTools.replace = function(s,sub,by) { return s.split(sub).join(by); }; @@ -2701,9 +2720,10 @@ client_players_RawSubs.loadSubs = function(item,video) { if(client_JsApi.hasSubtitleSupport(ext)) { return; } - var url = "/proxy?url=" + client_players_RawSubs.encodeURI(item.subs); + var url = "/proxy?url=" + encodeURI(item.subs); switch(ext) { case "ass": + client_players_RawSubs.parseAss(video,url); break; case "srt": client_players_RawSubs.parseSrt(video,url); @@ -2740,11 +2760,91 @@ client_players_RawSubs.parseSrt = function(video,url) { data += "" + sub.time + "\n"; data += "" + sub.text + "\n\n"; } - haxe_Log.trace(data,{ fileName : "src/client/players/RawSubs.hx", lineNumber : 64, className : "client.players.RawSubs", methodName : "parseSrt"}); var url = "data:text/plain;base64," + haxe_crypto_Base64.encode(haxe_io_Bytes.ofString(data)); client_players_RawSubs.onParsed(video,"SRT subtitles",url); }); }; +client_players_RawSubs.parseAss = function(video,url) { + window.fetch(url).then(function(response) { + return response.text(); + }).then(function(text) { + var subs = []; + var lines = StringTools.replace(text,"\r\n","\n").split("\n"); + var matchFormat = new EReg("^Format:",""); + var matchDialogue = new EReg("^Dialogue:",""); + var blockTags_r = new RegExp("\\{\\\\[^}]*\\}","g".split("u").join("")); + var tags_r = new RegExp("\\\\[^ ]+","g".split("u").join("")); + var drawingMode = new EReg("\\\\p[124]",""); + var eventStart = false; + var formatFound = false; + var ids_h = Object.create(null); + var subsCounter = 1; + var _g = 0; + while(_g < lines.length) { + var line = StringTools.trim(lines[_g++]); + if(!eventStart) { + eventStart = StringTools.startsWith(line,"[Events]"); + continue; + } + if(!formatFound) { + formatFound = matchFormat.match(line); + if(!formatFound) { + continue; + } + var list = line.replace(matchFormat.r,"").split(","); + var _g1 = 0; + var _g2 = list.length; + while(_g1 < _g2) { + var i = _g1++; + ids_h[StringTools.trim(list[i])] = i; + } + ids_h["_length"] = list.length; + } + if(!matchDialogue.match(line)) { + continue; + } + var list1 = line.replace(matchDialogue.r,"").split(","); + while(list1.length > ids_h["_length"]) { + var el = list1.pop(); + list1[list1.length - 1] += el; + } + var result = new Array(list1.length); + var _g3 = 0; + var _g11 = list1.length; + while(_g3 < _g11) { + var i1 = _g3++; + result[i1] = StringTools.trim(list1[i1]); + } + list1 = result; + var text = result[ids_h["Text"]]; + if(drawingMode.match(text)) { + text = ""; + } + text = text.replace(blockTags_r,""); + text = text.replace(tags_r,""); + subs.push({ counter : subsCounter, start : client_players_RawSubs.convertAssTime(result[ids_h["Start"]]), end : client_players_RawSubs.convertAssTime(result[ids_h["End"]]), text : text}); + ++subsCounter; + } + var data = "WEBVTT\n\n"; + var _g = 0; + while(_g < subs.length) { + var sub = subs[_g]; + ++_g; + data += "" + sub.counter + "\n"; + data += "" + sub.start + " --> " + sub.end + "\n"; + data += "" + sub.text + "\n\n"; + } + var url = "data:text/plain;base64," + haxe_crypto_Base64.encode(haxe_io_Bytes.ofString(data)); + client_players_RawSubs.onParsed(video,"ASS subtitles",url); + }); +}; +client_players_RawSubs.convertAssTime = function(time) { + if(!client_players_RawSubs.assTimeStamp.match(time)) { + return "" + StringTools.lpad("" + 0,"0",2) + ":" + StringTools.lpad("" + 0,"0",2) + ":" + StringTools.lpad("" + 0,"0",2) + "." + HxOverrides.substr(StringTools.rpad("" + 0,"0",3),0,3); + } + var time = { h : Std.parseInt(client_players_RawSubs.assTimeStamp.matched(1)), m : Std.parseInt(client_players_RawSubs.assTimeStamp.matched(2)), s : Std.parseInt(client_players_RawSubs.assTimeStamp.matched(3)), ms : Std.parseInt(client_players_RawSubs.assTimeStamp.matched(4))}; + return "" + StringTools.lpad("" + time.h,"0",2) + ":" + StringTools.lpad("" + time.m,"0",2) + ":" + StringTools.lpad("" + time.s,"0",2) + "." + HxOverrides.substr(StringTools.rpad("" + time.ms,"0",3),0,3); +}; client_players_RawSubs.onParsed = function(video,name,dataUrl) { var trackEl = window.document.createElement("track"); trackEl.label = name; @@ -2754,9 +2854,6 @@ client_players_RawSubs.onParsed = function(video,name,dataUrl) { trackEl.track.mode = "showing"; video.appendChild(trackEl); }; -client_players_RawSubs.encodeURI = function(data) { - return encodeURI(data); -}; var client_players_Youtube = function(main,player) { this.matchSeconds = new EReg("([0-9]+)S",""); this.matchMinutes = new EReg("([0-9]+)M",""); @@ -3783,6 +3880,7 @@ client_JsApi.videoChange = []; client_JsApi.videoRemove = []; client_JsApi.onceListeners = []; client_Settings.isSupported = false; +client_players_RawSubs.assTimeStamp = new EReg("([0-9]+):([0-9][0-9]):([0-9][0-9]).([0-9][0-9])",""); haxe_crypto_Base64.CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; haxe_crypto_Base64.BYTES = haxe_io_Bytes.ofString(haxe_crypto_Base64.CHARS); js_youtube_Youtube.isLoadedAPI = false; |
