From 2646bb905d34a88e503bac1f88f38d2c7699b5ae Mon Sep 17 00:00:00 2001 From: euzu Date: Wed, 29 Oct 2025 18:06:01 +0100 Subject: [PATCH] fixed series virtual ip session key problem --- backend/src/api/api_utils.rs | 2 +- backend/src/api/endpoints/m3u_api.rs | 7 ++-- backend/src/api/endpoints/xtream_api.rs | 45 ++++++++++----------- backend/src/repository/xtream_repository.rs | 4 ++ 4 files changed, 31 insertions(+), 27 deletions(-) diff --git a/backend/src/api/api_utils.rs b/backend/src/api/api_utils.rs index dc111b0ab..ff706d864 100644 --- a/backend/src/api/api_utils.rs +++ b/backend/src/api/api_utils.rs @@ -1327,5 +1327,5 @@ pub fn json_or_bin_response(accept: Option<&String>, data: &T) -> } pub fn create_fingerprint(fingerprint: &str, username: &str, virtual_id: u32) -> String { - format!("{fingerprint}{username}{virtual_id}") + format!("{fingerprint}|{username}|{virtual_id}") } \ No newline at end of file diff --git a/backend/src/api/endpoints/m3u_api.rs b/backend/src/api/endpoints/m3u_api.rs index 1ebe70ffd..8cd8063d5 100644 --- a/backend/src/api/endpoints/m3u_api.rs +++ b/backend/src/api/endpoints/m3u_api.rs @@ -108,12 +108,13 @@ async fn m3u_api_stream( } let (action_stream_id, stream_ext) = separate_number_and_remainder(stream_req.stream_id); - let virtual_id: u32 = try_result_bad_request!(action_stream_id.trim().parse()); + let req_virtual_id: u32 = try_result_bad_request!(action_stream_id.trim().parse()); let pli = try_result_not_found!( - m3u_get_item_for_stream_id(virtual_id, app_state, &target).await, + m3u_get_item_for_stream_id(req_virtual_id, app_state, &target).await, true, - format!("Failed to read m3u item for stream id {}", virtual_id) + format!("Failed to read m3u item for stream id {req_virtual_id}") ); + let virtual_id = pli.virtual_id; let input = try_option_bad_request!( app_state .app_config diff --git a/backend/src/api/endpoints/xtream_api.rs b/backend/src/api/endpoints/xtream_api.rs index 501fc2f18..6a0e55574 100644 --- a/backend/src/api/endpoints/xtream_api.rs +++ b/backend/src/api/endpoints/xtream_api.rs @@ -29,7 +29,7 @@ use axum::response::IntoResponse; use bytes::Bytes; use futures::stream::{self, StreamExt}; use futures::Stream; -use log::{debug, error, log_enabled, warn}; +use log::{debug, error, warn}; use serde::{Deserialize, Serialize}; use serde_json::{Map, Value}; use shared::error::create_tuliprox_error_result; @@ -219,7 +219,7 @@ async fn xtream_player_api_stream( stream_req: ApiStreamRequest<'_>, ) -> impl IntoResponse + Send { - // if log_enabled!(log::Level::Debug) { + // if log::log_enabled!(log::Level::Debug) { // debug!( // "Stream request ctx={} user={} stream_id={} action_path={}", // stream_req.context, @@ -229,13 +229,10 @@ async fn xtream_player_api_stream( // ); // let message = format!("Client Request headers {req_headers:?}"); // debug!("{}", sanitize_sensitive_info(&message)); + // let message = format!("Client Request headers {req_headers:?}"); + // debug!("{}", sanitize_sensitive_info(&message)); // } - if log_enabled!(log::Level::Debug) { - let message = format!("Client Request headers {req_headers:?}"); - debug!("{}", sanitize_sensitive_info(&message)); - } - let (user, target) = try_option_bad_request!( get_user_target_by_credentials( stream_req.username, stream_req.password, api_req, app_state), @@ -253,12 +250,13 @@ async fn xtream_player_api_stream( } let (action_stream_id, stream_ext) = separate_number_and_remainder(stream_req.stream_id); - let virtual_id: u32 = try_result_bad_request!(action_stream_id.trim().parse()); + let req_virtual_id: u32 = try_result_bad_request!(action_stream_id.trim().parse()); let (pli, mapping) = try_result_not_found!( - xtream_repository::xtream_get_item_for_stream_id(virtual_id, app_state, &target, None).await, + xtream_repository::xtream_get_item_for_stream_id(req_virtual_id, app_state, &target, None).await, true, - format!("Failed to read xtream item for stream id {virtual_id}") + format!("Failed to read xtream item for stream id {req_virtual_id}") ); + let virtual_id = pli.virtual_id; let input = try_option_bad_request!( app_state.app_config.get_input_by_name(pli.input_name.as_str()), true, @@ -418,25 +416,26 @@ async fn xtream_player_api_stream_with_token( return axum::http::StatusCode::BAD_REQUEST.into_response(); } let (action_stream_id, stream_ext) = separate_number_and_remainder(stream_req.stream_id); - let virtual_id: u32 = try_result_bad_request!(action_stream_id.trim().parse()); + let req_virtual_id: u32 = try_result_bad_request!(action_stream_id.trim().parse()); let (pli, _mapping) = try_result_bad_request!( xtream_repository::xtream_get_item_for_stream_id( - virtual_id, + req_virtual_id, app_state, &target, None ).await, true, - format!("Failed to read xtream item for stream id {}", virtual_id) + format!("Failed to read xtream item for stream id {req_virtual_id}") ); + let virtual_id = pli.virtual_id; let input = try_option_bad_request!( app_state .app_config .get_input_by_name(pli.input_name.as_str()), true, format!( - "Cant find input for target {target_name}, context {}, stream_id {virtual_id}", - stream_req.context + "Cant find input for target {target_name}, context {}, stream_id {}", + stream_req.context, pli.virtual_id ) ); @@ -478,7 +477,7 @@ async fn xtream_player_api_stream_with_token( &user, None, &pli.url, - pli.virtual_id, + virtual_id, &input, req_headers, UserConnectionPermission::Allowed, @@ -507,8 +506,8 @@ async fn xtream_player_api_stream_with_token( ), true, format!( - "Cant find stream url for target {target_name}, context {}, stream_id {virtual_id}", - stream_req.context + "Cant find stream url for target {target_name}, context {}, stream_id {}", + stream_req.context, virtual_id ) ); @@ -719,17 +718,17 @@ async fn xtream_player_api_resource( debug!("Target has no xtream output {target_name}"); return axum::http::StatusCode::BAD_REQUEST.into_response(); } - let virtual_id: u32 = try_result_bad_request!(resource_req.stream_id.trim().parse()); + let req_virtual_id: u32 = try_result_bad_request!(resource_req.stream_id.trim().parse()); let resource = resource_req.action_path.trim(); let (pli, _) = try_result_bad_request!( xtream_repository::xtream_get_item_for_stream_id( - virtual_id, + req_virtual_id, app_state, &target, None ).await, true, - format!("Failed to read xtream item for stream id {}", virtual_id) + format!("Failed to read xtream item for stream id {req_virtual_id}") ); let stream_url = if resource.starts_with(crate::model::XC_INFO_RESOURCE_PREFIX) { try_result_bad_request!(xtream_get_info_resource_url( @@ -1207,9 +1206,9 @@ async fn xtream_get_catchup_response( start: &str, end: &str, ) -> impl IntoResponse + Send { - let virtual_id: u32 = try_result_bad_request!(FromStr::from_str(stream_id)); + let req_virtual_id: u32 = try_result_bad_request!(FromStr::from_str(stream_id)); let (pli, _) = try_result_bad_request!(xtream_repository::xtream_get_item_for_stream_id( - virtual_id, + req_virtual_id, app_state, target, Some(XtreamCluster::Live) diff --git a/backend/src/repository/xtream_repository.rs b/backend/src/repository/xtream_repository.rs index c451445e2..9fafbdd8c 100644 --- a/backend/src/repository/xtream_repository.rs +++ b/backend/src/repository/xtream_repository.rs @@ -367,6 +367,7 @@ async fn xtream_get_item_for_stream_id_from_memory( if let Some(item) = xtream_storage.series.query(&mapping.parent_virtual_id) { let mut xc_item = item.clone(); xc_item.provider_id = mapping.provider_id; + xc_item.item_type = PlaylistItemType::Series; Ok(xc_item) } else { Ok(xtream_storage.series.query(&virtual_id) @@ -385,6 +386,7 @@ async fn xtream_get_item_for_stream_id_from_memory( if let Some(pl_item) = item { let mut xc_item = pl_item.clone(); xc_item.provider_id = mapping.provider_id; + xc_item.item_type = PlaylistItemType::Catchup; Ok(xc_item) } else { Err(str_to_io_error(&format!("Failed to read xtream item for id {virtual_id}"))) @@ -440,6 +442,7 @@ pub async fn xtream_get_item_for_stream_id( PlaylistItemType::Series => { if let Ok(mut item) = xtream_read_series_item_for_stream_id(app_config, mapping.parent_virtual_id, &storage_path) { item.provider_id = mapping.provider_id; + item.item_type = PlaylistItemType::Series; Ok(item) } else { xtream_read_item_for_stream_id(app_config, virtual_id, &storage_path, XtreamCluster::Series) @@ -449,6 +452,7 @@ pub async fn xtream_get_item_for_stream_id( let cluster = try_cluster!(xtream_cluster, mapping.item_type, virtual_id)?; let mut item = xtream_read_item_for_stream_id(app_config, mapping.parent_virtual_id, &storage_path, cluster)?; item.provider_id = mapping.provider_id; + item.item_type = PlaylistItemType::Catchup; Ok(item) } _ => {