@ekipnico/video-fetch 1.0.1 → 1.0.3
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.
|
@@ -7,6 +7,8 @@ export interface YtDlpProviderOptions {
|
|
|
7
7
|
cookiesPath?: string;
|
|
8
8
|
/** Browser to get cookies from (safari, chrome, firefox, etc.) */
|
|
9
9
|
cookiesFromBrowser?: string;
|
|
10
|
+
/** Proxy URL for yt-dlp requests */
|
|
11
|
+
proxyUrl?: string;
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
12
14
|
* yt-dlp based download provider.
|
|
@@ -15,22 +17,41 @@ export interface YtDlpProviderOptions {
|
|
|
15
17
|
* ## Environment Variables
|
|
16
18
|
* - `YTDLP_COOKIES_FROM_BROWSER`: Browser to get cookies from (safari, chrome, firefox)
|
|
17
19
|
* - `YTDLP_COOKIES_PATH`: Path to cookies.txt file
|
|
20
|
+
* - `YTDLP_PROXY`: Proxy URL for requests
|
|
18
21
|
*/
|
|
19
22
|
export declare class YtDlpProvider extends DownloadProvider {
|
|
20
23
|
readonly name = "yt-dlp";
|
|
21
24
|
private outputDir;
|
|
22
|
-
private
|
|
23
|
-
private
|
|
25
|
+
private optionsCookiesPath?;
|
|
26
|
+
private optionsCookiesFromBrowser?;
|
|
27
|
+
private optionsProxyUrl?;
|
|
24
28
|
constructor(options?: YtDlpProviderOptions);
|
|
29
|
+
/**
|
|
30
|
+
* Get cookies path - checks options first, then env var (dynamic).
|
|
31
|
+
*/
|
|
32
|
+
private get cookiesPath();
|
|
33
|
+
/**
|
|
34
|
+
* Get cookies from browser - checks options first, then env var (dynamic).
|
|
35
|
+
*/
|
|
36
|
+
private get cookiesFromBrowser();
|
|
37
|
+
/**
|
|
38
|
+
* Get proxy URL - checks options first, then env var (dynamic).
|
|
39
|
+
*/
|
|
40
|
+
private get proxyUrl();
|
|
25
41
|
/**
|
|
26
42
|
* Build cookies flag for yt-dlp commands.
|
|
27
43
|
*/
|
|
28
44
|
private getCookiesFlag;
|
|
45
|
+
/**
|
|
46
|
+
* Build proxy flag for yt-dlp commands.
|
|
47
|
+
*/
|
|
48
|
+
private getProxyFlag;
|
|
29
49
|
download(url: string, config: DownloadConfig): Promise<DownloadResult>;
|
|
30
50
|
extractMetadata(url: string): Promise<VideoMetadata>;
|
|
31
51
|
/**
|
|
32
52
|
* Get extractor-specific arguments to bypass restrictions.
|
|
33
|
-
* For YouTube,
|
|
53
|
+
* For YouTube, tries multiple player clients to avoid bot detection.
|
|
54
|
+
* Order matters: tries android first, then ios, then web as fallback.
|
|
34
55
|
*/
|
|
35
56
|
private getExtractorArgs;
|
|
36
57
|
isSupported(url: string): Promise<boolean>;
|
|
@@ -15,14 +15,35 @@ const execAsync = promisify(exec);
|
|
|
15
15
|
* ## Environment Variables
|
|
16
16
|
* - `YTDLP_COOKIES_FROM_BROWSER`: Browser to get cookies from (safari, chrome, firefox)
|
|
17
17
|
* - `YTDLP_COOKIES_PATH`: Path to cookies.txt file
|
|
18
|
+
* - `YTDLP_PROXY`: Proxy URL for requests
|
|
18
19
|
*/
|
|
19
20
|
export class YtDlpProvider extends DownloadProvider {
|
|
20
21
|
constructor(options) {
|
|
21
22
|
super();
|
|
22
23
|
this.name = 'yt-dlp';
|
|
23
24
|
this.outputDir = options?.outputDir || join(tmpdir(), 'video-download');
|
|
24
|
-
|
|
25
|
-
this.
|
|
25
|
+
// Store options but also check env vars dynamically in getters
|
|
26
|
+
this.optionsCookiesPath = options?.cookiesPath;
|
|
27
|
+
this.optionsCookiesFromBrowser = options?.cookiesFromBrowser;
|
|
28
|
+
this.optionsProxyUrl = options?.proxyUrl;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get cookies path - checks options first, then env var (dynamic).
|
|
32
|
+
*/
|
|
33
|
+
get cookiesPath() {
|
|
34
|
+
return this.optionsCookiesPath || process.env.YTDLP_COOKIES_PATH;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get cookies from browser - checks options first, then env var (dynamic).
|
|
38
|
+
*/
|
|
39
|
+
get cookiesFromBrowser() {
|
|
40
|
+
return this.optionsCookiesFromBrowser || process.env.YTDLP_COOKIES_FROM_BROWSER;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get proxy URL - checks options first, then env var (dynamic).
|
|
44
|
+
*/
|
|
45
|
+
get proxyUrl() {
|
|
46
|
+
return this.optionsProxyUrl || process.env.YTDLP_PROXY;
|
|
26
47
|
}
|
|
27
48
|
/**
|
|
28
49
|
* Build cookies flag for yt-dlp commands.
|
|
@@ -36,6 +57,15 @@ export class YtDlpProvider extends DownloadProvider {
|
|
|
36
57
|
}
|
|
37
58
|
return '';
|
|
38
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Build proxy flag for yt-dlp commands.
|
|
62
|
+
*/
|
|
63
|
+
getProxyFlag() {
|
|
64
|
+
if (this.proxyUrl) {
|
|
65
|
+
return `--proxy "${this.proxyUrl}"`;
|
|
66
|
+
}
|
|
67
|
+
return '';
|
|
68
|
+
}
|
|
39
69
|
async download(url, config) {
|
|
40
70
|
const mergedConfig = { ...DEFAULT_DOWNLOAD_CONFIG, ...config };
|
|
41
71
|
const outputDir = mergedConfig.outputDir || this.outputDir;
|
|
@@ -86,8 +116,9 @@ export class YtDlpProvider extends DownloadProvider {
|
|
|
86
116
|
}
|
|
87
117
|
async extractMetadata(url) {
|
|
88
118
|
const cookiesFlag = this.getCookiesFlag();
|
|
119
|
+
const proxyFlag = this.getProxyFlag();
|
|
89
120
|
const extractorArgs = this.getExtractorArgs(url);
|
|
90
|
-
const command = `yt-dlp ${cookiesFlag} ${extractorArgs} --dump-json --no-download "${url}"`;
|
|
121
|
+
const command = `yt-dlp ${cookiesFlag} ${proxyFlag} ${extractorArgs} --dump-json --no-download "${url}"`;
|
|
91
122
|
try {
|
|
92
123
|
const { stdout } = await execAsync(command, {
|
|
93
124
|
maxBuffer: 10 * 1024 * 1024,
|
|
@@ -101,11 +132,12 @@ export class YtDlpProvider extends DownloadProvider {
|
|
|
101
132
|
}
|
|
102
133
|
/**
|
|
103
134
|
* Get extractor-specific arguments to bypass restrictions.
|
|
104
|
-
* For YouTube,
|
|
135
|
+
* For YouTube, tries multiple player clients to avoid bot detection.
|
|
136
|
+
* Order matters: tries android first, then ios, then web as fallback.
|
|
105
137
|
*/
|
|
106
138
|
getExtractorArgs(url) {
|
|
107
139
|
if (url.includes('youtube.com') || url.includes('youtu.be')) {
|
|
108
|
-
return '--extractor-args "youtube:player_client=ios,web"';
|
|
140
|
+
return '--extractor-args "youtube:player_client=android,ios,web"';
|
|
109
141
|
}
|
|
110
142
|
return '';
|
|
111
143
|
}
|
|
@@ -170,9 +202,13 @@ export class YtDlpProvider extends DownloadProvider {
|
|
|
170
202
|
else if (this.cookiesPath && existsSync(this.cookiesPath)) {
|
|
171
203
|
args.push('--cookies', `"${this.cookiesPath}"`);
|
|
172
204
|
}
|
|
173
|
-
//
|
|
205
|
+
// Proxy for requests
|
|
206
|
+
if (this.proxyUrl) {
|
|
207
|
+
args.push('--proxy', `"${this.proxyUrl}"`);
|
|
208
|
+
}
|
|
209
|
+
// YouTube-specific: try multiple player clients to bypass bot detection
|
|
174
210
|
if (url.includes('youtube.com') || url.includes('youtu.be')) {
|
|
175
|
-
args.push('--extractor-args', '"youtube:player_client=ios,web"');
|
|
211
|
+
args.push('--extractor-args', '"youtube:player_client=android,ios,web"');
|
|
176
212
|
}
|
|
177
213
|
// Format selection (quote format string to handle shell metacharacters like < and >)
|
|
178
214
|
if (config.audioOnly) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YtDlpProvider.js","sourceRoot":"","sources":["../../src/providers/YtDlpProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAkB,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"YtDlpProvider.js","sourceRoot":"","sources":["../../src/providers/YtDlpProvider.ts"],"names":[],"mappings":"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"}
|