- // ==UserScript==
- // @name Inject2Download
- // @namespace http://lkubuntu.wordpress.com/
- // @version 0.4.8
- // @description Simple media download script
- // @author Anonymous Meerkat
- // @include *
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM.getValue
- // @grant GM.setValue
- // @grant none
- // @license MIT License
- // @run-at document-start
- // ==/UserScript==
-
- // NOTE: This script now requires GM_setValue/getValue for storing preferences
-
- (function() {
- "use strict";
-
- var injected_set = {};
- var did_prefs = false;
-
- function get_window() {
- var win = window;
- if (typeof unsafeWindow !== "undefined")
- win = unsafeWindow;
- return win;
- }
-
- var win = get_window();
-
- // Most of these are disabled by default in order to avoid modifying the user experience in unexpected ways
- var config_template = {
- simpleplayers: {
- name: "Replace with native players if possible",
- options: {
- "yes": "Yes",
- "flash": "Only if Flash is used",
- "no": "No"
- },
- default: "no"
- },
- noads: {
- name: "Block ads if possible (using a proper adblocker is highly recommended)",
- default: false
- },
- // TODO: Implement
- /*download: {
- name: "Enable downloading via the player itself if possible",
- default: false
- },*/
- blacklist: {
- name: "Blacklisted domains (one per line)",
- type: "textarea",
- default: [
- "translate.google.com", // Spams audio files
- "live.com" // Conflicts with $f
- ].join("\n")
- }
- };
-
- var config = {};
-
- for (var key in config_template) {
- config[key] = config_template[key].default;
- /*(function(key) {
- GM.getValue(key).then(
- function (data) {
- if (data !== undefined)
- config[key] = data;
- },
- function () {}
- );
- })(key);*/
-
-
- // Having both work as callbacks is possible, but introduces delay
- // in cases where it's not necessary
- if (typeof GM_getValue !== "undefined") {
- var data = GM_getValue(key);
- if (data !== undefined)
- config[key] = data;
- } else if (typeof GM !== "undefined" && GM.getValue) {
- GM.getValue(key).then(function (data) {
- if (data !== undefined) {
- config[key] = data;
- }
- }, function() {});
- }
- }
-
- function check_host(host) {
- var ourhost = window.location.hostname.toLowerCase();
- host = host.replace(/^ */, "").replace(/ *$/, "");
- if (ourhost === host.toLowerCase() ||
- (ourhost.indexOf("." + host) >= 0 &&
- ourhost.indexOf("." + host) === (ourhost.length - host.length - 1))) {
- return true;
- }
-
- return false;
- }
-
- function normalize_url(url) {
- if (!url)
- return url;
-
- return url.replace(/^[a-z]+:\/\//, "//");
- }
-
- function check_similar_url(url1, url2) {
- return normalize_url(url1) === normalize_url(url2);
- }
-
- var blacklisted = false;
- var verified_blacklisted = false;
- function check_blacklisted() {
- var blacklist = config.blacklist.split("\n");
- blacklisted = false;
- var host = window.location.hostname.toLowerCase();
- for (var i = 0; i < blacklist.length; i++) {
- var normalized = blacklist[i].replace(/^ */, "").replace(/ *$/, "");
- if (host === normalized.toLowerCase() ||
- (host.indexOf("." + normalized) >= 0 &&
- host.indexOf("." + normalized) === (host.length - normalized.length - 1))) {
- console.log("[i2d] Blacklisted: " + normalized);
- blacklisted = true;
- break;
- }
- }
- return blacklisted;
- }
-
- // Preferences
- if (window.location.hostname.toLowerCase() == "anonymousmeerkat.github.io" &&
- window.location.href.indexOf("anonymousmeerkat.github.io/inject2download/prefs.html") >= 0 &&
- !did_prefs) {
- run_on_load(function() {
- var text = [
- "<html><head><title>Inject2Download Preferences</title></head><body style='margin:0;padding:1em'>",
- "<div style='width:100%'><h2>Inject2Download</h2></div>",
- "<div id='prefs'></div>",
- "<div id='save'><button id='savebtn'>Save</button><br /><span id='savetxt'></span></div>",
- "</body></html>"
- ].join("");
- document.documentElement.innerHTML = text;
-
- var prefs = document.getElementById("prefs");
- prefs.appendChild(document.createElement("hr"));
- for (var key in config_template) {
- var template = config_template[key];
-
- var prefdiv = document.createElement("div");
- prefdiv.id = "pref-" + key;
- prefdiv.style.paddingBottom = "1em";
- var title = document.createElement("div");
- title.style.paddingBottom = ".5em";
- title.innerHTML = template.name;
- prefdiv.appendChild(title);
-
- if (typeof template.default === "boolean" ||
- "options" in template) {
- var options = template.options;
- if (typeof template.default === "boolean") {
- options = {
- "true": "Yes",
- "false": "No"
- };
- }
-
- for (var option in options) {
- var input = document.createElement("input");
- input.name = key;
- input.value = option;
- input.type = "radio";
- input.id = key + "-" + option;
-
- if (config[key].toString() === option)
- input.setAttribute("checked", true);
-
- var label = document.createElement("label");
- label.setAttribute("for", input.id);
- label.innerHTML = options[option];
-
- prefdiv.appendChild(input);
- prefdiv.appendChild(label);
- prefdiv.appendChild(document.createElement("br"));
- }
- } else if (template.type === "textarea") {
- var input = document.createElement("textarea");
- input.name = key;
- input.style.width = "30em";
- input.style.height = "10em";
- input.innerHTML = config[key];
-
- prefdiv.appendChild(input);
- } else {
- var input = document.createElement("input");
- input.name = key;
- input.value = config[key];
- input.style.width = "50em";
-
- prefdiv.appendChild(input);
- }
-
- prefs.appendChild(prefdiv);
- prefs.appendChild(document.createElement("hr"));
- }
-
- document.getElementById("savebtn").onclick = function() {
- for (var key in config_template) {
- var els = document.getElementsByName(key);
- var value = undefined;
- if (els.length > 1) {
- // radio
- for (var i = 0; i < els.length; i++) {
- if (els[i].checked) {
- value = els[i].value;
- if (value === "true")
- value = true;
- if (value === "false")
- value = false;
- break;
- }
- }
- } else {
- if (els[0].tagName === "INPUT") {
- value = els[0].value;
- } else if (els[0].tagName === "TEXTAREA") {
- value = els[0].value;
- }
- }
- console.log("[i2d] " + key + " = " + value);
-
- if (typeof GM_setValue !== "undefined")
- GM_setValue(key, value);
- else if (typeof GM !== "undefined" && GM.setValue)
- GM.setValue(key, value);
- }
- document.getElementById("savetxt").innerHTML = "Saved!";
- setTimeout(function() {
- document.getElementById("savetxt").innerHTML = "";
- }, 3000);
- };
-
- console.log("[i2d] Finished rendering preferences page");
- });
- did_prefs = true;
- }
-
- check_blacklisted();
-
- // Helper functions
- function run_on_load(f) {
- if (document.readyState === "complete" ||
- document.readyState === "interactive") {
- f();
- } else {
- var listener = function() {
- if (document.readyState === "complete" ||
- document.readyState === "interactive") {
- f();
-
- document.removeEventListener("readystatechange", listener);
- }
- };
-
- document.addEventListener("readystatechange", listener);
- //document.addEventListener('DOMContentLoaded', f, false);
- //window.addEventListener('load', f, false);
- }
- }
-
- var i2d_url_list = [];
- function i2d_show_url(namespace, url, description) {
- if (!blacklisted && !verified_blacklisted) {
- if (check_blacklisted()) {
- verified_blacklisted = true;
- }
- }
-
- if (blacklisted)
- return;
-
- function get_absolute_url(url) {
- var a = document.createElement('a');
- a.href = url;
- return a.href;
- }
-
- function run_on_load(f) {
- if (document.readyState === "complete" ||
- document.readyState === "interactive") {
- f();
- } else {
- var listener = function() {
- if (document.readyState === "complete" ||
- document.readyState === "interactive") {
- f();
-
- document.removeEventListener("readystatechange", listener);
- }
- };
-
- document.addEventListener("readystatechange", listener);
- //document.addEventListener('DOMContentLoaded', f, false);
- //window.addEventListener('load', f, false);
- }
- }
-
- if (!description)
- description = "";
-
- if (typeof url !== "string" || url.replace("\s", "").length === 0)
- return;
-
- if (url.match(/^mediasource:/) || url.match(/^blob:/) || url.match(/^data:/))
- return;
-
- url = get_absolute_url(url);
-
- for (var i = 0; i < i2d_url_list.length; i++) {
- if (i2d_url_list[i][0] === namespace &&
- i2d_url_list[i][1] === url &&
- i2d_url_list[i][2] === description)
- return;
- }
-
-
- i2d_url_list.push([namespace, url, description]);
-
- var newurl = decodeURIComponent(url);
-
- var text = "[" + namespace + "] " + description + ": ";
-
- console.log("[i2d] " + text + newurl);
-
- run_on_load(function() {
- var el = document.getElementById("i2d-popup");
- var elspan = document.getElementById("i2d-popup-x");
- var elspan1 = document.getElementById("i2d-popup-close");
- var elspan2 = document.getElementById("i2d-popup-prefs");
- var eldiv = document.getElementById("i2d-popup-div");
- var eldivhold = document.getElementById("i2d-popup-div-holder");
- if (!el) {
- el = document.createElement("div");
- el.style.all = "initial";
- //el.style.position = "absolute";
- el.style.width = "max(60%, 100em)";
- el.style.height = "max(60%, 100em)";
- el.style.maxWidth = "100%";
- el.style.maxHeight = "100%";
- el.style.height = "auto";
- el.style.width = "auto";
- el.style.background = "white";
- el.style.top = "0px";
- el.style.left = "0px";
- el.style.zIndex = Number.MAX_SAFE_INTEGER - 1;
- el.style.color = "black";
- el.style.fontFamily = "sans-serif";
- el.style.fontSize = "16px";
- el.style.lineHeight = "normal";
- el.style.textAlign = "left";
- el.style.overflow = "scroll";
- el.style.position = "absolute";
-
- /*el.ondblclick = function() {
- el.parentElement.removeChild(el);
- };*/
- eldivhold = document.createElement("div");
- eldivhold.id = "i2d-popup-span-holder";
- eldivhold.style.all = "initial";
- eldivhold.style.width = "100%";
- eldivhold.style.display = "block";
- eldivhold.style.overflow = "auto";
- eldivhold.style.paddingBottom = ".5em";
-
- elspan = document.createElement("span");
- elspan.style.all = "initial";
- elspan.style.fontSize = "130%";
- elspan.style.cursor = "pointer";
- elspan.style.color = "#900";
- elspan.style.padding = ".1em";
- elspan.style.float = "left";
- elspan.style.display = "inline";
- elspan.id = "i2d-popup-x";
- elspan.innerHTML = '[hide]';
- elspan.style.textDecoration = "underline";
- eldivhold.appendChild(elspan);
-
- elspan1 = document.createElement("span");
- elspan1.style.all = "initial";
- elspan1.style.fontSize = "130%";
- elspan1.style.cursor = "pointer";
- elspan1.style.color = "#900";
- elspan1.style.padding = ".1em";
- elspan1.style.float = "right";
- //elspan1.style.display = "none";
- elspan1.style.display = "inline";
- elspan1.id = "i2d-popup-close";
- elspan1.innerHTML = '[close]';
- elspan1.style.textDecoration = "underline";
- eldivhold.appendChild(elspan1);
-
- elspan2 = document.createElement("a");
- elspan2.style.all = "initial";
- elspan2.style.fontSize = "130%";
- elspan2.style.cursor = "pointer";
- elspan2.style.color = "#900";
- elspan2.style.padding = ".1em";
- elspan2.style.float = "left";
- //elspan1.style.display = "none";
- elspan2.style.display = "inline";
- elspan2.id = "i2d-popup-prefs";
- elspan2.innerHTML = '[options]';
- elspan2.href = "https://anonymousmeerkat.github.io/inject2download/prefs.html";
- elspan2.setAttribute("target", "_blank");
- elspan2.style.textDecoration = "underline";
- eldivhold.appendChild(elspan2);
-
- //el.innerHTML = "<br style='line-height:150%' />";
- el.id = "i2d-popup";
- eldiv = document.createElement("div");
- eldiv.style.all = "initial";
- eldiv.id = "i2d-popup-div";
- //eldiv.style.display = "none";
- eldiv.style.display = "block";
- el.appendChild(eldiv);
- el.insertBefore(eldivhold, el.firstChild);
- document.documentElement.appendChild(el);
-
- elspan.onclick = function() {
- /*var el = document.getElementById("i2d-popup");
- el.parentElement.removeChild(el);*/
- var eldiv = document.getElementById("i2d-popup-div");
- var elspan = document.getElementById("i2d-popup-x");
- if (eldiv.style.display === "none") {
- elspan.innerHTML = '[hide]';
- eldiv.style.display = "block";
- elspan1.style.display = "inline";
- } else {
- elspan.innerHTML = '[show]';
- eldiv.style.display = "none";
- elspan1.style.display = "none";
- }
- };
-
- elspan1.onclick = function() {
- var el = document.getElementById("i2d-popup");
- el.parentElement.removeChild(el);
- };
- }
- var shorturl = newurl;
- if (shorturl.length > 100) {
- shorturl = shorturl.substring(0, 99) + "…";
- }
- var el_divspan = document.createElement("span");
- el_divspan.style.all = "initial";
- el_divspan.innerHTML = text;
- eldiv.appendChild(el_divspan);
- var el_a = document.createElement("a");
- el_a.href = newurl;
- el_a.style.all = "initial";
- el_a.style.color = "blue";
- el_a.style.textDecoration = "underline";
- el_a.style.cursor = "pointer";
- el_a.title = newurl;
- el_a.innerHTML = shorturl;
- eldiv.appendChild(el_a);
- var el_br = document.createElement("br");
- el_br.style.all = "initial";
- eldiv.appendChild(el_br);
- //eldiv.innerHTML += text + "<a href='" + newurl + "' style='color:blue' title='" + newurl + "'>" + shorturl + "</a><br />";
-
- // XXX: why is this needed? test: http://playbb.me/embed.php?w=718&h=438&vid=at/nw/flying_witch_-_01.mp4, animeplus.tv
- /*document.body.removeChild(el);
- el.style.position = "absolute";
- document.body.appendChild(el);*/
-
- /*if (document.getElementById("i2d-popup-x"))
- document.getElementById("i2d-popup-x").parentElement.removeChild(document.getElementById("i2d-popup-x"));*/
-
- /*el.insertBefore(elspan, el.firstChild);
- el.insertBefore(elspan1, el.firstChild);*/
- //el.insertBefore(eldivhold, el.firstChild);
- });
- }
-
- function i2d_add_player(options) {
- var playlist = [];
- var elements = [];
- var ret = {};
-
- /*var videoel = document.createElement("video");
- videoel.setAttribute("controls", "");
- options.element.appendChild(videoel);*/
-
- if (!(options.elements instanceof Array) && !(options.elements instanceof NodeList)) {
- if (typeof options.elements === "string") {
- options.elements = document.querySelectorAll(options.elements);
- } else {
- options.elements = [options.elements];
- }
- }
- for (var i = 0; i < options.elements.length; i++) {
- (function(x) {
- if (!x)
- return;
- var videoel = document.createElement("video");
- videoel.setAttribute("controls", "");
- videoel.style.maxWidth = "100%";
- videoel.style.maxHeight = "100%";
- videoel.addEventListener("ended", function() {
- ret.next_playlist_item();
- });
- videoel.addEventListener("error", function() {
- ret.next_playlist_item();
- });
- /*var stylestr = "";
- for (var key in options.css) {
- stylestr += key + ":" + options.css[key] + ";"
- }*/
- for (var key in options.css) {
- videoel.style[key] = options.css[key];
- }
- //videoel.setAttribute("style", stylestr);
- if (options.replaceChildren) {
- x.innerHTML = "";
- }
- if (options.replace) {
- x.parentElement.replaceChild(videoel, x);
- } else {
- x.appendChild(videoel);
- }
- elements.push(videoel);
- })(options.elements[i]);
- }
- ret.add_urls = function(urls) {
- if (urls instanceof Array) {
- for (var i = 0; i < urls.length; i++) {
- ret.add_urls(urls[i]);
- }
- return;
- }
-
- playlist.push(urls);
- if (playlist.length === 1) {
- ret.set_url(playlist[0]);
- }
- };
- ret.replace_urls = function(urls) {
- playlist = [];
- return ret.add_urls(urls);
- };
- var getext = function(url) {
- if (!url)
- return url;
-
- return url.replace(/.*\.([^/.?]*)(?:\?.*)?$/, "$1").toLowerCase();
- };
- var loadscript = function(variable, url, cb) {
- if (!(variable in window)) {
- var script = document.createElement("script");
- script.src = url;
- script.onload = cb;
- document.head.insertBefore(script, document.head.lastChild);
- } else {
- cb();
- }
- };
- ret.set_url = function(url) {
- if (!url || typeof url !== "string")
- return;
- switch(getext(url)) {
- case "flv":
- loadscript("flvjs", "https://cdn.jsdelivr.net/npm/flv.js@latest", function() {
- var flvPlayer = flvjs.createPlayer({
- type: 'flv',
- url: url
- });
- for (var i = 0; i < elements.length; i++) {
- flvPlayer.attachMediaElement(elements[i]);
- }
- flvPlayer.load();
- });
- break;
- case "m3u8":
- loadscript("Hls", "https://cdn.jsdelivr.net/npm/hls.js@latest", function() {
- var hls = new Hls();
- hls.loadSource(url);
- for (var i = 0; i < elements.length; i++) {
- hls.attachMedia(elements[i]);
- }
- });
- break;
- default:
- for (var i = 0; i < elements.length; i++) {
- elements[i].src = url;
- }
- break;
- }
- };
- ret.next_playlist_item = function() {
- playlist = playlist.slice(1);
- if (playlist[0])
- ret.set_url(playlist[0]);
- };
- ret.setPlaying = function(playing) {
- for (var i = 0; i < elements.length; i++) {
- if (playing)
- elements[i].play();
- else
- elements[i].pause();
- }
- };
-
- if (options.urls)
- ret.add_urls(options.urls);
-
- return ret;
- }
-
-
- // Injecting functions
- var get_script_str = function(f) {
- return f.toString().replace(/^function.*{|}$/g, '');
- };
-
- function add_script(s, el) {
- var script_body = "(function() {\n" + s + "\n})();";
- var myscript = document.createElement('script');
- myscript.className = "i2d";
- myscript.innerHTML = script_body;
- if (el) {
- el.appendChild(myscript);
- } else {
- document.head.appendChild(myscript);
- }
- }
-
- function inject(variable, newvalue, aliases) {
- if (variable instanceof Array) {
- for (var i = 0; i < variable.length; i++) {
- inject(variable[i], newvalue, aliases);
- }
- return;
- }
-
- console.log("[i2d] injecting " + variable);
- if (!aliases)
- aliases = [];
-
- var initobjects = "";
- var subvariable = variable;
- var subindex = 0;
- while (true) {
- var index = subvariable.indexOf(".");
- var breakme = false;
- if (index < 0) {
- index = subvariable.length;
- breakme = true;
- }
- subvariable = subvariable.substr(index + 1);
- subindex += index + 1;
- var subname = variable.substr(0, subindex - 1);
- initobjects += "if (!" + subname + ") {" + subname + " = {};}\n";
- if (breakme)
- break;
- }
-
- add_script("var config = " + JSON.stringify(config) + ";\n" +
- i2d_show_url.toString() + "\n" + i2d_add_player.toString() + "\n" +
- initobjects + "\n" +
- "if ((window." + variable + " !== undefined) && !(window." + variable + ".INJECTED)) {\n" +
- "var oldvariable = window." + variable + ";\n" +
- "var oldvariable_keys = Object.keys(oldvariable);\n" +
- "window." + variable + " = " + newvalue.toString() + ";\n" +
- "for (var i = 0; i < oldvariable_keys.length; i++) {\n" +
- " window." + variable + "[oldvariable_keys[i]] = oldvariable[oldvariable_keys[i]];\n" +
- "}\n" +
- "window." + variable + ".INJECTED = true;\n" +
- "var aliases = " + JSON.stringify(aliases) + ";\n" +
- "for (var i = 0; i < aliases.length; i++) {\n" +
- " if (aliases[i] in window && window[aliases[i]] == oldvariable)" +
- " window[aliases[i]] = window." + variable + "\n" +
- "}\n" +
- "}");
- }
-
- function jquery_plugin_exists(name) {
- if (!("jQuery" in window) ||
- typeof window.jQuery !== "function" ||
- !("fn" in window.jQuery) ||
- !(name in window.jQuery.fn))
- return false;
-
-
- return true;
- }
-
- function inject_jquery_plugin(name, value) {
- if (!jquery_plugin_exists(name) ||
- window.jQuery.fn[name].INJECTED)
- return;
-
- inject("jQuery.fn." + name, value);
- }
-
- var injected_urls = [];
-
- (function(open) {
- window.XMLHttpRequest.prototype.open = function() {
- if (arguments[1]) {
- var src = arguments[1];
-
- var url = null;
- for (var i = 0; i < injected_urls.length; i++) {
- if (injected_urls[i].url &&
- check_similar_url(injected_urls[i].url, src)) {
- url = injected_urls[i];
- break;
- }
-
- if (injected_urls[i].pattern &&
- src.match(injected_urls[i].pattern)) {
- url = injected_urls[i];
- break;
- }
- }
-
- if (url) {
- this.addEventListener("readystatechange", function() {
- if (this.readyState === 4) {
- url.func.bind(this)(src);
- }
- });
- }
- }
-
- open.apply(this, arguments);
- };
- })(window.XMLHttpRequest.prototype.open);
-
- function inject_url(pattern, func) {
- var obj = {func: func};
-
- if (pattern instanceof RegExp) {
- obj.pattern = pattern;
- } else {
- obj.url = pattern;
- }
-
- for (var i = 0; i < injected_urls.length; i++) {
- if (injected_urls[i].url === obj.url ||
- injected_urls[i].pattern === obj.pattern)
- return;
- }
-
- injected_urls.push(obj);
- }
-
- function can_inject(name) {
- if (name in window && (typeof window[name] === "object" || typeof window[name] === "function") && !window[name].INJECTED)
- return true;
- return false;
- }
-
- function i2d_onload(f) {
- if (document.readyState === "loading") {
- document.addEventListener("DOMContentLoaded", f);
- } else {
- f();
- }
- }
-
-
- if (blacklisted)
- return;
-
- var injected = [];
- var defineProp = Object.defineProperty;
- win.Object.defineProperty = function() {
- if (arguments[0] === win &&
- injected.indexOf(arguments[1]) >= 0) {
- console.log("[i2d] Intercepted Object.defineProperty for " + arguments[1]);
-
- if (arguments[2] && arguments[2].value)
- win[arguments[1]] = arguments[2].value;
-
- return;
- }
-
- return defineProp.apply(this, arguments);
- };
-
- var defineProps = Object.defineProperties;
- win.Object.defineProperties = function() {
- if (arguments[0] === win) {
- var keys = Object.keys(arguments[1]);
-
- var newargs = [];
- newargs[0] = arguments[0];
- newargs[1] = {};
-
- for (var i = 0; i < keys.length; i++) {
- if (injected.indexOf(keys[i]) >= 0) {
- console.log("[i2d] Intercepted Object.defineProperties for " + keys[i]);
- if (arguments[1][keys[i]] && arguments[1][keys[i]].value) {
- win[keys[i]] = arguments[1][keys[i]].value;
- }
- } else {
- newargs[1][keys[i]] = arguments[1][keys[i]];
- }
- }
-
- return defineProps.apply(this, newargs);
- }
-
- return defineProps.apply(this, arguments);
- };
-
- var injections = [
- // soundManager
- {
- variables: {
- window: "soundManager.createSound"
- },
- replace: function(context, args) {
- var arg1 = args[0];
- var arg2 = args[1];
-
- if (typeof arg1 === "string")
- i2d_show_url("soundManager", arg2);
- else
- i2d_show_url("soundManager", arg1.url);
-
- return context.oldvariable.apply(this, args);
- }
- },
- // jwplayer
- {
- variables: {
- window: "jwplayer"
- },
- replace: function(context, args) {
- var result = context.oldvariable.apply(this, args);
-
- var check_sources = function(x, options) {
- if (!options)
- options = {};
-
- if (typeof x === "object") {
- if (x instanceof Array) {
- for (var i = 0; i < x.length; i++) {
- check_sources(x[i]);
- }
- return;
- }
-
- var label = "";
-
- if ("title" in x)
- label += "[" + x.title + "]";
-
- if ("label" in x)
- label += "[" + x.label + "]";
-
- if ("kind" in x)
- label += "(" + x.kind + ")";
-
- if ("streamer" in x) {
- i2d_show_url("jwplayer", x.streamer, "[stream]" + label);
- }
-
- if ("file" in x) {
- i2d_show_url("jwplayer", x.file, label);
- }
-
- if ("sources" in x) {
- check_sources(x.sources);
- }
-
- if ("playlist" in x) {
- check_sources(x.playlist, {playlist: true});
- }
-
- if ("tracks" in x) {
- check_sources(x.tracks, {playlist: true});
- }
- } else if (typeof x === "string") {
- i2d_show_url("jwplayer", x);
-
- if (options.playlist) {
- inject_url(x, function() {
- check_sources(JSON.parse(this.responseText), {playlist: true});
- });
- }
- }
- };
-
- if ("setup" in result) {
- var old_jwplayer_setup = result.setup;
- result.setup = function() {
- if (typeof arguments[0] === "object") {
- var x = arguments[0];
-
- if ("modes" in x) {
- for (var i = 0; i < x.modes.length; i++) {
- // TODO: support more?
- if ("type" in x.modes[i] && x.modes[i].type === "html5") {
- if ("config" in x.modes[i] && "file" in x.modes[i].config) {
- check_sources(x.modes[i].config);
- }
- }
- }
- }
-
- check_sources(x);
- }
-
- if (config.noads && "advertising" in arguments[0])
- delete arguments[0].advertising;
-
- return old_jwplayer_setup.apply(this, arguments);
- };
- }
-
- if ("load" in result) {
- var old_jwplayer_load = result.load;
- result.load = function() {
- check_sources(arguments[0]);
- return old_jwplayer_load.apply(this, arguments);
- };
- }
-
- if ("on" in result) {
- result.on('playlistItem', function(item) {
- check_sources(item.item);
- });
-
- var old_jwplayer_on = result.on;
- result.on = function() {
- if (arguments[0] === "adBlock")
- return;
-
- return old_jwplayer_on.apply(this, arguments);
- };
- }
-
- return result;
- }
- },
- // flowplayer
- {
- variables: {
- window: ["flowplayer"],
- window_alias: ["$f"]
- },
- check: function(variable) {
- if (!variable || !variable.version)
- return false;
- return true;
- },
- replace: function(context, args) {
- var obj_baseurl = null;
- var els = [];
-
- var urls = [];
- var url_pairs = {};
- var players = {};
- var add_url = function() {
- if (Object.keys(players).length === 0) {
- urls.push(arguments[1]);
- } else {
- for (var key in players) {
- players[key].add_urls(arguments[1]);
- }
- }
-
- return i2d_show_url.apply(this, args);
- };
- var add_url_pair = function(el) {
- var newargs = Array.prototype.slice.call(arguments, 1);
- if (!(el in players)) {
- if (!url_pairs[el])
- url_pairs[el] = [];
- url_pairs[el].push(newargs[1]);
- } else {
- players[el].add_urls(newargs[1]);
- }
-
- return i2d_show_url.apply(this, newargs);
- };
-
- function get_url(x) {
- x = decodeURIComponent(x);
-
- if (obj_baseurl) {
- if (x.match(/^[a-z]*:\/\//)) {
- return x;
- } else {
- return obj_baseurl + "/" + x;
- }
- } else {
- return x;
- }
- }
-
- function check_sources(x, els, label) {
- if (typeof x === "string") {
- if (!x.match(/\.xml$/))
- add_url("flowplayer", get_url(x), label);
-
- return;
- }
-
- if (x instanceof Array) {
- for (var i = 0; i < x.length; i++) {
- check_sources(x[i], els, label);
- }
- return;
- }
-
- if (typeof x !== "object")
- return;
-
- // test: https://flowplayer.com/docs/player/standalone/vast/overlay.html
- if (config.noads && "ima" in x)
- delete x.ima;
-
- label = "";
-
- if ("title" in x)
- label += "[" + x.title + "]";
-
- if ("clip" in x) {
- if ("baseUrl" in x.clip) {
- obj_baseurl = x.clip.baseUrl;
-
- for (var i = 0; i < els.length; i++) {
- els[i].i2d_baseurl = obj_baseurl;
- }
- }
-
- check_sources(x.clip, els, label);
- }
-
- if ("sources" in x) {
- check_sources(x.sources, els, label);
- }
-
- if ("playlist" in x) {
- check_sources(x.playlist, els, label);
- }
-
- if ("url" in x) {
- check_sources(x.url, els, label);
- }
-
- if ("src" in x) {
- check_sources(x.src, els. label);
- }
-
- if ("bitrates" in x) {
- for (var j = 0; j < x.bitrates.length; j++) {
- if ("url" in x.bitrates[j]) {
- var description = "";
- if (x.bitrates[j].isDefault)
- description += "default:";
- if (x.bitrates[j].sd)
- description += "sd:";
- if (x.bitrates[j].hd)
- description += "hd:";
- if (x.bitrates[j].bitrate)
- description += x.bitrates[j].bitrate;
-
- add_url("flowplayer", get_url(x.bitrates[j].url), description);
- }
- }
- }
- }
-
- if (args.length >= 1) {
- els = [null];
-
- if (typeof args[0] === "string") {
- try {
- els[0] = document.getElementById(args[0]);
- } catch(e) {
- }
-
- try {
- if (!els[0])
- els = document.querySelectorAll(args[0]);
- } catch(e) {
- els = [];
- }
- } else if (args[0] instanceof HTMLElement) {
- els = [args[0]];
- }
- }
-
- for (var i = 0; i < els.length; i++) {
- if (!els[i] || !(els[i] instanceof HTMLElement))
- continue;
-
- if ("i2d_baseurl" in els[i])
- obj_baseurl = els[i].i2d_baseurl;
- }
-
- var options = {};
-
- if (args.length >= 3 && typeof args[2] === "object") {
- check_sources(args[2], els);
- options = args[2];
- } else if (args.length >= 3 && typeof args[2] === "string") {
- add_url("flowplayer", get_url(args[2]));
- } else if (args.length === 2 && typeof args[1] === "object") {
- check_sources(args[1], els);
- options = args[1];
- } else if (args.length === 2 && typeof args[1] === "string") {
- add_url("flowplayer", get_url(args[1]));
- }
-
- var isflash = false;
- if (args.length >= 2 && typeof args[1] === "string" && args[1].toLowerCase().match(/\.swf$/)) {
- isflash = true;
- }
-
- for (var i = 0; i < els.length; i++) {
- if (!els[i] || !(els[i] instanceof HTMLElement))
- continue;
-
- var href = els[i].getAttribute("href");
- if (href) {
- add_url_pair(els[i], "flowplayer", get_url(href), "href");
- }
- }
-
- var oldvariable = context.oldvariable;
- if (config.simpleplayers === "yes" ||
- (config.simpleplayers === "flash" && isflash)) {
- oldvariable = function() {
- var css = {width: "100%", height: "100%"};
- for (var key in options.screen) {
- var val = options.screen[key];
- switch(key) {
- case "height":
- case "width":
- case "bottom":
- case "top":
- case "left":
- case "right":
- if (typeof val === "number") {
- css[key] = val + "px";
- } else {
- css[key] = val;
- }
- break;
- default:
- css[key] = val;
- break;
- }
- }
- for (var i = 0; i < els.length; i++) {
- var player_urls = url_pairs[els[i]] || [];
- for (var x = 0; x < urls.length; x++) {
- player_urls.push(urls[x]);
- }
- players[els[i]] = i2d_add_player({
- elements: els[i],
- replaceChildren: true,
- urls: player_urls,
- css: css
- });
- }
-
- var allp = function(name) {
- for (var key in players) {
- players[key][name].apply(this, Array.prototype.slice.apply(args, 1));
- }
- };
-
- var res = {};
- var fns = [
- "addClip",
- "setPlaylist",
- "load",
- "playlist",
- "play",
- "ipad"
- ];
- for (var i = 0; i < fns.length; i++) {
- res[fns[i]] = function(){};
- }
-
- return res;
- };
- }
-
- var result = oldvariable.apply(this, args);
-
- if (!result || typeof result !== "object")
- return result;
-
- if ("addClip" in result) {
- var old_fplayer_addclip = result.addClip;
- result.addClip = function() {
- if (arguments.length > 0)
- check_sources(arguments[0], els);
-
- return old_fplayer_addclip.apply(this, arguments);
- };
- }
-
- if ("setPlaylist" in result) {
- var old_fplayer_setplaylist = result.setPlaylist;
- result.setPlaylist = function() {
- if (arguments.length > 0)
- check_sources(arguments[0], els);
-
- return old_fplayer_setplaylist.apply(this, arguments);
- };
- }
-
- if ("load" in result) {
- var old_fplayer_load = result.load;
- result.load = function() {
- if (arguments.length > 0)
- check_sources(arguments[0], els);
-
- return old_fplayer_load.apply(this, arguments);
- };
- }
-
- if ("play" in result) {
- var old_fplayer_play = result.play;
- result.play = function() {
- if (arguments.length > 0)
- check_sources(arguments[0], els);
-
- return old_fplayer_play.apply(this, arguments);
- };
- }
-
- /*if ("on" in result) {
- result.on("load", function(e, api, video) {
- console.log(e);
- check_sources(video || api.video, els);
- });
- }*/
-
- return result;
- },
- after_inject: function(context) {
- context.win.flowplayer(function(api, root) {
- api.on("load", function(e, api, video) {
- context.win.flowplayer().load(video || api.video);
- });
- });
- }
- },
- // flowplayer (jQuery)
- {
- variables: {
- jquery: "flowplayer"
- },
- replace: function(context, args) {
- var newargs = Array.from(args);
- newargs.unshift(jQuery(this)[0]);
- return context.win.flowplayer.apply(this, newargs);
- }
- },
- // video.js
- {
- variables: {
- window: "videojs"
- },
- replace: function(context, args) {
- if (args.length > 0 && typeof args[0] === "string") {
- var my_el = document.getElementById(args[0]);
- if (!my_el)
- my_el = document.querySelector(args[0]);
-
- if (my_el) {
- if (my_el.src) {
- i2d_show_url("videojs", my_el.src);
- }
-
- for (var i = 0; i < my_el.children.length; i++) {
- if (my_el.children[i].tagName.toLowerCase() === "source") {
- if (my_el.children[i].src) {
- i2d_show_url("videojs", my_el.children[i].src, my_el.children[i].getAttribute("label"));
- }
- }
- }
- }
- }
-
- var parse_obj = function(obj) {
- if (obj instanceof Array) {
- for (var i = 0; i < obj.length; i++) {
- parse_obj(obj[i]);
- }
- } else if (typeof obj === "string") {
- // TODO
- } else if (typeof obj === "object") {
- if ("src" in obj) {
- var type;
- if ("type" in obj) {
- type = obj.type;
- }
-
- i2d_show_url("videojs", obj.src, type);
- }
-
- if ("sources" in obj) {
- parse_obj(obj.sources);
- }
- }
- };
-
- var result = context.oldvariable.apply(this, args);
-
- var old_videojs_src = result.src;
- result.src = function() {
- if (arguments.length > 0 && typeof arguments[0] === "object") {
- /*if ("src" in arguments[0]) {
- i2d_show_url("videojs", arguments[0].src);
- }*/
- parse_obj(arguments[0]);
- }
-
- return old_videojs_src.apply(this, arguments);
- };
-
- var old_videojs_playlist = result.playlist;
- result.playlist = function() {
- if (arguments.length > 0) {
- parse_obj(arguments[0]);
- }
-
- return old_videojs_playlist.apply(this, arguments);
- }
-
- return result;
- }
- },
- // amp
- {
- variables: {
- window: "amp"
- },
- replace: function(context, args) {
- function show_amp_source(sourceobj) {
- if ("protectionInfo" in sourceobj) {
- console.log("[amp] Cannot decode protection info");
- }
- if ("src" in sourceobj)
- i2d_show_url("amp", sourceobj.src);
- }
-
- if (args.length >= 2 && typeof args[1] === "object") {
- if ("sourceList" in args[1]) {
- for (var i = 0; i < args[1].sourceList.length; i++) {
- show_amp_source(args[1].sourceList[i]);
- }
- }
- }
-
- var result = context.oldvariable.apply(this, args);
-
- if (!result)
- return result;
-
- var old_amp_src = result.src;
- result.src = function() {
- for (var i = 0; i < args[0].length; i++) {
- show_amp_source(args[0][i]);
- }
-
- return old_amp_src.apply(this, args);
- };
-
- return result;
- }
- },
- // DJPlayer
- {
- variables: {
- window: "DJPlayer"
- },
- proto: {
- setMedia: function(context, args) {
- if (args.length > 0 && typeof args[0] === 'string') {
- i2d_show_url('DJPlayer', args[0]);
- }
-
- return context.oldvariable.apply(this, args);
- }
- }
- },
- // Bitmovin
- {
- variables: {
- window: ["bitmovin.player", "bitdash", "bitmovinPlayer"]
- },
- replace: function(context, args) {
- var result = context.oldvariable.apply(this, args);
-
- var check_progressive = function(progressive) {
- if (typeof progressive === "string") {
- i2d_show_url("bitmovin", progressive, "progressive");
- } else if (progressive instanceof Array) {
- for (var i = 0; i < progressive.length; i++) {
- check_progressive(progressive[i]);
- }
- } else if (typeof progressive === "object") {
- var str = "";
- if (progressive.label)
- str += "[" + progressive.label + "] ";
- if (progressive.bitrate)
- str += progressive.bitrate;
-
- i2d_show_url("bitmovin", progressive.url, str);
- }
- };
-
- var check_sources = function(x) {
- if (typeof x === "object") {
- if ("source" in x) {
- var sourceobj = x.source;
-
- if (sourceobj.progressive) {
- check_progressive(sourceobj.progressive);
- }
-
- if (sourceobj.dash) {
- i2d_show_url("bitmovin", sourceobj.dash, "dash");
- }
-
- if (sourceobj.hls) {
- i2d_show_url("bitmovin", sourceobj.hls, "hls");
- }
- }
- }
- };
-
- if ("setup" in result) {
- var old_bitmovin_setup = result.setup;
- result.setup = function() {
- check_sources(arguments[0]);
-
- return old_bitmovin_setup.apply(this, arguments);
- };
- }
-
- if ("load" in result) {
- var old_bitmovin_load = result.load;
- result.load = function() {
- check_sources({source: arguments[0]});
-
- return old_bitmovin_load.apply(this, arguments);
- };
- }
-
- return result;
- }
- },
- // createjs.Sound
- {
- variables: {
- window: "createjs.Sound.registerSound"
- },
- replace: function(context, args) {
- var url = null;
- var name = null;
- if (typeof args[0] === "string")
- url = args[0];
- else {
- url = args[0].src;
- if (args[0].id)
- name = args[0].id;
- }
-
- if (args[1] && typeof args[1] === "string")
- name = args[1];
-
- i2d_show_url("createjs", url, name);
-
- return context.oldvariable.apply(this, args);
- }
- },
- // createjs.Sound (via queue)
- {
- variables: {
- window: "createjs.LoadQueue"
- },
- common: {
- checkArgs: function(args) {
- var url = null;
- var name = null;
- var type = null;
-
- if (typeof args[0] === "string")
- url = args[0];
- else {
- url = args[0].src;
- if (args[0].id)
- name = args[0].id;
- type = args[0].type;
- }
-
- if (args[1] && typeof args[1] === "string")
- name = args[1];
-
- if (!type) {
- var ext = url.replace(/.*\.([a-z0-9]+)(?:[?#&].*)?$/, "$1");
- if (!ext ||
- // https://github.com/CreateJS/PreloadJS/blob/fd0f5790a4940892fa19972d6214be36f58eec85/src/preloadjs/utils/RequestUtils.js#L100
- (ext !== "ogg" &&
- ext !== "mp3" &&
- ext !== "webm")) {
- type = null;
- } else {
- type = "sound";
- }
- }
-
- if (type === "sound")
- i2d_show_url("createjs", url, name);
- }
- },
- proto: {
- loadFile: function(context, args) {
- context.common.checkArgs(args);
- return context.oldvariable.apply(this, args);
- },
- loadManifest: function(context, args) {
- if (args[0] instanceof Array) {
- for (var i = 0; i < args[0].length; i++) {
- context.common.checkArgs([args[0][i]]);
- }
- } else {
- context.common.checkArgs(args);
- }
-
- return context.oldvariable.apply(this, args);
- }
- }
- },
- // DASH.js
- {
- variables: {
- window: "dashjs.MediaPlayer"
- },
- replace: function(context, args) {
- var outer_result = context.oldvariable.apply(this, args);
-
- var oldcreate = outer_result.create;
- outer_result.create = function() {
- var result = oldcreate.apply(this, arguments);
-
- var old_attachsource = result.attachSource;
- result.attachSource = function(url) {
- i2d_show_url("dash.js", url);
- return old_attachsource.apply(this, arguments);
- };
-
- return result;
- };
-
- return outer_result;
- }
- },
- // hls.js
- {
- variables: {
- window: "Hls"
- },
- proto: {
- loadSource: function(context, args) {
- var url = args[0];
- i2d_show_url("hls.js", url);
- return context.oldvariable.apply(this, args);
- }
- }
- },
- // flv.js
- {
- variables: {
- window: "flvjs.createPlayer"
- },
- replace: function(context, args) {
- var options = args[0];
- if (options) {
- if ("url" in options) {
- i2d_show_url("flv.js", options.url);
- }
- }
- return context.oldvariable.apply(this, args);
- }
- },
- // Kollus
- {
- variables: {
- window: "KollusMediaContainer.createInstance"
- },
- replace: function(context, args) {
- var options = args[0];
-
- if (options) {
- if ("mediaurl" in options) {
- var types = [];
- if (options.isencrypted)
- types.push("encrypted");
- if (options.isaudiofiles)
- types.push("audio");
- else
- types.push("video");
- i2d_show_url("kollus", options.mediaurl, types.join(":"));
- }
- }
-
- // Replace flash with HTML5, but it doesn't work for HLS
- if (config.simpleplayers === "yes" ||
- config.simpleplayers === "flash") {
- var value = (new KollusMediaContainer(options));
- var old_launchFlashPlayer = value.launchFlashPlayer;
- value.launchFlashPlayer = function() {
- if (options.isencrypted) {
- return old_launchflashplayer.apply(this, arguments);
- } else if (options.isaudiofile) {
- return value.launchHTML5AudioPlayer();
- } else {
- return value.launchHTML5Player();
- }
- };
- value.isURLHasM3U8 = function(){return false;};
- value = value.initialize();
-
- return value;
- } else {
- return context.oldvariable.apply(this, args);
- }
- }
- },
- // Soundcloud
- {
- run_when: [{
- host: "soundcloud.com"
- }],
- urls: [
- {
- regex: /api\.soundcloud\.com\/.*?\/tracks\/[0-9]*\/streams/,
- callback: function(url) {
- var track = url.match(/\/tracks\/([0-9]*)\//);
- var parsed = JSON.parse(this.responseText);
- for (var item in parsed) {
- i2d_show_url("soundcloud", parsed[item], "[" + item + "] " + track[1]);
- }
- }
- }
- ]
- },
- // Mixcloud
- {
- run_when: [{
- host: "mixcloud.com"
- }],
- urls: [
- {
- regex: /^(?:https?:\/\/www\.mixcloud\.com)?\/graphql(?:\?.*)?$/,
- callback: function(url) {
- var mixcloud_key = atob("SUZZT1VXQU5UVEhFQVJUSVNUU1RPR0VUUEFJRERPTk9URE9XTkxPQURGUk9NTUlYQ0xPVUQ=");
- var key_length = mixcloud_key.length;
-
- try {
- var parsed = this.response;
- var viewer = parsed.data.viewer;
- if (!viewer)
- viewer = parsed.data.changePlayerQueue.viewer;
- var queue = viewer.playerQueue;
-
- var cloudcast;
- if (queue.queue) {
- var currentIndex = 0;
- if (queue.currentIndex)
- currentIndex = queue.currentIndex;
- cloudcast = queue.queue[currentIndex].cloudcast;
- }
-
- var info = cloudcast.streamInfo;
- for (var key in info) {
- var value = atob(info[key]);
- var newval = [];
- for (var i = 0; i < value.length; i++) {
- newval[i] = value.charCodeAt(i) ^ mixcloud_key.charCodeAt(i % mixcloud_key.length);
- }
- var newvalue = String.fromCharCode.apply(String, newval);
- if (newvalue.match(/^https?:\/\//)) {
- i2d_show_url("mixcloud", newvalue, "[" + key + "] " + cloudcast.slug);
- }
- }
- } catch (e) {
- }
- }
- }
- ]
- },
- // Forvo
- {
- run_when: [{
- host: "forvo.com"
- }],
- variables: {
- window: "createAudioObject"
- },
- replace: function(context, args) {
- var id = args[0];
- var mp3 = args[1];
- var ogg = args[2];
-
- i2d_show_url("forvo", mp3, "mp3");
- i2d_show_url("forvo", ogg, "ogg");
-
- return context.oldvariable.apply(this, args);
- }
- },
- // Twitter
- {
- run_when: [{
- host: "twitter.com",
- url_regex: /:\/\/[^/]*\/i\/videos/
- }],
- onload: function() {
- var pc = document.getElementById('playerContainer');
- if (!pc) {
- return;
- }
-
- var config = pc.getAttribute('data-config');
- if (!config) {
- return;
- }
-
- var config_parsed = JSON.parse(config);
-
- if ("video_url" in config_parsed) {
- i2d_show_url('twitter', config_parsed.video_url);
- }
- }
- },
- // TODO: Reimplement vine
-
- // jPlayer
- {
- variables: {
- jquery: "jPlayer"
- },
- replace: function(context, args) {
- if (args.length > 0 && args[0] === "setMedia") {
- if (args.length > 1) {
- if (typeof args[1] === "object") {
- for (var i in args[1]) {
- if (i === "title" ||
- i === "duration" ||
- i === "track" /* for now */ ||
- i === "artist" ||
- i === "free")
- continue;
-
- i2d_show_url("jPlayer", args[1][i], i);
- }
- } else if (typeof args[1] === "string") {
- i2d_show_url("jPlayer", args[1]);
- }
- }
- }
-
- return context.oldvariable.apply(this, args);
- }
- },
- // amazingaudioplayer
- {
- variables: {
- jquery: "amazingaudioplayer"
- },
- replace: function(context, args) {
- var result = context.oldvariable.apply(this, args);
-
- function add_source_obj(x) {
- type = "";
- if ("type" in x) {
- type = x.type;
- }
-
- i2d_show_url("amazingaudioplayer", x.src, type);
- }
-
- function add_source(x) {
- if (x instanceof Array) {
- for (var i = 0; i < x.length; i++) {
- add_source_obj(x[i]);
- }
- } else {
- add_source_obj(x);
- }
- }
-
- var audioplayer = jQuery(this).data("object").audioPlayer;
- if (audioplayer.audioItem) {
- add_source(audioplayer.audioItem.source);
- }
-
- var oldload = audioplayer.load;
- audioplayer.load = function(item) {
- if ("source" in item) {
- add_source(item.source);
- }
-
- return oldload.apply(this, arguments);
- };
-
- return result;
- }
- },
- // jPlayer{Audio,Video}
- {
- variables: {
- jquery: ["jPlayerAudio", "jPlayerVideo"]
- },
- proto: {
- setMedia: function(context, args) {
- var e = args[0];
- var label = "cleanaudioplayer";
- if (oldvariablename === "jPlayerVideo")
- label = "cleanvideoplayer";
-
- var absolute = this._absoluteMediaUrls(e);
- jQuery.each(this.formats, function(a, o) {
- i2d_show_url(label, absolute[o]);
- });
- return context.oldvariable.apply(this, args);
- }
- }
- }
- ];
-
- var props = {};
-
- function defineprop(lastobj_win, lastobj_props, oursplit) {
- // TODO: Implement window_alias
- if (!lastobj_win || !lastobj_props) {
- console.log("lastobj_win === null || lastobj_props === null");
- return;
- }
-
- if (!(oursplit in lastobj_props)) {
- console.log(oursplit + " not in lastobj_props");
- return;
- }
-
- var our_obj = lastobj_win[oursplit] || undefined;
- var our_prop = lastobj_props[oursplit];
-
- var recurse = function() {
- for (var key in our_prop) {
- if (!key.match(/^\$\$[A-Z]+$/)) {
- defineprop(our_obj, our_prop, key);
- }
- }
- };
-
- if (!our_prop.$$INJECTED) {
- if (our_obj !== undefined) {
- if (our_prop.$$CHECK) {
- if (!our_prop.$$CHECK(our_obj)) {
- return;
- }
- }
-
- if (our_prop.$$PROCESS) {
- lastobj_win[oursplit] = our_prop.$$PROCESS(our_obj);
- our_obj = lastobj_win[oursplit];
- }
-
- recurse();
- }
-
- try {
- defineProp(lastobj_win, oursplit, {
- get: function() {
- return our_obj;
- },
- set: function(n) {
- if (n === our_obj)
- return;
-
- //console.log(oursplit + " = ", n);
-
- if (our_prop.$$PROCESS)
- our_obj = our_prop.$$PROCESS(n);
- else
- our_obj = n;
-
- recurse();
- }
- });
- our_prop.$$INJECTED = true;
- } catch (e) {
- console.error(e);
- }
- }
- }
-
- function check_injection(injection, variable, variablename) {
- if ("check" in injection) {
- if (!injection.check(variable)) {
- console.log("[i2d] Not injecting " + variablename);
- return false;
- }
- }
-
- return true;
- }
-
- function apply_injection(injection, variable, variablename, win) {
- if (!check_injection(injection, variable, variablename))
- return variable;
-
- console.log("[i2d] Injecting " + variablename);
-
- if ("replace" in injection) {
- var context = {
- oldvariable: variable,
- oldvariablename: variablename,
- win: win,
- common: injection.common
- };
-
- var result = function() {
- return injection.replace.bind(this)(context, arguments);
- };
-
- for (var key in variable) {
- result[key] = variable[key];
- }
-
- return result;
- } else if ("proto" in injection) {
- for (var proto in injection.proto) {
- (function(proto) {
- var context = {
- oldvariable: variable.prototype[proto],
- oldvariablename: proto,
- win: win,
- common: injection.common
- };
-
- variable.prototype[proto] = function() {
- return injection.proto[proto].bind(this)(context, arguments);
- };
- })(proto);
- }
- }
-
- return variable;
- }
-
- function do_injection(injection) {
- if ("run_when" in injection) {
- var run_when = injection.run_when;
- if (!(run_when instanceof Array)) {
- run_when = [run_when];
- }
-
- for (var i = 0; i < run_when.length; i++) {
- if ("host" in run_when[i]) {
- if (!check_host(run_when[i].host))
- return false;
- }
-
- if ("url_regex" in run_when[i]) {
- if (!window.location.href.match(run_when[i].url_regex))
- return false;
- }
- }
- }
-
- var win = get_window();
-
- function do_window_injection(winvar) {
- if (!(winvar instanceof Array))
- winvar = [winvar];
-
- for (var i = 0; i < winvar.length; i++) {
- (function() {
- var varname = winvar[i];
- var dotsplit = varname.split(".");
- var lastobj = win;
-
- injected.push(dotsplit[0]);
-
- var process = function(v) {
- return apply_injection(injection, v, dotsplit[dotsplit.length - 1], win);
- };
-
- var check = function(v) {
- return check_injection(injection, v, dotsplit[dotsplit.length - 1]);
- };
-
- var lastprop = props;
- for (var x = 0; x < dotsplit.length; x++) {
- var oursplit = dotsplit[x];
- if (!lastprop[oursplit])
- lastprop[oursplit] = {};
-
- lastprop[oursplit].$$INJECTED = false;
-
- if (x === dotsplit.length - 1) {
- lastprop[oursplit].$$PROCESS = process;
- lastprop[oursplit].$$CHECK = check;
- }
-
- lastprop = lastprop[oursplit];
- }
-
- /*defineprop(lastobj, dotsplit, 0, function(v) {
- return apply_injection(injection, v, dotsplit[dotsplit.length - 1], win);
- });*/
- })();
- }
- }
-
- if ("variables" in injection) {
- if ("window" in injection.variables) {
- var winvar = injection.variables.window;
-
- do_window_injection(winvar);
-
- /*if (!(winvar instanceof Array))
- winvar = [winvar];
-
- for (var i = 0; i < winvar.length; i++) {
- var varname = winvar[i];
- var dotsplit = varname.split(".");
- var lastobj = win;
-
- defineprop(lastobj, dotsplit, 0, function(v) {
- return apply_injection(injection, v, dotsplit[dotsplit.length - 1], win);
- });
- }*/
- }
-
- if ("jquery" in injection.variables) {
- var jqvar = injection.variables.jquery;
- if (!(jqvar instanceof Array))
- jqvar = [jqvar];
-
- var winvar = [];
- for (var i = 0; i < jqvar.length; i++) {
- winvar.push("jQuery.fn." + jqvar[i]);
- }
-
- do_window_injection(winvar);
- }
- }
-
- if ("onload" in injection) {
- i2d_onload(injection.onload);
- }
-
- if ("urls" in injection) {
- for (var i = 0; i < injection.urls.length; i++) {
- inject_url(injection.urls[i].regex, injection.urls[i].callback);
- }
- }
- }
-
- function do_all_injections() {
- for (var i = 0; i < injections.length; i++) {
- do_injection(injections[i]);
- }
-
- var win = get_window();
- for (var key in props) {
- defineprop(win, props, key);
- }
- }
- do_all_injections();
-
-
- /*window.addEventListener("afterscriptexecute", function(e) {
- i2d_main(e.target);
- });*/
-
- var process_raw_tag = function(el) {
- var basename = "raw ";
-
- if (el.tagName.toLowerCase() === "video") {
- basename += "video";
- } else {
- basename += "audio";
- }
-
- if (el.id)
- basename += ": #" + el.id;
-
- var show_updates = function() {
- if (el.src)
- i2d_show_url(basename, el.src);
-
- for (var x = 0; x < el.children.length; x++) {
- if (el.children[x].tagName.toLowerCase() !== "source" &&
- el.children[x].tagName.toLowerCase() !== "track") {
- continue;
- }
-
- var type = "";
- if (el.children[x].type)
- type += "[" + el.children[x].type + "]";
-
- if (el.children[x].label)
- type += "[" + el.children[x].label + "]";
-
- if (el.children[x].srclang)
- type += "[" + el.children[x].srclang + "]";
-
- if (el.children[x].kind)
- type += "(" + el.children[x].kind + ")";
-
- if (el.children[x].src)
- i2d_show_url(basename, el.children[x].src, type);
- }
- };
-
- var observer = new MutationObserver(show_updates);
- observer.observe(el, { attributes: true, childList: true });
-
- show_updates();
- };
-
- var process_el = function(el) {
- if (el.nodeName === "SCRIPT") {
- //i2d_main(el);
- } else if (el.nodeName === "VIDEO" ||
- el.nodeName === "AUDIO") {
- process_raw_tag(el);
- }
-
- if (el.children) {
- for (var i = 0; i < el.children.length; i++) {
- process_el(el.children[i]);
- }
- }
- };
-
- var script_observer_cb = function(mutations, observer) {
- for (var i = 0; i < mutations.length; i++) {
- if (mutations[i].addedNodes) {
- for (var x = 0; x < mutations[i].addedNodes.length; x++) {
- var addednode = mutations[i].addedNodes[x];
- process_el(addednode);
- }
- }
- if (mutations[i].removedNodes) {
- for (var x = 0; x < mutations[i].removedNodes.length; x++) {
- if (mutations[i].removedNodes[x].nodeName === "SCRIPT") {
- //i2d_main(mutations[i].removedNodes[x]);
- }
- }
- }
- }
- };
-
- var script_observer = new MutationObserver(script_observer_cb);
-
- script_observer.observe(document, {childList: true, subtree: true});
-
- i2d_onload(function() {
- var get_raws = function() {
- var audios = [].slice.call(document.getElementsByTagName("audio"));
- var videos = [].slice.call(document.getElementsByTagName("video"));
- var els = Array.prototype.concat(audios, videos);
-
- for (var i = 0; i < els.length; i++) {
- var basename = "raw ";
- var el = els[i];
-
- if (el.tagName.toLowerCase() === "video") {
- basename += "video";
- } else {
- basename += "audio";
- }
-
- if (el.id)
- basename += ": #" + el.id;
-
- var show_updates = function() {
- if (el.src)
- i2d_show_url(basename, el.src);
-
- for (var x = 0; x < el.children.length; x++) {
- if (els[i].children[x].tagName.toLowerCase() !== "source" &&
- els[i].children[x].tagName.toLowerCase() !== "track") {
- continue;
- }
-
- var type = "";
- if (el.children[x].type)
- type += "[" + el.children[x].type + "]";
-
- if (el.children[x].label)
- type += "[" + el.children[x].label + "]";
-
- if (el.children[x].srclang)
- type += "[" + el.children[x].srclang + "]";
-
- if (el.children[x].kind)
- type += "(" + el.children[x].kind + ")";
-
- if (el.children[x].src)
- i2d_show_url(basename, el.children[x].src, type);
- }
- };
-
- var observer = new MutationObserver(show_updates);
- observer.observe(el, { attributes: true, childList: true });
-
- show_updates();
- }
- };
-
- //get_raws();
-
- //i2d_main();
- });
- })();