recycleactor commited on
Commit
a85c8b6
·
verified ·
1 Parent(s): a16b74d

Upload 2 files

Browse files
Files changed (1) hide show
  1. 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())