まめ畑

ゆるゆると書いていきます

ニコニコ動画から動画をDLするJetpack Feature

2009/9/25更新しました(Jetpack0.5でComponents.classesを使用するには - まめ畑)

息抜きにニコニコ動画から動画をダウンロードするFeatureを作ってみました。
既に、拡張やグリモンでありますがそのFeature簡易版です。
インストールは: Nico DL

インストールすると、ステータスバーに以下の様なアイコンが追加されます。

動画を再生するページで、この部分をクリックすると保存出来ます。
ログイン状態で操作して下さい。


用法容量にお気をつけ下さい。
MP4動画やエコノミーの判定は後ほど付けます。自動更新にしておくと便利です。


コードはこちら

/*
   @author: con_mame
   @url: http://d.hatena.ne.jp/con_mame/
   @title: Nico DL
   @description: Download Movie File from NicoNico Douga
   @version: 0.1
*/

(function(){

   const ICON = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAG5JREFUOE+tU+0OABAI5Jl6/2dDtjNaJR+34UdcXZdcGtILmAAgosLLghZP2mV50SNWCaIVdfm8IcPpuRCYwo0AejUq+ELgOSATXFeAh9cEs0PbJnr+byuQln7rgSnhdIgWCZjG6CzMdrt/IUJYAffFJ2uA33mhAAAAAElFTkSuQmCC";
   const CC = Components.classes;
   const CI = Components.interfaces;

   function getFlv(videoAddr){
      try{
         var saveFile = CC['@mozilla.org/filepicker;1'].createInstance(CI.nsIFilePicker);
         saveFile.init(jetpack.tabs.focused.contentWindow, "Save Nico Vide", CI.nsIFilePicker.modeSave);
         saveFile.defaultString = ".flv";
         saveFile.appendFilters(CI.nsIFilePicker.filterAll);

         var ret = saveFile.show();
         if(ret == CI.nsIFilePicker.returnCancel) return;
         var ios = CC["@mozilla.org/network/io-service;1"].getService(CI.nsIIOService);
         var url = ios.newURI(videoAddr, null, null);

         var iwp = CC['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'].createInstance(CI.nsIWebBrowserPersist);
         var trans = CC["@mozilla.org/transfer;1"].createInstance(CI.nsITransfer);
         trans.init(url, saveFile.fileURL, videoAddr, null, null, null, iwp);
         iwp.progressListener = trans;
         iwp.saveURI(url, null, null, null, null, saveFile.file);
      }catch(e){
         console.log(e);
      }
   }

   function showMessege(title, message){
      jetpack.notifications.show({
         title: title,
         body: message,
         icon: ICON
      });
   }

   function doDownload(videoId){
      $.ajax({
         type: "GET",
         url: "http://www.nicovideo.jp/api/getflv/" + videoId,
         cache: false,
         success: function(info){
            if(/&url=(.+?)&/.test(decodeURIComponent(info))){
               getFlv(RegExp.$1);
            }else{
               showMessege("Error", "Check Login");
            }
         },
         error: function(xtr, status, thrown){
            showMessege("Error", status);
         }
      });
   }

   jetpack.statusBar.append({
      html: <>
         <div id="dl"><img src={ICON}/>DL!</div>
      </>,
      onReady: function(doc){
         $(doc).click(function(){
            var watchPage = jetpack.tabs.focused.url;
            if(/http:\/\/www.nicovideo.jp\/watch\/(.+)$/.test(watchPage)){
               doDownload(RegExp.$1);
            }else{
               return;
            }
         });
         $("#dl", doc).css({
            position: "absolute",
            paddingTop: "5px",
            fontSize: "12pt",
            fontWeight: "bold",
            cursor: "pointer"
         });
      },
      width: 50
   });
})()


今まで作ったFeatureをインストールするとステータスバーこんな感じになります(グリモンのアイコンなどもありますが)