metadonnée technique dans le cache audio

This commit is contained in:
2025-11-22 10:51:14 +01:00
parent a51d7c551e
commit 792ac5cb95
6 changed files with 97 additions and 2 deletions

View File

@@ -29,10 +29,11 @@ rand = "0.8"
# HTTP streaming dependencies
bytes = { version = "1.0", optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
[features]
default = []
cache-sink = ["dep:pmoaudiocache", "dep:pmoflac", "dep:pmometadata"]
cache-sink = ["dep:pmoaudiocache", "dep:pmoflac", "dep:pmometadata", "dep:serde_json"]
playlist = ["cache-sink", "dep:pmoplaylist", "dep:pmocache"]
http-stream = ["dep:pmoflac", "dep:pmometadata", "dep:bytes", "dep:serde"]
all = ["cache-sink", "playlist", "http-stream"]

View File

@@ -8,6 +8,7 @@ use pmoaudio::{
};
use pmoaudiocache::AudioTrackMetadataExt;
use pmoflac::{encode_flac_stream, EncoderOptions, PcmFormat};
use serde_json::{Number, Value};
use std::{
collections::VecDeque,
pin::Pin,
@@ -289,6 +290,10 @@ impl NodeLogic for FlacCacheSinkLogic {
}
};
if let Some(transform) = self.cache.transform_metadata(&pk).await {
persist_transform_streaminfo(&self.cache, &pk, &transform);
}
// Phase 2: Prebuffer terminé! Copier les métadonnées et pusher à la playlist
// Copier les métadonnées du TrackBoundary dans le cache
// IMPORTANT: Faire ceci AVANT d'ajouter à la playlist pour que les métadonnées soient disponibles
@@ -910,6 +915,41 @@ async fn pump_track_segments_from_channel(
}
}
fn persist_transform_streaminfo(
cache: &pmoaudiocache::Cache,
pk: &str,
tmeta: &pmocache::download::TransformMetadata,
) {
if let Some(sr) = tmeta.sample_rate {
let _ = cache
.db
.set_a_metadata(pk, "sample_rate", Value::Number(Number::from(sr)));
}
if let Some(bps) = tmeta.bits_per_sample {
let _ = cache
.db
.set_a_metadata(pk, "bits_per_sample", Value::Number(Number::from(bps)));
}
if let Some(ch) = tmeta.channels {
let _ = cache
.db
.set_a_metadata(pk, "channels", Value::Number(Number::from(ch)));
}
if let Some(ts) = tmeta.total_samples {
let _ = cache
.db
.set_a_metadata(pk, "total_samples", Value::Number(Number::from(ts)));
if let Some(sr) = tmeta.sample_rate {
if sr > 0 {
let secs = (ts as f64 / sr as f64).round() as u64;
let _ = cache
.db
.set_a_metadata(pk, "duration_secs", Value::Number(Number::from(secs)));
}
}
}
}
/// Détermine la profondeur de bit d'un chunk audio
fn get_chunk_bit_depth(chunk: &AudioChunk) -> u8 {
match chunk {