From cdacf54f48e74b2d24248d1cb653ba81df9aa45d Mon Sep 17 00:00:00 2001 From: euzu Date: Mon, 2 Jun 2025 18:03:34 +0200 Subject: [PATCH] Catchup/Timeshift fix --- src/api/api_utils.rs | 5 +++-- .../model/streams/provider_stream_factory.rs | 20 ++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/api/api_utils.rs b/src/api/api_utils.rs index 6c8f306c3..b1583a9a2 100644 --- a/src/api/api_utils.rs +++ b/src/api/api_utils.rs @@ -1,5 +1,6 @@ use crate::api::endpoints::xtream_api::{get_xtream_player_api_stream_url, XtreamApiStreamContext}; use crate::api::model::active_provider_manager::{ProviderAllocation, ProviderConnectionGuard}; +use crate::tuliprox_error::{info_err}; use crate::api::model::app_state::AppState; use crate::api::model::model_utils::{ get_stream_response_with_headers}; use crate::api::model::request::UserApiRequest; @@ -24,9 +25,9 @@ use crate::utils::request; use crate::utils::request::{extract_extension_from_url, replace_url_extension, sanitize_sensitive_info}; use crate::utils::human_readable_byte_size; use crate::utils::{debug_if_enabled, trace_if_enabled}; -use crate::BUILD_TIMESTAMP; +use crate::{BUILD_TIMESTAMP}; use axum::body::Body; -use axum::http::HeaderMap; +use axum::http::{HeaderMap, HeaderValue}; use axum::response::IntoResponse; use chrono::{DateTime, Utc}; use futures::{StreamExt, TryStreamExt}; diff --git a/src/api/model/streams/provider_stream_factory.rs b/src/api/model/streams/provider_stream_factory.rs index 2ff9af02c..2d1671238 100644 --- a/src/api/model/streams/provider_stream_factory.rs +++ b/src/api/model/streams/provider_stream_factory.rs @@ -169,7 +169,8 @@ fn get_request_range_start_bytes(req_headers: &HashMap>) -> Opti } } } - None + Some(0) // catchup workaround. without range catchup not working. + //None } // fn get_host_and_optional_port(url: &Url) -> Option { @@ -192,6 +193,7 @@ fn prepare_client(request_client: &Arc, stream_options: &Provid } let mut headers = HeaderMap::default(); + for (key, value) in original_headers { if filter_request_header(key.as_str()) { headers.insert(key.clone(), value.clone()); @@ -268,6 +270,22 @@ async fn provider_stream_request(cfg: &Config, request_client: Arc { + if let (Some(boxed_provider_stream), response_info) = + create_channel_unavailable_stream(cfg, &get_response_headers(stream_options.get_headers()), StatusCode::BAD_GATEWAY) + { + Ok(Some((boxed_provider_stream, response_info))) + } else { + Err(StatusCode::SERVICE_UNAVAILABLE) + } + } + _ => Err(status) + }; } if status.is_server_error() { match status {