mangofetch_core/core/
errors.rs1pub fn classify_download_error(error: &str) -> (&str, &str) {
2 let lower = error.to_lowercase();
3
4 if lower.contains("cookie")
5 || lower.contains("login")
6 || lower.contains("sign in")
7 || lower.contains("authentication")
8 || lower.contains("403")
9 {
10 return ("auth_required", "This content requires login. Install the browser extension and visit the site while logged in.");
11 }
12
13 if lower.contains("captcha")
14 || lower.contains("blocking")
15 || lower.contains("rate limit")
16 || lower.contains("429")
17 || lower.contains("too many")
18 {
19 return (
20 "rate_limited",
21 "Too many requests. Try again in a few minutes.",
22 );
23 }
24
25 if lower.contains("private") || lower.contains("restricted") || lower.contains("age") {
26 return ("restricted", "This content is private or age-restricted.");
27 }
28
29 if lower.contains("downloaded file") && lower.contains("not found") {
30 return (
31 "file_missing",
32 "Downloaded file could not be located in the output folder.",
33 );
34 }
35
36 if lower.contains("not found")
37 || lower.contains("404")
38 || lower.contains("unavailable")
39 || lower.contains("deleted")
40 {
41 return ("not_found", "Content not found or has been deleted.");
42 }
43
44 if lower.contains("ffmpeg") || lower.contains("mux") || lower.contains("merge") {
45 return (
46 "ffmpeg_needed",
47 "FFmpeg is required for this download. Install it from Settings.",
48 );
49 }
50
51 if lower.contains("yt-dlp") || lower.contains("ytdlp") || lower.contains("no downloader") {
52 return (
53 "ytdlp_needed",
54 "yt-dlp is required. Install it from Settings.",
55 );
56 }
57
58 if lower.contains("nsig") || lower.contains("signature") || lower.contains("cipher") {
59 return (
60 "ytdlp_outdated",
61 "yt-dlp needs updating. Restart the app to auto-update.",
62 );
63 }
64
65 ("unknown", error)
66}