You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
"429": "YouTube rate limit exceeded. Try again later or use different yt-dlp arguments like '--sleep-requests 1' to slow down requests.",
157
+
"Too Many Requests": "YouTube rate limit exceeded. Try again later or use different yt-dlp arguments like '--sleep-requests 1' to slow down requests.",
158
+
"Sign in to confirm you're not a bot": "YouTube requires authentication (bot detection). Use --yt-dlp-args='--cookies-from-browser BROWSER' where BROWSER is chrome, firefox, brave, etc.",
159
+
"Use --cookies-from-browser": "YouTube requires authentication (bot detection). Use --yt-dlp-args='--cookies-from-browser BROWSER' where BROWSER is chrome, firefox, brave, etc.",
160
+
}
161
+
162
+
forkey, message:=rangeerrorMessages {
163
+
ifstrings.Contains(curLine, key) {
164
+
returnfmt.Errorf("%s", message)
165
+
}
166
+
}
167
+
}
168
+
iferr:=scanner.Err(); err!=nil {
169
+
returnfmt.Errorf("Error reading yt-dlp stderr")
170
+
}
171
+
returnnil
172
+
}
173
+
174
+
funcnoLangs(args []string) []string {
175
+
var (
176
+
iint
177
+
vstring
178
+
)
179
+
fori, v=rangeargs {
180
+
ifstrings.Contains(v, "--sub-langs") {
181
+
break
182
+
}
183
+
}
184
+
ifi==0||i==len(args)-1 {
185
+
returnargs
186
+
}
187
+
returnappend(args[0:i], args[i+2:]...)
188
+
}
189
+
146
190
// tryMethodYtDlpInternal is a helper function to reduce duplication between
147
191
// tryMethodYtDlp and tryMethodYtDlpWithTimestamps.
@@ -168,20 +212,18 @@ func (o *YouTube) tryMethodYtDlpInternal(videoId string, language string, additi
168
212
"--write-auto-subs",
169
213
"--skip-download",
170
214
"--sub-format", "vtt",
171
-
"--quiet",
172
-
"--no-warnings",
173
215
"-o", outputPath,
174
216
}
175
217
176
218
args:=append([]string{}, baseArgs...)
177
219
178
220
// Add built-in language selection first
179
221
iflanguage!="" {
180
-
langMatch:=language
181
-
iflen(langMatch) >2 {
182
-
langMatch=langMatch[:2]
222
+
langMatch:=language[:2]
223
+
langOpts:=language+","+langMatch+".*"
224
+
iflangMatch!=language {
225
+
langOpts+=","+langMatch
183
226
}
184
-
langOpts:=language+","+langMatch+".*,"+langMatch
185
227
args=append(args, "--sub-langs", langOpts)
186
228
}
187
229
@@ -196,65 +238,26 @@ func (o *YouTube) tryMethodYtDlpInternal(videoId string, language string, additi
196
238
197
239
args=append(args, videoURL)
198
240
199
-
cmd:=exec.Command("yt-dlp", args...)
200
-
201
-
varstderr bytes.Buffer
202
-
cmd.Stderr=&stderr
203
-
204
-
iferr=cmd.Run(); err!=nil {
205
-
stderrStr:=stderr.String()
206
-
207
-
// Check for specific YouTube errors
208
-
ifstrings.Contains(stderrStr, "429") ||strings.Contains(stderrStr, "Too Many Requests") {
209
-
err=fmt.Errorf("YouTube rate limit exceeded. Try again later or use different yt-dlp arguments like '--sleep-requests 1' to slow down requests. Error: %v", err)
210
-
return
211
-
}
212
-
213
-
ifstrings.Contains(stderrStr, "Sign in to confirm you're not a bot") ||strings.Contains(stderrStr, "Use --cookies-from-browser") {
214
-
err=fmt.Errorf("YouTube requires authentication (bot detection). Use --yt-dlp-args='--cookies-from-browser BROWSER' where BROWSER is chrome, firefox, brave, etc. Error: %v", err)
215
-
return
216
-
}
217
-
218
-
iflanguage!="" {
219
-
// Fallback: try without specifying language (let yt-dlp choose best available)
0 commit comments