Skip to content

Instantly share code, notes, and snippets.

@galaydaroman
Last active January 29, 2016 21:20
Show Gist options
  • Save galaydaroman/c4fec0a8d7c82e762a92 to your computer and use it in GitHub Desktop.
Save galaydaroman/c4fec0a8d7c82e762a92 to your computer and use it in GitHub Desktop.
Userscripts
// ==UserScript==
// @name Remove YouTube advertising
// @version 0.1
// @description try to take over the world!
// @author You
// @include https://*.youtube.com/*
// @include https://youtube.com/*
// @include http://*.youtube.com/*
// @include http://youtube.com/*
// @grant unsafeWindow
// ==/UserScript==
/* jshint -W097 */
'use strict';
var ads = [
'supported_without_ads',
'ad3_module',
'adsense_video_doc_id',
'allowed_ads',
'baseUrl',
'cafe_experiment_id',
'afv_inslate_ad_tag',
'advideo',
'ad_device',
'ad_channel_code_instream',
'ad_channel_code_overlay',
'ad_eurl',
'ad_flags',
'ad_host',
'ad_host_tier',
'ad_logging_flag',
'ad_preroll',
'ad_slots',
'ad_tag',
'ad_video_pub_id',
'aftv',
'afv',
'afv_ad_tag',
'afv_instream_max',
'afv_ad_tag_restricted_to_instream',
'afv_video_min_cpm',
'prefetch_ad_live_stream'
];
// unwraps the element so we can use its methods freely
function unwrap(elem) {
if (elem) {
if ( typeof XPCNativeWrapper === 'function' && typeof XPCNativeWrapper.unwrap === 'function' ) {
return XPCNativeWrapper.unwrap(elem);
} else if (elem.wrappedJSObject) {
return elem.wrappedJSObject;
}
}
return elem;
}
function setPref(str, values) {
var i, value, rQuery;
for (i = 0; value = values[i]; i += 1) {
// (several lines for readability)
rQuery = new RegExp('[?&]?' + value[0] + '=[^&]*');
str = str.replace(rQuery, '') + '&' + value[0] + '=' + value[1];
str = str.replace(/^&+|&+$/g, '');
}
return str;
}
function getPlayer() {
var doc = uw.document;
return doc.getElementById('c4-player') || doc.getElementById('movie_player');
}
var buildClassAttrHandler = function(handler) {
return function attrModifierHandler(mutations) {
mutations.forEach(function(mutation) {
if (mutation.attributeName === 'class') handler(mutation);
})
}
}
var uw = typeof unsafeWindow !== 'undefined' ? unsafeWindow : unwrap(window);
var observerPlayer = new WebKitMutationObserver(buildClassAttrHandler(function(e) {
var classAttr = e.target.getAttribute('class');
if (classAttr && classAttr.match(/\bad-showing\b/)) {
var skip = uw.document.getElementsByClassName('videoAdUiSkipButton');
if (skip.length) {
var eventClick = new MouseEvent('click', {
view: uw,
bubbles: false,
cancelable: false,
target: skip[0],
currentTarget:skip[0],
srcElement: skip[0],
buttons: 1
});
uw.console.log('Click to skip AD');
if (!skip[0].dispatchEvent(eventClick)) {
skip[0].click();
uw.console.log(' ----> test click');
}
}
}
}));
var player = null;
var processAd = function(p) {
player = p;
uw.player = player;
if (player) {
observerPlayer.observe(player, {attributes: true, subtree: false});
console.log('Mutaition player added');
var fv = player.getAttribute('flashvars');
if (fv) {
fv = fv.replace(new RegExp('(&|[&?])?(' + ads.join('|') + ')=[^&]*', 'g'), '');
fv = setPref(fv, [['vq', 'highres']]);
player.setAttribute('flashvars', fv);
}
}
}
document.getElementById('player').addEventListener("DOMNodeInserted", function(e) {
var _player = getPlayer();
if (e.relatedNode.id == 'movie_player' && _player && player !== _player) {
processAd(_player);
}
}, false);
processAd(getPlayer());
// ****************************
var w = uw || window;
var videos = w.document.getElementsByTagName('video');
if (videos.length) {
var vidos = videos[0];
if (!w) debugger;
w.addEventListener('keydown', function(event) {
if (event.keyCode == 0x1B) {
if (Math.abs(vidos.currentTime - vidos.duration) < 0.05 && vidos.paused) {
vidos.currentTime = 0;
vidos.play();
} else {
vidos.currentTime = Math.max(0, vidos.duration - 0.2);
}
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment