@ooneex/youtube 0.0.13 → 0.0.15
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/dist/index.js +2 -119
- package/dist/index.js.map +2 -2
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,121 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
|
|
3
|
-
import { YtDlp } from "ytdlp-nodejs";
|
|
2
|
+
import{YtDlp as B}from"ytdlp-nodejs";import{Exception as z}from"@ooneex/exception";import{HttpStatus as A}from"@ooneex/http-status";class q extends z{constructor(S,C={}){super(S,{status:A.Code.InternalServerError,data:C});this.name="YoutubeException"}}class F{ytdlp;constructor(S={}){let C=S.binaryPath||Bun.env.YOUTUBE_YTDLP_PATH,H=S.ffmpegPath||Bun.env.YOUTUBE_FFMPEG_PATH;if(!C)throw new q("yt-dlp binary path is required. Please provide it through the constructor options or set the YOUTUBE_YTDLP_PATH environment variable.");if(!H)throw new q("ffmpeg binary path is required. Please provide it through the constructor options or set the YOUTUBE_FFMPEG_PATH environment variable.");this.ytdlp=new B({binaryPath:C,ffmpegPath:H})}async getVideoInfo(S){try{return await this.ytdlp.getInfoAsync(S)}catch(C){throw new q(`Failed to get video info: ${C.message}`,{data:{url:S}})}}async getPlaylistInfo(S){try{return await this.ytdlp.getInfoAsync(S)}catch(C){throw new q(`Failed to get playlist info: ${C.message}`,{data:{url:S}})}}async download(S,C){try{return await this.ytdlp.downloadAsync(this.getWatchId(S)||"",{format:{filter:"audioandvideo",type:"mp4"},output:C})}catch(H){throw new q(`Failed to download video: ${H.message}`,{data:{url:S}})}}async downloadAudio(S,C){try{return await this.ytdlp.downloadAsync(this.getWatchId(S)||"",{format:{filter:"audioonly",type:"mp3"},output:C})}catch(H){throw new q(`Failed to download audio: ${H.message}`,{data:{url:S}})}}async getFile(S,C){try{let H=C?{filename:C.filename,format:C.format}:void 0;return await this.ytdlp.getFileAsync(this.getWatchId(S)||"",H)}catch(H){throw new q(`Failed to get file: ${H.message}`,{data:{url:S}})}}getWatchId(S){let C=[/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/v\/|youtube\.com\/watch\?.*&v=)([^&\n?#]+)/,/youtube\.com\/shorts\/([^&\n?#]+)/];for(let H of C){let x=S.match(H);if(x?.[1])return x[1]}return null}getEmbedUrl(S){let C=this.getWatchId(S)??S;if(!/^[\w-]{10,12}$/.test(C))return null;return`https://www.youtube.com/embed/${C}`}getWatchUrl(S){let C=this.getWatchId(S)??S;if(!/^[\w-]{10,12}$/.test(C))return null;return`https://www.youtube.com/watch?v=${C}`}}export{q as YoutubeException,F as Youtube};
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
import { Exception } from "@ooneex/exception";
|
|
7
|
-
import { HttpStatus } from "@ooneex/http-status";
|
|
8
|
-
|
|
9
|
-
class YoutubeException extends Exception {
|
|
10
|
-
constructor(message, data = {}) {
|
|
11
|
-
super(message, {
|
|
12
|
-
status: HttpStatus.Code.InternalServerError,
|
|
13
|
-
data
|
|
14
|
-
});
|
|
15
|
-
this.name = "YoutubeException";
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// src/Youtube.ts
|
|
20
|
-
class Youtube {
|
|
21
|
-
ytdlp;
|
|
22
|
-
constructor(options = {}) {
|
|
23
|
-
const binaryPath = options.binaryPath || Bun.env.YOUTUBE_YTDLP_PATH;
|
|
24
|
-
const ffmpegPath = options.ffmpegPath || Bun.env.YOUTUBE_FFMPEG_PATH;
|
|
25
|
-
if (!binaryPath) {
|
|
26
|
-
throw new YoutubeException("yt-dlp binary path is required. Please provide it through the constructor options or set the YOUTUBE_YTDLP_PATH environment variable.");
|
|
27
|
-
}
|
|
28
|
-
if (!ffmpegPath) {
|
|
29
|
-
throw new YoutubeException("ffmpeg binary path is required. Please provide it through the constructor options or set the YOUTUBE_FFMPEG_PATH environment variable.");
|
|
30
|
-
}
|
|
31
|
-
this.ytdlp = new YtDlp({
|
|
32
|
-
binaryPath,
|
|
33
|
-
ffmpegPath
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
async getVideoInfo(url) {
|
|
37
|
-
try {
|
|
38
|
-
return await this.ytdlp.getInfoAsync(url);
|
|
39
|
-
} catch (error) {
|
|
40
|
-
throw new YoutubeException(`Failed to get video info: ${error.message}`, {
|
|
41
|
-
data: { url }
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
async getPlaylistInfo(url) {
|
|
46
|
-
try {
|
|
47
|
-
return await this.ytdlp.getInfoAsync(url);
|
|
48
|
-
} catch (error) {
|
|
49
|
-
throw new YoutubeException(`Failed to get playlist info: ${error.message}`, {
|
|
50
|
-
data: { url }
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async download(url, destination) {
|
|
55
|
-
try {
|
|
56
|
-
return await this.ytdlp.downloadAsync(this.getWatchId(url) || "", {
|
|
57
|
-
format: { filter: "audioandvideo", type: "mp4" },
|
|
58
|
-
output: destination
|
|
59
|
-
});
|
|
60
|
-
} catch (error) {
|
|
61
|
-
throw new YoutubeException(`Failed to download video: ${error.message}`, {
|
|
62
|
-
data: { url }
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async downloadAudio(url, destination) {
|
|
67
|
-
try {
|
|
68
|
-
return await this.ytdlp.downloadAsync(this.getWatchId(url) || "", {
|
|
69
|
-
format: { filter: "audioonly", type: "mp3" },
|
|
70
|
-
output: destination
|
|
71
|
-
});
|
|
72
|
-
} catch (error) {
|
|
73
|
-
throw new YoutubeException(`Failed to download audio: ${error.message}`, {
|
|
74
|
-
data: { url }
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
async getFile(url, options) {
|
|
79
|
-
try {
|
|
80
|
-
const fileOptions = options ? { filename: options.filename, format: options.format } : undefined;
|
|
81
|
-
return await this.ytdlp.getFileAsync(this.getWatchId(url) || "", fileOptions);
|
|
82
|
-
} catch (error) {
|
|
83
|
-
throw new YoutubeException(`Failed to get file: ${error.message}`, {
|
|
84
|
-
data: { url }
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
getWatchId(url) {
|
|
89
|
-
const patterns = [
|
|
90
|
-
/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/v\/|youtube\.com\/watch\?.*&v=)([^&\n?#]+)/,
|
|
91
|
-
/youtube\.com\/shorts\/([^&\n?#]+)/
|
|
92
|
-
];
|
|
93
|
-
for (const pattern of patterns) {
|
|
94
|
-
const match = url.match(pattern);
|
|
95
|
-
if (match?.[1]) {
|
|
96
|
-
return match[1];
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
getEmbedUrl(urlOrId) {
|
|
102
|
-
const videoId = this.getWatchId(urlOrId) ?? urlOrId;
|
|
103
|
-
if (!/^[\w-]{10,12}$/.test(videoId)) {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
return `https://www.youtube.com/embed/${videoId}`;
|
|
107
|
-
}
|
|
108
|
-
getWatchUrl(urlOrId) {
|
|
109
|
-
const videoId = this.getWatchId(urlOrId) ?? urlOrId;
|
|
110
|
-
if (!/^[\w-]{10,12}$/.test(videoId)) {
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
return `https://www.youtube.com/watch?v=${videoId}`;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
export {
|
|
117
|
-
YoutubeException,
|
|
118
|
-
Youtube
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
//# debugId=CC377038C13D947D64756E2164756E21
|
|
4
|
+
//# debugId=D8DC7E8F8C92550864756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"import { YtDlp } from \"ytdlp-nodejs\";\nimport type {\n IYoutube,\n YoutubeFormatKeyWordType,\n YoutubeFormatOptionsType,\n YoutubeOptionsType,\n YoutubePlaylistInfoType,\n YoutubeVideoInfoType,\n} from \"./types\";\nimport { YoutubeException } from \"./YoutubeException\";\n\n/**\n * YouTube client for downloading and extracting information from YouTube videos and playlists.\n * Wraps yt-dlp functionality with a clean async API and proper error handling.\n *\n * @example Basic Usage\n * ```typescript\n * import { Youtube } from \"@ooneex/youtube\";\n *\n * const youtube = new Youtube();\n *\n * // Get video information\n * const info = await youtube.getVideoInfo(\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\");\n * console.log(info.title, info.duration);\n *\n * // Download a video\n * const filePath = await youtube.download(\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\");\n * console.log(`Downloaded to: ${filePath}`);\n * ```\n *\n * @example Download with Quality Options\n * ```typescript\n * const youtube = new Youtube();\n *\n * // Download video in 1080p\n * const path = await youtube.download(url, {\n * format: { video: \"1080p\" },\n * });\n *\n * // Download audio only\n * const audioPath = await youtube.download(url, {\n * format: { audio: \"highest\" },\n * });\n * ```\n */\nexport class Youtube implements IYoutube {\n private readonly ytdlp: YtDlp;\n\n /**\n * Creates a new YouTube client instance.\n *\n * @param options - Optional configuration for binary paths\n * @throws {YoutubeException} If required binary paths are not configured\n *\n * @example\n * ```typescript\n * const youtube = new Youtube();\n * ```\n *\n * @example With Custom Paths\n * ```typescript\n * const youtube = new Youtube({\n * binaryPath: \"/custom/path/to/yt-dlp\",\n * ffmpegPath: \"/custom/path/to/ffmpeg\",\n * });\n * ```\n */\n constructor(options: YoutubeOptionsType = {}) {\n const binaryPath = options.binaryPath || Bun.env.YOUTUBE_YTDLP_PATH;\n const ffmpegPath = options.ffmpegPath || Bun.env.YOUTUBE_FFMPEG_PATH;\n\n if (!binaryPath) {\n throw new YoutubeException(\n \"yt-dlp binary path is required. Please provide it through the constructor options or set the YOUTUBE_YTDLP_PATH environment variable.\",\n );\n }\n\n if (!ffmpegPath) {\n throw new YoutubeException(\n \"ffmpeg binary path is required. Please provide it through the constructor options or set the YOUTUBE_FFMPEG_PATH environment variable.\",\n );\n }\n\n this.ytdlp = new YtDlp({\n binaryPath,\n ffmpegPath,\n });\n }\n\n /**\n * Retrieves detailed metadata for a YouTube video.\n *\n * @param url - The YouTube video URL\n * @returns Promise resolving to video information including title, description,\n * duration, view count, available formats, and more\n * @throws {YoutubeException} If the video cannot be accessed or URL is invalid\n *\n * @example\n * ```typescript\n * const youtube = new Youtube();\n * const info = await youtube.getVideoInfo(\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\");\n *\n * console.log(\"Title:\", info.title);\n * console.log(\"Duration:\", info.duration, \"seconds\");\n * console.log(\"Views:\", info.view_count);\n * console.log(\"Description:\", info.description);\n * console.log(\"Available formats:\", info.formats.length);\n * ```\n */\n public async getVideoInfo(url: string): Promise<YoutubeVideoInfoType> {\n try {\n return await this.ytdlp.getInfoAsync<\"video\">(url);\n } catch (error) {\n throw new YoutubeException(`Failed to get video info: ${(error as Error).message}`, {\n data: { url },\n });\n }\n }\n\n /**\n * Retrieves information about a YouTube playlist including all videos.\n *\n * @param url - The YouTube playlist URL\n * @returns Promise resolving to playlist metadata and video entries\n * @throws {YoutubeException} If the playlist cannot be accessed or URL is invalid\n *\n * @example\n * ```typescript\n * const youtube = new Youtube();\n * const playlist = await youtube.getPlaylistInfo(\n * \"https://www.youtube.com/playlist?list=PLrAXtmErZgOeiKm4sgNOknGvNjby9efdf\"\n * );\n *\n * console.log(\"Playlist:\", playlist.title);\n * console.log(\"Video count:\", playlist.entries.length);\n *\n * // Iterate over videos in the playlist\n * for (const video of playlist.entries) {\n * console.log(`- ${video.title} (${video.duration}s)`);\n * }\n * ```\n */\n public async getPlaylistInfo(url: string): Promise<YoutubePlaylistInfoType> {\n try {\n return await this.ytdlp.getInfoAsync<\"playlist\">(url);\n } catch (error) {\n throw new YoutubeException(`Failed to get playlist info: ${(error as Error).message}`, {\n data: { url },\n });\n }\n }\n\n /**\n * Downloads a video to the local filesystem.\n *\n * @typeParam F - The format keyword type (video, audio, or videoandaudio)\n * @param url - The YouTube video URL\n * @param options - Optional format and quality settings\n * @returns Promise resolving to the path of the downloaded file\n * @throws {YoutubeException} If download fails\n *\n * @example Download with Default Settings\n * ```typescript\n * const youtube = new Youtube();\n * const filePath = await youtube.download(\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\");\n * console.log(\"Downloaded to:\", filePath);\n * ```\n *\n * @example Download with Specific Quality\n * ```typescript\n * const youtube = new Youtube();\n *\n * // Download 1080p video\n * const videoPath = await youtube.download(url, {\n * format: { video: \"1080p\" },\n * });\n *\n * // Download 720p video with audio\n * const hdPath = await youtube.download(url, {\n * format: { videoandaudio: \"720p\" },\n * });\n * ```\n *\n * @example Download Audio Only\n * ```typescript\n * const youtube = new Youtube();\n * const audioPath = await youtube.download(url, {\n * format: { audio: \"highest\" },\n * });\n * ```\n */\n public async download(url: string, destination: string): Promise<string> {\n try {\n return await this.ytdlp.downloadAsync(this.getWatchId(url) || \"\", {\n format: { filter: \"audioandvideo\", type: \"mp4\" },\n output: destination,\n });\n } catch (error) {\n throw new YoutubeException(`Failed to download video: ${(error as Error).message}`, {\n data: { url },\n });\n }\n }\n\n /**\n * Downloads only the audio from a YouTube video.\n * Convenience method that wraps download with audio-only format settings.\n *\n * @param url - The YouTube video URL\n * @param quality - Audio quality preference (defaults to \"highest\")\n * @returns Promise resolving to the path of the downloaded audio file\n * @throws {YoutubeException} If download fails\n *\n * @example Basic Usage\n * ```typescript\n * const youtube = new Youtube();\n * const audioPath = await youtube.downloadAudio(\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\");\n * console.log(\"Audio downloaded to:\", audioPath);\n * ```\n *\n * @example With Quality Option\n * ```typescript\n * const youtube = new Youtube();\n *\n * // Download highest quality audio\n * const hqPath = await youtube.downloadAudio(url, \"highest\");\n *\n * // Download lowest quality (smaller file)\n * const lqPath = await youtube.downloadAudio(url, \"lowest\");\n * ```\n */\n public async downloadAudio(url: string, destination: string): Promise<string> {\n try {\n return await this.ytdlp.downloadAsync(this.getWatchId(url) || \"\", {\n format: { filter: \"audioonly\", type: \"mp3\" },\n output: destination,\n });\n } catch (error) {\n throw new YoutubeException(`Failed to download audio: ${(error as Error).message}`, {\n data: { url },\n });\n }\n }\n\n /**\n * Downloads a video and returns it as a File object.\n * Useful for in-memory processing or streaming without saving to disk.\n *\n * @typeParam F - The format keyword type (video, audio, or videoandaudio)\n * @param url - The YouTube video URL\n * @param options - Optional filename and format settings\n * @returns Promise resolving to a File object containing the video data\n * @throws {YoutubeException} If download fails\n *\n * @example Basic Usage\n * ```typescript\n * const youtube = new Youtube();\n * const file = await youtube.getFile(\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\");\n *\n * console.log(\"File name:\", file.name);\n * console.log(\"File size:\", file.size, \"bytes\");\n * console.log(\"MIME type:\", file.type);\n * ```\n *\n * @example With Custom Filename\n * ```typescript\n * const youtube = new Youtube();\n * const file = await youtube.getFile(url, {\n * filename: \"my-video.mp4\",\n * });\n * ```\n *\n * @example With Format Options\n * ```typescript\n * const youtube = new Youtube();\n * const audioFile = await youtube.getFile(url, {\n * filename: \"audio.mp3\",\n * format: { audio: \"highest\" },\n * });\n * ```\n */\n public async getFile<F extends YoutubeFormatKeyWordType>(\n url: string,\n options?: { filename?: string; format?: YoutubeFormatOptionsType<F>[\"format\"] | undefined },\n ): Promise<File> {\n try {\n const fileOptions = options ? { filename: options.filename, format: options.format } : undefined;\n return await this.ytdlp.getFileAsync(\n this.getWatchId(url) || \"\",\n fileOptions as Parameters<typeof this.ytdlp.getFileAsync<F>>[1],\n );\n } catch (error) {\n throw new YoutubeException(`Failed to get file: ${(error as Error).message}`, {\n data: { url },\n });\n }\n }\n\n public getWatchId(url: string): string | null {\n const patterns = [\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/|youtube\\.com\\/v\\/|youtube\\.com\\/watch\\?.*&v=)([^&\\n?#]+)/,\n /youtube\\.com\\/shorts\\/([^&\\n?#]+)/,\n ];\n\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match?.[1]) {\n return match[1];\n }\n }\n\n return null;\n }\n\n public getEmbedUrl(urlOrId: string): string | null {\n const videoId = this.getWatchId(urlOrId) ?? urlOrId;\n\n // Validate that it looks like a YouTube video ID (typically 11 characters, alphanumeric with - and _)\n if (!/^[\\w-]{10,12}$/.test(videoId)) {\n return null;\n }\n\n return `https://www.youtube.com/embed/${videoId}`;\n }\n\n public getWatchUrl(urlOrId: string): string | null {\n const videoId = this.getWatchId(urlOrId) ?? urlOrId;\n\n // Validate that it looks like a YouTube video ID (typically 11 characters, alphanumeric with - and _)\n if (!/^[\\w-]{10,12}$/.test(videoId)) {\n return null;\n }\n\n return `https://www.youtube.com/watch?v=${videoId}`;\n }\n}\n",
|
|
6
6
|
"import { Exception } from \"@ooneex/exception\";\nimport { HttpStatus } from \"@ooneex/http-status\";\n\nexport class YoutubeException extends Exception {\n constructor(message: string, data: Record<string, unknown> = {}) {\n super(message, {\n status: HttpStatus.Code.InternalServerError,\n data,\n });\n this.name = \"YoutubeException\";\n }\n}\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": ";AAAA,gBAAS,qBCAT,oBAAS,0BACT,qBAAS,4BAEF,MAAM,UAAyB,CAAU,CAC9C,WAAW,CAAC,EAAiB,EAAgC,CAAC,EAAG,CAC/D,MAAM,EAAS,CACb,OAAQ,EAAW,KAAK,oBACxB,MACF,CAAC,EACD,KAAK,KAAO,mBAEhB,CDkCO,MAAM,CAA4B,CACtB,MAqBjB,WAAW,CAAC,EAA8B,CAAC,EAAG,CAC5C,IAAM,EAAa,EAAQ,YAAc,IAAI,IAAI,mBAC3C,EAAa,EAAQ,YAAc,IAAI,IAAI,oBAEjD,GAAI,CAAC,EACH,MAAM,IAAI,EACR,uIACF,EAGF,GAAI,CAAC,EACH,MAAM,IAAI,EACR,wIACF,EAGF,KAAK,MAAQ,IAAI,EAAM,CACrB,aACA,YACF,CAAC,OAuBU,aAAY,CAAC,EAA4C,CACpE,GAAI,CACF,OAAO,MAAM,KAAK,MAAM,aAAsB,CAAG,EACjD,MAAO,EAAO,CACd,MAAM,IAAI,EAAiB,6BAA8B,EAAgB,UAAW,CAClF,KAAM,CAAE,KAAI,CACd,CAAC,QA2BQ,gBAAe,CAAC,EAA+C,CAC1E,GAAI,CACF,OAAO,MAAM,KAAK,MAAM,aAAyB,CAAG,EACpD,MAAO,EAAO,CACd,MAAM,IAAI,EAAiB,gCAAiC,EAAgB,UAAW,CACrF,KAAM,CAAE,KAAI,CACd,CAAC,QA2CQ,SAAQ,CAAC,EAAa,EAAsC,CACvE,GAAI,CACF,OAAO,MAAM,KAAK,MAAM,cAAc,KAAK,WAAW,CAAG,GAAK,GAAI,CAChE,OAAQ,CAAE,OAAQ,gBAAiB,KAAM,KAAM,EAC/C,OAAQ,CACV,CAAC,EACD,MAAO,EAAO,CACd,MAAM,IAAI,EAAiB,6BAA8B,EAAgB,UAAW,CAClF,KAAM,CAAE,KAAI,CACd,CAAC,QA+BQ,cAAa,CAAC,EAAa,EAAsC,CAC5E,GAAI,CACF,OAAO,MAAM,KAAK,MAAM,cAAc,KAAK,WAAW,CAAG,GAAK,GAAI,CAChE,OAAQ,CAAE,OAAQ,YAAa,KAAM,KAAM,EAC3C,OAAQ,CACV,CAAC,EACD,MAAO,EAAO,CACd,MAAM,IAAI,EAAiB,6BAA8B,EAAgB,UAAW,CAClF,KAAM,CAAE,KAAI,CACd,CAAC,QAyCQ,QAA2C,CACtD,EACA,EACe,CACf,GAAI,CACF,IAAM,EAAc,EAAU,CAAE,SAAU,EAAQ,SAAU,OAAQ,EAAQ,MAAO,EAAI,OACvF,OAAO,MAAM,KAAK,MAAM,aACtB,KAAK,WAAW,CAAG,GAAK,GACxB,CACF,EACA,MAAO,EAAO,CACd,MAAM,IAAI,EAAiB,uBAAwB,EAAgB,UAAW,CAC5E,KAAM,CAAE,KAAI,CACd,CAAC,GAIE,UAAU,CAAC,EAA4B,CAC5C,IAAM,EAAW,CACf,wHACA,mCACF,EAEA,QAAW,KAAW,EAAU,CAC9B,IAAM,EAAQ,EAAI,MAAM,CAAO,EAC/B,GAAI,IAAQ,GACV,OAAO,EAAM,GAIjB,OAAO,KAGF,WAAW,CAAC,EAAgC,CACjD,IAAM,EAAU,KAAK,WAAW,CAAO,GAAK,EAG5C,GAAI,CAAC,iBAAiB,KAAK,CAAO,EAChC,OAAO,KAGT,MAAO,iCAAiC,IAGnC,WAAW,CAAC,EAAgC,CACjD,IAAM,EAAU,KAAK,WAAW,CAAO,GAAK,EAG5C,GAAI,CAAC,iBAAiB,KAAK,CAAO,EAChC,OAAO,KAGT,MAAO,mCAAmC,IAE9C",
|
|
9
|
+
"debugId": "D8DC7E8F8C92550864756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ooneex/youtube",
|
|
3
3
|
"description": "A YouTube video downloader and utility library",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.15",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"npm:publish": "bun publish --tolerate-republish --access public"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@ooneex/exception": "0.0.
|
|
32
|
-
"@ooneex/http-status": "0.0.
|
|
31
|
+
"@ooneex/exception": "0.0.13",
|
|
32
|
+
"@ooneex/http-status": "0.0.13",
|
|
33
33
|
"ytdlp-nodejs": "^2.3.5"
|
|
34
34
|
},
|
|
35
35
|
"keywords": [
|