豆瓣FM Hunter 更新

但是后来在新浪上搭建的服务器不能用了,于是努力实现了本地下载。

首先参考了别人的代码,把xpi文件(其实就是zip文件)打开,阅读里面下载相关的代码。

1.点击下载时,弹出对话框

function getFilePicker(path)
{
    var fp = Cc["@mozilla.org/filepicker;1"].getService(Ci.nsIFilePicker)
    fp.init(win, 'Save Douban Music', fp.modeSave)
	fp.defaultExtension = 'mp3';
	fp.defaultString = path;
	fp.appendFilter('MP3', '*.mp3');
	var rv = fp.show()
	if (rv == fp.returnOK || rv == fp.returnReplace) {
		return fp
	}
    else{
        return null;
    }
}

这里需要注意的一个地方就是Cc和Ci分别代表了Components.classes和Components.interfaces。 记得前面var {Cc, Ci} = require(“chrome”)

参数path其实就是文件名,我在这里使用了标题title。

2.接下来就要写入文件了。

var fp = getFilePicker(name);
if(!fp) return;

var file = fp.file;

var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var url = ios.newURI(u, null, null);
var channel = ios.newChannelFromURI(url);
var observer = {
  onStreamComplete : function(aLoader, aContext, aStatus, aLength, aResult) {
      	var stream = Cc["@mozilla.org/network/safe-file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
          stream.init(file, -1, -1, 0);
          var bstream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream);

          bstream.setOutputStream(stream);    
          bstream.writeByteArray(aResult, aLength);
          if (stream instanceof Ci.nsISafeOutputStream) {
             stream.finish();
          }else {
              stream.close();
          }
      }
}
var sl = Cc["@mozilla.org/network/stream-loader;1"].createInstance(Ci.nsIStreamLoader);
sl.init(observer);
channel.asyncOpen(sl, channel);

其实我也是在网上照抄一些代码,大体懂得一些含义,异步加载url地址,获得数据之后,写入文件。

等以后需要了,再进行更新吧。目前够用了。

Just For Fun