diff options
author | Feross Aboukhadijeh <feross@feross.org> | 2015-12-30 00:48:55 +0300 |
---|---|---|
committer | Feross Aboukhadijeh <feross@feross.org> | 2015-12-30 00:48:55 +0300 |
commit | 8e0fdc3b0406e0804fb8d78949a75d4201dc78b0 (patch) | |
tree | 97caae172d2534e96cfcd2d932471a26d46a81b2 /lib | |
parent | d6322a629ba1425115fec4b2d758c61b9b6d8ab5 (diff) |
Pulled code out into 3 new packages!
https://github.com/feross/render-media
https://github.com/feross/stream-to-blob-url
https://github.com/feross/stream-with-known-length-to-buffer
Diffstat (limited to 'lib')
-rw-r--r-- | lib/append-to.js | 33 | ||||
-rw-r--r-- | lib/file.js | 44 | ||||
-rw-r--r-- | lib/mime.json | 16 | ||||
-rw-r--r-- | lib/render-to.js | 17 | ||||
-rw-r--r-- | lib/render.js | 150 |
5 files changed, 11 insertions, 249 deletions
diff --git a/lib/append-to.js b/lib/append-to.js deleted file mode 100644 index 0b16607..0000000 --- a/lib/append-to.js +++ /dev/null @@ -1,33 +0,0 @@ -var render = require('./render') - -module.exports = function appendTo (file, rootElem, cb) { - if (rootElem && (rootElem.nodeName === 'VIDEO' || rootElem.nodeName === 'AUDIO')) { - throw new Error( - 'Invalid video/audio node argument. Argument must be root element that ' + - 'video/audio tag will be appended to.' - ) - } - - render(file, function (tagName) { - if (tagName === 'video' || tagName === 'audio') return createMedia(tagName) - else return createElem(tagName) - }, function (err, elem) { - if (err && elem) elem.remove() - cb(err, elem) - }) - - function createMedia (tagName) { - var elem = createElem(tagName) - elem.controls = true - elem.autoplay = true // for chrome - elem.play() // for firefox - rootElem.appendChild(elem) - return elem - } - - function createElem (tagName) { - var elem = document.createElement(tagName) - rootElem.appendChild(elem) - return elem - } -} diff --git a/lib/file.js b/lib/file.js index 09d3af8..0c2b43c 100644 --- a/lib/file.js +++ b/lib/file.js @@ -1,14 +1,14 @@ module.exports = File -var appendTo = require('./append-to') -var renderTo = require('./render-to') var eos = require('end-of-stream') var EventEmitter = require('events').EventEmitter var FileStream = require('./file-stream') var inherits = require('inherits') -var mime = require('./mime.json') var path = require('path') +var render = require('render-media') var stream = require('stream') +var streamToBlobURL = require('stream-to-blob-url') +var streamToBuffer = require('stream-with-known-length-to-buffer') inherits(File, EventEmitter) @@ -62,9 +62,9 @@ File.prototype.deselect = function () { * Create a readable stream to the file. Pieces needed by the stream will be prioritized * highly and fetched from the swarm first. * - * @param {Object} opts - * @param {number} opts.start stream slice of file, starting from this byte (inclusive) - * @param {number} opts.end stream slice of file, ending with this byte (inclusive) + * @param {Object=} opts + * @param {number} opts.start start stream at byte (inclusive) + * @param {number} opts.end end stream at byte (inclusive) * @return {FileStream} */ File.prototype.createReadStream = function (opts) { @@ -91,54 +91,32 @@ File.prototype.createReadStream = function (opts) { * @param {function} cb */ File.prototype.getBuffer = function (cb) { - var buf = new Buffer(this.length) - var offset = 0 - this.createReadStream() - .on('data', function (chunk) { - chunk.copy(buf, offset) - offset += chunk.length - }) - .on('end', function () { - cb(null, buf) - }) - .on('error', cb) + streamToBuffer(this.createReadStream(), this.length, cb) } /** * @param {function} cb */ File.prototype.getBlobURL = function (cb) { - var self = this if (typeof window === 'undefined') throw new Error('browser-only method') - - self.getBuffer(function (err, buffer) { - if (err) return cb(err) - var ext = path.extname(self.name).toLowerCase() - var type = mime[ext] - var blob = type ? new window.Blob([ buffer ], { type: type }) : new window.Blob([ buffer ]) - var url = window.URL.createObjectURL(blob) - cb(null, url) - }) + var mime = render.mime[path.extname(this.name).toLowerCase()] + streamToBlobURL(this.createReadStream(), this.length, mime, cb) } /** - * Show the file in a the browser by appending it to the DOM. * @param {Element|string} elem * @param {function} cb */ File.prototype.appendTo = function (elem, cb) { if (typeof window === 'undefined') throw new Error('browser-only method') - if (typeof elem === 'string') elem = document.querySelector(elem) - appendTo(this, elem, cb) + render.append(this, elem, cb) } /** - * Render the file in an existing DOM element. * @param {Element|string} elem * @param {function} cb */ File.prototype.renderTo = function (elem, cb) { if (typeof window === 'undefined') throw new Error('browser-only method') - if (typeof elem === 'string') elem = document.querySelector(elem) - renderTo(this, elem, cb) + render.render(this, elem, cb) } diff --git a/lib/mime.json b/lib/mime.json deleted file mode 100644 index c5990c3..0000000 --- a/lib/mime.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - ".aac": "audio/aac", - ".css": "text/css", - ".html": "text/html", - ".js": "application/javascript", - ".m4a": "audio/mp4", - ".md": "text/x-markdown", - ".mp3": "audio/mpeg", - ".mp4": "video/mp4", - ".oga": "audio/ogg", - ".ogg": "audio/ogg", - ".pdf": "application/pdf", - ".txt": "text/plain", - ".wav": "audio/wav", - ".webm": "video/webm" -} diff --git a/lib/render-to.js b/lib/render-to.js deleted file mode 100644 index d2b47cc..0000000 --- a/lib/render-to.js +++ /dev/null @@ -1,17 +0,0 @@ -var path = require('path') -var render = require('./render') - -module.exports = function renderTo (file, elem, cb) { - render(file, function (tagName) { - if (elem.nodeName !== tagName.toUpperCase()) { - var extname = path.extname(file.name).toLowerCase() - - throw new Error( - 'Cannot render "' + extname + '" inside a "' + - elem.nodeName.toLowerCase() + '" element, expected "' + tagName + '"' - ) - } - - return elem - }, cb) -} diff --git a/lib/render.js b/lib/render.js deleted file mode 100644 index 7f45936..0000000 --- a/lib/render.js +++ /dev/null @@ -1,150 +0,0 @@ -var debug = require('debug')('webtorrent:render') -var MediaSourceStream = require('mediasource') -var path = require('path') -var videostream = require('videostream') - -var VIDEOSTREAM_EXTS = [ '.mp4', '.m4v', '.m4a' ] - -var MEDIASOURCE_VIDEO_EXTS = [ '.mp4', '.m4v', '.webm' ] -var MEDIASOURCE_AUDIO_EXTS = [ '.m4a', '.mp3' ] -var MEDIASOURCE_EXTS = MEDIASOURCE_VIDEO_EXTS.concat(MEDIASOURCE_AUDIO_EXTS) - -var AUDIO_EXTS = [ '.wav', '.aac', '.ogg', '.oga' ] -var IMAGE_EXTS = [ '.jpg', '.jpeg', '.png', '.gif', '.bmp' ] -var IFRAME_EXTS = [ '.css', '.html', '.js', '.md', '.pdf', '.txt' ] - -var MediaSource = typeof window !== 'undefined' && window.MediaSource - -module.exports = function render (file, getElem, cb) { - if (!cb) cb = noop - var elem - var extname = path.extname(file.name).toLowerCase() - var currentTime = 0 - - if (MEDIASOURCE_EXTS.indexOf(extname) >= 0) renderMediaSource() - else if (AUDIO_EXTS.indexOf(extname) >= 0) renderAudio() - else if (IMAGE_EXTS.indexOf(extname) >= 0) renderImage() - else if (IFRAME_EXTS.indexOf(extname) >= 0) renderIframe() - else nextTick(cb, new Error('Unsupported file type "' + extname + '": Cannot append to DOM')) - - function renderMediaSource () { - if (!MediaSource) { - return nextTick(cb, new Error( - 'Video/audio streaming is not supported in your browser. You can still share ' + - 'or download ' + file.name + ' (once it\'s fully downloaded). Use Chrome for ' + - 'MediaSource support.' - )) - } - - var tagName = MEDIASOURCE_VIDEO_EXTS.indexOf(extname) >= 0 ? 'video' : 'audio' - - if (VIDEOSTREAM_EXTS.indexOf(extname) >= 0) useVideostream() - else useMediaSource() - - function useVideostream () { - debug('Use `videostream` package for ' + file.name) - prepareElem() - elem.addEventListener('error', fallbackToMediaSource) - elem.addEventListener('playing', onPlaying) - videostream(file, elem) - } - - function useMediaSource () { - debug('Use MediaSource API for ' + file.name) - prepareElem() - elem.addEventListener('error', fallbackToBlobURL) - elem.addEventListener('playing', onPlaying) - - file.createReadStream().pipe(new MediaSourceStream(elem, { extname: extname })) - if (currentTime) elem.currentTime = currentTime - } - - function useBlobURL () { - debug('Use Blob URL for ' + file.name) - prepareElem() - elem.addEventListener('error', fatalError) - elem.addEventListener('playing', onPlaying) - file.getBlobURL(function (err, url) { - if (err) return fatalError(err) - elem.src = url - if (currentTime) elem.currentTime = currentTime - }) - } - - function fallbackToMediaSource (err) { - debug('videostream error: fallback to MediaSource API: %o', err.message || err) - elem.removeEventListener('error', fallbackToMediaSource) - elem.removeEventListener('playing', onPlaying) - - useMediaSource() - } - - function fallbackToBlobURL (err) { - debug('MediaSource API error: fallback to Blob URL: %o', err.message || err) - elem.removeEventListener('error', fallbackToBlobURL) - elem.removeEventListener('playing', onPlaying) - - useBlobURL() - } - - function prepareElem () { - if (!elem) { - elem = getElem(tagName) - - elem.addEventListener('progress', function () { - currentTime = elem.currentTime - }) - } - } - } - - function onPlaying () { - elem.removeEventListener('playing', onPlaying) - cb(null, elem) - } - - function renderAudio () { - elem = getElem('audio') - file.getBlobURL(function (err, url) { - if (err) return fatalError(err) - elem.addEventListener('error', fatalError) - elem.addEventListener('playing', onPlaying) - elem.src = url - }) - } - - function renderImage () { - elem = getElem('img') - file.getBlobURL(function (err, url) { - if (err) return fatalError(err) - elem.src = url - elem.alt = file.name - cb(null, elem) - }) - } - - function renderIframe () { - elem = getElem('iframe') - - file.getBlobURL(function (err, url) { - if (err) return fatalError(err) - elem.src = url - if (extname !== '.pdf') elem.sandbox = 'allow-forms allow-scripts' - cb(null, elem) - }) - } - - function fatalError (err) { - err.message = 'Error rendering file "' + file.name + '": ' + err.message - debug(err.message) - if (cb) cb(err) - } -} - -function noop () {} - -function nextTick (cb, err, val) { - process.nextTick(function () { - if (cb) cb(err, val) - }) -} |