# ytdl-core-browser

> This library is a tiny wrapper around the [ytdl-core](https://www.npmjs.com/package/ytdl-core) library to make it work in the browser.

Latest version **1.0.0** (published 2020-08-12) · MIT license · 0 weekly downloads

## Install

```sh
npm install ytdl-core-browser
pnpm add ytdl-core-browser
yarn add ytdl-core-browser
bun add ytdl-core-browser
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.0 |
| Published | 2020-08-12 |
| First published | 2020-08-12 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 1 |
| Unpacked size | 480 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | edoulamenace |
| Keywords | ytdl-core, ytdl, browser, browserify, proof-of-concept, youtube, downloader |

## Links

- npm: https://www.npmjs.com/package/ytdl-core-browser
- npm.io page: https://npm.io/package/ytdl-core-browser

## Dependencies (1)

- [ytdl-core](https://npm.io/package/ytdl-core.md) ^3.2.1

## Alternatives

- [@opentelemetry/exporter-zipkin](https://npm.io/package/@opentelemetry/exporter-zipkin.md) — 14.8M weekly downloads
- [pusher-js](https://npm.io/package/pusher-js.md) — 2.0M weekly downloads
- [browserify](https://npm.io/package/browserify.md) — 1.7M weekly downloads
- [sqs-consumer](https://npm.io/package/sqs-consumer.md) — 1.7M weekly downloads
- [@sanity/eventsource](https://npm.io/package/@sanity/eventsource.md) — 930.8K weekly downloads

## Recent versions

- 1.0.0 (latest) — 2020-08-12

## README

# Browser Youtube Downloader
This library is a tiny wrapper around the [ytdl-core](https://www.npmjs.com/package/ytdl-core) library to make it work in the browser.

**Other methods than `.getInfo()` are not tested**. But we discourage using them in the browser.

We don't care about bugs and issues, do what you want. **This library is just a proof of concept**.


***Have fun!*** 

## Explanations
In order to make ytdl-core work in the browser, we use two steps:
1. We [browserify]() the source code
2. We use [proxyquireify](https://www.npmjs.com/package/proxyquireify) to mock [miniget](https://www.npmjs.com/package/miniget) and [m3u8stream](https://www.npmjs.com/package/m3u8stream) to bypass CORS errors by YouTube.


## Usage
Here is an example usage. You can replace `/dist/index.js` with the path to the library's
entry file.

```html
...
<body>
    ...
    <script src="/dist/index.js"></script>
    <script>
        const ytdl = window.require('ytdl-core-browser')({
            proxyUrl: 'https://cors-anywhere.herokuapp.com/',
            // proxyquireStubs: {}, arguments mapped directly to proxyquireify
            // For more info, see https://www.npmjs.com/package/proxyquireify
        });
        ytdl
            .getInfo('https://www.youtube.com/watch?v=WPdbEbwNTcU')
            .then(info=>console.log(info))
            .catch(err=>{throw err;});
    </script>
</body>
```

## Customize
This is the source code of the library: 

```ts
const proxyquire = require('proxyquireify')(require); 
const realMiniget = require('miniget');
const m3u8stream = require('m3u8stream');
// We import the library so it cached before using proxyquire
const ytdlCore = require('ytdl-core');

interface YtdlBrowserOptions {
    proxyUrl: string; // Ex: 'https://cors-anywhere.herokuapp.com/'
    proxyquireStubs?: any;
}

module.exports = (options: YtdlBrowserOptions) => {
    return proxyquire('ytdl-core', {
        miniget(url, opts){
            return realMiniget(options.proxyUrl + url, opts);
        },
        m3u8stream(url, opts){
            return m3u8stream(options.proxyUrl + url, opts);
        },
        ...(options.proxyquireStubs || {})
    });
};
```

You are very welcomed to hack the settings (especially with option `proxyquireStubs`).
For instance, if you want to use a custom implementation of the miniget library:
```js
const ytdl = window.require('ytdl-core-browser')({
    proxyUrl: ...
    proxyquireStubs: {
        miniget(url,options){
            // Your custom mock of miniget(...)
        },
        m3u8stream(url, options){
            // Your custom mock of m3u8stream(...)
        }
    }
})
```

---
_Source: https://npm.io/package/ytdl-core-browser · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
