YouTube Video Downloader

By LouCypher Uploaded May 28, 2009
/*
  @author: LouCypher
  @email: loucypher@mozillaca.com
  @url: http://userscripts.org/jetpacks/7
  @update: http://userscripts.org/jetpacks/7.js
  @title: YouTube Video Downloader
  @description: Download FLV video from YouTube
  @version: 0.1
*/


function YouTube_Downloader() {}

YouTube_Downloader.prototype = {
  icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAEtL/wDw8AAA9fUAAA0NAAD19QAAAQEAAPb2AAAeHgAAIyMAABcXAAAUFAD+AAAAAmtrAQAAAAACAAAAAAA6Ov/oQEAA6GlpAOWSkgD++PgAAP//AAD09ADoamoA/e3tAADR0QD+3t4AAOzsAAIXFwAAfn7/AAAAAAD///8A/yQk//9DQ////////25u//AcHP/7KSn/8wsL//719f/xMDD/9xwc//8aGv/sMTH/+0dH//9YWP////8AAP///wD/Fhb//xAQ//z/////ExP//v////1VVf//y8v/+8TE//vi4v/7wcH/9H5+///7+//2u7v//wkJ/////wACAAAAAP/4+AD/BgYAAwAAAAAICAAA+PgAAPj4AADt7QADEREAAU9PAAQcHAALQkIA+JKSAAlERAD/9/cAAAAAAAQAAAAA+QUFAAL9/QD9AAAABP7+APz5+QAC8vIAAPn5AP75+QABAgIA/Pf3AP739wAD7u4A9XNzAAYHBwAFAAAAAf///wDqIiL//+vrAAPz8wD+GBgAAtHRAP6/vwABBAQAAR4eAP7U1AABJSUAAdvbAP3+/gADTk4A/SMjABfz8wEEAAAAAPEaGgD57OwABVZWAP4EBABKmlUAAP8AAAAAAAAA1wAAAAABAADk/wD//v4Au/U5APkpKQAHLi4AFwAAAAH///8AAAAAAMorK//75+cA/fv7AEZS9AB3ap0AFAcIAOz58wAJAwYAwuvWAL+pjQC8sA4ABxoaADTW1gEAAAAABAAAAAAAAAAANtXVAQAAAAAAAAAA+WMB9fII+wD4/fwA9QL4AN7z4QC37s0AAAP/ADvw8AsAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADvwHAAMGBACe3bkA7OvRAAD9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAWEB9WZljwARCQ0A2vPiAOzuzgAgDQwAOBMFAHlVGQABYgH1AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAA9wmWmpWCANfy4wDC5b8AKgoMAEIQ9gBBEvIAh6PrAAD2CZYAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wAAOABqAC4A9UetWPVctCn1ba4R9QAxAPUAOABq////AP///wD///8A////AAD///8A////AP///wD///8A////AP///wAAVwmLADMA9QAzAPUAMwD1AFcJi////wD///8A////AP///wD///8AAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQE4AAAAAAAAAAD////IAAAAAAAAAAAAAAAAAAAAAAAAAABbyHw8a6Da8AAAAABJRU5ErkJggg==",
  avatar: "http://gravatar.com/avatar.php?gravatar_id=385808f29b1ed37df95f00960cc4c9c2&s=32",

  isVideoPage: function() {
    var reg = new RegExp("^http\\:\\/\\/www\\.youtube\\.com\\/watch\\?.*v\\=.*", "i");
    return reg.test(jetpack.tabs.focused.url);
  },

  get contentWindow() {
    return jetpack.tabs.focused.contentWindow;
  },

  notify: function(aString, aIcon) {
    jetpack.notifications.show({
      title: "YouTube Video Downloader",
      body: aString,
      icon: aIcon
    });
  },

  about: function() {
    this.notify("by LouCypher", this.avatar);
  },

  download: function() {
    if (this.isVideoPage()) {
      var swfArgs = this.contentWindow.wrappedJSObject.swfArgs;
      var url = "http://www.youtube.com/get_video" +
                "?video_id=" + swfArgs.video_id +
                "&t=" + swfArgs.t;
      jetpack.tabs.open(url);
    } else {
      this.notify("Not a YouTube video page.", this.icon);
    }
  }
};

jetpack.statusBar.append({
  html: <>
    <span style="cursor: pointer;">
      <img id="icon" />
    </span>
  </>,

  width: 16,

  onReady: function (aDocument) {
    var yt = new YouTube_Downloader(aDocument);
    $("img#icon", aDocument).attr("src", yt.icon);
    $(aDocument).click(function(aEvent) {
      switch(aEvent.button) {
        case 0: yt.download(); break;
        default: yt.about();
      }
    });
  }
});