
Download YouTube MP4 Downloader for Firefox. View and Download YouTube videos in raw MP4 format. Get notifications about available videos and formats. // ==UserScript== // @name Download YouTube Videos as MP4 // @description Adds a button that lets you download YouTube videos. // @homepageURL https://github.com. Sep 22, 2017 - Yesterday I tried to use 'Download YouTube videos as mp4' extension by only to find it wasn't. Download32 is source for free xnxx videos downloader shareware, freeware download - free music videos finder, SHAREAZA, WinX Free AVI to MP4 Converter, WinX Video Converter, Meditation Videos - Relaxation, etc. Freeware Keywords: Convert Video To Iphone Xs Free - Free Audio Converter - Free Download Youtube Videos - Free Mkv Converter.
Free Youtube To Mp4 Download
Download Free Youtube Videos Mp4
- // @name Download YouTube Videos as MP4
- // @description Adds a button that lets you download YouTube videos.
- // @homepageURL https://github.com/gantt/downloadyoutube
- // @version 1.8.8
- // @namespace http://googlesystem.blogspot.com
- // @include https://www.youtube.com/*
- // @exclude https://www.youtube.com/embed/*
- // @match https://www.youtube.com/*
- // @match http://s.ytimg.com/yts/jsbin/html5player*
- // @match https://s.ytimg.com/yts/jsbin/html5player*
- // @match https://manifest.googlevideo.com/*
- // @match https://*.googlevideo.com/videoplayback*
- // @match https://*.youtube.com/videoplayback*
- // @connect ytimg.com
- // @grant GM_getValue
- // @run-at document-end
- // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAB3RJTUUH2wMOCgIoGUYEAQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAAGSUExURfi/JO/v797e3sbGxq2traWlpZSUlJycnNbW1oyEhIRaWow5OZQhIZwYGKUQEKUICK0ICJQxMYxKSoxzc4x7e4RCQpQYGKUAAK0AALUAAL0AAK0QEIxra5QpKa0YGIxSUsYAAKUhIZR7e87Ozr0ICJRSUr29vYxjY6U5OaUpKa0hIb21tZwAALUICO/Ozu/GxqUxMZSEhLUYGO/W1r0YGKVCQpQQEL0pKffe3vfW1pxra5Q5OcZCQvfn585CQr2trZx7e8ZSUs5SUq05Oc5jY9ZjY84AAKWMjM5zc957e60pKdaMjOelpbWcnLWUlLVCQsYYGMYICNbOzpQICMYhIbV7e5xaWt6cnPfv79bGxt6lpe+9vc5KSs6lpb0xMc6EhM69vbUxMbUhIb1aWs61tcZaWuecnMYxMb1KSsZjY96UlNa1td7W1r17e9a9vZwQEN6trb1jY8YQENZra+fOzr1zc85aWufe3t6MjMY5OdZaWt61tdZ7e+/n5+e9vc6MjMZra+/e3ue1tdalpd7GxrUpKalL4aAAAAABdFJOUwBA5thmAAACxklEQVR42uXX/1/SQBgH8NuAoEQ2ijgbBivJLznBAiUUKiyJSgOVAk0tKZKw75mRRt/7v4MBY8ezjW39Vs8v8rqHz/u1jbvbidC/XL8KmcpOqVT6nSjXjooGw8WfFd+QWGfE4oLbtbr++PdMOy0BDYLjEj/0xevfWIyVAI7b/aIj/9WHsRrA8Yf9bqSexVgD4Lic9kWE/LgPwPGfNfJHDO4P8Iuq+S2M9QD8oUp+nxEAcFCtfgIA/14x/9ElAKDQbNQAwN9VAiYEABy0OgsAWAnB/AcBAtVWawkAfJ4CD0BQADZavYcQgI9h3CCQjpD5PcEgwG+SwLRhIL0vz78SjAPEU3hrHODfyX4I6rUJIP0G3oExoNwFXpoB+HwXmDEFpF9IwKA5YK+Tp9fMAdUOsC6YA553gKcmgdTfAhV1oMQqADndQDmJ0AZLAsFnCIV3VYDHJLAjDkZKciAaFz/lCeBJB1glgXBrNLndBWLJ9uZGAI+keTBLANL8SnWAzWRniAC2pG+6lQF0hfjTqCIBrEvjDwiggFSLuIUoLY0vEwAbUcsnc/LlnO02HGvEz+hXEeJ5Yj+4L2vNkxOJDSnlQzliIq2synr3embiUBjmw0FyU83KX04Ob+9aAK/Ppd5deZloz4HFlCHzt3sX0x2a6LcvQb4ab8r7i+DVdqvnCq/D5ZzqdhfAcr5B9wD0PNwPEu0ZnLwK9oPgNfCQJ2fhhhITJ3E8BjeUOXA+QNQlBh5xLjemVCgKjzgzNIJFjWF4yJoKhafgIWt6VHGmjgR0HvMuTipPdWQJ6AImbBRSE8aY/sC4er5xFx5vHyB4YRRpFWUf0AL4c+dHkHZRFo9TDeB9Aa3Llwjr8FlFwB+wO/rHm0VbPae9mPini/O5h/XGxatw2I6fGHAOuhiGZVxO98lTdgutP94yaIvVdqxZdpvFYTT9X9UfqQQlTXlm8wkAAAAASUVORK5CYII=
- (function () {
- var FORMAT_LABEL={'18':'MP4 360p','22':'MP4 720p','43':'WebM 360p','44':'WebM 480p','45':'WebM 720p','46':'WebM 1080p','135':'MP4 480p - no audio','137':'MP4 1080p - no audio','138':'MP4 2160p - no audio','140':'M4A 128kbps - audio','264':'MP4 1440p - no audio','266':'MP4 2160p - no audio','298':'MP4 720p60 - no audio','299':'MP4 1080p60 - no audio'};
- var FORMAT_TYPE={'18':'mp4','22':'mp4','43':'webm','44':'webm','45':'webm','46':'webm','135':'mp4','137':'mp4','138':'mp4','140':'m4a','264':'mp4','266':'mp4','298':'mp4','299':'mp4'};
- var FORMAT_ORDER=['18','43','135','44','22','298','45','137','299','46','264','138','266','140'];
- var FORMAT_RULE={'mp4':'all','webm':'none','m4a':'all'};
- // all=display all versions, max=only highest quality version, none=no version
- var SHOW_DASH_FORMATS=false;
- var BUTTON_TEXT={'ar':'تنزيل','cs':'Stáhnout','de':'Herunterladen','en':'Download','es':'Descargar','fr':'Télécharger','hi':'डाउनलोड','hu':'Letöltés','id':'Unduh','it':'Scarica','ja':'ダウンロード','ko':'내려받기','pl':'Pobierz','pt':'Baixar','ro':'Descărcați','ru':'Скачать','tr':'İndir','zh':'下载','zh-TW':'下載'};
- var BUTTON_TOOLTIP={'ar':'تنزيل هذا الفيديو','cs':'Stáhnout toto video','de':'Dieses Video herunterladen','en':'Download this video','es':'Descargar este vídeo','fr':'Télécharger cette vidéo','hi':'वीडियो डाउनलोड करें','hu':'Videó letöltése','id':'Unduh video ini','it':'Scarica questo video','ja':'このビデオをダウンロードする','ko':'이 비디오를 내려받기','pl':'Pobierz plik wideo','pt':'Baixar este vídeo','ro':'Descărcați acest videoclip','ru':'Скачать это видео','tr': 'Bu videoyu indir','zh':'下载此视频','zh-TW':'下載此影片'};
- var RANDOM=7489235179; // Math.floor(Math.random()*1234567890);
- var CONTAINER_ID='download-youtube-video'+RANDOM;
- var LISTITEM_ID='download-youtube-video-fmt'+RANDOM;
- var BUTTON_ID='download-youtube-video-button'+RANDOM;
- var DEBUG_ID='download-youtube-video-debug-info';
- var STORAGE_CODE='download-youtube-signature-code';
- var STORAGE_DASH='download-youtube-dash-enabled';
- var pagecontainer=document.getElementById('page-container');
- if (/^https?://www.youtube.com/watch?/.test(window.location.href)) run();
- var isAjax=/class[ws'-=]+spf-link/.test(pagecontainer.innerHTML);
- var logocontainer=document.getElementById('logo-container');
- if (logocontainer && !isAjax) { // fix for blocked videos
- isAjax=(' '+logocontainer.className+' ').indexOf(' spf-link ')>=0;
- var content=document.getElementById('content');
- var mo=window.MutationObserver||window.WebKitMutationObserver;
- var observer=new mo(function(mutations) {
- if(mutation.addedNodes!null) {
- for (var i=0; i<mutation.addedNodes.length; i++) {
- if (mutation.addedNodes[i].id'watch7-container' ||
- mutation.addedNodes[i].id'watch7-main-container') { // old value: movie_player
- break;
- }
- });
- observer.observe(content, {childList: true, subtree: true}); // old value: pagecontainer
- } else { // MutationObserver fallback for old browsers
- pagecontainer.addEventListener('DOMNodeInserted', onNodeInserted, false);
- }
- if (e && e.target && (e.target.id'watch7-container' ||
- e.target.id'watch7-main-container')) { // old value: movie_player
- }
- if (document.getElementById(CONTAINER_ID)) return; // check download container
- if (document.getElementById('p') && document.getElementById('vo')) return; // Feather not supported
- var videoID, videoFormats, videoAdaptFormats, videoManifestURL, scriptURL=null;
- var operaTable=new Array();
- var language=document.documentElement.getAttribute('lang');
- if (document.body.getAttribute('dir')'rtl') {
- }
- if (document.getElementById('watch7-action-buttons')) { // old UI
- }
- // obtain video ID, formats map
- var args=null;
- var usw=(typeof this.unsafeWindow ! 'undefined')?this.unsafeWindow:window; // Firefox, Opera<15
- if (usw.ytplayer && usw.ytplayer.config && usw.ytplayer.config.args) {
- }
- videoID=args['video_id'];
- videoAdaptFormats=args['adaptive_fmts'];
- debug('DYVAM - Info: Standard mode. videoID '+(videoID?videoID:'none')+'; ');
- if (usw.ytplayer && usw.ytplayer.config && usw.ytplayer.config.assets) {
- }
- if (videoIDnull) { // unsafeWindow workaround (Chrome, Opera 15+)
- var buffer=document.getElementById(DEBUG_ID+'2');
- while (buffer.firstChild) {
- }
- buffer=createHiddenElem('pre', DEBUG_ID+'2');
- injectScript ('if(ytplayer&&ytplayer.config&&ytplayer.config.args){document.getElementById('+DEBUG_ID+'2').appendChild(document.createTextNode('video_id':'+ytplayer.config.args.video_id+', 'js':'+ytplayer.config.assets.js+', 'dashmpd':'+ytplayer.config.args.dashmpd+', 'url_encoded_fmt_stream_map':'+ytplayer.config.args.url_encoded_fmt_stream_map+', 'adaptive_fmts':'+ytplayer.config.args.adaptive_fmts+''));}');
- if (code) {
- videoID=findMatch(code, /'video_id':s*'([^']+)'/);
- videoFormats=findMatch(code, /'url_encoded_fmt_stream_map':s*'([^']+)'/);
- videoFormats=videoFormats.replace(/&/g,'u0026');
- videoAdaptFormats=findMatch(code, /'adaptive_fmts':s*'([^']+)'/);
- videoAdaptFormats=videoAdaptFormats.replace(/&/g,'u0026');
- videoManifestURL=findMatch(code, /'dashmpd':s*'([^']+)'/);
- scriptURL=findMatch(code, /'js':s*'([^']+)'/);
- debug('DYVAM - Info: Injection mode. videoID '+(videoID?videoID:'none')+'; ');
- var bodyContent=document.body.innerHTML;
- videoID=findMatch(bodyContent, /'video_id':s*'([^']+)'/);
- videoFormats=findMatch(bodyContent, /'url_encoded_fmt_stream_map':s*'([^']+)'/);
- videoAdaptFormats=findMatch(bodyContent, /'adaptive_fmts':s*'([^']+)'/);
- videoManifestURL=findMatch(bodyContent, /'dashmpd':s*'([^']+)'/);
- scriptURL=findMatch(bodyContent, /'js':s*'([^']+)'/);
- scriptURL=scriptURL.replace(//g,');
- }
- debug('DYVAM - Info: Brute mode. videoID '+(videoID?videoID:'none')+'; ');
- debug('DYVAM - Info: url '+window.location.href+'; useragent '+window.navigator.userAgent);
- if (videoIDnull || videoFormatsnull || videoID.length0 || videoFormats.length0) {
- debug('DYVAM - Error: No config information found. YouTube must have changed the code.');
- }
- // Opera 12 extension message handler
- if (typeof window.opera ! 'undefined' && window.opera && typeof opera.extension ! 'undefined') {
- var index=findMatch(event.data.action, /xhr-([0-9]+)-response/);
- index=parseInt(index,10);
- if (typeof trigger 'function' && event.data.readyState 4) {
- trigger(event.data);
- }
- }
- DECODE_RULE=getDecodeRules(DECODE_RULE);
- }
- if (scriptURL.indexOf('//')0) {
- var protocol=(document.location.protocol'http:')?'http:':'https:';
- }
- }
- // video title
- videoTitle=videoTitle.replace(/s*-s*YouTube$/i, ').replace(/'/g, '').replace(/^s+|s+$/g, ').replace(/.+$/g, ');
- videoTitle=videoTitle.replace(/[:'?*]/g, ').replace(/[|/]/g, '_'); // Mac, Linux, Windows
- if (((window.navigator.userAgent || ').toLowerCase()).indexOf('windows') >= 0) {
- videoTitle=videoTitle.replace(/#/g, ').replace(/&/g, '_'); // Windows
- videoTitle=videoTitle.replace(/#/g, '%23').replace(/&/g, '%26'); // Mac, Linux
- var sep1='%2C', sep2='%26', sep3='%3D';
- sep1=',';
- sep2=(videoFormats.indexOf('&')>-1)?'&':'u0026';
- }
- var videoSignature=new Array();
- videoFormats=videoFormats+sep1+videoAdaptFormats;
- var videoFormatsGroup=videoFormats.split(sep1);
- var videoFormatsElem=videoFormatsGroup[i].split(sep2);
- for (var j=0;j<videoFormatsElem.length;j++) {
- if (pair.length2) {
- }
- if (videoFormatsPair['url']null) continue;
- var url=unescape(unescape(videoFormatsPair['url'])).replace(///g,'/').replace(/u0026/g,'&');
- var itag=videoFormatsPair['itag'];
- var sig=videoFormatsPair['sig']||videoFormatsPair['signature'];
- url=url+'&signature='+sig;
- } else if (videoFormatsPair['s']) {
- url=url+'&signature='+decryptSignature(videoFormatsPair['s']);
- }
- if (url.toLowerCase().indexOf('ratebypass')-1) { // speed up download for dash
- }
- if (url.toLowerCase().indexOf('http')0) { // validate URL
- }
- for (var category in FORMAT_RULE) {
- for (var index in FORMAT_TYPE){
- showFormat[index]=(rule'all');
- }
- for (var i=FORMAT_ORDER.length-1;i>=0;i--) {
- if (FORMAT_TYPE[format]category && videoURL[format]!=undefined) {
- break;
- }
- }
- var dashPref=getPref(STORAGE_DASH);
- SHOW_DASH_FORMATS=true;
- setPref(STORAGE_DASH,'0');
- for (var i=0;i<FORMAT_ORDER.length;i++) {
- if (format'37' && videoURL[format]undefined) { // hack for dash 1080p
- format='137';
- showFormat[format]=showFormat['37'];
- } else if (format'38' && videoURL[format]undefined) { // hack for dash 4K
- format='138';
- showFormat[format]=showFormat['38'];
- if (!SHOW_DASH_FORMATS && format.length>2) continue;
- if (videoURL[format]!=undefined && FORMAT_LABEL[format]!=undefined && showFormat[format]) {
- downloadCodeList.push({url:videoURL[format],sig:videoSignature[format],format:format,label:FORMAT_LABEL[format]});
- debug('DYVAM - Info: itag'+format+' url:'+videoURL[format]);
- }
- if (downloadCodeList.length0) {
- debug('DYVAM - Error: No download URL found. Probably YouTube uses encrypted streams.');
- }
- // find parent container
- var parentElement=document.getElementById('watch7-action-buttons');
- parentElement=document.getElementById('watch8-secondary-actions');
- debug('DYVAM Error - No container for adding the download button. YouTube must have changed the code.');
- } else {
- }
- var buttonText=(BUTTON_TEXT[language])?BUTTON_TEXT[language]:BUTTON_TEXT['en'];
- var buttonLabel=(BUTTON_TOOLTIP[language])?BUTTON_TOOLTIP[language]:BUTTON_TOOLTIP['en'];
- // generate download code for regular interface
- var spanIcon=document.createElement('span');
- spanIcon.setAttribute('class', 'yt-uix-button-icon-wrapper');
- imageIcon.setAttribute('src', '//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif');
- imageIcon.setAttribute('class', 'yt-uix-button-icon');
- imageIcon.setAttribute('style', 'width:20px;height:20px;background-size:20px 20px;background-repeat:no-repeat;background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABG0lEQVRYR+2W0Q3CMAxE2wkYAdiEEWADmIxuACMwCmzABpCTEmRSO7YTQX+ChECV43t2nF7GYeHPuLD+0AKwC/DnWMAp/N5qimkBuAfBdRTF/+2/AV6ZYFUxVYuicAfoHegd6B3oHfhZB+ByF+JyV8FkrAB74pqH3DU5L3iGoBURhdVODIQF4EjEkWLmmhYALOQgNIBcHHke4buhxXAAaFnaAhqbQ5QAOHHkwhZ8balkx1ICCiEBWNZ+CivdB7REHIC2ZjZK2oWklDDdB1NSdCd/Js2PqQMpSIKYVcM8kE6QCwDBNRCqOBJrW0CL8kCYxL0A1k6YxWsANAiXeC2ABOEWbwHAWrwxpzgkmA/JtIqnxTOElmPnjlkc4A3FykAhA42AxwAAAABJRU5ErkJggg);');
- mainSpan.appendChild(spanIcon);
- spanButton.setAttribute('class', 'yt-uix-button-content');
- spanButton.appendChild(document.createTextNode(buttonText+' '));
- var imgButton=document.createElement('img');
- imgButton.setAttribute('class', 'yt-uix-button-arrow');
- imgButton.setAttribute('src', '//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif');
- }
- var listItems=document.createElement('ol');
- listItems.setAttribute('style', 'display:none;');
- listItems.setAttribute('class', 'yt-uix-button-menu');
- var listItem=document.createElement('li');
- listLink.setAttribute('style', 'text-decoration:none;');
- listLink.setAttribute('href', downloadCodeList[i].url);
- listLink.setAttribute('download', videoTitle+'.'+FORMAT_TYPE[downloadCodeList[i].format]);
- listButton.setAttribute('class', 'yt-uix-button-menu-item');
- listButton.setAttribute('id', LISTITEM_ID+downloadCodeList[i].format);
- listButton.appendChild(document.createTextNode(downloadCodeList[i].label));
- listItem.appendChild(listLink);
- }
- var buttonElement=document.createElement('button');
- if (newWatchPage) {
- buttonElement.setAttribute('class', 'yt-uix-button yt-uix-button-size-default yt-uix-button-opacity yt-uix-tooltip');
- buttonElement.setAttribute('class', 'yt-uix-button yt-uix-tooltip yt-uix-button-empty yt-uix-button-text');
- buttonElement.setAttribute('style', 'margin-top:4px; margin-left:'+((textDirection'left')?5:10)+'px;');
- buttonElement.setAttribute('data-tooltip-text', buttonLabel);
- buttonElement.setAttribute('role', 'button');
- buttonElement.addEventListener('click', function(){return false;}, false);
- var containerSpan=document.createElement('span');
- containerSpan.appendChild(document.createTextNode(' '));
- if (!newWatchPage) { // watch7
- } else { // watch8
- parentElement.insertBefore(containerSpan, parentElement.firstChild);
- // REPLACEWITH if (!isSignatureUpdatingStarted) {
- addFileSize(downloadCodeList[i].url, downloadCodeList[i].format);
- // }
- if (typeof GM_download ! 'undefined') {
- var downloadFMT=document.getElementById(LISTITEM_ID+downloadCodeList[i].format);
- if (url.indexOf('clen=')>0 && url.indexOf('dur=')>0 && url.indexOf('gir=')>0
- downloadFMT.addEventListener('click', downloadVideoNatively, false);
- }
- var elem=e.currentTarget;
- if (e.preventDefault) {
- }
- if (loop) {
- GM_download(downloadCodeList[loop].url, videoTitle+'.'+FORMAT_TYPE[downloadCodeList[loop].format]);
- return false;
- function addFromManifest() { // add Dash URLs from manifest file
- var formats=['137', '138', '140']; // 137=1080p, 138=4k, 140=m4a
- for (var i=0;i<formats.length;i++) {
- isNecessary=false;
- }
- if (videoManifestURL && SHOW_DASH_FORMATS && isNecessary) {
- var matchSig=findMatch(videoManifestURL, //s/([a-zA-Z0-9.]+)//i);
- var decryptedSig=decryptSignature(matchSig);
- videoManifestURL=videoManifestURL.replace('/s/'+matchSig+'/','/signature/'+decryptedSig+'/');
- }
- var protocol=(document.location.protocol'http:')?'http:':'https:';
- }
- debug('DYVAM - Info: manifestURL '+videoManifestURL);
- method:'GET',
- onload:function(response) {
- if (response.readyState 4 && response.status 200 && response.responseText) {
- debug('DYVAM - Info: maniestFileContents '+response.responseText);
- var lastFormatFromList=downloadCodeList[downloadCodeList.length-1].format;
- debug('DYVAM - Info: lastformat: '+lastFormatFromList);
- k=formats[i];
- if (videoURL[k] || showFormat[k]false) continue;
- var regexp = new RegExp('<BaseURL>(http[^<]+itag/'+k+'[^<]+)</BaseURL>','i');
- var matchURL=findMatch(response.responseText, regexp);
- debug('DYVAM - Info: matchURL itag= '+k+' url= '+matchURL);
- matchURL=matchURL.replace(/&/g,'&');
- downloadCodeList.push(
- {url:matchURL,sig:videoSignature[k],format:k,label:FORMAT_LABEL[k]});
- var downloadFMT=document.getElementById(LISTITEM_ID+lastFormatFromList);
- var clone=downloadFMT.parentNode.parentNode.cloneNode(true);
- clone.firstChild.firstChild.setAttribute('id', LISTITEM_ID+k);
- downloadFMT.parentNode.parentNode.parentNode.appendChild(clone);
- downloadFMT=document.getElementById(LISTITEM_ID+k);
- downloadFMT.firstChild.nodeValue=FORMAT_LABEL[k];
- lastFormatFromList=k;
- }
- });
- }
- function injectStyle(code) {
- style.type='text/css';
- style.appendChild(document.createTextNode(code));
- document.getElementsByTagName('head')[0].appendChild(style);
- var script=document.createElement('script');
- script.textContent=code;
- document.body.removeChild(script);
- var debugElem=document.getElementById(DEBUG_ID);
- debugElem=createHiddenElem('div', DEBUG_ID);
- debugElem.appendChild(document.createTextNode(str+' '));
- var elem=document.createElement(tag);
- elem.setAttribute('style', 'display:none;');
- return elem;
- function fixTranslations(language, textDirection) {
- if (/^af|bg|bn|ca|cs|de|el|es|et|eu|fa|fi|fil|fr|gl|hi|hr|hu|id|it|iw|kn|lv|lt|ml|mr|ms|nl|pl|ro|ru|sl|sk|sr|sw|ta|te|th|uk|ur|vi|zu$/.test(language)) { // fix international UI
- var likeButton=document.getElementById('watch-like');
- var spanElements=likeButton.getElementsByClassName('yt-uix-button-content');
- spanElements[0].style.display='none'; // hide like text
- }
- if (/^bg|ca|cs|el|eu|hr|it|ml|ms|pl|sl|sw|te$/.test(language)) {
- }
- injectStyle('#watch7-secondary-actions .yt-uix-button{margin-'+textDirection+':'+marginPixels+'px!important}');
- }
- function findMatch(text, regexp) {
- return (matches)?matches[1]:null;
- return (typeof s'string' || s instanceof String);
- return (typeof n'number' && n%10);
- function getPref(name) { // cross-browser GM_getValue
- try {a=typeof GM_getValue.toString; b=GM_getValue.toString()} catch(e){}
- (a 'undefined' || b.indexOf('not supported') -1)) {
- return GM_getValue(name, null); // Greasemonkey, Tampermonkey, Firefox extension
- var ls=null;
- if (ls) {
- return ls.getItem(name); // Chrome script, Opera extensions
- }
- }
- function setPref(name, value) { // cross-browser GM_setValue
- try {a=typeof GM_setValue.toString; b=GM_setValue.toString()} catch(e){}
- (a 'undefined' || b.indexOf('not supported') -1)) {
- GM_setValue(name, value); // Greasemonkey, Tampermonkey, Firefox extension
- var ls=null;
- if (ls) {
- return ls.setItem(name, value); // Chrome script, Opera extensions
- }
- function crossXmlHttpRequest(details) { // cross-browser GM_xmlhttpRequest
- if (typeof GM_xmlhttpRequest 'function') { // Greasemonkey, Tampermonkey, Firefox extension, Chrome script
- } else if (typeof window.opera ! 'undefined' && window.opera && typeof opera.extension ! 'undefined' &&
- typeof opera.extension.postMessage ! 'undefined') { // Opera 12 extension
- opera.extension.postMessage({'action':'xhr-'+index, 'url':details.url, 'method':details.method});
- } else if (typeof window.opera 'undefined' && typeof XMLHttpRequest 'function') { // Opera 15+ extension
- xhr.onreadystatechange = function() {
- if (details['onload']) {
- }
- }
- xhr.send();
- }
- function addFileSize(url, format) {
- function updateVideoLabel(size, format) {
- var elem=document.getElementById(LISTITEM_ID+format);
- size=parseInt(size,10);
- size=parseFloat((size/1073741824).toFixed(1))+' GB';
- size=parseFloat((size/1048576).toFixed(1))+' MB';
- size=parseFloat((size/1024).toFixed(1))+' KB';
- if (elem.childNodes.length>1) {
- } else if (elem.childNodes.length1) {
- elem.appendChild(document.createTextNode(' ('+size+')'));
- }
- var matchSize=findMatch(url, /[&?]clen=([0-9]+)&/i);
- updateVideoLabel(matchSize, format);
- try {
- method:'HEAD',
- onload:function(response) {
- if (response.readyState 4 && response.status 200) { // add size
- if (typeof response.getResponseHeader 'function') {
- size=response.getResponseHeader('Content-length');
- var regexp = new RegExp('^Content-length: (.*)$','im');
- var match = regexp.exec(response.responseHeaders);
- size=match[1];
- }
- updateVideoLabel(size, format);
- }
- });
- }
- debug('DYVAM - Info: signature start '+getPref(STORAGE_CODE));
- findMatch(sourceCode,
- /.sets*('signature's*,s*([a-zA-Z0-9_$][w$]*)(/)
- /.sigs*||s*([a-zA-Z0-9_$][w$]*)(/)
- /.signatures*=s*([a-zA-Z_$][w$]*)([a-zA-Z_$][w$]*)/); //old
- if (signatureFunctionName null) return setPref(STORAGE_CODE, 'error');
- signatureFunctionName=signatureFunctionName.replace('$','$');
- var regCode = new RegExp(signatureFunctionName + 's*=s*function' +
- 's*([w$]*)s*{[w$]*=[w$]*.split(');n*(.+);return [w$]*.join');
- var regCode2 = new RegExp('function s*' + signatureFunctionName +
- 's*([w$]*)s*{[w$]*=[w$]*.split(');n*(.+);return [w$]*.join');
- var functionCode = findMatch(sourceCode, regCode) || findMatch(sourceCode, regCode2);
- debug('DYVAM - Info: signaturefunction ' + signatureFunctionName + ' -- ' + functionCode);
- if (functionCode null) return setPref(STORAGE_CODE, 'error');
- var reverseFunctionName = findMatch(sourceCode,
- /([w$]*)s*:s*functions*(s*[w$]*s*)s*{s*(?:returns*)?[w$]*.reverses*(s*)s*}/);
- debug('DYVAM - Info: reversefunction ' + reverseFunctionName);
- if (reverseFunctionName) reverseFunctionName=reverseFunctionName.replace('$','$');
- /([w$]*)s*:s*functions*(s*[w$]*s*,s*[w$]*s*)s*{s*(?:returns*)?[w$]*.(?:slice|splice)(.+)s*}/);
- debug('DYVAM - Info: slicefunction ' + sliceFunctionName);
- if (sliceFunctionName) sliceFunctionName=sliceFunctionName.replace('$','$');
- var regSlice = new RegExp('.(?:'+'slice'+(sliceFunctionName?'|'+sliceFunctionName:')+
- ')s*(s*(?:[a-zA-Z_$][w$]*s*,)?s*([0-9]+)s*)'); // .slice(5) sau .Hf(a,5)
- var regReverse = new RegExp('.(?:'+'reverse'+(reverseFunctionName?'|'+reverseFunctionName:')+
- ')s*([^)]*)'); // .reverse() sau .Gf(a,45)
- var regSwap = new RegExp('[w$]+s*(s*[w$]+s*,s*([0-9]+)s*)');
- var regInline = new RegExp('[w$]+[0]s*=s*[w$]+[([0-9]+)s*%s*[w$]+.length]');
- var decodeArray=[];
- for (var i=0; i<functionCodePieces.length; i++) {
- functionCodePieces[i]=functionCodePieces[i].trim();
- if (codeLine.length>0) {
- var arrReverse=codeLine.match(regReverse);
- debug(i+': '+codeLine+' --'+(arrSlice?' slice length '+arrSlice.length:') +' '+(arrReverse?'reverse':'));
- var slice=parseInt(arrSlice[1], 10);
- decodeArray.push(-slice);
- } else if (arrReverse && arrReverse.length >= 1) { // reverse
- } else if (codeLine.indexOf('[0]') >= 0) { // inline swap
- functionCodePieces[i+1].indexOf('.length') >= 0 &&
- var inline=findMatch(functionCodePieces[i+1], regInline);
- decodeArray.push(inline);
- } else return setPref(STORAGE_CODE, 'error');
- var swap=findMatch(codeLine, regSwap);
- if (isInteger(swap) && swap>0){
- } else return setPref(STORAGE_CODE, 'error');
- }
- setPref(STORAGE_URL, scriptURL);
- DECODE_RULE=decodeArray;
- debug('DYVAM - Info: signature '+decodeArray.toString()+' '+scriptURL);
- for (var i=0;i<downloadCodeList.length;i++) {
- var elem=document.getElementById(LISTITEM_ID+downloadCodeList[i].format);
- var sig=downloadCodeList[i].sig;
- url=url.replace(/&signature=[w.]+/, '&signature='+decryptSignature(sig));
- addFileSize(url, downloadCodeList[i].format);
- }
- }
- function isValidSignatureCode(arr) { // valid values: '5,-3,0,2,5', 'error'
- if (arr'error') return true;
- for (var i=0;i<arr.length;i++) {
- if (!isInteger(parseInt(arr[i],10))) return false;
- return true;
- var storageURL=getPref(STORAGE_URL);
- if (!(/,0,|^0,|,0$|-/.test(storageCode))) storageCode=null; // hack for only positive items
- if (storageCode && isValidSignatureCode(storageCode) && storageURL &&
- scriptURL.replace(/^https?/i,')storageURL.replace(/^https?/i,')) return;
- debug('DYVAM fetch '+scriptURL);
- crossXmlHttpRequest({
- url:scriptURL,
- debug('DYVAM fetch status '+response.status);
- if (response.readyState 4 && response.status 200 && response.responseText) {
- }
- });
- }
- function getDecodeRules(rules) {
- if (storageCode && storageCode!='error' && isValidSignatureCode(storageCode)) {
- for (var i=0; i<arr.length; i++) {
- }
- debug('DYVAM - Info: signature '+arr.toString()+' '+scriptURL);
- return rules;
- function swap(a,b){var c=a[0];a[0]=a[b%a.length];a[b]=c;return a};
- function decode(sig, arr) { // encoded decryption
- var sigA=sig.split(');
- var act=arr[i];
- sigA=(act>0)?swap(sigA, act):((act0)?sigA.reverse():sigA.slice(-act));
- var result=sigA.join(');
- }
- if (signull) return ';
- if (arr) {
- if (sig2) return sig2;
- setPref(STORAGE_URL, ');
- }
- }
- }
- })();
- // @name Download YouTube Videos as MP4
- // @description Adds a button that lets you download YouTube videos.
- // @homepageURL https://github.com/gantt/downloadyoutube
- // @version 1.8.8
- // @namespace http://googlesystem.blogspot.com
- // @include https://www.youtube.com/*
- // @exclude https://www.youtube.com/embed/*
- // @match https://www.youtube.com/*
- // @match http://s.ytimg.com/yts/jsbin/html5player*
- // @match https://s.ytimg.com/yts/jsbin/html5player*
- // @match https://manifest.googlevideo.com/*
- // @match https://*.googlevideo.com/videoplayback*
- // @match https://*.youtube.com/videoplayback*
- // @connect ytimg.com
- // @grant GM_getValue
- // @run-at document-end
- // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAB3RJTUUH2wMOCgIoGUYEAQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAAGSUExURfi/JO/v797e3sbGxq2traWlpZSUlJycnNbW1oyEhIRaWow5OZQhIZwYGKUQEKUICK0ICJQxMYxKSoxzc4x7e4RCQpQYGKUAAK0AALUAAL0AAK0QEIxra5QpKa0YGIxSUsYAAKUhIZR7e87Ozr0ICJRSUr29vYxjY6U5OaUpKa0hIb21tZwAALUICO/Ozu/GxqUxMZSEhLUYGO/W1r0YGKVCQpQQEL0pKffe3vfW1pxra5Q5OcZCQvfn585CQr2trZx7e8ZSUs5SUq05Oc5jY9ZjY84AAKWMjM5zc957e60pKdaMjOelpbWcnLWUlLVCQsYYGMYICNbOzpQICMYhIbV7e5xaWt6cnPfv79bGxt6lpe+9vc5KSs6lpb0xMc6EhM69vbUxMbUhIb1aWs61tcZaWuecnMYxMb1KSsZjY96UlNa1td7W1r17e9a9vZwQEN6trb1jY8YQENZra+fOzr1zc85aWufe3t6MjMY5OdZaWt61tdZ7e+/n5+e9vc6MjMZra+/e3ue1tdalpd7GxrUpKalL4aAAAAABdFJOUwBA5thmAAACxklEQVR42uXX/1/SQBgH8NuAoEQ2ijgbBivJLznBAiUUKiyJSgOVAk0tKZKw75mRRt/7v4MBY8ezjW39Vs8v8rqHz/u1jbvbidC/XL8KmcpOqVT6nSjXjooGw8WfFd+QWGfE4oLbtbr++PdMOy0BDYLjEj/0xevfWIyVAI7b/aIj/9WHsRrA8Yf9bqSexVgD4Lic9kWE/LgPwPGfNfJHDO4P8Iuq+S2M9QD8oUp+nxEAcFCtfgIA/14x/9ElAKDQbNQAwN9VAiYEABy0OgsAWAnB/AcBAtVWawkAfJ4CD0BQADZavYcQgI9h3CCQjpD5PcEgwG+SwLRhIL0vz78SjAPEU3hrHODfyX4I6rUJIP0G3oExoNwFXpoB+HwXmDEFpF9IwKA5YK+Tp9fMAdUOsC6YA553gKcmgdTfAhV1oMQqADndQDmJ0AZLAsFnCIV3VYDHJLAjDkZKciAaFz/lCeBJB1glgXBrNLndBWLJ9uZGAI+keTBLANL8SnWAzWRniAC2pG+6lQF0hfjTqCIBrEvjDwiggFSLuIUoLY0vEwAbUcsnc/LlnO02HGvEz+hXEeJ5Yj+4L2vNkxOJDSnlQzliIq2synr3embiUBjmw0FyU83KX04Ob+9aAK/Ppd5deZloz4HFlCHzt3sX0x2a6LcvQb4ab8r7i+DVdqvnCq/D5ZzqdhfAcr5B9wD0PNwPEu0ZnLwK9oPgNfCQJ2fhhhITJ3E8BjeUOXA+QNQlBh5xLjemVCgKjzgzNIJFjWF4yJoKhafgIWt6VHGmjgR0HvMuTipPdWQJ6AImbBRSE8aY/sC4er5xFx5vHyB4YRRpFWUf0AL4c+dHkHZRFo9TDeB9Aa3Llwjr8FlFwB+wO/rHm0VbPae9mPini/O5h/XGxatw2I6fGHAOuhiGZVxO98lTdgutP94yaIvVdqxZdpvFYTT9X9UfqQQlTXlm8wkAAAAASUVORK5CYII=
- (function () {
- var FORMAT_LABEL={'18':'MP4 360p','22':'MP4 720p','43':'WebM 360p','44':'WebM 480p','45':'WebM 720p','46':'WebM 1080p','135':'MP4 480p - no audio','137':'MP4 1080p - no audio','138':'MP4 2160p - no audio','140':'M4A 128kbps - audio','264':'MP4 1440p - no audio','266':'MP4 2160p - no audio','298':'MP4 720p60 - no audio','299':'MP4 1080p60 - no audio'};
- var FORMAT_TYPE={'18':'mp4','22':'mp4','43':'webm','44':'webm','45':'webm','46':'webm','135':'mp4','137':'mp4','138':'mp4','140':'m4a','264':'mp4','266':'mp4','298':'mp4','299':'mp4'};
- var FORMAT_ORDER=['18','43','135','44','22','298','45','137','299','46','264','138','266','140'];
- var FORMAT_RULE={'mp4':'all','webm':'none','m4a':'all'};
- // all=display all versions, max=only highest quality version, none=no version
- var SHOW_DASH_FORMATS=false;
- var BUTTON_TEXT={'ar':'تنزيل','cs':'Stáhnout','de':'Herunterladen','en':'Download','es':'Descargar','fr':'Télécharger','hi':'डाउनलोड','hu':'Letöltés','id':'Unduh','it':'Scarica','ja':'ダウンロード','ko':'내려받기','pl':'Pobierz','pt':'Baixar','ro':'Descărcați','ru':'Скачать','tr':'İndir','zh':'下载','zh-TW':'下載'};
- var BUTTON_TOOLTIP={'ar':'تنزيل هذا الفيديو','cs':'Stáhnout toto video','de':'Dieses Video herunterladen','en':'Download this video','es':'Descargar este vídeo','fr':'Télécharger cette vidéo','hi':'वीडियो डाउनलोड करें','hu':'Videó letöltése','id':'Unduh video ini','it':'Scarica questo video','ja':'このビデオをダウンロードする','ko':'이 비디오를 내려받기','pl':'Pobierz plik wideo','pt':'Baixar este vídeo','ro':'Descărcați acest videoclip','ru':'Скачать это видео','tr': 'Bu videoyu indir','zh':'下载此视频','zh-TW':'下載此影片'};
- var RANDOM=7489235179; // Math.floor(Math.random()*1234567890);
- var CONTAINER_ID='download-youtube-video'+RANDOM;
- var LISTITEM_ID='download-youtube-video-fmt'+RANDOM;
- var BUTTON_ID='download-youtube-video-button'+RANDOM;
- var DEBUG_ID='download-youtube-video-debug-info';
- var STORAGE_CODE='download-youtube-signature-code';
- var STORAGE_DASH='download-youtube-dash-enabled';
- var pagecontainer=document.getElementById('page-container');
- if (/^https?://www.youtube.com/watch?/.test(window.location.href)) run();
- var isAjax=/class[ws'-=]+spf-link/.test(pagecontainer.innerHTML);
- var logocontainer=document.getElementById('logo-container');
- if (logocontainer && !isAjax) { // fix for blocked videos
- isAjax=(' '+logocontainer.className+' ').indexOf(' spf-link ')>=0;
- var content=document.getElementById('content');
- var mo=window.MutationObserver||window.WebKitMutationObserver;
- var observer=new mo(function(mutations) {
- if(mutation.addedNodes!null) {
- for (var i=0; i<mutation.addedNodes.length; i++) {
- if (mutation.addedNodes[i].id'watch7-container' ||
- mutation.addedNodes[i].id'watch7-main-container') { // old value: movie_player
- break;
- }
- });
- observer.observe(content, {childList: true, subtree: true}); // old value: pagecontainer
- } else { // MutationObserver fallback for old browsers
- pagecontainer.addEventListener('DOMNodeInserted', onNodeInserted, false);
- }
- if (e && e.target && (e.target.id'watch7-container' ||
- e.target.id'watch7-main-container')) { // old value: movie_player
- }
- if (document.getElementById(CONTAINER_ID)) return; // check download container
- if (document.getElementById('p') && document.getElementById('vo')) return; // Feather not supported
- var videoID, videoFormats, videoAdaptFormats, videoManifestURL, scriptURL=null;
- var operaTable=new Array();
- var language=document.documentElement.getAttribute('lang');
- if (document.body.getAttribute('dir')'rtl') {
- }
- if (document.getElementById('watch7-action-buttons')) { // old UI
- }
- // obtain video ID, formats map
- var args=null;
- var usw=(typeof this.unsafeWindow ! 'undefined')?this.unsafeWindow:window; // Firefox, Opera<15
- if (usw.ytplayer && usw.ytplayer.config && usw.ytplayer.config.args) {
- }
- videoID=args['video_id'];
- videoAdaptFormats=args['adaptive_fmts'];
- debug('DYVAM - Info: Standard mode. videoID '+(videoID?videoID:'none')+'; ');
- if (usw.ytplayer && usw.ytplayer.config && usw.ytplayer.config.assets) {
- }
- if (videoIDnull) { // unsafeWindow workaround (Chrome, Opera 15+)
- var buffer=document.getElementById(DEBUG_ID+'2');
- while (buffer.firstChild) {
- }
- buffer=createHiddenElem('pre', DEBUG_ID+'2');
- injectScript ('if(ytplayer&&ytplayer.config&&ytplayer.config.args){document.getElementById('+DEBUG_ID+'2').appendChild(document.createTextNode('video_id':'+ytplayer.config.args.video_id+', 'js':'+ytplayer.config.assets.js+', 'dashmpd':'+ytplayer.config.args.dashmpd+', 'url_encoded_fmt_stream_map':'+ytplayer.config.args.url_encoded_fmt_stream_map+', 'adaptive_fmts':'+ytplayer.config.args.adaptive_fmts+''));}');
- if (code) {
- videoID=findMatch(code, /'video_id':s*'([^']+)'/);
- videoFormats=findMatch(code, /'url_encoded_fmt_stream_map':s*'([^']+)'/);
- videoFormats=videoFormats.replace(/&/g,'u0026');
- videoAdaptFormats=findMatch(code, /'adaptive_fmts':s*'([^']+)'/);
- videoAdaptFormats=videoAdaptFormats.replace(/&/g,'u0026');
- videoManifestURL=findMatch(code, /'dashmpd':s*'([^']+)'/);
- scriptURL=findMatch(code, /'js':s*'([^']+)'/);
- debug('DYVAM - Info: Injection mode. videoID '+(videoID?videoID:'none')+'; ');
- var bodyContent=document.body.innerHTML;
- videoID=findMatch(bodyContent, /'video_id':s*'([^']+)'/);
- videoFormats=findMatch(bodyContent, /'url_encoded_fmt_stream_map':s*'([^']+)'/);
- videoAdaptFormats=findMatch(bodyContent, /'adaptive_fmts':s*'([^']+)'/);
- videoManifestURL=findMatch(bodyContent, /'dashmpd':s*'([^']+)'/);
- scriptURL=findMatch(bodyContent, /'js':s*'([^']+)'/);
- scriptURL=scriptURL.replace(//g,');
- }
- debug('DYVAM - Info: Brute mode. videoID '+(videoID?videoID:'none')+'; ');
- debug('DYVAM - Info: url '+window.location.href+'; useragent '+window.navigator.userAgent);
- if (videoIDnull || videoFormatsnull || videoID.length0 || videoFormats.length0) {
- debug('DYVAM - Error: No config information found. YouTube must have changed the code.');
- }
- // Opera 12 extension message handler
- if (typeof window.opera ! 'undefined' && window.opera && typeof opera.extension ! 'undefined') {
- var index=findMatch(event.data.action, /xhr-([0-9]+)-response/);
- index=parseInt(index,10);
- if (typeof trigger 'function' && event.data.readyState 4) {
- trigger(event.data);
- }
- }
- DECODE_RULE=getDecodeRules(DECODE_RULE);
- }
- if (scriptURL.indexOf('//')0) {
- var protocol=(document.location.protocol'http:')?'http:':'https:';
- }
- }
- // video title
- videoTitle=videoTitle.replace(/s*-s*YouTube$/i, ').replace(/'/g, '').replace(/^s+|s+$/g, ').replace(/.+$/g, ');
- videoTitle=videoTitle.replace(/[:'?*]/g, ').replace(/[|/]/g, '_'); // Mac, Linux, Windows
- if (((window.navigator.userAgent || ').toLowerCase()).indexOf('windows') >= 0) {
- videoTitle=videoTitle.replace(/#/g, ').replace(/&/g, '_'); // Windows
- videoTitle=videoTitle.replace(/#/g, '%23').replace(/&/g, '%26'); // Mac, Linux
- var sep1='%2C', sep2='%26', sep3='%3D';
- sep1=',';
- sep2=(videoFormats.indexOf('&')>-1)?'&':'u0026';
- }
- var videoSignature=new Array();
- videoFormats=videoFormats+sep1+videoAdaptFormats;
- var videoFormatsGroup=videoFormats.split(sep1);
- var videoFormatsElem=videoFormatsGroup[i].split(sep2);
- for (var j=0;j<videoFormatsElem.length;j++) {
- if (pair.length2) {
- }
- if (videoFormatsPair['url']null) continue;
- var url=unescape(unescape(videoFormatsPair['url'])).replace(///g,'/').replace(/u0026/g,'&');
- var itag=videoFormatsPair['itag'];
- var sig=videoFormatsPair['sig']||videoFormatsPair['signature'];
- url=url+'&signature='+sig;
- } else if (videoFormatsPair['s']) {
- url=url+'&signature='+decryptSignature(videoFormatsPair['s']);
- }
- if (url.toLowerCase().indexOf('ratebypass')-1) { // speed up download for dash
- }
- if (url.toLowerCase().indexOf('http')0) { // validate URL
- }
- for (var category in FORMAT_RULE) {
- for (var index in FORMAT_TYPE){
- showFormat[index]=(rule'all');
- }
- for (var i=FORMAT_ORDER.length-1;i>=0;i--) {
- if (FORMAT_TYPE[format]category && videoURL[format]!=undefined) {
- break;
- }
- }
- var dashPref=getPref(STORAGE_DASH);
- SHOW_DASH_FORMATS=true;
- setPref(STORAGE_DASH,'0');
- for (var i=0;i<FORMAT_ORDER.length;i++) {
- if (format'37' && videoURL[format]undefined) { // hack for dash 1080p
- format='137';
- showFormat[format]=showFormat['37'];
- } else if (format'38' && videoURL[format]undefined) { // hack for dash 4K
- format='138';
- showFormat[format]=showFormat['38'];
- if (!SHOW_DASH_FORMATS && format.length>2) continue;
- if (videoURL[format]!=undefined && FORMAT_LABEL[format]!=undefined && showFormat[format]) {
- downloadCodeList.push({url:videoURL[format],sig:videoSignature[format],format:format,label:FORMAT_LABEL[format]});
- debug('DYVAM - Info: itag'+format+' url:'+videoURL[format]);
- }
- if (downloadCodeList.length0) {
- debug('DYVAM - Error: No download URL found. Probably YouTube uses encrypted streams.');
- }
- // find parent container
- var parentElement=document.getElementById('watch7-action-buttons');
- parentElement=document.getElementById('watch8-secondary-actions');
- debug('DYVAM Error - No container for adding the download button. YouTube must have changed the code.');
- } else {
- }
- var buttonText=(BUTTON_TEXT[language])?BUTTON_TEXT[language]:BUTTON_TEXT['en'];
- var buttonLabel=(BUTTON_TOOLTIP[language])?BUTTON_TOOLTIP[language]:BUTTON_TOOLTIP['en'];
- // generate download code for regular interface
- var spanIcon=document.createElement('span');
- spanIcon.setAttribute('class', 'yt-uix-button-icon-wrapper');
- imageIcon.setAttribute('src', '//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif');
- imageIcon.setAttribute('class', 'yt-uix-button-icon');
- imageIcon.setAttribute('style', 'width:20px;height:20px;background-size:20px 20px;background-repeat:no-repeat;background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABG0lEQVRYR+2W0Q3CMAxE2wkYAdiEEWADmIxuACMwCmzABpCTEmRSO7YTQX+ChECV43t2nF7GYeHPuLD+0AKwC/DnWMAp/N5qimkBuAfBdRTF/+2/AV6ZYFUxVYuicAfoHegd6B3oHfhZB+ByF+JyV8FkrAB74pqH3DU5L3iGoBURhdVODIQF4EjEkWLmmhYALOQgNIBcHHke4buhxXAAaFnaAhqbQ5QAOHHkwhZ8balkx1ICCiEBWNZ+CivdB7REHIC2ZjZK2oWklDDdB1NSdCd/Js2PqQMpSIKYVcM8kE6QCwDBNRCqOBJrW0CL8kCYxL0A1k6YxWsANAiXeC2ABOEWbwHAWrwxpzgkmA/JtIqnxTOElmPnjlkc4A3FykAhA42AxwAAAABJRU5ErkJggg);');
- mainSpan.appendChild(spanIcon);
- spanButton.setAttribute('class', 'yt-uix-button-content');
- spanButton.appendChild(document.createTextNode(buttonText+' '));
- var imgButton=document.createElement('img');
- imgButton.setAttribute('class', 'yt-uix-button-arrow');
- imgButton.setAttribute('src', '//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif');
- }
- var listItems=document.createElement('ol');
- listItems.setAttribute('style', 'display:none;');
- listItems.setAttribute('class', 'yt-uix-button-menu');
- var listItem=document.createElement('li');
- listLink.setAttribute('style', 'text-decoration:none;');
- listLink.setAttribute('href', downloadCodeList[i].url);
- listLink.setAttribute('download', videoTitle+'.'+FORMAT_TYPE[downloadCodeList[i].format]);
- listButton.setAttribute('class', 'yt-uix-button-menu-item');
- listButton.setAttribute('id', LISTITEM_ID+downloadCodeList[i].format);
- listButton.appendChild(document.createTextNode(downloadCodeList[i].label));
- listItem.appendChild(listLink);
- }
- var buttonElement=document.createElement('button');
- if (newWatchPage) {
- buttonElement.setAttribute('class', 'yt-uix-button yt-uix-button-size-default yt-uix-button-opacity yt-uix-tooltip');
- buttonElement.setAttribute('class', 'yt-uix-button yt-uix-tooltip yt-uix-button-empty yt-uix-button-text');
- buttonElement.setAttribute('style', 'margin-top:4px; margin-left:'+((textDirection'left')?5:10)+'px;');
- buttonElement.setAttribute('data-tooltip-text', buttonLabel);
- buttonElement.setAttribute('role', 'button');
- buttonElement.addEventListener('click', function(){return false;}, false);
- var containerSpan=document.createElement('span');
- containerSpan.appendChild(document.createTextNode(' '));
- if (!newWatchPage) { // watch7
- } else { // watch8
- parentElement.insertBefore(containerSpan, parentElement.firstChild);
- // REPLACEWITH if (!isSignatureUpdatingStarted) {
- addFileSize(downloadCodeList[i].url, downloadCodeList[i].format);
- // }
- if (typeof GM_download ! 'undefined') {
- var downloadFMT=document.getElementById(LISTITEM_ID+downloadCodeList[i].format);
- if (url.indexOf('clen=')>0 && url.indexOf('dur=')>0 && url.indexOf('gir=')>0
- downloadFMT.addEventListener('click', downloadVideoNatively, false);
- }
- var elem=e.currentTarget;
- if (e.preventDefault) {
- }
- if (loop) {
- GM_download(downloadCodeList[loop].url, videoTitle+'.'+FORMAT_TYPE[downloadCodeList[loop].format]);
- return false;
- function addFromManifest() { // add Dash URLs from manifest file
- var formats=['137', '138', '140']; // 137=1080p, 138=4k, 140=m4a
- for (var i=0;i<formats.length;i++) {
- isNecessary=false;
- }
- if (videoManifestURL && SHOW_DASH_FORMATS && isNecessary) {
- var matchSig=findMatch(videoManifestURL, //s/([a-zA-Z0-9.]+)//i);
- var decryptedSig=decryptSignature(matchSig);
- videoManifestURL=videoManifestURL.replace('/s/'+matchSig+'/','/signature/'+decryptedSig+'/');
- }
- var protocol=(document.location.protocol'http:')?'http:':'https:';
- }
- debug('DYVAM - Info: manifestURL '+videoManifestURL);
- method:'GET',
- onload:function(response) {
- if (response.readyState 4 && response.status 200 && response.responseText) {
- debug('DYVAM - Info: maniestFileContents '+response.responseText);
- var lastFormatFromList=downloadCodeList[downloadCodeList.length-1].format;
- debug('DYVAM - Info: lastformat: '+lastFormatFromList);
- k=formats[i];
- if (videoURL[k] || showFormat[k]false) continue;
- var regexp = new RegExp('<BaseURL>(http[^<]+itag/'+k+'[^<]+)</BaseURL>','i');
- var matchURL=findMatch(response.responseText, regexp);
- debug('DYVAM - Info: matchURL itag= '+k+' url= '+matchURL);
- matchURL=matchURL.replace(/&/g,'&');
- downloadCodeList.push(
- {url:matchURL,sig:videoSignature[k],format:k,label:FORMAT_LABEL[k]});
- var downloadFMT=document.getElementById(LISTITEM_ID+lastFormatFromList);
- var clone=downloadFMT.parentNode.parentNode.cloneNode(true);
- clone.firstChild.firstChild.setAttribute('id', LISTITEM_ID+k);
- downloadFMT.parentNode.parentNode.parentNode.appendChild(clone);
- downloadFMT=document.getElementById(LISTITEM_ID+k);
- downloadFMT.firstChild.nodeValue=FORMAT_LABEL[k];
- lastFormatFromList=k;
- }
- });
- }
- function injectStyle(code) {
- style.type='text/css';
- style.appendChild(document.createTextNode(code));
- document.getElementsByTagName('head')[0].appendChild(style);
- var script=document.createElement('script');
- script.textContent=code;
- document.body.removeChild(script);
- var debugElem=document.getElementById(DEBUG_ID);
- debugElem=createHiddenElem('div', DEBUG_ID);
- debugElem.appendChild(document.createTextNode(str+' '));
- var elem=document.createElement(tag);
- elem.setAttribute('style', 'display:none;');
- return elem;
- function fixTranslations(language, textDirection) {
- if (/^af|bg|bn|ca|cs|de|el|es|et|eu|fa|fi|fil|fr|gl|hi|hr|hu|id|it|iw|kn|lv|lt|ml|mr|ms|nl|pl|ro|ru|sl|sk|sr|sw|ta|te|th|uk|ur|vi|zu$/.test(language)) { // fix international UI
- var likeButton=document.getElementById('watch-like');
- var spanElements=likeButton.getElementsByClassName('yt-uix-button-content');
- spanElements[0].style.display='none'; // hide like text
- }
- if (/^bg|ca|cs|el|eu|hr|it|ml|ms|pl|sl|sw|te$/.test(language)) {
- }
- injectStyle('#watch7-secondary-actions .yt-uix-button{margin-'+textDirection+':'+marginPixels+'px!important}');
- }
- function findMatch(text, regexp) {
- return (matches)?matches[1]:null;
- return (typeof s'string' || s instanceof String);
- return (typeof n'number' && n%10);
- function getPref(name) { // cross-browser GM_getValue
- try {a=typeof GM_getValue.toString; b=GM_getValue.toString()} catch(e){}
- (a 'undefined' || b.indexOf('not supported') -1)) {
- return GM_getValue(name, null); // Greasemonkey, Tampermonkey, Firefox extension
- var ls=null;
- if (ls) {
- return ls.getItem(name); // Chrome script, Opera extensions
- }
- }
- function setPref(name, value) { // cross-browser GM_setValue
- try {a=typeof GM_setValue.toString; b=GM_setValue.toString()} catch(e){}
- (a 'undefined' || b.indexOf('not supported') -1)) {
- GM_setValue(name, value); // Greasemonkey, Tampermonkey, Firefox extension
- var ls=null;
- if (ls) {
- return ls.setItem(name, value); // Chrome script, Opera extensions
- }
- function crossXmlHttpRequest(details) { // cross-browser GM_xmlhttpRequest
- if (typeof GM_xmlhttpRequest 'function') { // Greasemonkey, Tampermonkey, Firefox extension, Chrome script
- } else if (typeof window.opera ! 'undefined' && window.opera && typeof opera.extension ! 'undefined' &&
- typeof opera.extension.postMessage ! 'undefined') { // Opera 12 extension
- opera.extension.postMessage({'action':'xhr-'+index, 'url':details.url, 'method':details.method});
- } else if (typeof window.opera 'undefined' && typeof XMLHttpRequest 'function') { // Opera 15+ extension
- xhr.onreadystatechange = function() {
- if (details['onload']) {
- }
- }
- xhr.send();
- }
- function addFileSize(url, format) {
- function updateVideoLabel(size, format) {
- var elem=document.getElementById(LISTITEM_ID+format);
- size=parseInt(size,10);
- size=parseFloat((size/1073741824).toFixed(1))+' GB';
- size=parseFloat((size/1048576).toFixed(1))+' MB';
- size=parseFloat((size/1024).toFixed(1))+' KB';
- if (elem.childNodes.length>1) {
- } else if (elem.childNodes.length1) {
- elem.appendChild(document.createTextNode(' ('+size+')'));
- }
- var matchSize=findMatch(url, /[&?]clen=([0-9]+)&/i);
- updateVideoLabel(matchSize, format);
- try {
- method:'HEAD',
- onload:function(response) {
- if (response.readyState 4 && response.status 200) { // add size
- if (typeof response.getResponseHeader 'function') {
- size=response.getResponseHeader('Content-length');
- var regexp = new RegExp('^Content-length: (.*)$','im');
- var match = regexp.exec(response.responseHeaders);
- size=match[1];
- }
- updateVideoLabel(size, format);
- }
- });
- }
- debug('DYVAM - Info: signature start '+getPref(STORAGE_CODE));
- findMatch(sourceCode,
- /.sets*('signature's*,s*([a-zA-Z0-9_$][w$]*)(/)
- /.sigs*||s*([a-zA-Z0-9_$][w$]*)(/)
- /.signatures*=s*([a-zA-Z_$][w$]*)([a-zA-Z_$][w$]*)/); //old
- if (signatureFunctionName null) return setPref(STORAGE_CODE, 'error');
- signatureFunctionName=signatureFunctionName.replace('$','$');
- var regCode = new RegExp(signatureFunctionName + 's*=s*function' +
- 's*([w$]*)s*{[w$]*=[w$]*.split(');n*(.+);return [w$]*.join');
- var regCode2 = new RegExp('function s*' + signatureFunctionName +
- 's*([w$]*)s*{[w$]*=[w$]*.split(');n*(.+);return [w$]*.join');
- var functionCode = findMatch(sourceCode, regCode) || findMatch(sourceCode, regCode2);
- debug('DYVAM - Info: signaturefunction ' + signatureFunctionName + ' -- ' + functionCode);
- if (functionCode null) return setPref(STORAGE_CODE, 'error');
- var reverseFunctionName = findMatch(sourceCode,
- /([w$]*)s*:s*functions*(s*[w$]*s*)s*{s*(?:returns*)?[w$]*.reverses*(s*)s*}/);
- debug('DYVAM - Info: reversefunction ' + reverseFunctionName);
- if (reverseFunctionName) reverseFunctionName=reverseFunctionName.replace('$','$');
- /([w$]*)s*:s*functions*(s*[w$]*s*,s*[w$]*s*)s*{s*(?:returns*)?[w$]*.(?:slice|splice)(.+)s*}/);
- debug('DYVAM - Info: slicefunction ' + sliceFunctionName);
- if (sliceFunctionName) sliceFunctionName=sliceFunctionName.replace('$','$');
- var regSlice = new RegExp('.(?:'+'slice'+(sliceFunctionName?'|'+sliceFunctionName:')+
- ')s*(s*(?:[a-zA-Z_$][w$]*s*,)?s*([0-9]+)s*)'); // .slice(5) sau .Hf(a,5)
- var regReverse = new RegExp('.(?:'+'reverse'+(reverseFunctionName?'|'+reverseFunctionName:')+
- ')s*([^)]*)'); // .reverse() sau .Gf(a,45)
- var regSwap = new RegExp('[w$]+s*(s*[w$]+s*,s*([0-9]+)s*)');
- var regInline = new RegExp('[w$]+[0]s*=s*[w$]+[([0-9]+)s*%s*[w$]+.length]');
- var decodeArray=[];
- for (var i=0; i<functionCodePieces.length; i++) {
- functionCodePieces[i]=functionCodePieces[i].trim();
- if (codeLine.length>0) {
- var arrReverse=codeLine.match(regReverse);
- debug(i+': '+codeLine+' --'+(arrSlice?' slice length '+arrSlice.length:') +' '+(arrReverse?'reverse':'));
- var slice=parseInt(arrSlice[1], 10);
- decodeArray.push(-slice);
- } else if (arrReverse && arrReverse.length >= 1) { // reverse
- } else if (codeLine.indexOf('[0]') >= 0) { // inline swap
- functionCodePieces[i+1].indexOf('.length') >= 0 &&
- var inline=findMatch(functionCodePieces[i+1], regInline);
- decodeArray.push(inline);
- } else return setPref(STORAGE_CODE, 'error');
- var swap=findMatch(codeLine, regSwap);
- if (isInteger(swap) && swap>0){
- } else return setPref(STORAGE_CODE, 'error');
- }
- setPref(STORAGE_URL, scriptURL);
- DECODE_RULE=decodeArray;
- debug('DYVAM - Info: signature '+decodeArray.toString()+' '+scriptURL);
- for (var i=0;i<downloadCodeList.length;i++) {
- var elem=document.getElementById(LISTITEM_ID+downloadCodeList[i].format);
- var sig=downloadCodeList[i].sig;
- url=url.replace(/&signature=[w.]+/, '&signature='+decryptSignature(sig));
- addFileSize(url, downloadCodeList[i].format);
- }
- }
- function isValidSignatureCode(arr) { // valid values: '5,-3,0,2,5', 'error'
- if (arr'error') return true;
- for (var i=0;i<arr.length;i++) {
- if (!isInteger(parseInt(arr[i],10))) return false;
- return true;
- var storageURL=getPref(STORAGE_URL);
- if (!(/,0,|^0,|,0$|-/.test(storageCode))) storageCode=null; // hack for only positive items
- if (storageCode && isValidSignatureCode(storageCode) && storageURL &&
- scriptURL.replace(/^https?/i,')storageURL.replace(/^https?/i,')) return;
- debug('DYVAM fetch '+scriptURL);
- crossXmlHttpRequest({
- url:scriptURL,
- debug('DYVAM fetch status '+response.status);
- if (response.readyState 4 && response.status 200 && response.responseText) {
- }
- });
- }
- function getDecodeRules(rules) {
- if (storageCode && storageCode!='error' && isValidSignatureCode(storageCode)) {
- for (var i=0; i<arr.length; i++) {
- }
- debug('DYVAM - Info: signature '+arr.toString()+' '+scriptURL);
- return rules;
- function swap(a,b){var c=a[0];a[0]=a[b%a.length];a[b]=c;return a};
- function decode(sig, arr) { // encoded decryption
- var sigA=sig.split(');
- var act=arr[i];
- sigA=(act>0)?swap(sigA, act):((act0)?sigA.reverse():sigA.slice(-act));
- var result=sigA.join(');
- }
- if (signull) return ';
- if (arr) {
- if (sig2) return sig2;
- setPref(STORAGE_URL, ');
- }
- }
- }
- })();