NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Simple Video Audio Blocker // @version 1.7.2 // @description Block loading of videos/audio (flash or html5) at the site being visited. Click to enable once, alt-c to enable for site permanently. // @include * // @license GPL-3.0 // @updateURL https://openuserjs.org/meta/slow!/Simple_Video_Audio_Blocker.meta.js // @run-at document-start // @require https://code.jquery.com/jquery-3.2.1.js // @require https://code.jquery.com/ui/1.12.1/jquery-ui.js // @require https://raw.githubusercontent.com/SloaneFox/code/master/gm4-polyfill-1.0.1.js // @require https://raw.githubusercontent.com/SloaneFox/code/master/sfs-utils-0.1.4.js // @grant GM_getValue // @grant GM_setValue // @grant GM.getValue // @grant GM.setValue // @grant GM_registerMenuCommand // ==/UserScript== try{ console.log("Start of svab script, document.readyState:",document.readyState,"vids?:",document.getElementsByTagName("video").length); var allow_site, pagekey, menu, orig_vol=0.33; if (!environInit(main.bind(this))) document.addEventListener("DOMContentLoaded",main); async function main(e) {try{ await init_globs(); if(allow_site) { console.info("Site has previously been given permission to run videos."); setupUI("allowed"); return; } var vids=$("video"); // See mdn obj HTMLMediaElement. vids.each(pauseVideo); log("Handle vids",document.readyState,"#vids",vids.length); if(vids.length) { setupStyle(); setupUI("vids"); let doc=$(document); doc.keydown(function(e){ if(e.which==27) { $(".svab-overlay").click(); doc.off("keydown"); } }); } vids.each(blockVids); } catch(e){logError("Error in main()",window.parent==window);} }; function blockVids(i,vid) { var jvid=$(vid); //log("Vid readyState:",vid.readyState,"Vid i=",i,objInfo(jvid),", prev:",objInfo(jvid.prev()),", next",objInfo(jvid.next()),"src",jvid.attr("src")); jvid.on("playing volumechange",function(e) {try{ this.pause(); var vol=this.volume; log("Playing/vol events",vol); if(vol!=0) orig_vol=vol;; pauseVideo(0,this); } catch(e){logError("playing event handler",e);} }); overlayVid(jvid); }; function pauseVideo(i,v) { //$(v).on("playing",e=>v.pause()); v.volume=0; v.autoplay=false; v.defaultMuted=true; var timeranges=v.seekable, nRanges=timeranges.length; if(v.readyState<3) {return;} // needs 3 to be playable, that at at min 2 frames. v.pause(); v.currentTime=v.duration-1; log("pauseVideo(). Got timeranges",timeranges,"len",nRanges, "readystate:",v.readyState,"Video duration/seekend",v.duration,"/",v.seekable.end(nRanges-1)); // duration and end same, a float in seconds } function overlayVid(jv,v=jv[0]) { jv.addClass("svab-target"); //log("is parent visible:",jv.parent().is(":visible")); jv.parent().addClass("svab-container"); jv.after("<div class=svab-overlay/>"); var overlay=$(".svab-overlay"); overlay.click({jv:jv,v:v},clear); overlay.on("mouseover mouseout mouseenter mousemove",e=>false); jv.parentsUntil("body").each((i,el)=>{ var jel=$(el); var opacity=jel.css("opacity"), width=jel.width(),height=jel.height(), changed; if(opacity!=1 ) { jel.css("opacity",1); changed=true;} if(width==0||height==0) { jel.width("90%");jel.height("90%"); changed=true; } if(changed) { jel.attr("svab_change",opacity+"-"+width+"-"+height); //log("changed",opacity,width,height,jel[0]); } }); } function clear (e){try{ var jv=e.data.jv,v=e.data.v; //log("Click on overlay. this is:", this," e ",e,"vol:",v.volume); jv.off("playing volumechange"); v.currentTime=0; v.muted=false; v.volume=orig_vol; setTimeout(x=>v.play(),1000); // why? jv.removeClass("svab-target"); jv.parent().removeClass("svab-container"); $(this).remove(); jv.click(); } catch(e){logError("clearing block",e);}} function setupStyle() { var img="data:image/gif;base64,R0lGODlhFgAWAOfQAAABAAACAAAHCg4HBRoeICEjICIkITJETj1CRDZESTNFTzRGUEFFRzlHTDZIUjdJUzhKVDpLVjtNV0BOUz1PWUlNTz5QWj9RW0FTXUZUWkNVX0RWYE9UVkRXYUpYXkdZZExbYU1cYktdaE9eY05ga09hbFJhZlNiZ01jc1FjbVRjaFZkalRncVNqeltpb2NoaltqcE9tfFFvfl5tc1dufmdrblxueV1velRygWRzeV10hGV0el91hmZ1e2B2h2d2fHB0d1p5iFt6iWZ4g2p5f2h6hWx7gXB/hXGAhnh/h3KBh3uAg3qBiXSDiXGEj3WEinaFi3CGl3eGjHuKkH6KioKJkX2MknqNmXuOmn+OlICPlYGQloOSmIaSk4STmYWUmoaVm4eWnIiXnYSYo4mYnpKXmYqZoIaapYuaoYibpoyboo2co5Obo46epI+fpZCgppGhp5WhopOjqZSkqpilpZOmspamrJenrZqqsJursZyssp2ttKOstJ6utZ+vtqGwt6KxuKOzuaqyuqS0uqW1u66zta21vae3vbG2uK+3v6m5v7C4wKq6wLO4u7G5wq+8va29xLa7vrO8xK6+xbG+v7W+xrTAwba/x7m/wbnBybzBw73CxLXFy77Dxb/ExrfHzcDFyLjIzsLHysPIy8DJ0cTJzMXKzcTN1cfNz8bO1snO0MrP0cjQ2MvQ0snR2szR1MrS283S1c7T1s/U19DV2NHX2dLY2tTZ29Xa3Nbb3dfc39jd4Nne4drf4tvg49zi5N/k5uDl6OPo6+Tp7OXq7ebs7uft7+nu8Ovw8+7w7ezx9PL08fP18vD2+Pb49Pf59v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEKAP8ALAAAAAAWABYAAAj+AP8JHCgQVy1WqUJNIsiQ4a1dwYYVE8aLlaI6DQmykjXMmbNlypAZKwbs05goGTmxUvZMmTFhwHzx2qWrFyksQRgqIuWM2TFhzXjdqiXrVatVqzo58UEQEDFmxoLx4mDrVyxVpkSB8qQJD4+BaVI5KybVVwADhWppzVQpUiJBWGgIPHOMWDBfuHYFCDBgCS1PlhYZGqTHzY1/QvIku4trlq29eytMqkQIkJ47bIaw0HGImK9ctV7Jgry3AB1IevDIEVMkBY5JwHLRioVqFem9AmromdOGyxASMgzxovVKlShTt/cy0POGjJUcImLImdUK1ahOoJIDCfRGDZcnLj6ytLhSapTWS5lIE6jyp42aMFOMmOjwzwYiTJssPZIEGcEdPG2QAUYWSsxA3z8oWNHIIoscwsheL+wWYBhbSLHDCBcMlIIYfPzxhx4BUEGIHGsIqAUUP6hAAUEisFBGHHbYwcQdcJTIhRVN7LCCBREwtEEJSXTxhRtheKHFFE0QMUMIEzyQEQYauGCEEkocYUQPM5yQAQQNZDSQBBZ4AMIIIGQwgQMJeNmQAw4soMABaWYUEAA7"; var svab_style=GM_addStyle(` .svab-container { width: 100%;height: 100%; position: relative !important; z-index:2147483635 !important;} .svab-target, .svab-overlay { width: 100%; height: 100%; position: absolute; top: 0; left: 0; z-index:2147483640; } .svab-overlay { z-index: 2147483647 !important; } `); if(svab_style) svab_style.id="svab-style"; else log("Old addStyle",GM_addStyle.toString()); GM_addStyle(` .svab-overlay { background:url(`+img+`); border:6px double silver; box-sizing: border-box; min-width:50px;min-height:50px; background-repeat: no-repeat;background-position: center; cursor:pointer; background-color: #381714; display: inline-block; } `); // Outline of HTML: // <div class="svab-container"> // <div class="svab-target">a</div> // <div class="svab-overlay background=..."> </div> // </div> } //End setupStyle() function setupUI() { menu=GM.registerMenuCommand("Toggle video blocking for website [on]",function(){try{ allow_site^=true; GM.setValue(pagekey,allow_site); if(allow_site) $(".svab-overlay").click(); else $("video").each(blockVids); setLabel(); } catch(e){logError("toggle vid",e);} }); setLabel(); // GM.registerMenuCommand("Adjust",async function(){ // if (!this.reply) this.reply=await GM.getValue("adjust_reply",""); // while(true) { // var reply=prompt("Give cmd",this.reply||""); // if(!reply) break; // alert(eval(reply)); // this.reply=reply; // GM.setValue("adjust_reply",reply); // } // }); } function setLabel() { if(menu && menu.tagName) { var m=$(menu), label=m.attr("label"); label=label.replace(/\[.*/, allow_site? "[off]." : "[on]."); m.attr("label",label); } } async function init_globs() { pagekey=location.host; allow_site=await GM.getValue(pagekey,false); } } catch(e){ console.log("SVAB script",e);} // function fastEvent() { // $("video").each((i,el)=>{ // el.defaultMuted=true;el.volume=0; el.autoplay=false; el.pause(); // el.addEventListener("playing",function(e){this.pause();}); // el.addEventListener("volumechange",function(e){ // if(this.volume==0) return; // this.volume=0; this.pause(); // log(this,"=this========== Volume changed to:",v,this.volume); //usu. vol changes to 1. // }); // }); // console.log("DOMContentLoaded event #vids:",$("video").length); // } function environInit(cback) { // returns false if GM environment is there, otherwise it calls main when ready and immediately returns true. this.plat_chrome=false; this.plat_msedge=false; //chrome standalone, ie, not under tamper in chrome. // this.plat_msedge=/Edge[\d./]+$/i.test(navigator.userAgent); if (/Chrome/.test(navigator.userAgent)) this.plat_chrome=true; this.plat_mac = /^Mac/.test(navigator.platform); try { this.nonGMmode= (typeof GM == "undefined"); } // || "Barychelidae"!=GM_getValue("arachnoidal","Barychelidae"); } catch(e) { this.nonGMmode=true; }; //eg, chromium stadalone //this.nonjQ = !window.jQuery || parseFloat(jQuery.fn.jquery) < 3.1; if (nonGMmode){ // chromium bare, ie, w/o tamper. console.info("SVAB userscript in non GM_ mode at "+location.href, "typeof GM:",typeof GM, "nonGMmode",nonGMmode); this.unsafeWindow=window; this.old_GM_getValue=this.GM_getValue; try { localStorage["anothervariable"]=32; } catch(e) { window.nostorage=true; if(!iframe) console.error("No local storage, no GM storage, use Tampermonkey to include this script on page:",location.href); window.localStorage={}; } if(!window.nostorage) console.log("Have local storage",localStorage.anothervariable); this.GM_getValue=function(a,b) { return localStorage[a]||b; }; this.GM_setValue=function(a,b) { localStorage[a]=b; }; this.GM_getResourceURL=function(url) { var ext="Dbl"; if (url.endsWith("Orig")) ext=".orig"; else if (url.endsWith("Xsm")) ext="ExSm"; else if (url.endsWith("Trpl")) ext="Trpl"; return "https://raw.githubusercontent.com/SloaneFox/imgstore/master/whiteCurtains"+ ext +".jpg"; }; //this.GM_registerMenuCommand=x=>null; this.GM_addStyle=function(cssSheet) { $("head").append("<style>"+cssSheet+"</style>"); }; this.uneval=function(x) { return "("+JSON.stringify(x)+")"; }; //Diff is that uneval brackets string and json excludes code only data allowed in json. var xhr_queue=[], xhr=new XMLHttpRequest(); xhr.onload=x=> { //arrow function means this remains window not xhr (as a function would). console.log(xhr.responseURL,"onload to eval in window, jQuery in window? ",!!window.jQuery,!!window.$,!!this.jQuery); var synop=(xhr.response||"").substr(0,40); try { eval.call(window,xhr.response); } catch(e) { console.error("Can't eval Error:"+e,". Response:",xhr.response?xhr.response.substr(0,60)+"[60chars]":"No response text",x,xhr,", Queue:",xhr_queue); } if (xhr_queue.length) { xhr.open('GET', xhr_queue.shift()); xhr.send(); } else cback(); ////////////////// // else if (!iframe) main.call(window); ////////////////// }; xhr.onerror=e=> { console.log("W/e XHR Error: "+e,", E:",e,"XHR:",xhr,"After error queue:",xhr_queue); if (xhr_queue.length) xhr.open('GET', xhr_queue.shift()); xhr.send(); }; var jq_versions_prior={ core: parseFloat(this.$ && this.$.fn && this.$.fn.jquery) || 0, ui: parseFloat(this.$ && this.$.ui && this.$.ui.version) || 0 }; if(jq_versions_prior.core < 1.7) xhr_queue.push("https://code.jquery.com/jquery-1.7.2.js"); if(jq_versions_prior.ui < 1.12) xhr_queue.push("https://code.jquery.com/ui/1.12.1/jquery-ui.js"); xhr_queue.push("https://raw.githubusercontent.com/SloaneFox/code/master/gm4-polyfill.js"); xhr_queue.push("https://raw.githubusercontent.com/SloaneFox/code/master/gm-popup-menus-1.3.7.js"); xhr_queue.push("https://raw.githubusercontent.com/SloaneFox/code/master/sfs-utils-0.1.4.js"); xhr.open('GET', xhr_queue.shift()); xhr.send(); return true; } else return false; //if (nonGM || nonJQ) }//End environInit()