Youtube Nifties

By funkwurm Last update Apr 20, 2009 — Installed 532 times.

There are 2 previous versions of this script.

// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.
//
// To install, you need Greasemonkey: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "funkwurm Youtube Enhancer", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name          funkwurm Youtube Nifties
// @namespace     http://www.youtube.com/funkwurm
// @description   Adds a few nifty Youtube enhancements
// @include       http://youtube.com/*
// @include       http://*.youtube.com/*
// ==/UserScript==

function _funkYTE() {
  var self=this;
  
  function getElementsByClassName(e, needle) { /* modified version of crisp's getElementsByClassName, this version expects an parent-element as a first argument */
    var s = [], r = [], undefined;
 /*    var e = document.documentElement || document.body; */
    var re = new RegExp('(^|\\s)' + needle + '(\\s|$)');

    while (e !== undefined) {
      while (e) {
        if (e.nodeType == 1) {
          if (e.className && re.test(e.className)) r.push(e);
          s.push(e.firstChild);
        }
        e = e.nextSibling;
      }
      e = s.pop();
    }
    return r;
  }
  
  function getParentTagFromElement(sTag, rElement) { /* does what the name of the function says, get the nearest parent of rElement that is of tag sTag */
    var rParent=rElement.parentNode;
    while (rParent.nodeName.toLowerCase()!=sTag.toLowerCase() && rParent.nodeName.toLowerCase()!='body') {
      rParent=rParent.parentNode;
    }
    return rParent;
  }

  function checkIfPageIs(sPageToCheck) {
    switch (true) {
      case (sPageToCheck=='view_video'  &&  location.href.search(/^http:\/\/([a-z]{2,3}\.)?youtube\.[a-z]{2,3}(\.[a-z]{2,3})?\/watch\?/i)!=-1):
      case (sPageToCheck=='all_comments' && location.href.search(/^http:\/\/([a-z]{2,3}\.)?youtube\.[a-z]{2,3}(\.[a-z]{2,3})?\/comment_servlet\?/i)!=-1):
      case (sPageToCheck=='subs_center'  && location.href.search(/^http:\/\/([a-z]{2,3}\.)?youtube\.[a-z]{2,3}(\.[a-z]{2,3})?\/my_subscriptions/i)!=-1):
        return true;
    }
    return false;
  }
  
  if (checkIfPageIs('view_video') || checkIfPageIs('all_comments')) {
    var sVideoId=location.href.split("?")[1].match(/v=(([^&#]|$)*)/)[1];
  }
  
  var aLanguages={
    "english":{
      "descriptionSaveButt":"Right-click save video to PC button",
      "descriptionConfirmD":"Ask to confirm before deleting comment",
      "descriptionSubsTabs":"Make middleclick open videos in tabs",
      "confirmDeleteDialog":"Are you sure you want to delete this comment?",
      "saveButtonTitle":"Right click, save as: ",
      "saveNormal":"normal/HQ",
      "saveHD":"HD"
    }
  }
  
  function getLanguage() {
    return 'english';
  }
  
  function setOption(sOption, bEnabled) {
    GM_setValue('en'+sOption, bEnabled);
  }
  
  function getOption(sOption) {
    return GM_getValue('en'+sOption, 'not set');
  }
  
  function initOption(sOption) {
    var sOptionState='';
    if (unsafeWindow['YTDid'+sOption]) {
      setOption(sOption, false);
      sOptionState=' disabled="disabled"';
    } else if (getOption(sOption)=='not set') {
      setOption(sOption, true);
    }
    if (getOption(sOption)) {
      sOptionState=' checked="checked"';
    }
    return '<li><label><input type="checkbox" id="_funkEn'+sOption+'"'+sOptionState+' /> '+aLanguages[getLanguage()]['description'+sOption]+'</label></li>';
  }

  var bSettingsWinDone=false;
  function makeSettingsWin() {
    bSettingsWinDone=true;
    
    var eStyle=document.createElement('style');
    eStyle.appendChild(document.createTextNode(
      '#_funkContainer {'+
        'background-color:#fff;'+
        'position:fixed;'+
        'bottom:0px;'+
        'right:10px;'+
      '}'+
      '#_funkField {'+
        'border:0;'+
        'margin:0;'+
        'padding:0;'+
      '}'+
      '#_funkButton {'+
        'cursor:pointer;'+
      '}'+
      '#_funkSettings {'+
        'display:none;'+
      '}'+
      '#_funkSettings, #_funkSettings li {'+
        'list-style-type:none;'+
        'padding:0;'+
        'margin:0;'+
      '}'+
      '#watch-views {'+
        'white-space:nowrap;'+
      '}'+
      '#watch-rating-div, #ratingWrapper, #watch-views-div {'+
        'width:auto !important;'+
      '}'
    ));
    document.getElementsByTagName('head')[0].appendChild(eStyle);
    
    var sSettingsHtml=
      '<fieldset id="_funkField"><legend id="_funkButton">Youtube Nifties</legend>'+
        '<ul id="_funkSettings">Enable:'+
          initOption('SaveButt')+
          initOption('ConfirmD')+
          initOption('SubsTabs')+
        '</ul>'+
      '</fieldset>';
    var eSettingsDiv=document.createElement('div');
    eSettingsDiv.setAttribute('id', '_funkContainer');
    eSettingsDiv.innerHTML=sSettingsHtml;
    document.body.appendChild(eSettingsDiv);
    var aCheckBoxes=eSettingsDiv.getElementsByTagName('input');
    var iCheckBoxIndex=aCheckBoxes.length;
    while (iCheckBoxIndex--) {
      aCheckBoxes[iCheckBoxIndex].addEventListener('click', function() {
        _funkYTEnhance.setOptionEnabled(this.id.substr(7, 8), this.checked);
      }, false);
    }
    document.getElementById('_funkButton').addEventListener('click', function() {
      var rOptionsUl=document.getElementById('_funkSettings');
      if (rOptionsUl.style.display=='block') {
        rOptionsUl.style.display='none';
      } else {
        rOptionsUl.style.display='block';
      }
    }, false);
  }
  
  var bSaveButtonAdded=false;
  function addSaveButton() {
    bSaveButtonAdded=true;
    var sDownloadUrl='http://youtube.com/get_video?video_id=';
      
    var rPlayerDiv=document.getElementById('movie_player');
    var sTId=rPlayerDiv.getAttribute('flashvars').match(/(\?|&)t=(([^&]|$)*)/)[2];
    var sVideoUrl=sDownloadUrl+sVideoId+'&t='+sTId;
    
    var eSpanToAdd=document.createElement('span');
    eSpanToAdd.innerHTML=aLanguages[getLanguage()]['saveButtonTitle']+
                         '<a href="'+sVideoUrl+'&fmt=18" rel="nofollow">'+aLanguages[getLanguage()]['saveNormal']+'</a> or '+
                         '<a href="'+sVideoUrl+'&fmt=22" rel="nofollow">'+aLanguages[getLanguage()]['saveHD']+'</a>. ';

    eInsertBefore=document.getElementById('watch-view-count');
    eInsertBefore.parentNode.insertBefore(eSpanToAdd, eInsertBefore);
  }
  
  var bConfirmDeleteDone=false;
  function addConfirmDelete() {
    bConfirmDeleteDone=true;
    var aDeleteAs=document.getElementsByTagName('a');
    var iA=aDeleteAs.length;
    while (iA--) {
      var sOnclick=aDeleteAs[iA].getAttribute('onclick');
      if (sOnclick && sOnclick.search(/removeComment/)!=-1) {
        aDeleteAs[iA].removeAttribute('onclick');
        aDeleteAs[iA].addEventListener('click', new Function ("if (confirm('"+aLanguages[getLanguage()]['confirmDeleteDialog']+"')) { unsafeWindow."+sOnclick+" } "), false);
      }
    }
  }

  var bSubsMadeMidClickable=false;
  function makeSubsMidClickable() {
    bSubsMadeMidClickable=true;
    var aVideoLinks=document.getElementById('videos').getElementsByTagName('a');
    iVideos=aVideoLinks.length;
    while (iVideos--) {
      if (aVideoLinks[iVideos].getAttribute('href').indexOf('#')!=-1) {
        var sVideoURL=aVideoLinks[iVideos].getAttribute('onclick').match(/'([^']+)'/)[1]; // '
        aVideoLinks[iVideos].setAttribute('href', 'watch?v='+sVideoURL);
        aVideoLinks[iVideos].removeAttribute('onclick');
      }
    }
  }
  
  this.checkIfPage=function(sPageToCheck) {
    return checkIfPageIs(sPageToCheck);
  }
  
  this.setOptionEnabled=function(sOption, bEnabled) {
    setOption(sOption, bEnabled);
  }
  
  this.getOptionEnabled=function(sOption) {
    return getOption(sOption);
  }
  
  this.addCounter=function() {
    addCounterToTextareas();
  }
  
  this.addConfirm=function() {
    addConfirmDelete();
  }
  
  this.addNifties=function() {
    if (checkIfPageIs('view_video')) {
      if (!bSaveButtonAdded && getOption('SaveButt'))
        addSaveButton();
      if (!bConfirmDeleteDone && getOption('ConfirmD'))
        addConfirmDelete();
    }
    if (checkIfPageIs('all_comments')) {
      if (!bPaginationNavigationExpandingDone && getOption('PageNavE'))
        expandPaginationNavigation();
      if (!bConfirmDeleteDone && getOption('ConfirmD'))
        addConfirmDelete();
    }
    if (checkIfPageIs('subs_center')) {
      if (!bSubsMadeMidClickable && getOption('SubsTabs'))
        makeSubsMidClickable();
    }
    if (!bSettingsWinDone)
      makeSettingsWin();
  }
}

_funkYTEnhance=new _funkYTE();
_funkYTEnhance.addNifties();

document.addEventListener("DOMNodeInsterted", _funkYTEnhance.addConfirm, false);