// ==UserScript==
// @name YouTube View Most Popular and Newest Uploader Videos (2018+)
// @namespace YVMUV
// @version 23.1
// @description See the user's most 'Popular' and 'Newest' video pages in a sliding-dropdown preview without even having to leave the video page.
// @run-at document-start
// @include *://www.youtube.com/watch?v=*
// @include *://www.youtube.com/channel/*/videos?*
// @exclude *://www.youtube.com/tv*
// @exclude *://www.youtube.com/embed/*
// @exclude *://www.youtube.com/live_chat*
// @exclude *://www.youtube.com/feed/subscriptions?flowx=2*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @require https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js
// @resource primefix https://greasyfork.org/scripts/370052-youtube-old-site-design/code/Youtube%20Old%20Site%20Design.user.js
// @resource primefixb https://greasyfork.org/scripts/32906-get-me-old-youtube/code/Get%20me%20Old%20Youtube.user.js
// @resource spfremove https://greasyfork.org/scripts/16935-disable-spf-youtube/code/Disable%20SPF%20Youtube.user.js
// @grant GM_getResourceText
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @author drhouse
// @contributor Artain [Get me Old Youtube]
// ==/UserScript==
this.$ = this.jQuery = jQuery.noConflict(true);
$(document).ready(function () {
eval(GM_getResourceText("spfremove"));
//eval(GM_getResourceText("primefix"));
eval(GM_getResourceText("primefixb"));
if(window.location != window.parent.location){
$('#masthead-positioner').remove();
$('div.branded-page-v2-top-row').remove();
$('#appbar-guide-menu').remove();
$('div#masthead-positioner-height-offset').remove();
var links = document.getElementById('content').getElementsByTagName('a');
for(var i=0 ; i<links.length ; i++){
links[i].setAttribute('target', '_top');
}
}
else {
//not in frame
}
var dest = '#watch7-user-header > div > a';
var channel = $(dest).attr('href');
var link = 'https://www.youtube.com' + channel + '/videos?view=0&sort=p&flow=grid';
var link2 = "'" + link + "'";
var dest2 = $('#watch8-secondary-actions > div:nth-child(3)');
var linkdd = 'https://www.youtube.com' + channel + '/videos?view=0&sort=dd&flow=grid';
var linkdd2 = "'" + linkdd + "'";
$('<button class="yt-uix-button yt-uix-button-size-default yt-uix-button-has-icon yt-uix-tooltip addto-button" type="button" title="More actions" aria-pressed="false" id="popular" role="button" aria-haspopup="false" data-tooltip-text="Popular videos" aria-labelledby="yt-uix-tooltip93-arialabel"><span class="yt-uix-button-content"><a href="' + link + '"> Most popular videos</a></span></button>').insertAfter(dest2).css('color', '#666')
$('<button class="yt-uix-button yt-uix-button-size-default yt-uix-button-has-icon yt-uix-tooltip addto-button" type="button" title="More actions" aria-pressed="false" id="newest" role="button" aria-haspopup="false" data-tooltip-text="Newest videos" aria-labelledby="yt-uix-tooltip93-arialabel"><span class="yt-uix-button-content"><a href="' + linkdd + '"> Newest videos</a></span></button>').insertAfter(dest2).css('color', '#666');
document.getElementById("popular").addEventListener("click", function(event){
event.preventDefault()
});
document.getElementById("newest").addEventListener("click", function(event){
event.preventDefault()
});
$("head").append (
'<link '
+ 'href="//netdna.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" '
+ 'rel="stylesheet" type="text/css">'
);
$("head").append (
'<link '
+ 'href="//unity.alwaysdata.net/test/push.css" '
+ 'rel="stylesheet" type="text/css">'
);
+function ($) {
// PUSH PLUGIN CLASS DEFINITION
// ============================
// variable used to indetify inilitizing of the Push plugin
var pushAPI = '[data-toggle="push"]' // Default value is '[data-toggle="push"]'
// Main function to get off canvas element and options
var Push = function (element, options) {
this.element = element
this.options = options
}
// Current version
Push.VERSION = '1.0'
// Transition duration
Push.TRANSITION_DURATION = 150
// Default PUSH plugin settings
Push.DEFAULTS = {
// Easing method, used for the element when it (opens / closes).
easing : 'cubic-bezier(.2,.7,.5,1)', // Default value is 'cubic-bezier(.2,.7,.5,1)'
// Duration for an element to (open / close)
duration : 1500, // Default value is 300
// Delay before the element (opens / closes)
delay : 1000, // Default value is 0
// Distance an element (opens / closes)
distance : 250, // Default value is 250
// Enable or disable Anti Scrolling (outside the element)
antiScroll : false, // Default value is true
// Enable or disable keyboard closing (escape key to close the element)
keyboard : true, // Default value is true
// Enable or disable a modal like overlay (outside the element).
overlay : false, // Default value is true
// Canvas element (outside togglable sidebars).
canvas : '#body-container' // Default value is '#wrapper'
}
// Function to check if the canvas element is open
Push.prototype.isOpen = function () {
// Return if the canvas element has the isOpen class
return $(this.options.canvas).hasClass('isOpen')
}
// Function to toggle (open or close)
Push.prototype.toggle = function () {
// If canvas is already open
if (this.isOpen()) {
this.close() // close canvas and hide element
}
// If canvas isn't open
else {
this.open() // open canvas and reveal element
}
}
// Function to find all fixed elements
Push.prototype.findFixed = function () {
// Filter all elements with position: fixed
var fixed_elements = $('*').filter(function() {
return $(this).css("position") === 'fixed';
}).not(this.element) // Skip sidebar element
// Return all fixed elements, except the sidebar element
return fixed_elements
}
// Function to disable scrolling outside an element
Push.prototype.disableScrolling = function () {
// Add overflow hidden to body, to prevent scrolling
$(document.body).css('overflow', 'hidden')
// On touch devices, overflow: hidden, is ignored. So we specefiy another prevention for touch devices.
if ('ontouchstart' in document.documentElement) {
$(document).on('touchmove.bs.push', function (e) {
e.preventDefault()
})
}
}
// Function to enable scrolling outside an element
Push.prototype.enableScrolling = function () {
// Override the previously added overflow hiddien. To active normal scroll behaviour
$(document.body).css('overflow', 'auto')
// Turn off the anti touch functionality for touch devices.
if ('ontouchstart' in document.documentElement) {
$(document).off('touchmove.bs.push')
}
}
// Function to disable key press to close an element
Push.prototype.disableKeyboard = function () {
// Turn off the previously added keybind to close an open sidebar
$(window).off('keydown.bs.push')
}
// Function to enable key press to close an element
Push.prototype.enableKeyboard = function () {
// Add functionality to close a sidebar, with a specefied keybind
$(window).one('keydown.bs.push', $.proxy(function (e) {
e.which == 13 && this.close() || e.which == 32 && this.close() // default value is: 27 (ESC key)
}, this))
}
// Function to remove an overlay outside the element
Push.prototype.disableOverlay = function () {
// Prepare the overlay variable
var $overlay = $(".modal-backdrop");
// Remove previously added overlay effect, from the canvas element
$overlay.remove();
}
// Function to add an overlay outside the element
Push.prototype.enableOverlay = function () {
// Prepare the overlay variable
var $overlay = $('<div class="modal-backdrop in"></div>');
// Add an overlay effect to the canvas element
$overlay.appendTo(this.options.canvas);
}
// Function to open an element
Push.prototype.open = function () {
// Set the (that) variable, for easy access, and to avoid conflict.
var that = this
// Get all fixed elements, except the sidebar elements
var fixedElements = this.findFixed()
// If options is set to disable scrolling, disable it on opening
if (this.options.antiScroll) this.disableScrolling()
// If options is set to enable keyboard, enable it on opening
if (this.options.keyboard) this.enableKeyboard()
// If options is set to activate overlay, activate it on opening
if (this.options.overlay) this.enableOverlay()
// Reveal the toggled sidebar
$(this.element).removeClass('hidden')
// Open the canvas elemen
$(this.options.canvas)
.on('click.bs.push', $.proxy(this.close, this)) // If the user clicks on the canvas element, call the close functionality.
.trigger('open.bs.push') // Trigger the open sequence
.addClass('isOpen') // adds the isOpen class, to identify that the canvas is open
// If browser doesn't support CSS3 transitions & translations
if (!$.support.transition) {
// Move all specefied fixed elements, when canvas is open
fixedElements
.css({
'left': this.options.distance + 'px',
'position': 'relative'
})
// Move the actual canvas
$(this.options.canvas)
.css({
'left': this.options.distance + 'px',
'position': 'relative'
})
.trigger('opened.bs.push') // Indicate that the opening sequence is complete
return
}
// Prepare the CSS3 transitioning of the all fixed elements, except for the sidebars
fixedElements
.css({
'-webkit-transition': '-webkit-transform ' + this.options.duration + 'ms ' + this.options.easing,
'-ms-transition': '-ms-transform ' + this.options.duration + 'ms ' + this.options.easing,
'transition': 'transform ' + this.options.duration + 'ms ' + this.options.easing
})
// Prepare the CSS3 transitioning of the canvas element
$(this.options.canvas)
.css({
'-webkit-transition': '-webkit-transform ' + this.options.duration + 'ms ' + this.options.easing,
'-ms-transition': '-ms-transform ' + this.options.duration + 'ms ' + this.options.easing,
'transition': 'transform ' + this.options.duration + 'ms ' + this.options.easing
})
this.options.canvas.offsetWidth // Force reflow
// Move all specefied fixed elements, when the canvas opening sequence is initilised
fixedElements
.css({
'-webkit-transform': 'translateY(' + this.options.distance + 'px)',
'-ms-transform': 'translateY(' + this.options.distance + 'px)',
'transform': 'translateY(' + this.options.distance + 'px)'
})
// Move the actual canvas element, when the opening sequence is initialised
$(this.options.canvas)
.css({
'-webkit-transform': 'translateY(' + this.options.distance + 'px)',
'-ms-transform': 'translateY(' + this.options.distance + 'px)',
'transform': 'translateY(' + this.options.distance + 'px)'
})
.one('bsTransitionEnd', function () {
$(that.options.canvas).trigger('opened.bs.push') // Indicate that the opening sequence is complete
})
.emulateTransitionEnd(this.options.duration) // Emulate the ending prosedure of the canvas opening
}
// Function to close an element
Push.prototype.close = function () {
// Set the (that) variable, for easy access, and to avoid conflict.
var that = this
// Get all fixed elements, except the sidebar elements
var fixedElements = this.findFixed()
// If options is set to enable keyboard, disable it on closing
if (this.options.keyboard) this.disableKeyboard()
// If options is set to activate overlay, deactivate it on closing
if (this.options.overlay) this.disableOverlay()
// If options is set to disable scrolling, enable it on clsoing
if (this.options.antiScroll) this.enableScrolling()
// Function to finilize the closing prosedure
function complete () {
// Hide the toggled sidebar
$(that.element).addClass('hidden')
// Reset the CSS3 transitioning and translation, of the all fixed elements back to default.
fixedElements
.css({
'-webkit-transition': '',
'-ms-transition': '',
'transition': '',
'-webkit-transform': '',
'-ms-transform': '',
'transform': ''
})
// Reset the CSS3 transitioning and translation, of the canvas element back to default.
$(that.options.canvas)
.removeClass('isOpen') // remove the isOpen class, to identify that the canvas is closed
.css({
'-webkit-transition': '',
'-ms-transition': '',
'transition': '',
'-webkit-transform': '',
'-ms-transform': '',
'transform': ''
})
.trigger('closed.bs.push') // Indicate that the closing sequence is complete
}
// If browser doesn't support CSS3 transitions & translations
if (!$.support.transition) {
// Move back all specefied fixed elements to default.
fixedElements
.css({
'left': '',
'position': ''
})
// Move back the canvas element to default.
$(this.options.canvas)
.trigger('close.bs.push') // Trigger the close sequence
.css({
'left': '',
'position': ''
})
.off('click.bs.push') // Turn off the click indicator for the canvas element
// Initilise the final closing functionality
return complete()
}
// Remove the CSS3 trasform values for all fixed elements
fixedElements
.css({
'-webkit-transform': 'none',
'-ms-transform': 'none',
'transform': 'none'
})
// Remove the CSS3 transform values for the canvas element
$(this.options.canvas)
.trigger('close.bs.push') // Trigger the close sequence
.off('click.bs.push') // Turn off the click indicator for the canvas element
.css({
'-webkit-transform': 'none',
'-ms-transform': 'none',
'transform': 'none'
})
.one('bsTransitionEnd', complete) // // Initilize the complete function, to finilise the closing
.emulateTransitionEnd(this.options.duration) // Emulate the ending prosedure of the canvas closing
}
// PUSH PLUGIN DEFINITION
// ======================
// Function to initlise the push Plugin
function Plugin(option) {
// Begin initilising of the push plugin, for every indicator clicked
return this.each(function () {
// Prepare a variable, containing the designated element
var $this = $(this)
// Prepare a variable, containing the data-attributes
var data = $this.data('bs.push')
// Prepare the plugin options
var options = $.extend(
{
// extentions...
},
Push.DEFAULTS, // Initilise default plugin values
$this.data(), // Get the extending options from the plugin indicator
typeof option == 'object' && option // Setup an object with the designated options
)
// If the push indicatore doesn't contain any data atributes. Use the default values
if (!data) $this.data('bs.push', (data = new Push(this, options)))
// If the push indicator has a data attribute, containing a string
if (typeof option == 'string') data[option]() // Setup the option
})
}
var old = $.fn.push
$.fn.push = Plugin
$.fn.push.Constructor = Push
// PUSH AVOID CONFLICT
// ====================
$.fn.push.noConflict = function () {
$.fn.push = old
return this
}
// PUSH DATA-API
// =============
// When clicked on a push data API indicator, initilise the plugin
$(document).on('click', pushAPI, function () {
// Get all the data options
var options = $(this).data()
// Get the designated data-target (sidebar element)
var $target = $(this.getAttribute('data-target'))
// If no designated data-target is spcefied, use default value
if (!$target.data('bs.push')) {
$target.push(options) // Get all the other data options
}
// Toggle the designated data-target (sidebar )
$target.push('toggle')
})
}(jQuery);
//----------------------------------------------------------------
channel = $('#popular > span > a').attr('href');
var channeln = $('#newest > span > a').attr('href');
var channel2 = channel + '#browse-items-primary';
var channel2n = channeln + '#browse-items-primary';
var ifrm;
ifrm = document.createElement("iframe");
ifrm.setAttribute("src", channel2);
ifrm.setAttribute("id", "ifrmz");
ifrm.style.width = 1500+"px";
ifrm.style.height = 548+"px";
var ifrm2;
ifrm2 = document.createElement("iframe");
ifrm2.setAttribute("src", channel2n);
ifrm2.setAttribute("id", "ifrmz2");
ifrm2.style.width = 1500+"px";
ifrm2.style.height = 548+"px";
$('<nav class="push-sidebar hidden" id="sidebar-left"></nav>').insertBefore('#body-container');
$('<nav class="push-sidebar hidden" id="sidebar-left2"></nav>').insertBefore('#body-container');
$( "#body-container" ).wrap( '<section class="canvas" id="canvas"></section>' );
function newload(){
$('nav#sidebar-left').append(ifrm);
}
function newload2(){
$('nav#sidebar-left2').append(ifrm2);
}
$( "#newest" ).attr({
'class': "yt-uix-button yt-uix-button-size-default",
'data-toggle': "push",
'data-target': "#sidebar-left2",
'data-distance': "500"
});
$( "#newest" ).click(function(e) {
newload2();
});
$( "#popular" ).attr({
'class': "yt-uix-button yt-uix-button-size-default",
'data-toggle': "push",
'data-target': "#sidebar-left",
'data-distance': "500"
});
$( "#popular" ).click(function(e) {
newload();
});
});