vector sizes

streaming wip
This commit is contained in:
euzu
2025-01-09 13:31:05 +01:00
parent ca9a8fea79
commit 1718e6d52c
12 changed files with 29 additions and 28 deletions
+7 -7
View File
@@ -19,7 +19,6 @@ use tokio_stream::Stream;
use url::Url;
const STREAM_QUEUE_SIZE: usize = 1024; // mpsc channel holding messages.
const STREAM_CONNECT_TIMEOUT_SECS: u64 = 5; // Wait timeout secs for connection when server dropped connection, then retry
const ERR_RETRY_TIMEOUT_SECS: u64 = 10; // If connect status is 4xx or 5xx, we wait until we allow next request from client
fn get_request_bytes(req_headers: &HashMap<String, Vec<u8>>) -> usize {
@@ -78,13 +77,13 @@ pub fn get_buffered_stream(stream_url: &Url, req: &HttpRequest, input: Option<&C
let url = stream_url.clone();
let stop_signal = Arc::new(AtomicBool::new(false));
let stop_stream = Arc::clone(&stop_signal);
let req_client = request_utils::get_client_request(input_headers.as_ref(), &url, Some(&req_headers));
actix_rt::spawn(async move {
let masked_url = mask_sensitive_info(url.as_str());
let req_bytes = get_request_bytes(&req_headers);
let bytes_counter = if range_send { Some(AtomicUsize::new(req_bytes)) } else { None };
while !stop_signal.load(Ordering::Relaxed) {
let mut client = request_utils::get_client_request(input_headers.as_ref(), &url, Some(&req_headers));
client = client.timeout(Duration::from_secs(STREAM_CONNECT_TIMEOUT_SECS));
let Some(mut client) = req_client.try_clone() else { break };
let bytes_to_request = bytes_counter.as_ref().map_or(0, |atomic| atomic.load(Ordering::Relaxed));
if bytes_to_request > 0 {
// on reconnect send range header to avoid starting from beginning for vod
@@ -108,7 +107,7 @@ pub fn get_buffered_stream(stream_url: &Url, req: &HttpRequest, input: Option<&C
match response.chunk().await {
Ok(Some(chunk)) => {
if chunk.is_empty() {
// debug!("Stream finished ? {masked_url}");
// debug!("Download Stream finished ? {masked_url}");
break;
}
if let Ok(permit) = tx.reserve().await {
@@ -118,18 +117,19 @@ pub fn get_buffered_stream(stream_url: &Url, req: &HttpRequest, input: Option<&C
bytes.fetch_add(len, Ordering::Relaxed);
}
} else {
// debug!("Stream finished, client disconnect ? {masked_url}");
// debug!("Client disconnect ? {masked_url}");
stop_signal.store(true, Ordering::Relaxed);
break;
}
}
Err(_err) => {
// debug!("Media stream error {masked_url} {_err:?}");
stop_signal.store(true, Ordering::Relaxed);
break;
}
Ok(None) => {
// no chunk available
// debug!("media stream finished no data available");
// debug!("Media stream finished no data available {masked_url}");
stop_signal.store(true, Ordering::Relaxed);
break;
}
@@ -149,7 +149,7 @@ pub fn get_buffered_stream(stream_url: &Url, req: &HttpRequest, input: Option<&C
}
actix_web::rt::time::sleep(Duration::from_secs(1)).await;
}
debug!("Reconnecting stream stopped {masked_url}");
// debug!("Reconnecting stream stopped {masked_url}");
drop(tx);
});
+2 -2
View File
@@ -121,10 +121,10 @@ async fn serve_epg(epg_path: &Path, req: &HttpRequest, user: &ProxyUserCredentia
fn serve_epg_with_timeshift(epg_file: File, offset_minutes: i32) -> HttpResponse {
let reader = BufReader::new(epg_file);
let encoder = GzEncoder::new(Vec::new(), Compression::default());
let encoder = GzEncoder::new(Vec::with_capacity(4096), Compression::default());
let mut xml_reader = Reader::from_reader(reader);
let mut xml_writer = Writer::new(encoder);
let mut buf = Vec::new();
let mut buf = Vec::with_capacity(1024);
let duration = Duration::minutes(i64::from(offset_minutes));
loop {