aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fetchyoutube.js84
1 files changed, 84 insertions, 0 deletions
diff --git a/fetchyoutube.js b/fetchyoutube.js
new file mode 100644
index 0000000..d553951
--- /dev/null
+++ b/fetchyoutube.js
@@ -0,0 +1,84 @@
+// ==VimperatorPlugin==
+// @name Fetch YouTube Video
+// @description Fetch YouTube Video (fmt=22)
+// @license Creative Commons 2.1 (Attribution + Share Alike)
+// @version 1.0
+// @author anekos (anekos@snca.net)
+// @minVersion 1.2
+// @maxVersion 2.0pre
+// ==/VimperatorPlugin==
+//
+// Usage:
+// :fetchyoutube
+// Download YouTube video to default download directory.
+// (pref: browser.download.dir)
+//
+// Links:
+// http://d.hatena.ne.jp/nokturnalmortum/20081118#1227004197
+
+(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 dir = options.getPref('browser.download.dir');
+ let as = content.document.defaultView.wrappedJSObject.swfArgs;
+ let title = doc.title.replace(/^YouTube - /, '');
+ let url = 'http://www.youtube.com/get_video?fmt=22&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.getFile(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: completion.file},
+ true
+ );
+
+ // fetch({});
+
+})();
+
+// vim:sw=2 ts=2 et si fdm=marker:
+