Spaces:
Running
Running
Upload 3 files
Browse files- Cargo.toml +1 -1
- src/api.rs +19 -5
- src/main.rs +8 -3
Cargo.toml
CHANGED
|
@@ -13,7 +13,7 @@ tracing = "0.1"
|
|
| 13 |
tracing-subscriber = "0.3"
|
| 14 |
tokio = { version = "1", features = ["rt-multi-thread", "macros", "fs"] }
|
| 15 |
serde = { version = "1.0", features = ["derive"] }
|
| 16 |
-
reqwest = { version = "0.11", features = ["json", "rustls-tls", "cookies", "gzip", "stream"], default-features = false }
|
| 17 |
serde_json = "1.0"
|
| 18 |
thiserror = "1.0"
|
| 19 |
bytes = "1"
|
|
|
|
| 13 |
tracing-subscriber = "0.3"
|
| 14 |
tokio = { version = "1", features = ["rt-multi-thread", "macros", "fs"] }
|
| 15 |
serde = { version = "1.0", features = ["derive"] }
|
| 16 |
+
reqwest = { version = "0.11", features = ["json", "rustls-tls", "cookies", "gzip", "brotli", "deflate", "stream"], default-features = false }
|
| 17 |
serde_json = "1.0"
|
| 18 |
thiserror = "1.0"
|
| 19 |
bytes = "1"
|
src/api.rs
CHANGED
|
@@ -145,9 +145,7 @@ impl APIClient {
|
|
| 145 |
|
| 146 |
let body = serde_json::to_string(params)?;
|
| 147 |
|
| 148 |
-
let
|
| 149 |
-
.client
|
| 150 |
-
.post(url)
|
| 151 |
.header("Content-Type", "text/plain;charset=UTF-8")
|
| 152 |
.body(body)
|
| 153 |
.query(&[
|
|
@@ -174,10 +172,18 @@ impl APIClient {
|
|
| 174 |
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
|
| 175 |
)
|
| 176 |
.send()
|
| 177 |
-
.await?
|
| 178 |
-
.json()
|
| 179 |
.await?;
|
| 180 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 181 |
if let Some(error) = json.error.as_object() {
|
| 182 |
for (code, message) in error {
|
| 183 |
return Err(APIError::DeezerError {
|
|
@@ -258,6 +264,14 @@ impl APIClient {
|
|
| 258 |
.header("Content-Type", "application/json")
|
| 259 |
.header("Origin", "https://www.deezer.com")
|
| 260 |
.header("Referer", "https://www.deezer.com/")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 261 |
.json(&req)
|
| 262 |
.send()
|
| 263 |
.await
|
|
|
|
| 145 |
|
| 146 |
let body = serde_json::to_string(params)?;
|
| 147 |
|
| 148 |
+
let resp = self.client.post(url)
|
|
|
|
|
|
|
| 149 |
.header("Content-Type", "text/plain;charset=UTF-8")
|
| 150 |
.body(body)
|
| 151 |
.query(&[
|
|
|
|
| 172 |
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
|
| 173 |
)
|
| 174 |
.send()
|
|
|
|
|
|
|
| 175 |
.await?;
|
| 176 |
|
| 177 |
+
let status = resp.status().as_u16();
|
| 178 |
+
let text = resp.text().await?;
|
| 179 |
+
let json: DeezerResponse = serde_json::from_str(&text).map_err(|e| {
|
| 180 |
+
let snip: String = text.chars().take(200).collect();
|
| 181 |
+
APIError::DeezerError {
|
| 182 |
+
code: "bad_json".to_string(),
|
| 183 |
+
message: format!("status:{status}; {e}; {snip}"),
|
| 184 |
+
}
|
| 185 |
+
})?;
|
| 186 |
+
|
| 187 |
if let Some(error) = json.error.as_object() {
|
| 188 |
for (code, message) in error {
|
| 189 |
return Err(APIError::DeezerError {
|
|
|
|
| 264 |
.header("Content-Type", "application/json")
|
| 265 |
.header("Origin", "https://www.deezer.com")
|
| 266 |
.header("Referer", "https://www.deezer.com/")
|
| 267 |
+
.header("Accept-Language", "en-US,en;q=0.9")
|
| 268 |
+
.header("sec-ch-ua", "\"Chromium\";v=\"124\", \"Google Chrome\";v=\"124\", \"Not-A.Brand\";v=\"99\"")
|
| 269 |
+
.header("sec-ch-ua-mobile", "?0")
|
| 270 |
+
.header("sec-ch-ua-platform", "\"Windows\"")
|
| 271 |
+
.header(
|
| 272 |
+
"User-Agent",
|
| 273 |
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
|
| 274 |
+
)
|
| 275 |
.json(&req)
|
| 276 |
.send()
|
| 277 |
.await
|
src/main.rs
CHANGED
|
@@ -229,10 +229,15 @@ async fn fetch_media_url(
|
|
| 229 |
.map_err(|e| e.to_string())?;
|
| 230 |
|
| 231 |
let status = media_resp.status();
|
| 232 |
-
let
|
| 233 |
-
.
|
| 234 |
.await
|
| 235 |
-
.map_err(|_| "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 236 |
|
| 237 |
let url = extract_media_url(&media_json);
|
| 238 |
if !url.is_empty() {
|
|
|
|
| 229 |
.map_err(|e| e.to_string())?;
|
| 230 |
|
| 231 |
let status = media_resp.status();
|
| 232 |
+
let media_text = media_resp
|
| 233 |
+
.text()
|
| 234 |
.await
|
| 235 |
+
.map_err(|_| "media:read".to_string())?;
|
| 236 |
+
|
| 237 |
+
let media_json: serde_json::Value = serde_json::from_str(&media_text).map_err(|_| {
|
| 238 |
+
let snip: String = media_text.chars().take(200).collect();
|
| 239 |
+
format!("media_bad_json:{}:{}", status.as_u16(), snip)
|
| 240 |
+
})?;
|
| 241 |
|
| 242 |
let url = extract_media_url(&media_json);
|
| 243 |
if !url.is_empty() {
|