Youtube Mini Player

Toggle mini player when scrolling down in Youtube

目前為 2015-09-07 提交的版本,檢視 最新版本

// ==UserScript==
// @name        Youtube Mini Player
// @namespace   feifeihang.info
// @description Toggle mini player when scrolling down in Youtube
// @include     https://youtu.be/*
// @include     http://youtu.be/*
// @include     https://www.youtube.com/watch?*
// @include     http://www.youtube.com/watch?*
// @version     5
// @grant       none
// ==/UserScript==
window.addEventListener('load', function () {
  (function (window, document, undefined) {
    // find and keep a reference of the video player.
    var player = document.querySelector('#movie_player');
    var stylePlayer = '';
    var video = document.querySelector('#movie_player video.video-stream');
    var videoSize = {};
    var controls = document.querySelector('#movie_player .ytp-chrome-bottom');
    var controlsWidth;
    
    // a flag to indicate is the mini player is toggled.
    var isToggled = false;
    var isTogglable = true;
    var originalHeight = undefined;
    window.addEventListener('scroll', function () {
      if (!isTogglable) {
        return false;
      }
      // when scrolling up to 1/3 original player height, turn off mini player.
      if (isToggled && window.pageYOffset < originalHeight / 3) {
        player.style = stylePlayer;
        video.style.width = videoSize.width;
        video.style.height = videoSize.height;
        controls.style.width = controlsWidth;
        isToggled = false;
        return;
      }
      // when scrolling down to 1/3 player height, go to mini player mode.
      gotoMini();
    }, false);
    function gotoMini() {
      if (!isToggled &&
      window.pageYOffset >= parseInt(player.offsetHeight, 10) / 3) {
        originalHeight = parseInt(player.offsetHeight, 10);
        stylePlayer = player.style.cssText;
        videoSize = {
          height: video.style.height,
          width: video.style.width
        };
        controlsWidth = controls.style.width;
        var top = 'top: ' + (window.innerHeight - 270) + 'px;';
        var left = 'left: ' + (window.innerWidth - 400) + 'px;';
        player.style = 'position: fixed; bottom: 20px; left: 20px; height: 250px;' +
        'width: 350px; z-index: 9999999;' + top + left;
        video.style.height = '250px';
        video.style.width = '350px';
        controls.style.width = '350px';
        
        isToggled = true;
      }
    }
    // add a mini player toggle button.

    var btn = document.createElement('div');
    btn.className += ' yt-uix-button yt-uix-button-size-default yt-uix-button-primary';
    btn.innerHTML = 'Mini: on';
    btn.style = 'line-height: 26px; height: 26px; margin-left: 5px;';
    btn.onclick = function () {
      if (this.innerHTML === 'Mini: on') {
        this.innerHTML = 'Mini: off';
        isTogglable = false;
        if (isToggled) {
          player.style = stylePlayer;
          video.style.width = videoSize.width;
          video.style.height = videoSize.height;
          controls.style.width = controlsWidth;
          isToggled = false;
        }
      } 
      else {
        this.innerHTML = 'Mini: on';
        gotoMini();
        isTogglable = true;
      }
    }
    var dom = document.querySelector('#yt-masthead-signin') ||
    document.querySelector('#yt-masthead-user');
    dom.appendChild(btn);
  }) (window, document);
}, false);