bruh commit
This commit is contained in:
commit
b7add9a9a4
6 changed files with 1950 additions and 0 deletions
86
src/main.rs
Normal file
86
src/main.rs
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
#[macro_use] extern crate rocket;
|
||||
|
||||
use rocket::{serde::{Deserialize, json::Json}, State, http::Status};
|
||||
use serde_json::json;
|
||||
use std::sync::RwLock;
|
||||
|
||||
mod api;
|
||||
use api::{APIClient, APIError, Format};
|
||||
|
||||
struct StateData {
|
||||
client: APIClient
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct DeezerTrackList {
|
||||
data: Vec<DeezerTrack>
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[allow(non_snake_case)]
|
||||
struct DeezerTrack {
|
||||
TRACK_TOKEN: String
|
||||
}
|
||||
|
||||
#[get("/")]
|
||||
fn index() -> &'static str {
|
||||
"marecchione gay af"
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct Request {
|
||||
formats: Vec<Format>,
|
||||
ids: Vec<u32>,
|
||||
}
|
||||
|
||||
#[post("/get_url", data = "<req>")]
|
||||
async fn get_url(req: Json<Request>, state_data: &State<RwLock<StateData>>) -> (Status, String) {
|
||||
if req.formats.is_empty() {
|
||||
return (Status::BadRequest, "Format list cannot be empty".to_string());
|
||||
}
|
||||
if req.ids.is_empty() {
|
||||
return (Status::BadRequest, "ID list cannot be empty".to_string());
|
||||
}
|
||||
|
||||
let mut client: APIClient;
|
||||
let old_sid: String;
|
||||
{
|
||||
let state_data_read = state_data.read().unwrap();
|
||||
old_sid = state_data_read.client.sid.clone();
|
||||
client = state_data_read.client.clone();
|
||||
}
|
||||
|
||||
let resp: Result<DeezerTrackList, APIError> = client.api_call("song.getListData", &json!({"sng_ids":req.ids})).await;
|
||||
let track_list;
|
||||
match resp {
|
||||
Ok(t) => track_list = t,
|
||||
Err(e) => return (Status::InternalServerError, e.to_string()),
|
||||
};
|
||||
|
||||
if track_list.data.is_empty() {
|
||||
return (Status::BadRequest, "No valid IDs found".to_string())
|
||||
}
|
||||
|
||||
let track_tokens: Vec<&str> = track_list.data.iter().map(|t| t.TRACK_TOKEN.as_str()).collect();
|
||||
|
||||
let media_result = client.get_media(&req.formats, track_tokens).await;
|
||||
let media_resp;
|
||||
match media_result {
|
||||
Ok(r) => media_resp = r,
|
||||
Err(_) => return (Status::InternalServerError, "Error while getting response from media.deezer.com".to_string())
|
||||
};
|
||||
|
||||
if client.sid != old_sid {
|
||||
let mut state_data_write = state_data.write().unwrap();
|
||||
state_data_write.client = client;
|
||||
}
|
||||
|
||||
(Status::Ok, media_resp.text().await.unwrap())
|
||||
}
|
||||
|
||||
#[launch]
|
||||
fn rocket() -> _ {
|
||||
rocket::build()
|
||||
.manage(RwLock::new(StateData { client: APIClient::new() }))
|
||||
.mount("/", routes![index, get_url])
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue