// ==VimperatorPlugin==
// @name           Fetch YouTube Video
// @description    Fetch YouTube Video (fmt=22)
// @license        Creative Commons 2.1 (Attribution + Share Alike)
// @version        1.1.1
// @author         anekos (anekos@snca.net)
// @minVersion     2.3pre
// @maxVersion     2.3pre
// ==/VimperatorPlugin==
//
// Usage:
//    :fetchyoutube
//      Download YouTube video to default download directory.
//      (pref: browser.download.dir)
//
// Links:
//    http://d.hatena.ne.jp/nokturnalmortum/20081118#1227004197
//
// Refs:
//    http://creazy.net/2008/11/another_way_to_find_youtube_hd_file.html

(function () {

    function fixFilename (filename) {
      const badChars = /[\\\/:;*?"`|]/g;
      return filename.replace(badChars, '_');
    }

    function makeFile (s) {
      var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
      file.initWithPath(s);
      return file;
    }

    function makeURL (s) {
      var url = Cc["@mozilla.org/network/standard-url;1"].createInstance(Ci.nsIURL);
      url.spec = s;
      return url;
    }

    function fetch (arg) {
      let doc = content.document;
      if (!doc.location.href.match(/^http:\/\/(?:[^.]+\.)?youtube\.com\/watch/))
        return;
      let filepath = arg.string;
      let as = content.document.defaultView.wrappedJSObject.swfArgs;
      let title = doc.title.replace(/^YouTube - /, '');
      // XXX 今が、fmt=22 じゃなかったら確認した方が良い?
      let fmt = /^22/.test(as.fmt_map) ? '22' : '18';
      let url = 'http://www.youtube.com/get_video?fmt=' + fmt + '&video_id=' + as.video_id + '&t=' + as.t;

      let dm = Cc["@mozilla.org/download-manager;1"].getService(Ci.nsIDownloadManager);
      let wbp = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Ci.nsIWebBrowserPersist);

      let file;
      if (filepath) {
        file = io.File(io.expandPath(filepath));
      } else {
        file = dm.userDownloadsDirectory;
      }
      if (file.isDirectory())
        file.appendRelativePath(fixFilename(title) + '.mp4');
      if (file.exists())
        return liberator.echoerr('The file already exists! -> ' + file.path);
      file = makeFileURI(file);


      let dl = dm.addDownload(0, makeURL(url, null, null), file, title, null, null, null, null, wbp);
      wbp.progressListener = dl;
      wbp.persistFlags |= wbp.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
      wbp.saveURI(makeURL(url), null, null, null, null, file);
      liberator.echo('maybe downloading started');
    }

    commands.addUserCommand(
      ['fetchyoutube', 'fetchyt'],
      'fecth YouTube HD video',
      fetch,
      {argCount: '*', completer: function (context) completion.file(context)},
      true
    );

    // fetch({});

})();

// vim:sw=2 ts=2 et si fdm=marker: