Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/webtorrent/webtorrent.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFeross Aboukhadijeh <feross@feross.org>2015-12-30 00:48:55 +0300
committerFeross Aboukhadijeh <feross@feross.org>2015-12-30 00:48:55 +0300
commit8e0fdc3b0406e0804fb8d78949a75d4201dc78b0 (patch)
tree97caae172d2534e96cfcd2d932471a26d46a81b2 /lib
parentd6322a629ba1425115fec4b2d758c61b9b6d8ab5 (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.js33
-rw-r--r--lib/file.js44
-rw-r--r--lib/mime.json16
-rw-r--r--lib/render-to.js17
-rw-r--r--lib/render.js150
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)
- })
-}