NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name YouThumb! (For old youtube design) YouTube thumbnails showing // @namespace www.youtube.com/watch.youthumb // @version 1.4 // @license GPLv2 // @description Show YouTube thumbnail picture by button, near likes buttons. For old youtube design // @author zanygamer@gmail.com // @include *youtube.com/* // @match *youtube.com/* // @grant none // @run-at document-end // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js // ==/UserScript== /* Videos for testing https://www.youtube.com/watch?v=SgEsf4QcR0Q - all resolutions https://www.youtube.com/watch?v=y0OzPjlJHzM - only hqdefautl https://www.youtube.com/watch?v=ZckOGWOYfFA - WO maxres https://www.youtube.com/watch?v=8Zy9InnJ4-Y&index=11&list=PLzPivwyXljVV100GMKcQAekdThrN2z6DQ - Jump over playlist https://www.youtube.com/watch?v=oJtV-vVkQYI - from this to this https://www.youtube.com/watch?v=Gug8WIu5cPE https://www.youtube.com/watch?v=bwy2HnmQoFo&t=250s TODO Show thumbs not only on watch page */ (function ($, undefined) { $(function () { 'use strict'; var t = { // translates show_thumb: { ru: "Показать миниатюру", en: "Show thumb" }, hide_thumb: { ru: "Скрыть миниатюру", en: "Hide thumb" }, show_hide_thumb: { ru: "Показать / скрыть миниатюру", en: "Show / hide thumb" }, close_thumb: { ru: "Кликните, чтобы закрыть миниатюру", en: "Click to close thumbnail" } }, cl = function(m){console.log(m);}, isset = function (e){ return typeof e == 'undefined' ? false : true;}, trys = 0, setImages, imgBase, defaultImgSrc = 0, imgSrc = null, images = ['maxresdefault.jpg', 'sddefault.jpg', 'hqdefault.jpg'], maxCount = 25, count = 0, LANG = navigator.language, $body = $('body'), bp_width = '32px', bp_height = '20px', widthes = [0, 0, 0], setImagesInterval, endvar; if(LANG == 'en-US') LANG = 'en'; if(LANG == 'ru-RU') LANG = 'ru'; function showThumbnail(){ var YouThumb = $('#YouThumb'); var playerApi = $('#player-api'); playerApi.prepend('<img title="'+ t.close_thumb[LANG] +'" id=YouThumb src='+ imgSrc +' style=position:absolute;z-index:999>'); YouThumb = $('#YouThumb'); YouThumb.on('click', showHideThumbnail); var offval = 0; if((YouThumb[0].naturalWidth / YouThumb[0].naturalHeight) > 1.4) { // keep aspect ratio YouThumb.attr('width', playerApi[0].offsetWidth); YouThumb.attr('height', playerApi[0].offsetHeight); //-25 } else { YouThumb.attr('width', playerApi[0].offsetHeight + (playerApi[0].offsetHeight / 3)); YouThumb.attr('height', playerApi[0].offsetHeight); offval = (playerApi[0].offsetWidth - (playerApi[0].offsetHeight + (playerApi[0].offsetHeight / 3))) / 2; } YouThumb.css('left', parseInt(YouThumb.css('left'))+ offval +'px'); $('#YouThumbStatus').html(t.hide_thumb[LANG]); $('#movie_player').css('visibility','hidden'); } function hideThumbnail(){ $('#YouThumbStatus').html(t.show_thumb[LANG]); YouThumb.remove(); $('#movie_player').css('visibility','visible'); } function showHideThumbnail(event){ // when click on buttons or thumbnail var YouThumb = $('#YouThumb'); if(event){ imgSrc = event.target.nodeName == 'SPAN' ? defaultImgSrc : event.target.src; } if(YouThumb.length !== 0 && event && event.target.nodeName == 'SPAN'){ hideThumbnail(); return; } if(YouThumb.length === 0 || (YouThumb.length !== 0 && $('#YouThumb')[0].src != imgSrc)){ if(YouThumb.length !== 0) YouThumb.remove(); showThumbnail(); } else hideThumbnail(); } function getWidths_setButton(){ count++; if(count > maxCount){ cl('LIMIT'); return; } for(let i = 0; i < images.length; i++){ let img = document.getElementById('YouThumb_'+ images[i] +'_imgSrc'); if(!img && count < maxCount){ setTimeout(getWidths_setButton, 500); return; } if(img) widthes[i] = img.naturalWidth; }; let to_insert = ''; for(let i = 0; i < widthes.length; i++){ if(widthes[i] === 0 && count < maxCount){ setTimeout(getWidths_setButton, 500); return;} if(widthes[i] > 120){ if(!defaultImgSrc) defaultImgSrc = imgBase+images[i];// cl(defaultImgSrc); to_insert+= ' <img class=YouThumbButtonImage src="'+ imgBase+images[i] +'" style="width:'+ bp_width +';height:'+ bp_height +'"/>'; } } $('<button id=YouThumbButton class="yt-uix-button yt-uix-button-size-default yt-uix-button-opacity yt-uix-button-has-icon no-icon-markup yt-uix-button-toggled yt-uix-post-anchor yt-uix-tooltip"><span id=YouThumbStatus>'+ t.show_thumb[LANG] +' </span></button>').appendTo($('.like-button-renderer')[0]); $('#YouThumbButton').append(to_insert); } function setImages(){ var YouThumb = $('#YouThumb'); var YouThumbButton = $('#YouThumbButton'); if(YouThumb.length !== 0) hideThumbnail(); // YouThumb.remove(); ShowHideThumbnail(); //$('#movie_player').css('visibility','visible'); if(YouThumbButton.length !== 0){ clearInterval(setImagesInterval); return; } try { imgBase = $('#watch7-content > link[itemprop="thumbnailUrl"]')[0].href; imgBase = imgBase.split('/'); delete imgBase[imgBase.length-1]; imgBase = imgBase.join('/'); } catch(err) { //alert(err.message); cl($('link')); var $body = $('body'); cl($body.find('link')); cl($('link[itemprop="thumbnailUrl"]')); cl(err); return; } clearInterval(setImagesInterval); //cl(imgSrc); //yt-uix-button yt-uix-button-hh-text //imgSrc = imgBase+images[2]; //cl(imgSrc); var images_to_insert = ''; for(let i = 0; i < images.length; i++){ images_to_insert+= '<img id=YouThumb_'+ images[i] +'_imgSrc src="'+ imgBase+images[i] +'" data-tooltip-text="'+ t.show_hide_thumb[LANG] +'" style=position:absolute;top:-50px;left:-50px;width:1px;height:1px>'; } $('body').append(images_to_insert); getWidths_setButton(); } function mocallback(mutationrecords){ if($('title').html() == title || !/watch/i.test(location.href)) return; count = 0; defaultImgSrc = 0; setImagesInterval = setInterval(setImages, 500); // TODO launch every 200 msecs. while element link[itemprop="thumbnailUrl"] not be found, and no more than 50 times! } var title = $('title'); if(!isset(title[0])) return; var title_content = title.html(); var mo = new MutationObserver(mocallback); var options = {'childList': true}; mo.observe(title[0], options); //mo.observe(document.title, options); mo.observe(qs('head>title'), options); //mo.observe(document.getElementById('eow-title'), options); $('body').on('click', '.YouThumbButtonImage', showHideThumbnail); $('body').on('click', '#YouThumbStatus', showHideThumbnail); }); })(window.jQuery.noConflict(true));