untube 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,14 +3,7 @@
3
3
  [![npm version](https://img.shields.io/npm/v/untube.svg)](https://www.npmjs.com/package/untube)
4
4
  [![License](https://img.shields.io/npm/l/untube.svg)](LICENSE)
5
5
 
6
- A lightweight YouTube metadata and streaming URL scraper for Node.js, featuring proxy and cookie support. Ported from [yt-dlp](https://github.com/yt-dlp/yt-dlp).
7
-
8
- ## Features
9
-
10
- - ✅ Fetch complete video metadata.
11
- - ✅ HTTP/HTTPS Proxy support via `undici`.
12
- - ✅ Automatic Cookie management (File or Remote DB).
13
- - ✅ Full TypeScript support.
6
+ A lightweight, extremely fast YouTube video downloader and metadata scraper for Node.js. Ported from the core extraction logic of [yt-dlp](https://github.com/yt-dlp/yt-dlp).
14
7
 
15
8
  ## Installation
16
9
 
@@ -18,72 +11,164 @@ A lightweight YouTube metadata and streaming URL scraper for Node.js, featuring
18
11
  npm install untube
19
12
  ```
20
13
 
21
- ## Usage
14
+ ## Quick Start (Downloading Videos)
15
+
16
+ `untube` provides a readable stream that you can pipe anywhere (e.g., to a file, to `fluent-ffmpeg`, or an HTTP response).
17
+
18
+ > **⚠️ Important Note on Video & Audio:**
19
+ > YouTube separates high-quality video (1080p, 4K) and audio into different streams (DASH formats). If you choose a high-quality video format (like `highestvideo`), the resulting file will **not have sound**. If you want a single file with both high-quality video and audio, you must download the video and audio streams separately and merge them yourself using a tool like `ffmpeg`.
22
20
 
23
21
  ```typescript
24
- import { getVideoInfo } from 'untube';
25
-
26
- async function main() {
27
- try {
28
- const info = await getVideoInfo('videoId', {
29
- // Optional: Path to cookies file (Netscape format) or RawCookie object
30
- cookie: './cookies.txt',
31
- // Optional: Use proxy to avoid rate limits or blocks
32
- proxy: 'http://user:pass@my-proxy.com:8080'
33
- });
34
-
35
- console.log('Title:', info.title);
36
- console.log('Channel:', info.uploader);
37
-
38
- // List available video & audio formats
39
- info.formats.forEach(format => {
40
- console.log(`[${format.format_id}] ${format.resolution} - ${format.url}`);
41
- });
42
- } catch (error) {
43
- console.error('Failed to fetch info:', error);
22
+ import fs from 'node:fs';
23
+ import untube from 'untube';
24
+
25
+ // Setup AbortController to cancel download if needed
26
+ const controller = new AbortController();
27
+
28
+ // Start downloading a video
29
+ const stream = untube('dQw4w9WgXcQ', {
30
+ format: 'highestvideo', // Select highest video quality (will likely be video-only)
31
+ signal: controller.signal, // Pass the abort signal
32
+ // cookie: './cookies.txt', // Optional: avoid age-restrictions
33
+ });
34
+
35
+ // Optional: Listen to events
36
+ stream.on('info', (info, format) => {
37
+ console.log(`Downloading: ${info.title}`);
38
+ console.log(`Format: ${format.resolution} (${format.container})`);
39
+
40
+ // You can also access subtitles/captions
41
+ if (info.captions.length > 0) {
42
+ console.log(`Available Subtitles: ${info.captions.map(c => c.language).join(', ')}`);
44
43
  }
45
- }
44
+ });
45
+
46
+ stream.on('progress', (progress) => {
47
+ const downloadedMb = (progress.downloadedBytes / 1024 / 1024).toFixed(2);
48
+ const totalMb = (progress.totalBytes / 1024 / 1024).toFixed(2);
49
+ console.log(`Progress: ${progress.percent}% (${downloadedMb}MB / ${totalMb}MB)`);
50
+ });
51
+
52
+ stream.on('error', (err) => {
53
+ console.error(`Error: ${err.message}`);
54
+ });
46
55
 
47
- main();
56
+ // Pipe the stream directly to a file
57
+ stream.pipe(fs.createWriteStream('video.mp4'));
58
+
59
+ // Example: Cancel download after 5 seconds
60
+ // setTimeout(() => controller.abort(), 5000);
48
61
  ```
49
62
 
63
+ ---
64
+
65
+ ## Configuration Options
66
+
67
+ When calling `untube(id, options)` or `untube.getVideoInfo(id, options)`, you can pass an options object.
68
+
69
+ ### `format` (Quality Selection)
70
+ You can easily pick the desired quality using preset strings or specific format IDs (`itag`):
71
+
72
+ - **Presets:** `'highest'` (default), `'lowest'`, `'highestaudio'`, `'lowestaudio'`, `'highestvideo'`, `'lowestvideo'`.
73
+ - **Resolutions:** `'1080p'`, `'720p'`, etc.
74
+ - **Format ID / itag:** Use specific itags like `'137'` (1080p video-only), `'140'` (m4a audio), or `'18'` (360p video+audio).
75
+
76
+ ```typescript
77
+ // Download exactly 1080p MP4 (Video only)
78
+ untube('videoId', { format: '137' });
79
+
80
+ // Download the best audio available
81
+ untube('videoId', { format: 'highestaudio' });
82
+ ```
83
+
84
+ ### `mode` (Streaming Behavior)
85
+ By default, `untube` uses **parallel** downloading to bypass YouTube bandwidth throttling.
86
+
87
+ | Mode | Characteristics | Best for |
88
+ | :--- | :--- | :--- |
89
+ | `'parallel'` (Default) | Incredibly fast. Downloads chunks concurrently into a temp file and streams the result. Emits `progress` events. | Downloading files, massive scrapers. |
90
+ | `'sequential'` | Pure RAM streaming. Slower (throttled by YouTube). No temp files used. Start-up time is instant. | Real-time audio playback. |
91
+
92
+ ```typescript
93
+ // Use sequential mode for instant start-up time
94
+ const stream = untube('videoId', { format: 'highestaudio', mode: 'sequential' });
95
+ ```
96
+
97
+ ---
98
+
99
+ ## Fetching Metadata
100
+
101
+ If you only need the video details without downloading the stream, use `untube.getVideoInfo()`:
102
+
103
+ ```typescript
104
+ import untube from 'untube';
105
+
106
+ const info = await untube.getVideoInfo('videoId');
107
+
108
+ console.log('Title:', info.title);
109
+ console.log('Views:', info.view_count);
110
+ ```
111
+
112
+ ### Format Utilities
113
+
114
+ `untube` includes powerful utility functions to help you manage and filter formats from the `info` object.
115
+
116
+ ```typescript
117
+ const info = await untube.getVideoInfo('videoId');
118
+
119
+ // 1. Choose a specific format manually
120
+ const bestAudio = untube.chooseFormat(info.formats, { quality: 'highestaudio' });
121
+
122
+ // 2. Filter formats custom logic
123
+ const mp4Only = untube.filterFormats(info.formats, format => format.container === 'mp4');
124
+
125
+ // 3. Filter using presets ('video', 'audio', 'audioandvideo', 'videoonly', 'audioonly')
126
+ const videoNoSound = untube.filterFormats(info.formats, 'videoonly');
127
+
128
+ // 4. Sort formats from highest to lowest quality
129
+ const sorted = untube.sortFormats(info.formats);
130
+ ```
131
+
132
+ ---
133
+
50
134
  ## Cookie Handling
51
135
 
52
136
  Using cookies is highly recommended to avoid rate limits, access age-restricted (NSFW) videos, or videos only available in specific regions.
53
137
 
54
138
  ### 1. Using a File (Netscape format)
55
- 1. Install a browser extension like **"Get cookies.txt LOCALLY"** (available on Chrome Web Store or Firefox Add-ons).
56
- 2. Open YouTube and ensure you are logged in (optional, but recommended).
57
- 3. Click on the extension and select **"Export as Netscape format"**.
58
- 4. Save the file as `cookies.txt` in your project directory.
59
- 5. Provide the file path in the `cookie` option.
139
+ 1. Install a browser extension like **"Get cookies.txt LOCALLY"** (Chrome/Firefox).
140
+ 2. Open YouTube and ensure you are logged in.
141
+ 3. Export the cookies in **Netscape format** and save it as `cookies.txt`.
142
+ 4. Provide the file path:
143
+
144
+ ```typescript
145
+ untube('videoId', { cookie: './cookies.txt' });
146
+ ```
60
147
 
61
- ### 2. Advanced: Remote Storage (Firebase, Database, etc.)
148
+ ### 2. Advanced: Remote Storage (Database / Firebase)
62
149
  If you want to store cookies in a remote database or as a string, use the `RawCookie` class:
63
150
 
64
151
  ```typescript
65
- import { getVideoInfo, RawCookie } from 'untube';
152
+ import untube from 'untube';
66
153
 
67
- const myRawCookie = new RawCookie(
154
+ const myRawCookie = new untube.RawCookie(
68
155
  async () => {
69
- // Implement your own read logic (e.g., from Firebase Realtime DB)
70
- const cookies = await fetchCookiesFromDB();
71
- return cookies; // Must return Netscape format string
156
+ // Implement read logic (e.g., fetch from DB)
157
+ return await fetchCookiesFromDB(); // Must return Netscape format string
72
158
  },
73
159
  async (newCookies) => {
74
- // Implement your own write logic
75
- // This is called whenever YouTube sends new cookies
160
+ // Implement write logic (called when YouTube refreshes cookies)
76
161
  await saveCookiesToDB(newCookies);
77
162
  }
78
163
  );
79
164
 
80
- const info = await getVideoInfo('videoId', {
81
- cookie: myRawCookie
82
- });
165
+ untube('videoId', { cookie: myRawCookie });
83
166
  ```
84
167
 
85
168
  > **⚠️ Security:** Never share your cookies with anyone as they contain your login session. Ensure local cookie files are added to your `.gitignore`.
86
169
 
170
+ ---
171
+
87
172
  ## Disclaimer
88
173
 
89
174
  This project is created for educational and research purposes only. Users are solely responsible for how they use this tool. Ensure you comply with YouTube's Terms of Service and applicable copyright laws in your region. The author is not responsible for any misuse of this tool.
@@ -0,0 +1,7 @@
1
+ export interface DownloadProgress {
2
+ percent: number;
3
+ downloadedBytes: number;
4
+ totalBytes: number;
5
+ }
6
+ export declare function downloadVideoParallel(url: string, proxy?: string, signal?: AbortSignal, onProgressCallback?: ((progress: DownloadProgress) => void) | null): Promise<string | null>;
7
+ //# sourceMappingURL=downloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../src/downloader.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,kBAAkB,GAAE,CAAC,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC,GAAG,IAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsG/L"}
@@ -0,0 +1,107 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createWriteStream } from 'node:fs';
3
+ import fs from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { Readable } from 'node:stream';
7
+ import { pipeline } from 'node:stream/promises';
8
+ import pLimit from 'p-limit';
9
+ import { fetch, ProxyAgent } from 'undici';
10
+ const CHUNK_SIZE = 5 * 1024 * 1024;
11
+ const CONCURRENCY = 20;
12
+ const RETRY_LIMIT = 3;
13
+ export async function downloadVideoParallel(url, proxy, signal, onProgressCallback = null) {
14
+ const tempFileName = `download_${randomUUID()}.mp4`;
15
+ const filePath = path.join(os.tmpdir(), tempFileName);
16
+ const dispatcher = proxy ? new ProxyAgent(proxy) : undefined;
17
+ try {
18
+ let progress = 0;
19
+ const limit = pLimit(CONCURRENCY);
20
+ let fileHandle = null;
21
+ async function downloadAndWriteChunk(start, end, chunkIndex, retryCount = 0) {
22
+ try {
23
+ const response = await fetch(url, {
24
+ headers: { Range: `bytes=${start}-${end}` },
25
+ signal: signal || AbortSignal.timeout(30000),
26
+ dispatcher
27
+ });
28
+ if (!response.ok) {
29
+ throw new Error(`HTTP error ${response.status} for chunk ${chunkIndex}`);
30
+ }
31
+ const arrayBuffer = await response.arrayBuffer();
32
+ const buffer = Buffer.from(arrayBuffer);
33
+ if (fileHandle) {
34
+ await fileHandle.write(buffer, 0, buffer.length, start);
35
+ }
36
+ }
37
+ catch (error) {
38
+ if (retryCount >= RETRY_LIMIT) {
39
+ throw new Error(`Chunk ${chunkIndex} failed after ${RETRY_LIMIT} retries: ${error.message}`);
40
+ }
41
+ return downloadAndWriteChunk(start, end, chunkIndex, retryCount + 1);
42
+ }
43
+ }
44
+ try {
45
+ const headResponse = await fetch(url, {
46
+ method: 'HEAD',
47
+ headers: { 'Accept-Encoding': 'identity' },
48
+ dispatcher
49
+ });
50
+ if (!headResponse.ok) {
51
+ throw new Error(`Server response: ${headResponse.status}`);
52
+ }
53
+ const acceptRanges = headResponse.headers.get('accept-ranges') === 'bytes';
54
+ const totalSize = Number.parseInt(String(headResponse.headers.get('content-length')), 10);
55
+ if (!acceptRanges || Number.isNaN(totalSize)) {
56
+ console.log(`[Downloader] Range not supported or unknown size. Using fallback streaming...`);
57
+ const response = await fetch(url, { dispatcher, signal });
58
+ if (!response.ok || !response.body)
59
+ throw new Error(`Fallback HTTP Error: ${response.status}`);
60
+ await pipeline(Readable.fromWeb(response.body), createWriteStream(filePath), { signal });
61
+ return filePath;
62
+ }
63
+ fileHandle = await fs.open(filePath, 'w');
64
+ const totalChunks = Math.ceil(totalSize / CHUNK_SIZE);
65
+ const downloadTasks = [];
66
+ let downloadedCount = 0;
67
+ for (let i = 0; i < totalChunks; i++) {
68
+ const start = i * CHUNK_SIZE;
69
+ const end = Math.min(start + CHUNK_SIZE - 1, totalSize - 1);
70
+ const task = limit(async () => {
71
+ await downloadAndWriteChunk(start, end, i);
72
+ downloadedCount++;
73
+ const percent = Math.ceil((downloadedCount / totalChunks) * 100);
74
+ const downloadedBytes = Math.min(downloadedCount * CHUNK_SIZE, totalSize);
75
+ if (onProgressCallback && percent !== progress) {
76
+ progress = percent;
77
+ try {
78
+ onProgressCallback({ percent, downloadedBytes, totalBytes: totalSize });
79
+ }
80
+ catch (cbError) {
81
+ console.error(cbError);
82
+ }
83
+ }
84
+ });
85
+ downloadTasks.push(task);
86
+ }
87
+ await Promise.all(downloadTasks);
88
+ await fileHandle.close();
89
+ return filePath;
90
+ }
91
+ catch (error) {
92
+ console.error(`[Downloader] Failed to process ${url}:`, error.message);
93
+ if (fileHandle) {
94
+ await fileHandle.close().catch(() => { });
95
+ }
96
+ await fs.unlink(filePath).catch(() => { });
97
+ return null;
98
+ }
99
+ }
100
+ catch (err) {
101
+ await fs.unlink(filePath).catch(() => { });
102
+ const errStr = err instanceof Error ? err.stack || err.message : String(err);
103
+ console.error(`[Downloader] Critical Error:\n${errStr}`);
104
+ throw err;
105
+ }
106
+ }
107
+ //# sourceMappingURL=downloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloader.js","sourceRoot":"","sources":["../src/downloader.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import { RawCookie } from './cookie-manager.js';
2
+ import { filterFormats, sortFormats, chooseFormat, FilterFunction, FilterString, ChooseFormatQuality, ChooseFormatOptions } from './utils.js';
3
+ import { PassThrough } from 'node:stream';
2
4
  export interface YouTubeFormat {
3
5
  asr: number | null;
4
6
  filesize: number | null;
@@ -23,6 +25,12 @@ export interface YouTubeFormat {
23
25
  resolution: string;
24
26
  format: string;
25
27
  }
28
+ export interface YouTubeCaption {
29
+ url: string;
30
+ ext: string;
31
+ name: string;
32
+ language: string;
33
+ }
26
34
  export interface VideoInfo {
27
35
  id: string;
28
36
  title: string;
@@ -43,6 +51,7 @@ export interface VideoInfo {
43
51
  thumbnail: string;
44
52
  thumbnails: any[];
45
53
  formats: YouTubeFormat[];
54
+ captions: YouTubeCaption[];
46
55
  availability: string;
47
56
  }
48
57
  export interface GetVideoInfoOptions {
@@ -50,5 +59,20 @@ export interface GetVideoInfoOptions {
50
59
  proxy?: string;
51
60
  }
52
61
  declare function getVideoInfo(videoId: string, options?: GetVideoInfoOptions): Promise<VideoInfo>;
53
- export { getVideoInfo, RawCookie };
62
+ export interface UntubeOptions extends GetVideoInfoOptions {
63
+ format?: ChooseFormatQuality;
64
+ filter?: FilterString | FilterFunction;
65
+ mode?: 'parallel' | 'sequential';
66
+ signal?: AbortSignal;
67
+ }
68
+ declare function untube(id: string, options?: UntubeOptions): PassThrough;
69
+ declare namespace untube {
70
+ var getVideoInfo: typeof import("./index.js").getVideoInfo;
71
+ var RawCookie: typeof import("./cookie-manager.js").RawCookie;
72
+ var filterFormats: typeof import("./utils.js").filterFormats;
73
+ var sortFormats: typeof import("./utils.js").sortFormats;
74
+ var chooseFormat: typeof import("./utils.js").chooseFormat;
75
+ }
76
+ export { getVideoInfo, RawCookie, filterFormats, sortFormats, chooseFormat, FilterFunction, FilterString, ChooseFormatQuality, ChooseFormatOptions };
77
+ export default untube;
54
78
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAsB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAK9D,MAAM,WAAW,aAAa;IAC1B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC3B,iBAAiB,EAAE,OAAO,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,GAAG,EAAE,CAAA;IACjB,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAUD,iBAAe,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,SAAS,CAAC,CAqLlG;AA4GD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,6 +2,11 @@ import CookieManager, { RawCookie } from './cookie-manager.js';
2
2
  import jsc from './solver-bundle.js';
3
3
  import crypto from 'node:crypto';
4
4
  import { fetch, ProxyAgent } from 'undici';
5
+ import { filterFormats, sortFormats, chooseFormat } from './utils.js';
6
+ import { PassThrough, Readable } from 'node:stream';
7
+ import { createReadStream } from 'node:fs';
8
+ import fs from 'node:fs/promises';
9
+ import { downloadVideoParallel } from './downloader.js';
5
10
  async function getVideoInfo(videoId, options = {}) {
6
11
  const cookieSource = options.cookie || './cookies.txt';
7
12
  const cm = new CookieManager(cookieSource);
@@ -84,6 +89,9 @@ async function getVideoInfo(videoId, options = {}) {
84
89
  throw new Error(`InnerTube API failed: ${apiRes.status} ${apiRes.statusText}`);
85
90
  }
86
91
  const json = await apiRes.json();
92
+ if (json.playabilityStatus && json.playabilityStatus.status !== 'OK') {
93
+ throw new Error(`YouTube Error: ${json.playabilityStatus.reason || json.playabilityStatus.status}`);
94
+ }
87
95
  let preprocessedPlayerCache = null;
88
96
  const getPreprocessedPlayer = async () => {
89
97
  if (preprocessedPlayerCache)
@@ -246,6 +254,17 @@ function normalizeYtDlp(json) {
246
254
  const duration = Number.parseInt(vd.lengthSeconds || mf.lengthSeconds || '0', 10);
247
255
  const view_count = Number.parseInt(vd.viewCount || mf.viewCount || '0', 10);
248
256
  const isLive = vd.isLiveContent || false;
257
+ const captions = [];
258
+ if (json.captions?.playerCaptionsTracklistRenderer?.captionTracks) {
259
+ for (const track of json.captions.playerCaptionsTracklistRenderer.captionTracks) {
260
+ captions.push({
261
+ url: track.baseUrl,
262
+ ext: 'vtt',
263
+ name: track.name?.simpleText || track.languageCode,
264
+ language: track.languageCode,
265
+ });
266
+ }
267
+ }
249
268
  return {
250
269
  id: vd.videoId,
251
270
  title: vd.title || mf.title?.simpleText,
@@ -266,8 +285,63 @@ function normalizeYtDlp(json) {
266
285
  thumbnail: mf.thumbnail?.thumbnails?.[mf.thumbnail.thumbnails.length - 1]?.url || vd.thumbnail?.thumbnails?.[vd.thumbnail.thumbnails.length - 1]?.url || '',
267
286
  thumbnails: mf.thumbnail?.thumbnails || vd.thumbnail?.thumbnails || [],
268
287
  formats,
288
+ captions,
269
289
  availability: json.playabilityStatus?.status || 'OK',
270
290
  };
271
291
  }
272
- export { getVideoInfo, RawCookie };
292
+ function untube(id, options = {}) {
293
+ const stream = new PassThrough();
294
+ (async () => {
295
+ try {
296
+ const info = await getVideoInfo(id, options);
297
+ const format = chooseFormat(info.formats, {
298
+ quality: options.format,
299
+ filter: options.filter
300
+ });
301
+ stream.emit('info', info, format);
302
+ if (options.mode === 'sequential' || format.url.includes('.m3u8')) {
303
+ const dispatcher = options.proxy ? new ProxyAgent(options.proxy) : undefined;
304
+ const fetchOptions = { dispatcher, signal: options.signal };
305
+ if (!format.url.includes('.m3u8')) {
306
+ fetchOptions.headers = { Range: 'bytes=0-' };
307
+ }
308
+ const response = await fetch(format.url, fetchOptions);
309
+ if (!response.ok || !response.body) {
310
+ throw new Error(`Failed to fetch video stream: ${response.status}`);
311
+ }
312
+ const webStream = Readable.fromWeb(response.body);
313
+ webStream.on('error', (err) => stream.emit('error', err));
314
+ webStream.pipe(stream);
315
+ }
316
+ else {
317
+ const tempFile = await downloadVideoParallel(format.url, options.proxy, options.signal, (percent) => {
318
+ stream.emit('progress', percent);
319
+ });
320
+ if (!tempFile) {
321
+ throw new Error('Download failed, no file returned.');
322
+ }
323
+ const readStream = createReadStream(tempFile);
324
+ readStream.on('error', (err) => {
325
+ stream.emit('error', err);
326
+ fs.unlink(tempFile).catch(() => { });
327
+ });
328
+ readStream.on('end', () => {
329
+ fs.unlink(tempFile).catch(() => { });
330
+ });
331
+ readStream.pipe(stream);
332
+ }
333
+ }
334
+ catch (err) {
335
+ stream.emit('error', err);
336
+ }
337
+ })();
338
+ return stream;
339
+ }
340
+ untube.getVideoInfo = getVideoInfo;
341
+ untube.RawCookie = RawCookie;
342
+ untube.filterFormats = filterFormats;
343
+ untube.sortFormats = sortFormats;
344
+ untube.chooseFormat = chooseFormat;
345
+ export { getVideoInfo, RawCookie, filterFormats, sortFormats, chooseFormat };
346
+ export default untube;
273
347
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { YouTubeFormat } from './index.js';
2
+ export type FilterFunction = (format: YouTubeFormat) => boolean;
3
+ export type FilterString = 'audioandvideo' | 'videoandaudio' | 'video' | 'videoonly' | 'audio' | 'audioonly';
4
+ export declare function filterFormats(formats: YouTubeFormat[], filter: FilterString | FilterFunction): YouTubeFormat[];
5
+ export declare function sortFormats(formats: YouTubeFormat[]): YouTubeFormat[];
6
+ export type ChooseFormatQuality = 'highest' | 'lowest' | 'highestaudio' | 'lowestaudio' | 'highestvideo' | 'lowestvideo' | string;
7
+ export interface ChooseFormatOptions {
8
+ quality?: ChooseFormatQuality;
9
+ filter?: FilterString | FilterFunction;
10
+ }
11
+ export declare function chooseFormat(formats: YouTubeFormat[], options?: ChooseFormatOptions): YouTubeFormat;
12
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,eAAe,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,CAAC;AAS7G,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,cAAc,GAAG,aAAa,EAAE,CAoB9G;AASD,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAcrE;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,aAAa,GAAG,MAAM,CAAC;AAelI,MAAM,WAAW,mBAAmB;IAChC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,YAAY,GAAG,cAAc,CAAC;CAC1C;AASD,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,OAAO,GAAE,mBAAwB,GAAG,aAAa,CAiDvG"}
package/dist/utils.js ADDED
@@ -0,0 +1,84 @@
1
+ export function filterFormats(formats, filter) {
2
+ if (typeof filter === 'function') {
3
+ return formats.filter(filter);
4
+ }
5
+ switch (filter) {
6
+ case 'audioandvideo':
7
+ case 'videoandaudio':
8
+ return formats.filter((f) => f.vcodec !== 'none' && f.acodec !== 'none');
9
+ case 'video':
10
+ return formats.filter((f) => f.vcodec !== 'none');
11
+ case 'videoonly':
12
+ return formats.filter((f) => f.vcodec !== 'none' && f.acodec === 'none');
13
+ case 'audio':
14
+ return formats.filter((f) => f.acodec !== 'none');
15
+ case 'audioonly':
16
+ return formats.filter((f) => f.acodec !== 'none' && f.vcodec === 'none');
17
+ default:
18
+ return formats;
19
+ }
20
+ }
21
+ export function sortFormats(formats) {
22
+ return [...formats].sort((a, b) => {
23
+ const aRes = a.height || 0;
24
+ const bRes = b.height || 0;
25
+ if (aRes !== bRes)
26
+ return bRes - aRes;
27
+ const aVbr = a.vbr || 0;
28
+ const bVbr = b.vbr || 0;
29
+ if (aVbr !== bVbr)
30
+ return bVbr - aVbr;
31
+ const aAbr = a.abr || 0;
32
+ const bAbr = b.abr || 0;
33
+ return bAbr - aAbr;
34
+ });
35
+ }
36
+ export function chooseFormat(formats, options = {}) {
37
+ let filtered = options.filter ? filterFormats(formats, options.filter) : formats;
38
+ if (filtered.length === 0) {
39
+ throw new Error('No formats found matching the given criteria.');
40
+ }
41
+ const quality = options.quality || 'highest';
42
+ switch (quality) {
43
+ case 'highest':
44
+ filtered = sortFormats(filtered);
45
+ return filtered[0];
46
+ case 'lowest':
47
+ filtered = sortFormats(filtered).reverse();
48
+ return filtered[0];
49
+ case 'highestaudio':
50
+ filtered = filterFormats(filtered, 'audio');
51
+ filtered.sort((a, b) => (b.abr || 0) - (a.abr || 0));
52
+ if (filtered.length === 0)
53
+ throw new Error('No audio formats found.');
54
+ return filtered[0];
55
+ case 'lowestaudio':
56
+ filtered = filterFormats(filtered, 'audio');
57
+ filtered.sort((a, b) => (a.abr || 0) - (b.abr || 0));
58
+ if (filtered.length === 0)
59
+ throw new Error('No audio formats found.');
60
+ return filtered[0];
61
+ case 'highestvideo':
62
+ filtered = filterFormats(filtered, 'video');
63
+ filtered = sortFormats(filtered);
64
+ if (filtered.length === 0)
65
+ throw new Error('No video formats found.');
66
+ return filtered[0];
67
+ case 'lowestvideo':
68
+ filtered = filterFormats(filtered, 'video');
69
+ filtered = sortFormats(filtered).reverse();
70
+ if (filtered.length === 0)
71
+ throw new Error('No video formats found.');
72
+ return filtered[0];
73
+ default: {
74
+ const exactMatch = filtered.find((f) => f.format_id === quality ||
75
+ f.resolution === quality ||
76
+ (typeof quality === 'string' && f.resolution.includes(quality)));
77
+ if (!exactMatch) {
78
+ throw new Error(`No format found matching quality: ${quality}`);
79
+ }
80
+ return exactMatch;
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "untube",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "Lightweight YouTube video metadata and streaming URL extractor for Node.js. Features automatic signature decryption (n-parameter), proxy support, and cookie management. Ported from yt-dlp.",
5
5
  "keywords": [
6
6
  "youtube",
@@ -37,7 +37,7 @@
37
37
  ],
38
38
  "scripts": {
39
39
  "build": "npx tsc",
40
- "test": "echo \"Error: no test specified\" && exit 1",
40
+ "update-solver": "node scripts/update-solver.js",
41
41
  "prepublishOnly": "npm run build"
42
42
  },
43
43
  "devDependencies": {
@@ -46,6 +46,7 @@
46
46
  "typescript": "^5.9.3"
47
47
  },
48
48
  "dependencies": {
49
+ "p-limit": "^7.3.0",
49
50
  "tough-cookie": "^6.0.1",
50
51
  "undici": "^7.24.3"
51
52
  }