Merge pull request 'Debug dans pmoaudiocache pour les piste non complètement téléchargées' (#34) from push-wzwlxvklsnuw into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m25s
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m25s
Reviewed-on: https://gargoton.petite-maison-orange.fr/eric/pmomusic/pulls/34
This commit was merged in pull request #34.
This commit is contained in:
@@ -124,6 +124,24 @@ async fn serve_finalized_pk<C: CacheConfig + 'static>(
|
|||||||
warn!("Error updating hit count for {}: {}", pk, e);
|
warn!("Error updating hit count for {}: {}", pk, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ROUTE 1 : Fichier en cours de téléchargement
|
||||||
|
// Utilise le streaming progressif avec Content-Length pour permettre
|
||||||
|
// la lecture pendant le téléchargement tout en préservant la durée/position
|
||||||
|
if let Some(download) = cache.get_download(pk).await {
|
||||||
|
if !download.finished().await {
|
||||||
|
let response = stream_file_progressive(file_path, download, content_type).await;
|
||||||
|
|
||||||
|
if response.status().is_success() {
|
||||||
|
cache.notify_broadcast(pk, &qualifier).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ROUTE 2 : Fichier complètement téléchargé
|
||||||
|
// Utilise l'ancien système éprouvé qui garantit un passage correct
|
||||||
|
// de toutes les informations (Content-Length automatique, etc.)
|
||||||
let response = serve_complete_file(file_path, content_type).await;
|
let response = serve_complete_file(file_path, content_type).await;
|
||||||
|
|
||||||
if response.status().is_success() {
|
if response.status().is_success() {
|
||||||
@@ -256,6 +274,8 @@ async fn stream_file_progressive(
|
|||||||
download: Arc<crate::download::Download>,
|
download: Arc<crate::download::Download>,
|
||||||
content_type: &'static str,
|
content_type: &'static str,
|
||||||
) -> Response {
|
) -> Response {
|
||||||
|
use axum::http::header;
|
||||||
|
|
||||||
// Attendre qu'au moins 64 KB soient disponibles avant de commencer
|
// Attendre qu'au moins 64 KB soient disponibles avant de commencer
|
||||||
const MIN_SIZE_TO_START: u64 = 64 * 1024;
|
const MIN_SIZE_TO_START: u64 = 64 * 1024;
|
||||||
|
|
||||||
@@ -284,15 +304,24 @@ async fn stream_file_progressive(
|
|||||||
let stream = ReaderStream::new(file);
|
let stream = ReaderStream::new(file);
|
||||||
let body = Body::from_stream(stream);
|
let body = Body::from_stream(stream);
|
||||||
|
|
||||||
(
|
// Récupérer la taille attendue du fichier si disponible
|
||||||
StatusCode::OK,
|
let expected_size = download.expected_size().await;
|
||||||
[
|
|
||||||
("content-type", content_type),
|
// Construire la réponse avec Content-Length si connu
|
||||||
("transfer-encoding", "chunked"),
|
let mut response = axum::http::Response::builder()
|
||||||
],
|
.status(StatusCode::OK)
|
||||||
body,
|
.header(header::CONTENT_TYPE, content_type);
|
||||||
)
|
|
||||||
.into_response()
|
if let Some(size) = expected_size {
|
||||||
|
// Si on connaît la taille finale, l'envoyer au renderer
|
||||||
|
// pour qu'il puisse calculer la durée et afficher la position
|
||||||
|
response = response.header(header::CONTENT_LENGTH, size);
|
||||||
|
} else {
|
||||||
|
// Sinon, utiliser chunked encoding
|
||||||
|
response = response.header(header::TRANSFER_ENCODING, "chunked");
|
||||||
|
}
|
||||||
|
|
||||||
|
response.body(body).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sert un fichier complet déjà téléchargé
|
/// Sert un fichier complet déjà téléchargé
|
||||||
|
|||||||
Reference in New Issue
Block a user