mirror of
https://github.com/euzu/tuliprox.git
synced 2026-10-24 00:32:30 +02:00
added virtual id handling
This commit is contained in:
+16
-7
@@ -5,6 +5,7 @@ use crate::api::api_utils::{get_user_target, get_user_target_by_credentials, str
|
||||
use crate::api::api_model::{AppState, UserApiRequest};
|
||||
use crate::model::config::TargetType;
|
||||
use crate::repository::m3u_repository::{m3u_get_file_paths, m3u_get_item_for_stream_id, m3u_load_rewrite_playlist};
|
||||
use crate::repository::storage::get_target_storage_path;
|
||||
|
||||
async fn m3u_api(
|
||||
api_req: web::Query<UserApiRequest>,
|
||||
@@ -38,15 +39,23 @@ async fn m3u_api_stream(
|
||||
if let Ok(m3u_stream_id) = stream_id.parse::<u32>() {
|
||||
if let Some((_user, target)) = get_user_target_by_credentials(&username, &password, &api_req, &app_state) {
|
||||
if target.has_output(&TargetType::M3u) {
|
||||
if let Some((m3u_path, idx_path)) = m3u_get_file_paths(&app_state.config, target) {
|
||||
match m3u_get_item_for_stream_id(m3u_stream_id, &m3u_path, &idx_path) {
|
||||
Ok(m3u_item) => {
|
||||
return stream_response(m3u_item.url.as_str(), &req, None).await;
|
||||
}
|
||||
Err(err) => {
|
||||
error!("Failed to get m3u url: {}", err);
|
||||
|
||||
match get_target_storage_path(&app_state.config, target.name.as_str()) {
|
||||
Some(target_path) => {
|
||||
if let Some((m3u_path, idx_path)) = m3u_get_file_paths(&target_path) {
|
||||
match m3u_get_item_for_stream_id(m3u_stream_id, &m3u_path, &idx_path) {
|
||||
Ok(m3u_item) => {
|
||||
return stream_response(m3u_item.url.as_str(), &req, None).await;
|
||||
}
|
||||
Err(err) => {
|
||||
error!("Failed to get m3u url: {}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
None => {
|
||||
error!("Failed to get target path for {}", target.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ use crate::model::api_proxy::{ProxyType, ProxyUserCredentials};
|
||||
use crate::model::config::{Config, ConfigInput, ConfigTarget};
|
||||
use crate::model::config::TargetType;
|
||||
use crate::repository::m3u_repository::m3u_get_epg_file_path;
|
||||
use crate::repository::storage::get_target_storage_path;
|
||||
use crate::repository::xtream_repository::{xtream_get_epg_file_path, xtream_get_storage_path};
|
||||
use crate::utils::{file_utils, request_utils};
|
||||
|
||||
@@ -51,10 +52,13 @@ fn get_epg_path_for_target_of_type(target_name: &str, file_path: Option<PathBuf>
|
||||
}
|
||||
|
||||
fn get_epg_path_for_target(config: &Config, target: &ConfigTarget) -> Option<PathBuf> {
|
||||
// TODO if we share the same virtual_id for epg, can we store an epg file for the target ?
|
||||
for output in &target.output {
|
||||
match output.target {
|
||||
TargetType::M3u => {
|
||||
return get_epg_path_for_target_of_type(&target.name, m3u_get_epg_file_path(config, target));
|
||||
if let Some(target_path) = get_target_storage_path(config, &target.name) {
|
||||
return get_epg_path_for_target_of_type(&target.name, m3u_get_epg_file_path(&target_path));
|
||||
}
|
||||
}
|
||||
TargetType::Xtream => {
|
||||
if let Some(storage_path) = xtream_get_storage_path(config, &target.name) {
|
||||
|
||||
+8
-13
@@ -263,7 +263,7 @@ async fn xtream_player_api_streaming_timeshift(
|
||||
fn get_xtream_vod_info(target: &ConfigTarget, pli: &XtreamPlaylistItem, content: &str) -> Result<String, Error> {
|
||||
if let Ok(mut doc) = serde_json::from_str::<Map<String, Value>>(content) {
|
||||
if let Some(Value::Object(movie_data)) = doc.get_mut("movie_data") {
|
||||
let stream_id = pli.stream_id;
|
||||
let stream_id = pli.virtual_id;
|
||||
let category_id = pli.category_id;
|
||||
movie_data.insert("stream_id".to_string(), Value::Number(serde_json::value::Number::from(stream_id)));
|
||||
movie_data.insert("category_id".to_string(), Value::Number(serde_json::value::Number::from(category_id)));
|
||||
@@ -278,7 +278,7 @@ fn get_xtream_vod_info(target: &ConfigTarget, pli: &XtreamPlaylistItem, content:
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(Error::new(ErrorKind::Other, format!("Failed to get vod info for id {}", pli.stream_id)))
|
||||
Err(Error::new(ErrorKind::Other, format!("Failed to get vod info for id {}", pli.virtual_id)))
|
||||
}
|
||||
|
||||
fn get_xtream_series_info(config: &Config, target: &ConfigTarget, pli: &XtreamPlaylistItem, content: &str) -> Result<String, Error> {
|
||||
@@ -309,13 +309,13 @@ fn get_xtream_series_info(config: &Config, target: &ConfigTarget, pli: &XtreamPl
|
||||
}
|
||||
}
|
||||
if let Ok(result) = serde_json::to_string(&doc) {
|
||||
let _ = xtream_repository::xtream_write_series_info(config, target.name.replace(' ', "_").as_str(), pli.stream_id, &new_id_to_provider_id_mapping, &result);
|
||||
let _ = xtream_repository::xtream_write_series_info(config, target.name.replace(' ', "_").as_str(), pli.virtual_id, &new_id_to_provider_id_mapping, &result);
|
||||
return Ok(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(Error::new(ErrorKind::Other, format!("Failed to get series info for id {}", pli.stream_id)))
|
||||
Err(Error::new(ErrorKind::Other, format!("Failed to get series info for id {}", pli.virtual_id)))
|
||||
}
|
||||
|
||||
async fn xtream_get_stream_info_content(info_url: &str, input: &ConfigInput) -> Result<String, Error> {
|
||||
@@ -325,7 +325,7 @@ async fn xtream_get_stream_info_content(info_url: &str, input: &ConfigInput) ->
|
||||
async fn xtream_get_stream_info(config: &Config, input: &ConfigInput, target: &ConfigTarget,
|
||||
pli: &XtreamPlaylistItem, info_url: &str, cluster: XtreamCluster) -> Result<String, Error> {
|
||||
if cluster == XtreamCluster::Series {
|
||||
if let Ok(content) = xtream_repository::xtream_load_series_info(config, target.name.replace(' ', "_").as_str(), pli.stream_id) {
|
||||
if let Ok(content) = xtream_repository::xtream_load_series_info(config, target.name.replace(' ', "_").as_str(), pli.virtual_id) {
|
||||
return Ok(content);
|
||||
}
|
||||
}
|
||||
@@ -343,7 +343,7 @@ async fn xtream_get_stream_info(config: &Config, input: &ConfigInput, target: &C
|
||||
}
|
||||
|
||||
Err(Error::new(std::io::ErrorKind::Other, format!("Cant find stream with id: {}/{}/{}",
|
||||
target.name.replace(' ', "_").as_str(), &cluster, pli.stream_id)))
|
||||
target.name.replace(' ', "_").as_str(), &cluster, pli.virtual_id)))
|
||||
}
|
||||
|
||||
async fn xtream_get_stream_info_response(app_state: &AppState, user: &ProxyUserCredentials,
|
||||
@@ -549,13 +549,8 @@ async fn xtream_player_api(
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
if api_req.action.is_empty() {
|
||||
debug!("Paremeter action is empty!");
|
||||
HttpResponse::Unauthorized().finish()
|
||||
} else {
|
||||
debug!("cant find user!");
|
||||
HttpResponse::BadRequest().finish()
|
||||
}
|
||||
debug!("{}", if api_req.action.is_empty() { "Paremeter action is empty!" } else { "cant find user!" });
|
||||
HttpResponse::BadRequest().finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user