Greasy Fork is available in English.
Bypass age/content restrictions on YouTube
// ==UserScript==
// @name YouTube Restriction Bypass
// @namespace http://greasyfork.icu/en/users/305931-emerson-bardusco
// @version 1.7
// @description Bypass age/content restrictions on YouTube
// @author EmersonxD
// @match *://*.youtube.com/*
// @grant none
// @run-at document-start
// @license MIT
// ==/UserScript==
(function() {
'use strict';
var config = {
proxyHost: 'https://youtube-proxy.zerody.one',
validStatuses: ['OK', 'LIVE_STREAM_OFFLINE'],
unlockableStatuses: ['AGE_VERIFICATION_REQUIRED', 'CONTENT_CHECK_REQUIRED']
};
var nativeXHR = XMLHttpRequest.prototype.open;
var nativeJSON = JSON.parse;
function log() {
var args = Array.prototype.slice.call(arguments);
console.log('[Bypass] ' + args.join(' '));
}
function isGoogleVideo(url) {
return url.host.indexOf('.googlevideo.com') > -1;
}
function needsProxy(url) {
return url.search.indexOf('gcr=') > -1;
}
function buildProxyUrl(url) {
return config.proxyHost + '/direct/' + btoa(url.href);
}
function modifyRequest(url) {
if (!isGoogleVideo(url)) return url.href;
if (!needsProxy(url)) return url.href;
try {
return buildProxyUrl(url);
} catch(e) {
log('Error modifying request:', e.message);
return url.href;
}
}
function unlockPlayer(data) {
var status = data.playabilityStatus;
if (status && config.unlockableStatuses.indexOf(status.status) > -1) {
status.status = 'OK';
status.reason = '';
log('Player unlocked');
}
return data;
}
function unlockResponse(data) {
var content = data.contents;
if (content && content.twoColumnWatchNextResults && content.twoColumnWatchNextResults.secondaryResults) {
content.twoColumnWatchNextResults.secondaryResults = {
secondaryResults: {
results: []
}
};
log('Sidebar cleaned');
}
return data;
}
function processJSON(data) {
try {
return unlockResponse(unlockPlayer(data));
} catch(e) {
log('Processing error:', e.message);
return data;
}
}
XMLHttpRequest.prototype.open = function(method, url) {
var newUrl = modifyRequest(new URL(url));
var args = [method, newUrl || url].concat(Array.prototype.slice.call(arguments, 2));
nativeXHR.apply(this, args);
};
JSON.parse = function(text) {
return processJSON(nativeJSON.call(this, text));
};
log('Initialized');
})();