UNPKG

10.5 kBMarkdownView Raw
1# node-ytdl-core
2[![Dependency Status](https://david-dm.org/fent/node-ytdl-core.svg)](https://david-dm.org/fent/node-ytdl-core)
3[![codecov](https://codecov.io/gh/fent/node-ytdl-core/branch/master/graph/badge.svg)](https://codecov.io/gh/fent/node-ytdl-core)
4[![Discord](https://img.shields.io/discord/484464227067887645.svg)](https://discord.gg/V3vSCs7)
5
6Yet another youtube downloading module. Written with only Javascript and a node-friendly streaming interface.
7
8# Support
9You can contact us for support on our [chat server](https://discord.gg/V3vSCs7)
10
11# Usage
12
13```js
14const fs = require('fs');
15const ytdl = require('ytdl-core');
16// TypeScript: import ytdl from 'ytdl-core'; with --esModuleInterop
17// TypeScript: import * as ytdl from 'ytdl-core'; with --allowSyntheticDefaultImports
18// TypeScript: import ytdl = require('ytdl-core'); with neither of the above
19
20ytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ')
21 .pipe(fs.createWriteStream('video.mp4'));
22```
23
24
25# API
26### ytdl(url, [options])
27
28Attempts to download a video from the given url. Returns a [readable stream](https://nodejs.org/api/stream.html#stream_class_stream_readable). `options` can have the following, in addition to any [`getInfo()` option](#async-ytdl.getinfo(url%2C-%5Boptions%5D)) and [`chooseFormat()` option](#ytdl.downloadfrominfo(info%2C-options)).
29
30* `range` - A byte range in the form `{start: INT, end: INT}` that specifies part of the file to download, ie {start: 10355705, end: 12452856}. Not supported on segmented (DASH MPD, m3u8) formats.
31 * This downloads a portion of the file, and not a separately spliced video.
32* `begin` - What time in the video to begin. Supports formats `00:00:00.000`, `0ms, 0s, 0m, 0h`, or number of milliseconds. Example: `1:30`, `05:10.123`, `10m30s`.
33 * For live videos, this also accepts a unix timestamp or Date object, and defaults to `Date.now()`.
34 * This option is not very reliable for non-live videos, see [#129](https://github.com/fent/node-ytdl-core/issues/129), [#219](https://github.com/fent/node-ytdl-core/issues/219).
35* `liveBuffer` - How much time buffer to use for live videos in milliseconds. Default is `20000`.
36* `highWaterMark` - How much of the video download to buffer into memory. See [node's docs](https://nodejs.org/api/stream.html#stream_constructor_new_stream_writable_options) for more. Defaults to 512KB.
37* `dlChunkSize` - When the chosen format is video only or audio only, the download is separated into multiple chunks to avoid throttling. This option specifies the size of each chunk in bytes. Setting it to 0 disables chunking. Defaults to 10MB.
38
39#### Event: info
40* [`ytdl.videoInfo`](typings/index.d.ts#L194) - Info.
41* [`ytdl.videoFormat`](typings/index.d.ts#L22) - Video Format.
42
43Emitted when the video's `info` is fetched, along with the chosen format to download.
44
45#### Event: progress
46* `number` - Chunk length in bytes or segment number.
47* `number` - Total bytes or segments downloaded.
48* `number` - Total bytes or segments.
49
50Emitted whenever a new chunk is received. Passes values describing the download progress.
51
52#### miniget events
53
54All [miniget events](https://github.com/fent/node-miniget#event-redirect) are forwarded and can be listened to from the returned stream.
55
56### Stream#destroy()
57
58Call to abort and stop downloading a video.
59
60### async ytdl.getBasicInfo(url, [options])
61
62Use this if you only want to get metainfo from a video.
63
64### async ytdl.getInfo(url, [options])
65
66Gets metainfo from a video. Includes additional formats, and ready to download deciphered URL. This is what the `ytdl()` function uses internally.
67
68`options` can have the following
69
70* `requestOptions` - Anything to merge into the request options which [miniget](https://github.com/fent/node-miniget) is called with, such as `headers`.
71* `lang` - The 2 character symbol of a language. Default is `en`.
72
73### ytdl.downloadFromInfo(info, options)
74
75Once you have received metadata from a video with the `ytdl.getInfo` function, you may pass that information along with other options to this function.
76
77### ytdl.chooseFormat(formats, options)
78
79Can be used if you'd like to choose a format yourself. Throws an Error if it fails to find any matching format.
80
81`options` can have the following
82
83* `quality` - Video quality to download. Can be an [itag value](http://en.wikipedia.org/wiki/YouTube#Quality_and_formats), a list of itag values, or `highest`/`lowest`/`highestaudio`/`lowestaudio`/`highestvideo`/`lowestvideo`. `highestaudio`/`lowestaudio`/`highestvideo`/`lowestvideo` all prefer audio/video only respectively. Defaults to `highest`, which prefers formats with both video and audio.
84
85 A typical video's formats will be sorted in the following way using `quality: 'highest'`
86 ```
87 itag container quality codecs bitrate audio bitrate
88 18 mp4 360p avc1.42001E, mp4a.40.2 696.66KB 96KB
89 137 mp4 1080p avc1.640028 4.53MB
90 248 webm 1080p vp9 2.52MB
91 136 mp4 720p avc1.4d4016 2.2MB
92 247 webm 720p vp9 1.44MB
93 135 mp4 480p avc1.4d4014 1.1MB
94 134 mp4 360p avc1.4d401e 593.26KB
95 140 mp4 mp4a.40.2 128KB
96 ```
97 format 18 at 360p will be chosen first since it's the highest quality format with both video and audio. If you'd like a higher quality format with both video and audio, see the section on [handling separate streams](#handling-separate-streams).
98* `filter` - Used to filter the list of formats to choose from. Can be `audioandvideo` or `videoandaudio` to filter formats that contain both video and audio, `video` to filter for formats that contain video, or `videoonly` for formats that contain video and no additional audio track. Can also be `audio` or `audioonly`. You can give a filtering function that gets called with each format available. This function is given the `format` object as its first argument, and should return true if the format is preferable.
99 ```js
100 // Example with custom function.
101 ytdl(url, { filter: format => format.container === 'mp4' })
102 ```
103* `format` - Primarily used to download specific video or audio streams. This can be a specific `format` object returned from `getInfo`.
104 * Supplying this option will ignore the `filter` and `quality` options since the format is explicitly provided.
105
106```js
107// Example of choosing a video format.
108let info = await ytdl.getInfo(videoID);
109let format = ytdl.chooseFormat(info.formats, { quality: '134' });
110console.log('Format found!', format);
111```
112
113### ytdl.filterFormats(formats, filter)
114
115If you'd like to work with only some formats, you can use the [`filter` option above](#ytdlurl-options).
116
117```js
118// Example of filtering the formats to audio only.
119let info = await ytdl.getInfo(videoID);
120let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');
121console.log('Formats with only audio: ' + audioFormats.length);
122```
123
124### ytdl.validateID(id)
125
126Returns true if the given string satisfies YouTube's ID format.
127
128### ytdl.validateURL(url)
129
130Returns true if able to parse out a valid video ID.
131
132### ytdl.getURLVideoID(url)
133
134Returns a video ID from a YouTube URL.
135Throws an Error if it fails to parse an ID.
136
137### ytdl.getVideoID(str)
138
139Same as the above `ytdl.getURLVideoID()`, but can be called with the video ID directly, in which case it returns it. This is what ytdl uses internally.
140Throws an Error if it fails to parse an ID.
141
142## Limitations
143
144ytdl cannot download videos that fall into the following
145* Regionally restricted (requires a [proxy](example/proxy.js))
146* Private (if you have access, requires [cookies](example/cookies.js))
147* Rentals (if you have access, requires [cookies](example/cookies.js))
148
149Generated download links are valid for 6 hours, and may only be downloadable from the same IP address.
150
151## Handling Separate Streams
152
153Typically 1080p or better videos do not have audio encoded with it. The audio must be downloaded separately and merged via an 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. Look at [example/ffmpeg.js](example/ffmpeg.js) for an example on doing this.
154
155## What if it stops working?
156
157Youtube updates their website all the time, it's not that rare for this to stop working. If it doesn't work for you and you're using the latest version, feel free to open up an issue. Make sure to check if there isn't one already with the same error.
158
159Run the tests at `test/irl-test.js` to make sure this is really an issue with ytdl-core.
160
161 npm run test:irl
162
163These tests are not mocked, they try to start downloading a few videos. If these fail, then it's time to debug. If the error you're getting is signature deciphering, check `lib/sig.js`. Otherwise, the error is likely within `lib/info.js`.
164
165# Install
166
167```bash
168npm install ytdl-core@latest
169```
170
171Or for Yarn users:
172```bash
173yarn add ytdl-core@latest
174```
175
176Make sure you're installing the latest version of ytdl-core to keep up with the latest fixes.
177
178If you're using a bot or app that uses ytdl-core such as [ytdl-core-discord](https://github.com/amishshah/ytdl-core-discord) or [discord-player](https://github.com/Androz2091/discord-player), it may be dependent on an older version. To update its ytdl-core version, that library has to update its `package.json` file, you can't simply change the version on your project's `package.json`, the app will still use its own older version of ytdl-core.
179
180Look in their repo to see if they already have an active pull request that updates ytdl-core. If they don't, open an issue asking them to update ytdl-core, or better yet, fork the project and submit a pull request with the updated version.
181
182While you wait for the pull reques to merge, you can point to its branch in your `package.json`
183
184```json
185 "ytdl-core-discord": "amishshah/ytdl-core-discord#dependabot/npm_and_yarn/ytdl-core-2.0.1"
186```
187
188# Related Projects
189
190- [ytdl](https://github.com/fent/node-ytdl) - A cli wrapper of this.
191- [pully](https://github.com/JimmyBoh/pully) - Another cli wrapper of this aimed at high quality formats.
192- [ytsr](https://github.com/TimeForANinja/node-ytsr) - YouTube video search results.
193- [ytpl](https://github.com/TimeForANinja/node-ytpl) - YouTube playlist and channel resolver.
194
195
196# Tests
197Tests are written with [mocha](https://mochajs.org)
198
199```bash
200npm test
201```