Spaces:
Running
Running
Upload main.rs
Browse files- src/main.rs +27 -3
src/main.rs
CHANGED
|
@@ -1281,7 +1281,28 @@ async fn download(
|
|
| 1281 |
}
|
| 1282 |
|
| 1283 |
// Determine file extension
|
| 1284 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1285 |
let meta = AudioTagMeta::from(&q);
|
| 1286 |
dec = inject_audio_metadata(dec, ext, &meta).await;
|
| 1287 |
|
|
@@ -1307,14 +1328,17 @@ async fn download(
|
|
| 1307 |
};
|
| 1308 |
|
| 1309 |
let ct = if ext == "flac" { "audio/flac" } else { "audio/mpeg" };
|
|
|
|
|
|
|
| 1310 |
|
| 1311 |
axum::response::Response::builder()
|
| 1312 |
.status(200)
|
| 1313 |
.header("Content-Type", ct)
|
| 1314 |
.header("Content-Length", dec.len().to_string())
|
| 1315 |
-
.header("Content-Disposition", format!("
|
| 1316 |
-
.header("Accept-Ranges", "
|
| 1317 |
.header("Access-Control-Allow-Origin", "*")
|
|
|
|
| 1318 |
.body(axum::body::Body::from(dec))
|
| 1319 |
.unwrap()
|
| 1320 |
.into_response()
|
|
|
|
| 1281 |
}
|
| 1282 |
|
| 1283 |
// Determine file extension
|
| 1284 |
+
// Проверяем магические байты для определения РЕАЛЬНОГО формата файла
|
| 1285 |
+
let is_flac = dec.len() > 4 && &dec[0..4] == b"fLaC";
|
| 1286 |
+
let is_mp3 = dec.len() > 3 && (
|
| 1287 |
+
(&dec[0..3] == b"ID3") || // ID3 tag
|
| 1288 |
+
(dec[0] == 0xFF && (dec[1] & 0xE0) == 0xE0) // MP3 sync word
|
| 1289 |
+
);
|
| 1290 |
+
|
| 1291 |
+
let ext = if is_flac {
|
| 1292 |
+
"flac"
|
| 1293 |
+
} else if is_mp3 || used_fmt.contains("MP3") {
|
| 1294 |
+
"mp3"
|
| 1295 |
+
} else if used_fmt.contains("FLAC") {
|
| 1296 |
+
// Заявлен FLAC, но магических байтов нет - возможно битый файл
|
| 1297 |
+
tracing::warn!("Track {} claimed as FLAC but magic bytes not found, treating as mp3", q.id);
|
| 1298 |
+
"mp3"
|
| 1299 |
+
} else {
|
| 1300 |
+
"mp3"
|
| 1301 |
+
};
|
| 1302 |
+
|
| 1303 |
+
tracing::info!("Download track {}: claimed_format={}, detected_ext={}, size={} bytes",
|
| 1304 |
+
q.id, used_fmt, ext, dec.len());
|
| 1305 |
+
|
| 1306 |
let meta = AudioTagMeta::from(&q);
|
| 1307 |
dec = inject_audio_metadata(dec, ext, &meta).await;
|
| 1308 |
|
|
|
|
| 1328 |
};
|
| 1329 |
|
| 1330 |
let ct = if ext == "flac" { "audio/flac" } else { "audio/mpeg" };
|
| 1331 |
+
|
| 1332 |
+
tracing::info!("Sending file: {} ({})", filename, ct);
|
| 1333 |
|
| 1334 |
axum::response::Response::builder()
|
| 1335 |
.status(200)
|
| 1336 |
.header("Content-Type", ct)
|
| 1337 |
.header("Content-Length", dec.len().to_string())
|
| 1338 |
+
.header("Content-Disposition", format!("inline; filename=\"{}\"", filename))
|
| 1339 |
+
.header("Accept-Ranges", "bytes")
|
| 1340 |
.header("Access-Control-Allow-Origin", "*")
|
| 1341 |
+
.header("Cache-Control", "public, max-age=31536000")
|
| 1342 |
.body(axum::body::Body::from(dec))
|
| 1343 |
.unwrap()
|
| 1344 |
.into_response()
|