ytdl-core
Version:
Youtube video downloader in pure javascript.
86 lines (53 loc) • 3.66 kB
Markdown
# node-ytdl-core [](http://travis-ci.org/fent/node-ytdl-core)
Yet another youtube downloading module. This time written with only Javascript and a more node-friendly streaming interface.
For a CLI version of this, check out [ytdl](https://github.com/fent/node-ytdl) and [pully](https://github.com/JimmyBoh/pully).
# Usage
```js
var fs = require('fs');
var ytdl = require('ytdl-core');
ytdl('http://www.youtube.com/watch?v=A02s8omM_hI')
.pipe(fs.createWriteStream('video.flv'));
```
# API
### ytdl(url, options)
Attempts to download a video from the given url. Returns a readable stream. `options` can have the following keys
* `quality` - Video quality to download. Can be an [itag value](http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs) value, or `highest`/`lowest`. Defaults to `highest`.
* `filter` - You can give a filtering function that gets called with each format available. Used to decide what format to download. This function is given the `format` object as its first argument, and should return true if the format is preferable.
* `format` - This can be a specific `format` object returned from `getInfo`. This is primarily used to download specific video or audio streams. **Note:** Supplying this option will ignore the `filter` and `quality` options since the format is explicitly provided.
* `range` - A byte range in the form `INT-INT` that specifies a part of the video to download. ie 10355705-12452856.
```js
// Example with `filter` option.
ytdl(url, { filter: function(format) { return format.container === 'mp4'; } })
.pipe(fs.createWriteStream('vide.mp4'));
```
`options` can also have any [request](https://github.com/mikeal/request) options.
The returned readable stream emits these additional events.
#### Event: 'info'
* `Object` - Info.
* `Object` - Format.
Emitted when the a video's `info` hash is fetched. Along with the chosen format metadata to download. `format.url` might be different if `start` was given. `format.size` will also be available.
Info and format may look like [this](https://gist.github.com/fent/6c8251132e1addb5121e).
### ytdl.getInfo(url, [options], callback(err, info))
Use this if you only want to get metainfo from a video.
`options` gets passed to the `request()`, it can also have a `downloadURL` property set to `true` if you want ytdl to include the download url instead of the regular one. In some cases, a signature needs to be deciphered, and will require ytdl to make additional requests.
### ytdl.downloadFromInfo(info, options)
Once you have received metadata from a video with the `getInfo` function,
you may pass that `info`, along with other `options` to `downloadFromInfo`.
Note: Be sure to set the `downloadURL` option to `true` when you call `getInfo`
or you will receive a 403 error when you call `downloadFromInfo`.
The returned readable stream emits these additional events:
#### Event: 'format'
* `Object` - Format.
Emitted when a format metadata has been chosen. `format.size` will also be available.
# Tips
### Handling Separate Streams
Typically 1080p or better video does not have audio encoded with it. The audio must be downloaded separately and merged via an appropriate encoding library. `ffmpeg` is the most widely used tool, with many [Node.js modules available](https://www.npmjs.com/search?q=ffmpeg). Use the `format` objects returned from `ytdl.getInfo` to download specific streams to combine to fit your needs.
# Install
npm install ytdl-core
# Tests
Tests are written with [mocha](http://visionmedia.github.com/mocha/)
```bash
npm test
```
# License
MIT