diff options
-rw-r--r-- | fetchyoutube.js | 84 |
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: + |