diff --git a/play-version.js b/play-version.js index aa919f6..b80cd71 100644 --- a/play-version.js +++ b/play-version.js @@ -1,5 +1,5 @@ // ==UserScript== -// @name Show Subtitle/Audio Names for Plex +// @name Show Subtitle/Audio Names for Plex // @version 2.5 // @grant none // @include http://plex/* @@ -26,7 +26,7 @@ } return "Unknown"; } - + function intercept(url, responseText) { if (url.indexOf("/library/metadata/") == -1 && url.indexOf("/status/sessions") == -1) return responseText; let response = JSON.parse(responseText); @@ -45,7 +45,7 @@ let streams = parts[k].Stream; for (let l = 0; l < streams.length; l++) { if (!streams[l].hasOwnProperty("displayTitle") || !streams[l].hasOwnProperty("title")) continue; - streams[l].displayTitle = streams[l].displayTitle + " (" + streams[l].title + ")"; + streams[l].displayTitle = streams[l].displayTitle + " (" + streams[l].title + ")"; } } } @@ -53,64 +53,63 @@ return JSON.stringify(response); } - // From https://stackoverflow.com/questions/26447335/ (function() { - // create XMLHttpRequest proxy object - var oldXMLHttpRequest = XMLHttpRequest; + const oldXMLHttpRequest = XMLHttpRequest; + XMLHttpRequest = new Proxy(XMLHttpRequest, + { + construct: function(target, args) + { + //alert("constructor"); + let made = new target(...args); - // define constructor for my proxy object - XMLHttpRequest = function() { - var actual = new oldXMLHttpRequest(); - var self = this; - - this.onreadystatechange = null; - - // this is the actual handler on the real XMLHttpRequest object - actual.onreadystatechange = function() { - if (this.readyState == 4 && (actual.responseType == '' || actual.responseType == 'text')) { - try { - self._responseText = intercept(actual.responseURL, actual.responseText); - } catch (err) { - console.error(err); - } - } - if (self.onreadystatechange) { - return self.onreadystatechange(); - } - }; - - // add all proxy getters/setters - ["responseText"].forEach(function(item) { - Object.defineProperty(self, item, { - get: function() { - if (self.hasOwnProperty("_" + item)) { - return self["_" + item]; - } else { - return actual[item]; + let proxiedCallback = made.onreadystatechange; + let _responseText = made.responseText; + made.onreadystatechange = (...readyArgs) => + { + if (made.readyState == 4 && (made.responseType == '' || made.responseType == 'text')) { + try { + _responseText = intercept(made.responseURL, made.responseText); + } catch (err) { + console.error(err); + } } - }, - set: function(val) {actual[item] = val;} - }); - }); + if (proxiedCallback) proxiedCallback.apply(made, readyArgs); + }; - // add all proxy getters/setters - ["status", "statusText", "responseType", "response", "readyState", "responseXML", - "upload", "ontimeout, timeout", "withCredentials", "onload", "onerror", - "onprogress", "responseURL"].forEach(function(item) { - Object.defineProperty(self, item, { - get: function() {return actual[item];}, - set: function(val) {actual[item] = val;} - }); - }); - - // add all pure proxy pass-through methods - ["addEventListener", "send", "open", "abort", "getAllResponseHeaders", - "getResponseHeader", "overrideMimeType", "setRequestHeader"].forEach(function(item) { - Object.defineProperty(self, item, { - value: function() {return actual[item].apply(actual, arguments);} - }); - }); - } + const processGet = function(val, target) + { + if (typeof val === 'function') return val.bind(target); + return val; + }; + return new Proxy(made, + { + get: function(target, prop, receiver) + { + if (prop == "onreadystatechange") + { + return processGet(proxiedCallback, target); + } + if (prop == "responseText") + { + return _responseText; + } + return processGet(target[prop], target); + }, + set: function(target, prop, value, receiver) + { + if (prop == "onreadystatechange") + { + proxiedCallback = value; + return true; + } + target[prop] = value; + return true; + } + } + ); + } + } + ); })(); } @@ -118,3 +117,4 @@ var script = document.createElement('script'); script.appendChild(document.createTextNode('('+ main +')();\n//# sourceURL=injectPlex.js')); (document.body || document.head || document.documentElement).appendChild(script); +