Spaces:
Paused
Paused
Upload main.rs
Browse files- src/main.rs +4 -43
src/main.rs
CHANGED
|
@@ -969,20 +969,6 @@ async fn gw_light_call(
|
|
| 969 |
let url = "https://www.deezer.com/ajax/gw-light.php";
|
| 970 |
let url_deezer = "https://www.deezer.com".parse::<Url>().unwrap();
|
| 971 |
|
| 972 |
-
fn cookie_value(jar: &Jar, url: &Url, key: &str) -> Option<String> {
|
| 973 |
-
let Some(hv) = jar.cookies(url) else { return None };
|
| 974 |
-
let Ok(s) = hv.to_str() else { return None };
|
| 975 |
-
for part in s.split(';') {
|
| 976 |
-
let p = part.trim();
|
| 977 |
-
if let Some(rest) = p.strip_prefix(&format!("{key}=")) {
|
| 978 |
-
if !rest.is_empty() {
|
| 979 |
-
return Some(rest.to_string());
|
| 980 |
-
}
|
| 981 |
-
}
|
| 982 |
-
}
|
| 983 |
-
None
|
| 984 |
-
}
|
| 985 |
-
|
| 986 |
fn cid() -> String {
|
| 987 |
SystemTime::now()
|
| 988 |
.duration_since(UNIX_EPOCH)
|
|
@@ -992,7 +978,6 @@ async fn gw_light_call(
|
|
| 992 |
|
| 993 |
async fn do_req(
|
| 994 |
client: &reqwest::Client,
|
| 995 |
-
jar: &Arc<Jar>,
|
| 996 |
url_deezer: &Url,
|
| 997 |
url: &str,
|
| 998 |
method: &str,
|
|
@@ -1010,17 +995,6 @@ async fn gw_light_call(
|
|
| 1010 |
.header("Content-Type", "text/plain;charset=UTF-8")
|
| 1011 |
.body(params.to_string())
|
| 1012 |
};
|
| 1013 |
-
|
| 1014 |
-
let sid = cookie_value(jar, url_deezer, "sid").unwrap_or_default();
|
| 1015 |
-
let arl = cookie_value(jar, url_deezer, "arl").unwrap_or_default();
|
| 1016 |
-
if !sid.is_empty() || !arl.is_empty() {
|
| 1017 |
-
let mut parts: Vec<String> = Vec::new();
|
| 1018 |
-
parts.push(format!("arl={arl}"));
|
| 1019 |
-
if !sid.is_empty() {
|
| 1020 |
-
parts.push(format!("sid={sid}"));
|
| 1021 |
-
}
|
| 1022 |
-
req = req.header("Cookie", parts.join("; "));
|
| 1023 |
-
}
|
| 1024 |
if let Some(uid) = user_id.filter(|s| !s.trim().is_empty()) {
|
| 1025 |
req = req.header("x-deezer-user", uid);
|
| 1026 |
}
|
|
@@ -1054,19 +1028,6 @@ async fn gw_light_call(
|
|
| 1054 |
.await
|
| 1055 |
.map_err(|_| "network".to_string())?;
|
| 1056 |
|
| 1057 |
-
if method == "deezer.getUserData" {
|
| 1058 |
-
for v in r.headers().get_all("set-cookie").iter() {
|
| 1059 |
-
if let Ok(s) = v.to_str() {
|
| 1060 |
-
if s.starts_with("sid=") {
|
| 1061 |
-
let cookie = s.split(';').next().unwrap_or("").trim();
|
| 1062 |
-
if !cookie.is_empty() {
|
| 1063 |
-
jar.add_cookie_str(&format!("{cookie}; Domain=.deezer.com"), url_deezer);
|
| 1064 |
-
}
|
| 1065 |
-
}
|
| 1066 |
-
}
|
| 1067 |
-
}
|
| 1068 |
-
}
|
| 1069 |
-
|
| 1070 |
let status = r.status();
|
| 1071 |
let text = r.text().await.map_err(|_| "read".to_string())?;
|
| 1072 |
let json: GwResp = serde_json::from_str(&text).map_err(|_| {
|
|
@@ -1085,17 +1046,17 @@ async fn gw_light_call(
|
|
| 1085 |
}
|
| 1086 |
|
| 1087 |
if method == "deezer.getUserData" {
|
| 1088 |
-
match do_req(client,
|
| 1089 |
Ok(v) => Ok(v),
|
| 1090 |
-
Err(e1) => match do_req(client,
|
| 1091 |
Ok(v) => Ok(v),
|
| 1092 |
Err(e2) => Err(format!("getUserData:{e1}; fallback:{e2}")),
|
| 1093 |
},
|
| 1094 |
}
|
| 1095 |
} else {
|
| 1096 |
-
match do_req(client,
|
| 1097 |
Ok(v) => Ok(v),
|
| 1098 |
-
Err(e1) => match do_req(client,
|
| 1099 |
Ok(v) => Ok(v),
|
| 1100 |
Err(e2) => Err(format!("{e1}; retry:{e2}")),
|
| 1101 |
},
|
|
|
|
| 969 |
let url = "https://www.deezer.com/ajax/gw-light.php";
|
| 970 |
let url_deezer = "https://www.deezer.com".parse::<Url>().unwrap();
|
| 971 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 972 |
fn cid() -> String {
|
| 973 |
SystemTime::now()
|
| 974 |
.duration_since(UNIX_EPOCH)
|
|
|
|
| 978 |
|
| 979 |
async fn do_req(
|
| 980 |
client: &reqwest::Client,
|
|
|
|
| 981 |
url_deezer: &Url,
|
| 982 |
url: &str,
|
| 983 |
method: &str,
|
|
|
|
| 995 |
.header("Content-Type", "text/plain;charset=UTF-8")
|
| 996 |
.body(params.to_string())
|
| 997 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 998 |
if let Some(uid) = user_id.filter(|s| !s.trim().is_empty()) {
|
| 999 |
req = req.header("x-deezer-user", uid);
|
| 1000 |
}
|
|
|
|
| 1028 |
.await
|
| 1029 |
.map_err(|_| "network".to_string())?;
|
| 1030 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1031 |
let status = r.status();
|
| 1032 |
let text = r.text().await.map_err(|_| "read".to_string())?;
|
| 1033 |
let json: GwResp = serde_json::from_str(&text).map_err(|_| {
|
|
|
|
| 1046 |
}
|
| 1047 |
|
| 1048 |
if method == "deezer.getUserData" {
|
| 1049 |
+
match do_req(client, &url_deezer, url, method, api_token, ¶ms, true, None).await {
|
| 1050 |
Ok(v) => Ok(v),
|
| 1051 |
+
Err(e1) => match do_req(client, &url_deezer, url, method, api_token, ¶ms, false, None).await {
|
| 1052 |
Ok(v) => Ok(v),
|
| 1053 |
Err(e2) => Err(format!("getUserData:{e1}; fallback:{e2}")),
|
| 1054 |
},
|
| 1055 |
}
|
| 1056 |
} else {
|
| 1057 |
+
match do_req(client, &url_deezer, url, method, api_token, ¶ms, false, None).await {
|
| 1058 |
Ok(v) => Ok(v),
|
| 1059 |
+
Err(e1) => match do_req(client, &url_deezer, url, method, api_token, ¶ms, false, None).await {
|
| 1060 |
Ok(v) => Ok(v),
|
| 1061 |
Err(e2) => Err(format!("{e1}; retry:{e2}")),
|
| 1062 |
},
|