diff --git a/src/api/api_utils.rs b/src/api/api_utils.rs index a019d7be4..424507489 100644 --- a/src/api/api_utils.rs +++ b/src/api/api_utils.rs @@ -148,7 +148,7 @@ pub async fn stream_response(app_state: &AppState, stream_url: &str, if let Ok(url) = Url::parse(stream_url) { let active_clients = Arc::clone(&app_state.active_clients); let (stream_opt, provider_response) = if direct_pipe_provider_stream { - get_provider_pipe_stream(&app_state.http_client, &url, req, input).await + get_provider_pipe_stream(&app_state.http_client, &url, req, input, item_type).await } else { let buffer_stream_options = BufferStreamOptions::new(item_type, stream_retry, buffer_enabled, buffer_size, share_stream); provider_stream::get_provider_reconnect_buffered_stream(&app_state.http_client, &url, req, input, buffer_stream_options).await diff --git a/src/api/model/streams/provider_stream.rs b/src/api/model/streams/provider_stream.rs index d344e8970..b6eb9889a 100644 --- a/src/api/model/streams/provider_stream.rs +++ b/src/api/model/streams/provider_stream.rs @@ -1,4 +1,4 @@ -use crate::api::api_utils::get_headers_from_request; +use crate::api::api_utils::{get_headers_from_request, HeaderFilter}; use crate::api::model::streams::provider_stream_factory::{create_provider_stream, BufferStreamOptions}; use crate::model::config::ConfigInput; use crate::utils::network::request::{get_request_headers, sanitize_sensitive_info}; @@ -12,15 +12,28 @@ use futures::TryStreamExt; use url::Url; use crate::api::model::model_utils::get_response_headers; use crate::api::model::stream_error::StreamError; +use crate::model::playlist::PlaylistItemType; use crate::utils::debug_if_enabled; type ProviderStreamResponse = (Option>>, Option<(Vec<(String, String)>, StatusCode)>); + +pub fn get_header_filter_for_item_type(item_type: PlaylistItemType) -> HeaderFilter { + match item_type { + PlaylistItemType::Live | PlaylistItemType::LiveUnknown | PlaylistItemType::LiveHls => { + Some(Box::new(|key| key != "accept-ranges" && key != "range" && key != "content-range")) + } + _ => None, + } +} + pub async fn get_provider_pipe_stream(http_client: &Arc, stream_url: &Url, req: &HttpRequest, - input: Option<&ConfigInput>) -> ProviderStreamResponse { - let req_headers = get_headers_from_request(req, &None); + input: Option<&ConfigInput>, + item_type: PlaylistItemType) -> ProviderStreamResponse { + let filter_header = get_header_filter_for_item_type(item_type); + let req_headers = get_headers_from_request(req, &filter_header); debug_if_enabled!("Stream requested with headers: {:?}", req_headers.iter().map(|header| (header.0, String::from_utf8_lossy(header.1))).collect::>()); // These are the configured headers for this input. let input_headers = input.map(|i| i.headers.clone()); diff --git a/src/api/model/streams/provider_stream_factory.rs b/src/api/model/streams/provider_stream_factory.rs index e106289d8..97245b13d 100644 --- a/src/api/model/streams/provider_stream_factory.rs +++ b/src/api/model/streams/provider_stream_factory.rs @@ -20,6 +20,7 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::time::{Duration, Instant}; use url::Url; +use crate::api::model::streams::provider_stream::get_header_filter_for_item_type; // TODO make this configurable pub const STREAM_QUEUE_SIZE: usize = 1024; // mpsc channel holding messages. with 8092byte chunks and 2Mbit/s approx 8MB @@ -168,7 +169,8 @@ fn get_client_stream_request_params( options: &BufferStreamOptions) -> (usize, Option, bool, HeaderMap) { let stream_buffer_size = if options.is_buffer_enabled() { options.get_stream_buffer_size() } else { 1 }; - let mut req_headers = get_headers_from_request(req, &None); + let filter_header = get_header_filter_for_item_type(options.item_type); + let mut req_headers = get_headers_from_request(req, &filter_header); debug_if_enabled!("Stream requested with headers: {:?}", req_headers.iter().map(|header| (header.0, String::from_utf8_lossy(header.1))).collect::>()); // we need the range bytes from client request for seek ing to the right position let req_range_start_bytes = get_request_range_start_bytes(&req_headers);