| export interface DownloadProgress { | ||
| percent: number; | ||
| downloadedBytes: number; | ||
| totalBytes: number; | ||
| } | ||
| export declare function downloadVideoParallel(url: string, proxy?: string, signal?: AbortSignal, onProgressCallback?: ((progress: DownloadProgress) => void) | null): Promise<string | null>; | ||
| //# sourceMappingURL=downloader.d.ts.map |
| {"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"} |
| import { randomUUID } from 'node:crypto'; | ||
| import { createWriteStream } from 'node:fs'; | ||
| import fs from 'node:fs/promises'; | ||
| import os from 'node:os'; | ||
| import path from 'node:path'; | ||
| import { Readable } from 'node:stream'; | ||
| import { pipeline } from 'node:stream/promises'; | ||
| import pLimit from 'p-limit'; | ||
| import { fetch, ProxyAgent } from 'undici'; | ||
| const CHUNK_SIZE = 5 * 1024 * 1024; | ||
| const CONCURRENCY = 20; | ||
| const RETRY_LIMIT = 3; | ||
| export async function downloadVideoParallel(url, proxy, signal, onProgressCallback = null) { | ||
| const tempFileName = `download_${randomUUID()}.mp4`; | ||
| const filePath = path.join(os.tmpdir(), tempFileName); | ||
| const dispatcher = proxy ? new ProxyAgent(proxy) : undefined; | ||
| try { | ||
| let progress = 0; | ||
| const limit = pLimit(CONCURRENCY); | ||
| let fileHandle = null; | ||
| async function downloadAndWriteChunk(start, end, chunkIndex, retryCount = 0) { | ||
| try { | ||
| const response = await fetch(url, { | ||
| headers: { Range: `bytes=${start}-${end}` }, | ||
| signal: signal || AbortSignal.timeout(30000), | ||
| dispatcher | ||
| }); | ||
| if (!response.ok) { | ||
| throw new Error(`HTTP error ${response.status} for chunk ${chunkIndex}`); | ||
| } | ||
| const arrayBuffer = await response.arrayBuffer(); | ||
| const buffer = Buffer.from(arrayBuffer); | ||
| if (fileHandle) { | ||
| await fileHandle.write(buffer, 0, buffer.length, start); | ||
| } | ||
| } | ||
| catch (error) { | ||
| if (retryCount >= RETRY_LIMIT) { | ||
| throw new Error(`Chunk ${chunkIndex} failed after ${RETRY_LIMIT} retries: ${error.message}`); | ||
| } | ||
| return downloadAndWriteChunk(start, end, chunkIndex, retryCount + 1); | ||
| } | ||
| } | ||
| try { | ||
| const headResponse = await fetch(url, { | ||
| method: 'HEAD', | ||
| headers: { 'Accept-Encoding': 'identity' }, | ||
| dispatcher | ||
| }); | ||
| if (!headResponse.ok) { | ||
| throw new Error(`Server response: ${headResponse.status}`); | ||
| } | ||
| const acceptRanges = headResponse.headers.get('accept-ranges') === 'bytes'; | ||
| const totalSize = Number.parseInt(String(headResponse.headers.get('content-length')), 10); | ||
| if (!acceptRanges || Number.isNaN(totalSize)) { | ||
| console.log(`[Downloader] Range not supported or unknown size. Using fallback streaming...`); | ||
| const response = await fetch(url, { dispatcher, signal }); | ||
| if (!response.ok || !response.body) | ||
| throw new Error(`Fallback HTTP Error: ${response.status}`); | ||
| await pipeline(Readable.fromWeb(response.body), createWriteStream(filePath), { signal }); | ||
| return filePath; | ||
| } | ||
| fileHandle = await fs.open(filePath, 'w'); | ||
| const totalChunks = Math.ceil(totalSize / CHUNK_SIZE); | ||
| const downloadTasks = []; | ||
| let downloadedCount = 0; | ||
| for (let i = 0; i < totalChunks; i++) { | ||
| const start = i * CHUNK_SIZE; | ||
| const end = Math.min(start + CHUNK_SIZE - 1, totalSize - 1); | ||
| const task = limit(async () => { | ||
| await downloadAndWriteChunk(start, end, i); | ||
| downloadedCount++; | ||
| const percent = Math.ceil((downloadedCount / totalChunks) * 100); | ||
| const downloadedBytes = Math.min(downloadedCount * CHUNK_SIZE, totalSize); | ||
| if (onProgressCallback && percent !== progress) { | ||
| progress = percent; | ||
| try { | ||
| onProgressCallback({ percent, downloadedBytes, totalBytes: totalSize }); | ||
| } | ||
| catch (cbError) { | ||
| console.error(cbError); | ||
| } | ||
| } | ||
| }); | ||
| downloadTasks.push(task); | ||
| } | ||
| await Promise.all(downloadTasks); | ||
| await fileHandle.close(); | ||
| return filePath; | ||
| } | ||
| catch (error) { | ||
| console.error(`[Downloader] Failed to process ${url}:`, error.message); | ||
| if (fileHandle) { | ||
| await fileHandle.close().catch(() => { }); | ||
| } | ||
| await fs.unlink(filePath).catch(() => { }); | ||
| return null; | ||
| } | ||
| } | ||
| catch (err) { | ||
| await fs.unlink(filePath).catch(() => { }); | ||
| const errStr = err instanceof Error ? err.stack || err.message : String(err); | ||
| console.error(`[Downloader] Critical Error:\n${errStr}`); | ||
| throw err; | ||
| } | ||
| } | ||
| //# sourceMappingURL=downloader.js.map |
| {"version":3,"file":"downloader.js","sourceRoot":"","sources":["../src/downloader.ts"],"names":[],"mappings":"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"} |
| import { YouTubeFormat } from './index.js'; | ||
| export type FilterFunction = (format: YouTubeFormat) => boolean; | ||
| export type FilterString = 'audioandvideo' | 'videoandaudio' | 'video' | 'videoonly' | 'audio' | 'audioonly'; | ||
| export declare function filterFormats(formats: YouTubeFormat[], filter: FilterString | FilterFunction): YouTubeFormat[]; | ||
| export declare function sortFormats(formats: YouTubeFormat[]): YouTubeFormat[]; | ||
| export type ChooseFormatQuality = 'highest' | 'lowest' | 'highestaudio' | 'lowestaudio' | 'highestvideo' | 'lowestvideo' | string; | ||
| export interface ChooseFormatOptions { | ||
| quality?: ChooseFormatQuality; | ||
| filter?: FilterString | FilterFunction; | ||
| } | ||
| export declare function chooseFormat(formats: YouTubeFormat[], options?: ChooseFormatOptions): YouTubeFormat; | ||
| //# sourceMappingURL=utils.d.ts.map |
| {"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"} |
| export function filterFormats(formats, filter) { | ||
| if (typeof filter === 'function') { | ||
| return formats.filter(filter); | ||
| } | ||
| switch (filter) { | ||
| case 'audioandvideo': | ||
| case 'videoandaudio': | ||
| return formats.filter((f) => f.vcodec !== 'none' && f.acodec !== 'none'); | ||
| case 'video': | ||
| return formats.filter((f) => f.vcodec !== 'none'); | ||
| case 'videoonly': | ||
| return formats.filter((f) => f.vcodec !== 'none' && f.acodec === 'none'); | ||
| case 'audio': | ||
| return formats.filter((f) => f.acodec !== 'none'); | ||
| case 'audioonly': | ||
| return formats.filter((f) => f.acodec !== 'none' && f.vcodec === 'none'); | ||
| default: | ||
| return formats; | ||
| } | ||
| } | ||
| export function sortFormats(formats) { | ||
| return [...formats].sort((a, b) => { | ||
| const aRes = a.height || 0; | ||
| const bRes = b.height || 0; | ||
| if (aRes !== bRes) | ||
| return bRes - aRes; | ||
| const aVbr = a.vbr || 0; | ||
| const bVbr = b.vbr || 0; | ||
| if (aVbr !== bVbr) | ||
| return bVbr - aVbr; | ||
| const aAbr = a.abr || 0; | ||
| const bAbr = b.abr || 0; | ||
| return bAbr - aAbr; | ||
| }); | ||
| } | ||
| export function chooseFormat(formats, options = {}) { | ||
| let filtered = options.filter ? filterFormats(formats, options.filter) : formats; | ||
| if (filtered.length === 0) { | ||
| throw new Error('No formats found matching the given criteria.'); | ||
| } | ||
| const quality = options.quality || 'highest'; | ||
| switch (quality) { | ||
| case 'highest': | ||
| filtered = sortFormats(filtered); | ||
| return filtered[0]; | ||
| case 'lowest': | ||
| filtered = sortFormats(filtered).reverse(); | ||
| return filtered[0]; | ||
| case 'highestaudio': | ||
| filtered = filterFormats(filtered, 'audio'); | ||
| filtered.sort((a, b) => (b.abr || 0) - (a.abr || 0)); | ||
| if (filtered.length === 0) | ||
| throw new Error('No audio formats found.'); | ||
| return filtered[0]; | ||
| case 'lowestaudio': | ||
| filtered = filterFormats(filtered, 'audio'); | ||
| filtered.sort((a, b) => (a.abr || 0) - (b.abr || 0)); | ||
| if (filtered.length === 0) | ||
| throw new Error('No audio formats found.'); | ||
| return filtered[0]; | ||
| case 'highestvideo': | ||
| filtered = filterFormats(filtered, 'video'); | ||
| filtered = sortFormats(filtered); | ||
| if (filtered.length === 0) | ||
| throw new Error('No video formats found.'); | ||
| return filtered[0]; | ||
| case 'lowestvideo': | ||
| filtered = filterFormats(filtered, 'video'); | ||
| filtered = sortFormats(filtered).reverse(); | ||
| if (filtered.length === 0) | ||
| throw new Error('No video formats found.'); | ||
| return filtered[0]; | ||
| default: { | ||
| const exactMatch = filtered.find((f) => f.format_id === quality || | ||
| f.resolution === quality || | ||
| (typeof quality === 'string' && f.resolution.includes(quality))); | ||
| if (!exactMatch) { | ||
| throw new Error(`No format found matching quality: ${quality}`); | ||
| } | ||
| return exactMatch; | ||
| } | ||
| } | ||
| } | ||
| //# sourceMappingURL=utils.js.map |
| {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,aAAa,CAAC,OAAwB,EAAE,MAAqC;IACzF,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACb,KAAK,eAAe,CAAC;QACrB,KAAK,eAAe;YAChB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC7E,KAAK,OAAO;YACR,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACtD,KAAK,WAAW;YACZ,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC7E,KAAK,OAAO;YACR,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACtD,KAAK,WAAW;YACZ,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC7E;YACI,OAAO,OAAO,CAAC;IACvB,CAAC;AACL,CAAC;AASD,MAAM,UAAU,WAAW,CAAC,OAAwB;IAChD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,GAAG,IAAI,CAAC;QAEtC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,GAAG,IAAI,CAAC;QAEtC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,OAAO,IAAI,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC;AA6BD,MAAM,UAAU,YAAY,CAAC,OAAwB,EAAE,UAA+B,EAAE;IACpF,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEjF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;IAE7C,QAAQ,OAAO,EAAE,CAAC;QACd,KAAK,SAAS;YACV,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACjC,OAAO,QAAQ,CAAC,CAAC,CAAkB,CAAC;QACxC,KAAK,QAAQ;YACT,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3C,OAAO,QAAQ,CAAC,CAAC,CAAkB,CAAC;QACxC,KAAK,cAAc;YACf,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACtE,OAAO,QAAQ,CAAC,CAAC,CAAkB,CAAC;QACxC,KAAK,aAAa;YACd,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACtE,OAAO,QAAQ,CAAC,CAAC,CAAkB,CAAC;QACxC,KAAK,cAAc;YACf,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACtE,OAAO,QAAQ,CAAC,CAAC,CAAkB,CAAC;QACxC,KAAK,aAAa;YACd,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACtE,OAAO,QAAQ,CAAC,CAAC,CAAkB,CAAC;QACxC,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CACF,CAAC,CAAC,SAAS,KAAK,OAAO;gBACvB,CAAC,CAAC,UAAU,KAAK,OAAO;gBACxB,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CACtE,CAAC;YACF,IAAI,CAAC,UAAU,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,UAAU,CAAC;QACtB,CAAC;IACL,CAAC;AACL,CAAC"} |
+25
-1
| import { RawCookie } from './cookie-manager.js'; | ||
| import { filterFormats, sortFormats, chooseFormat, FilterFunction, FilterString, ChooseFormatQuality, ChooseFormatOptions } from './utils.js'; | ||
| import { PassThrough } from 'node:stream'; | ||
| export interface YouTubeFormat { | ||
@@ -26,2 +28,8 @@ asr: number | null; | ||
| } | ||
| export interface YouTubeCaption { | ||
| url: string; | ||
| ext: string; | ||
| name: string; | ||
| language: string; | ||
| } | ||
| export interface VideoInfo { | ||
@@ -47,2 +55,3 @@ id: string; | ||
| formats: YouTubeFormat[]; | ||
| captions: YouTubeCaption[]; | ||
| availability: string; | ||
@@ -55,3 +64,18 @@ } | ||
| declare function getVideoInfo(videoId: string, options?: GetVideoInfoOptions): Promise<VideoInfo>; | ||
| export { getVideoInfo, RawCookie }; | ||
| export interface UntubeOptions extends GetVideoInfoOptions { | ||
| format?: ChooseFormatQuality; | ||
| filter?: FilterString | FilterFunction; | ||
| mode?: 'parallel' | 'sequential'; | ||
| signal?: AbortSignal; | ||
| } | ||
| declare function untube(id: string, options?: UntubeOptions): PassThrough; | ||
| declare namespace untube { | ||
| var getVideoInfo: typeof import("./index.js").getVideoInfo; | ||
| var RawCookie: typeof import("./cookie-manager.js").RawCookie; | ||
| var filterFormats: typeof import("./utils.js").filterFormats; | ||
| var sortFormats: typeof import("./utils.js").sortFormats; | ||
| var chooseFormat: typeof import("./utils.js").chooseFormat; | ||
| } | ||
| export { getVideoInfo, RawCookie, filterFormats, sortFormats, chooseFormat, FilterFunction, FilterString, ChooseFormatQuality, ChooseFormatOptions }; | ||
| export default untube; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,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"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
+75
-1
@@ -5,2 +5,7 @@ import CookieManager, { RawCookie } from './cookie-manager.js'; | ||
| import { fetch, ProxyAgent } from 'undici'; | ||
| import { filterFormats, sortFormats, chooseFormat } from './utils.js'; | ||
| import { PassThrough, Readable } from 'node:stream'; | ||
| import { createReadStream } from 'node:fs'; | ||
| import fs from 'node:fs/promises'; | ||
| import { downloadVideoParallel } from './downloader.js'; | ||
| async function getVideoInfo(videoId, options = {}) { | ||
@@ -88,2 +93,5 @@ const cookieSource = options.cookie || './cookies.txt'; | ||
| const json = await apiRes.json(); | ||
| if (json.playabilityStatus && json.playabilityStatus.status !== 'OK') { | ||
| throw new Error(`YouTube Error: ${json.playabilityStatus.reason || json.playabilityStatus.status}`); | ||
| } | ||
| let preprocessedPlayerCache = null; | ||
@@ -251,2 +259,13 @@ const getPreprocessedPlayer = async () => { | ||
| const isLive = vd.isLiveContent || false; | ||
| const captions = []; | ||
| if (json.captions?.playerCaptionsTracklistRenderer?.captionTracks) { | ||
| for (const track of json.captions.playerCaptionsTracklistRenderer.captionTracks) { | ||
| captions.push({ | ||
| url: track.baseUrl, | ||
| ext: 'vtt', | ||
| name: track.name?.simpleText || track.languageCode, | ||
| language: track.languageCode, | ||
| }); | ||
| } | ||
| } | ||
| return { | ||
@@ -272,6 +291,61 @@ id: vd.videoId, | ||
| formats, | ||
| captions, | ||
| availability: json.playabilityStatus?.status || 'OK', | ||
| }; | ||
| } | ||
| export { getVideoInfo, RawCookie }; | ||
| function untube(id, options = {}) { | ||
| const stream = new PassThrough(); | ||
| (async () => { | ||
| try { | ||
| const info = await getVideoInfo(id, options); | ||
| const format = chooseFormat(info.formats, { | ||
| quality: options.format, | ||
| filter: options.filter | ||
| }); | ||
| stream.emit('info', info, format); | ||
| if (options.mode === 'sequential' || format.url.includes('.m3u8')) { | ||
| const dispatcher = options.proxy ? new ProxyAgent(options.proxy) : undefined; | ||
| const fetchOptions = { dispatcher, signal: options.signal }; | ||
| if (!format.url.includes('.m3u8')) { | ||
| fetchOptions.headers = { Range: 'bytes=0-' }; | ||
| } | ||
| const response = await fetch(format.url, fetchOptions); | ||
| if (!response.ok || !response.body) { | ||
| throw new Error(`Failed to fetch video stream: ${response.status}`); | ||
| } | ||
| const webStream = Readable.fromWeb(response.body); | ||
| webStream.on('error', (err) => stream.emit('error', err)); | ||
| webStream.pipe(stream); | ||
| } | ||
| else { | ||
| const tempFile = await downloadVideoParallel(format.url, options.proxy, options.signal, (percent) => { | ||
| stream.emit('progress', percent); | ||
| }); | ||
| if (!tempFile) { | ||
| throw new Error('Download failed, no file returned.'); | ||
| } | ||
| const readStream = createReadStream(tempFile); | ||
| readStream.on('error', (err) => { | ||
| stream.emit('error', err); | ||
| fs.unlink(tempFile).catch(() => { }); | ||
| }); | ||
| readStream.on('end', () => { | ||
| fs.unlink(tempFile).catch(() => { }); | ||
| }); | ||
| readStream.pipe(stream); | ||
| } | ||
| } | ||
| catch (err) { | ||
| stream.emit('error', err); | ||
| } | ||
| })(); | ||
| return stream; | ||
| } | ||
| untube.getVideoInfo = getVideoInfo; | ||
| untube.RawCookie = RawCookie; | ||
| untube.filterFormats = filterFormats; | ||
| untube.sortFormats = sortFormats; | ||
| untube.chooseFormat = chooseFormat; | ||
| export { getVideoInfo, RawCookie, filterFormats, sortFormats, chooseFormat }; | ||
| export default untube; | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,EAAE,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,GAAG,MAAM,oBAAoB,CAAA;AACpC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AA+D1C,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,UAA+B,EAAE;IAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,eAAe,CAAA;IACtD,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,CAAA;IAC1C,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;IAEf,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAE5E,MAAM,QAAQ,GAAG,mCAAmC,OAAO,EAAE,CAAA;IAC7D,MAAM,OAAO,GAA2B;QACpC,YAAY,EAAE,iHAAiH;QAC/H,iBAAiB,EAAE,gBAAgB;QACnC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE;KAC/C,CAAA;IAED,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,UAAU,EAAS,CAAC,CAAA;IACrE,MAAM,QAAQ,GAAG,MAAO,OAAe,CAAC,IAAI,EAAE,CAAA;IAE9C,MAAM,UAAU,GAAI,OAAO,CAAC,OAAe,CAAC,YAAY,EAAE,CAAA;IAC1D,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;QACzE,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAClE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;IAE9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAA;IACtC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;IAErB,IAAI,qBAAqB,GAAQ,EAAE,CAAA;IACnC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAA;IACrF,IAAI,kBAAkB,EAAE,CAAC;QACrB,IAAI,CAAC;YACD,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAE,CAAC,CAAA;QAC9D,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,kDAAkD,MAAM,oBAAoB,CAAA;IAC3F,MAAM,UAAU,GAAG,SAAS,CAAA;IAC5B,MAAM,aAAa,GAAG,YAAY,CAAA;IAElC,MAAM,OAAO,GAAG;QACZ,OAAO,EAAE;YACL,MAAM,EAAE;gBACJ,UAAU;gBACV,aAAa;gBACb,SAAS,EAAE,oDAAoD;gBAC/D,EAAE,EAAE,IAAI;gBACR,EAAE,EAAE,IAAI;aACX;SACJ;QACD,OAAO;QACP,eAAe,EAAE;YACb,sBAAsB,EAAE;gBACpB,eAAe,EAAE,kBAAkB;gBACnC,kBAAkB,EAAE,GAAG;aAC1B;SACJ;KACJ,CAAA;IAED,MAAM,UAAU,GAA2B;QACvC,YAAY,EAAE,oDAAoD;QAClE,cAAc,EAAE,kBAAkB;QAClC,uBAAuB,EAAE,GAAG;QAC5B,0BAA0B,EAAE,aAAa;QACzC,QAAQ,EAAE,yBAAyB;QACnC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE;KAC7C,CAAA;IAED,MAAM,aAAa,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAA;IACzF,IAAI,aAAa,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,IAAI,aAAa,CAAC,KAAK,0BAA0B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1H,UAAU,CAAC,aAAa,GAAG,eAAe,SAAS,IAAI,IAAI,EAAE,CAAA;IACjE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;QAC/B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7B,UAAU;KACN,CAAC,CAAA;IAET,MAAM,aAAa,GAAI,MAAM,CAAC,OAAe,CAAC,YAAY,EAAE,CAAA;IAC5D,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,aAAa,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QAC1E,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,IAAI,GAAQ,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;IAErC,IAAI,uBAAuB,GAAQ,IAAI,CAAA;IACvC,MAAM,qBAAqB,GAAG,KAAK,IAAI,EAAE;QACrC,IAAI,uBAAuB;YAAE,OAAO,uBAAuB,CAAA;QAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,0BAA0B,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,2EAA2E,CAAA;QACrK,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,UAAU,EAAS,CAAC,CAAA;QACzD,MAAM,MAAM,GAAG,MAAO,GAAW,CAAC,IAAI,EAAE,CAAA;QAExC,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAA;QACzF,MAAM,MAAM,GAAQ,GAAG,CAAC,KAAK,CAAC,CAAA;QAE9B,uBAAuB,GAAG,MAAM,CAAC,mBAAmB,CAAA;QACpD,OAAO,uBAAuB,CAAA;IAClC,CAAC,CAAA;IAED,MAAM,UAAU,GAAU;QACtB,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,IAAI,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,IAAI,EAAE,CAAC;KACjD,CAAA;IAED,MAAM,aAAa,GAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAa,EAAE,CAAA;IAEhC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;YAChE,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,CAAC;gBAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAE5B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACvC,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACjC,IAAI,CAAC;oBAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC9B,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACjC,IAAI,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9B,CAAC;IACL,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,EAAE,CAAA;QACxD,MAAM,QAAQ,GAAU,EAAE,CAAA;QAC1B,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAA;QACrG,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAA;QAE/F,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAA;QACzF,MAAM,MAAM,GAAQ,GAAG,CAAC,KAAK,CAAC,CAAA;QAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;QAC5I,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;QAExI,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBACzB,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;gBAChE,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBACvC,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAA;gBAC1C,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAE/B,IAAI,OAAO,EAAE,CAAC;oBACV,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;oBAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;oBAEjC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;wBAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;oBACvD,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;wBAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;oBAEpD,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;gBAC7B,CAAC;gBACD,OAAO,MAAM,CAAC,eAAe,CAAA;YACjC,CAAC;iBAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACjC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChB,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;oBACjC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;gBAC7B,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,CAAC,qBAAqB,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAA;IACnG,IAAI,CAAC,WAAW,GAAG,qBAAqB,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAA;IAExE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,SAAS,cAAc,CAAC,IAAS;IAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,yBAAyB,IAAI,EAAE,CAAA;IAC5D,MAAM,OAAO,GAAoB,EAAE,CAAA;IAEnC,MAAM,SAAS,GAAG,CAAC,CAAM,EAAiB,EAAE;QACxC,IAAI,MAAM,GAAG,MAAM,CAAA;QACnB,IAAI,MAAM,GAAG,MAAM,CAAA;QAEnB,IAAI,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACzE,IAAI,GAAG,KAAK,OAAO;YAAE,GAAG,GAAG,KAAK,CAAA;QAChC,IAAI,GAAG,KAAK,mBAAmB;YAAE,GAAG,GAAG,KAAK,CAAA;QAE5C,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;YAChD,IAAI,KAAK,EAAE,CAAC;gBACR,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC/D,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAClC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;gBACtB,CAAC;qBAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;oBAClB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACpB,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;oBACtB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,SAAS,GAAG,GAAG,CAAA;QACnB,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS,GAAG,KAAK,CAAA;aAC7C,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS,GAAG,MAAM,CAAA;aACpD,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS,GAAG,KAAK,CAAA;aACnD,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS,GAAG,KAAK,CAAA;QAEzD,IAAI,UAAU,GAAG,YAAY,CAAA;QAC7B,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACtB,UAAU,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;QACzC,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAClB,UAAU,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAA;QAC/B,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACjB,UAAU,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,CAAA;QAC9B,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,UAAU,EAAE,CAAA;QAE7F,OAAO;YACH,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YACtE,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YACvE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;YAC1C,WAAW,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE;YAC9C,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI;YAClB,cAAc,EAAE,CAAC,CAAC,aAAa,IAAI,IAAI;YACvC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;YACxB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;YACtB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI;YAC5C,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YACpD,GAAG;YACH,MAAM;YACN,MAAM;YACN,SAAS;YACT,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YACvD,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;YAC/E,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;YAC3C,GAAG,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YAClE,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YACzF,UAAU;YACV,MAAM;SACT,CAAA;IACL,CAAC,CAAA;IAED,IAAI,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;IAC9D,CAAC;IACD,IAAI,IAAI,CAAC,aAAa,EAAE,eAAe,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,aAAa,IAAI,GAAG,EAAE,EAAE,CAAC,CAAA;IACjF,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,IAAI,GAAG,EAAE,EAAE,CAAC,CAAA;IAC3E,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,IAAI,KAAK,CAAA;IAExC,OAAO;QACH,EAAE,EAAE,EAAE,CAAC,OAAO;QACd,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU;QACvC,WAAW,EAAE,EAAE,CAAC,gBAAgB,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,IAAI,EAAE;QACpE,OAAO,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,gBAAgB;QACzC,QAAQ,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,gBAAgB;QAC1C,UAAU,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,iBAAiB;QAChD,WAAW,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,mCAAmC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI;QACpI,QAAQ;QACR,UAAU;QACV,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,IAAI,GAAG,CAAC,IAAI,IAAI;QAClE,SAAS,EAAE,CAAC,EAAE,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,KAAK,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvH,WAAW,EAAE,mCAAmC,EAAE,CAAC,OAAO,EAAE;QAC5D,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9C,iBAAiB,EAAE,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU;QACtE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;QAC5C,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7E,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE;QAC3J,UAAU,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,IAAI,EAAE;QACtE,OAAO;QACP,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,IAAI;KACvD,CAAA;AACL,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAA"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
+3
-2
| { | ||
| "name": "untube", | ||
| "version": "2.0.2", | ||
| "version": "2.1.0", | ||
| "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.", | ||
@@ -49,5 +49,6 @@ "keywords": [ | ||
| "dependencies": { | ||
| "p-limit": "^7.3.0", | ||
| "tough-cookie": "^6.0.1", | ||
| "undici": "^7.24.3" | ||
| } | ||
| } | ||
| } |
+130
-45
@@ -6,11 +6,4 @@ # untube | ||
| 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). | ||
| 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). | ||
| ## Features | ||
| - ✅ Fetch complete video metadata. | ||
| - ✅ HTTP/HTTPS Proxy support via `undici`. | ||
| - ✅ Automatic Cookie management (File or Remote DB). | ||
| - ✅ Full TypeScript support. | ||
| ## Installation | ||
@@ -22,31 +15,122 @@ | ||
| ## Usage | ||
| ## Quick Start (Downloading Videos) | ||
| `untube` provides a readable stream that you can pipe anywhere (e.g., to a file, to `fluent-ffmpeg`, or an HTTP response). | ||
| > **⚠️ Important Note on Video & Audio:** | ||
| > 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`. | ||
| ```typescript | ||
| import { getVideoInfo } from 'untube'; | ||
| import fs from 'node:fs'; | ||
| import untube from 'untube'; | ||
| async function main() { | ||
| try { | ||
| const info = await getVideoInfo('videoId', { | ||
| // Optional: Path to cookies file (Netscape format) or RawCookie object | ||
| cookie: './cookies.txt', | ||
| // Optional: Use proxy to avoid rate limits or blocks | ||
| proxy: 'http://user:pass@my-proxy.com:8080' | ||
| }); | ||
| // Setup AbortController to cancel download if needed | ||
| const controller = new AbortController(); | ||
| console.log('Title:', info.title); | ||
| console.log('Channel:', info.uploader); | ||
| // List available video & audio formats | ||
| info.formats.forEach(format => { | ||
| console.log(`[${format.format_id}] ${format.resolution} - ${format.url}`); | ||
| }); | ||
| } catch (error) { | ||
| console.error('Failed to fetch info:', error); | ||
| // Start downloading a video | ||
| const stream = untube('dQw4w9WgXcQ', { | ||
| format: 'highestvideo', // Select highest video quality (will likely be video-only) | ||
| signal: controller.signal, // Pass the abort signal | ||
| // cookie: './cookies.txt', // Optional: avoid age-restrictions | ||
| }); | ||
| // Optional: Listen to events | ||
| stream.on('info', (info, format) => { | ||
| console.log(`Downloading: ${info.title}`); | ||
| console.log(`Format: ${format.resolution} (${format.container})`); | ||
| // You can also access subtitles/captions | ||
| if (info.captions.length > 0) { | ||
| console.log(`Available Subtitles: ${info.captions.map(c => c.language).join(', ')}`); | ||
| } | ||
| } | ||
| }); | ||
| main(); | ||
| stream.on('progress', (progress) => { | ||
| const downloadedMb = (progress.downloadedBytes / 1024 / 1024).toFixed(2); | ||
| const totalMb = (progress.totalBytes / 1024 / 1024).toFixed(2); | ||
| console.log(`Progress: ${progress.percent}% (${downloadedMb}MB / ${totalMb}MB)`); | ||
| }); | ||
| stream.on('error', (err) => { | ||
| console.error(`Error: ${err.message}`); | ||
| }); | ||
| // Pipe the stream directly to a file | ||
| stream.pipe(fs.createWriteStream('video.mp4')); | ||
| // Example: Cancel download after 5 seconds | ||
| // setTimeout(() => controller.abort(), 5000); | ||
| ``` | ||
| --- | ||
| ## Configuration Options | ||
| When calling `untube(id, options)` or `untube.getVideoInfo(id, options)`, you can pass an options object. | ||
| ### `format` (Quality Selection) | ||
| You can easily pick the desired quality using preset strings or specific format IDs (`itag`): | ||
| - **Presets:** `'highest'` (default), `'lowest'`, `'highestaudio'`, `'lowestaudio'`, `'highestvideo'`, `'lowestvideo'`. | ||
| - **Resolutions:** `'1080p'`, `'720p'`, etc. | ||
| - **Format ID / itag:** Use specific itags like `'137'` (1080p video-only), `'140'` (m4a audio), or `'18'` (360p video+audio). | ||
| ```typescript | ||
| // Download exactly 1080p MP4 (Video only) | ||
| untube('videoId', { format: '137' }); | ||
| // Download the best audio available | ||
| untube('videoId', { format: 'highestaudio' }); | ||
| ``` | ||
| ### `mode` (Streaming Behavior) | ||
| By default, `untube` uses **parallel** downloading to bypass YouTube bandwidth throttling. | ||
| | Mode | Characteristics | Best for | | ||
| | :--- | :--- | :--- | | ||
| | `'parallel'` (Default) | Incredibly fast. Downloads chunks concurrently into a temp file and streams the result. Emits `progress` events. | Downloading files, massive scrapers. | | ||
| | `'sequential'` | Pure RAM streaming. Slower (throttled by YouTube). No temp files used. Start-up time is instant. | Real-time audio playback. | | ||
| ```typescript | ||
| // Use sequential mode for instant start-up time | ||
| const stream = untube('videoId', { format: 'highestaudio', mode: 'sequential' }); | ||
| ``` | ||
| --- | ||
| ## Fetching Metadata | ||
| If you only need the video details without downloading the stream, use `untube.getVideoInfo()`: | ||
| ```typescript | ||
| import untube from 'untube'; | ||
| const info = await untube.getVideoInfo('videoId'); | ||
| console.log('Title:', info.title); | ||
| console.log('Views:', info.view_count); | ||
| ``` | ||
| ### Format Utilities | ||
| `untube` includes powerful utility functions to help you manage and filter formats from the `info` object. | ||
| ```typescript | ||
| const info = await untube.getVideoInfo('videoId'); | ||
| // 1. Choose a specific format manually | ||
| const bestAudio = untube.chooseFormat(info.formats, { quality: 'highestaudio' }); | ||
| // 2. Filter formats custom logic | ||
| const mp4Only = untube.filterFormats(info.formats, format => format.container === 'mp4'); | ||
| // 3. Filter using presets ('video', 'audio', 'audioandvideo', 'videoonly', 'audioonly') | ||
| const videoNoSound = untube.filterFormats(info.formats, 'videoonly'); | ||
| // 4. Sort formats from highest to lowest quality | ||
| const sorted = untube.sortFormats(info.formats); | ||
| ``` | ||
| --- | ||
| ## Cookie Handling | ||
@@ -57,23 +141,24 @@ | ||
| ### 1. Using a File (Netscape format) | ||
| 1. Install a browser extension like **"Get cookies.txt LOCALLY"** (available on Chrome Web Store or Firefox Add-ons). | ||
| 2. Open YouTube and ensure you are logged in (optional, but recommended). | ||
| 3. Click on the extension and select **"Export as Netscape format"**. | ||
| 4. Save the file as `cookies.txt` in your project directory. | ||
| 5. Provide the file path in the `cookie` option. | ||
| 1. Install a browser extension like **"Get cookies.txt LOCALLY"** (Chrome/Firefox). | ||
| 2. Open YouTube and ensure you are logged in. | ||
| 3. Export the cookies in **Netscape format** and save it as `cookies.txt`. | ||
| 4. Provide the file path: | ||
| ### 2. Advanced: Remote Storage (Firebase, Database, etc.) | ||
| ```typescript | ||
| untube('videoId', { cookie: './cookies.txt' }); | ||
| ``` | ||
| ### 2. Advanced: Remote Storage (Database / Firebase) | ||
| If you want to store cookies in a remote database or as a string, use the `RawCookie` class: | ||
| ```typescript | ||
| import { getVideoInfo, RawCookie } from 'untube'; | ||
| import untube from 'untube'; | ||
| const myRawCookie = new RawCookie( | ||
| const myRawCookie = new untube.RawCookie( | ||
| async () => { | ||
| // Implement your own read logic (e.g., from Firebase Realtime DB) | ||
| const cookies = await fetchCookiesFromDB(); | ||
| return cookies; // Must return Netscape format string | ||
| // Implement read logic (e.g., fetch from DB) | ||
| return await fetchCookiesFromDB(); // Must return Netscape format string | ||
| }, | ||
| async (newCookies) => { | ||
| // Implement your own write logic | ||
| // This is called whenever YouTube sends new cookies | ||
| // Implement write logic (called when YouTube refreshes cookies) | ||
| await saveCookiesToDB(newCookies); | ||
@@ -83,5 +168,3 @@ } | ||
| const info = await getVideoInfo('videoId', { | ||
| cookie: myRawCookie | ||
| }); | ||
| untube('videoId', { cookie: myRawCookie }); | ||
| ``` | ||
@@ -91,2 +174,4 @@ | ||
| --- | ||
| ## Disclaimer | ||
@@ -93,0 +178,0 @@ |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
640131
4.92%23
53.33%3107
10.85%179
90.43%3
50%11
120%+ Added
+ Added
+ Added