bruh commit

This commit is contained in:
uh wot 2021-09-14 13:53:06 +02:00
commit b7add9a9a4
Signed by: uhwot
GPG key ID: CB2454984587B781
6 changed files with 1950 additions and 0 deletions

86
src/main.rs Normal file
View 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])
}