Spaces:
Paused
Paused
Upload 2 files
Browse files- src/main.rs +49 -0
src/main.rs
CHANGED
|
@@ -973,6 +973,54 @@ async fn oauth_playlist_tracks(Json(req): Json<OauthPlaylistTracksReq>) -> impl
|
|
| 973 |
}
|
| 974 |
}
|
| 975 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 976 |
#[tokio::main]
|
| 977 |
async fn main() {
|
| 978 |
let bind_addr = std::env::var("BIND_ADDR").unwrap_or("[::]".to_string());
|
|
@@ -1007,6 +1055,7 @@ async fn main() {
|
|
| 1007 |
.route("/oauth/me", post(oauth_me))
|
| 1008 |
.route("/oauth/playlists", post(oauth_playlists))
|
| 1009 |
.route("/oauth/playlist_tracks", post(oauth_playlist_tracks))
|
|
|
|
| 1010 |
.with_state(state)
|
| 1011 |
.layer(cors)
|
| 1012 |
.layer(CompressionLayer::new())
|
|
|
|
| 973 |
}
|
| 974 |
}
|
| 975 |
|
| 976 |
+
#[derive(Debug, Deserialize)]
|
| 977 |
+
struct OauthArlReq {
|
| 978 |
+
access_token: String,
|
| 979 |
+
}
|
| 980 |
+
|
| 981 |
+
async fn oauth_arl(Json(req): Json<OauthArlReq>) -> impl IntoResponse {
|
| 982 |
+
let token = req.access_token.trim().to_string();
|
| 983 |
+
if token.is_empty() {
|
| 984 |
+
return json_error(StatusCode::BAD_REQUEST, "access_token required");
|
| 985 |
+
}
|
| 986 |
+
|
| 987 |
+
let jar = Arc::new(Jar::default());
|
| 988 |
+
let url_deezer = "https://www.deezer.com".parse::<Url>().unwrap();
|
| 989 |
+
jar.add_cookie_str("comeback=1; Domain=.deezer.com", &url_deezer);
|
| 990 |
+
let client = reqwest::Client::builder()
|
| 991 |
+
.cookie_provider(jar)
|
| 992 |
+
.timeout(std::time::Duration::from_secs(20))
|
| 993 |
+
.build()
|
| 994 |
+
.unwrap();
|
| 995 |
+
|
| 996 |
+
let _ = client
|
| 997 |
+
.get("https://api.deezer.com/platform/generic/track/80085")
|
| 998 |
+
.header("Authorization", format!("Bearer {}", token))
|
| 999 |
+
.send()
|
| 1000 |
+
.await;
|
| 1001 |
+
|
| 1002 |
+
let ud = match gw_light_call(&client, "deezer.getUserData", "null", json!({})).await {
|
| 1003 |
+
Ok(v) => v,
|
| 1004 |
+
Err(e) => return json_error(StatusCode::BAD_GATEWAY, e),
|
| 1005 |
+
};
|
| 1006 |
+
|
| 1007 |
+
let check_form = ud["checkForm"].as_str().unwrap_or("").to_string();
|
| 1008 |
+
if check_form.is_empty() {
|
| 1009 |
+
return json_error(StatusCode::BAD_GATEWAY, "no checkForm");
|
| 1010 |
+
}
|
| 1011 |
+
|
| 1012 |
+
let arl_v = match gw_light_call(&client, "user.getArl", &check_form, json!({})).await {
|
| 1013 |
+
Ok(v) => v,
|
| 1014 |
+
Err(e) => return json_error(StatusCode::BAD_GATEWAY, e),
|
| 1015 |
+
};
|
| 1016 |
+
let arl = arl_v.as_str().unwrap_or("").to_string();
|
| 1017 |
+
if arl.len() < 20 {
|
| 1018 |
+
return json_error(StatusCode::BAD_GATEWAY, "no arl");
|
| 1019 |
+
}
|
| 1020 |
+
|
| 1021 |
+
(StatusCode::OK, Json(json!({ "arl": arl }))).into_response()
|
| 1022 |
+
}
|
| 1023 |
+
|
| 1024 |
#[tokio::main]
|
| 1025 |
async fn main() {
|
| 1026 |
let bind_addr = std::env::var("BIND_ADDR").unwrap_or("[::]".to_string());
|
|
|
|
| 1055 |
.route("/oauth/me", post(oauth_me))
|
| 1056 |
.route("/oauth/playlists", post(oauth_playlists))
|
| 1057 |
.route("/oauth/playlist_tracks", post(oauth_playlist_tracks))
|
| 1058 |
+
.route("/oauth/arl", post(oauth_arl))
|
| 1059 |
.with_state(state)
|
| 1060 |
.layer(cors)
|
| 1061 |
.layer(CompressionLayer::new())
|