// ==UserScript==
// @name Stop Overzealous Embedding Twitter
// @description Tries to turn embedded Twitter videos into links
// @include *
// @exclude *.twitter.com/*
// @version 5
// ==/UserScript==
var risky_tags = ["object", "embed", "iframe"];
function init(risky_elements) {
var i, j, k, index;
var video_id, video_url, video_link;
var risky_attributes, risky_node;
var bad_elements = [];
var bad_ids = [];
if (risky_elements === null) {
risky_elements = document.querySelectorAll(risky_tags.join(", "));
}
for (j = 0; j < risky_elements.length; j++) {
if (risky_tags.indexOf(risky_elements[j].nodeName.toLowerCase()) == -1) {
continue;
}
index = 0;
risky_attributes = risky_elements[j].attributes;
for (k = 0; k < risky_attributes.length; k++) {
risky_node = risky_attributes[k].nodeValue;
if (risky_node.indexOf("player.vimeo.com") >= 0) {
risky_elements[j].style.display = "none";
if (risky_node.indexOf("/video/") >= 0) {
index = risky_node.indexOf("/video/") + 7;
}
if (index > 0) {
video_id = risky_node.substring(index, index + 9);
bad_elements.push(risky_elements[j]);
bad_ids.push(video_id);
}
break;
}
}
}
for (i = 0; i < bad_ids.length; i++) {
video_id = bad_ids[i];
video_url = "https://player.vimeo.com/video/" + video_id;
video_link = document.createElement("a");
video_link.innerHTML = video_url;
video_link.setAttribute("href", video_url);
bad_elements[i].parentNode.replaceChild(video_link, bad_elements[i]);
}
}
var init_callback = function (mutations) {
if (init_callback.timer) return;
var i, j;
for (i = 0; i < mutations.length; i++) {
risky_elements = [];
mutation_nodes = mutations[i].addedNodes;
if (!mutation_nodes) {
continue;
}
for (j = 0; j < mutation_nodes.length; j++) {
if (mutation_nodes[j].nodeName && risky_tags.indexOf(mutation_nodes[j].nodeName.toLowerCase()) !== -1) {
risky_elements.push(mutation_nodes[j]);
}
}
init_callback.timer = setTimeout(init, 200, risky_elements);
}
init_callback.timer = false;
};
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
observer = new MutationObserver(init_callback);
observer.observe(document.body, {childList: true, subtree: true, attributes: false, characterData: false});
init(null);