integrated local series into playlist

This commit is contained in:
euzu
2025-12-19 16:00:02 +01:00
parent aa4463b632
commit a2effbeb3f
10 changed files with 24 additions and 22 deletions
Generated
+6 -4
View File
@@ -1096,7 +1096,7 @@ dependencies = [
[[package]]
name = "frontend"
version = "3.2.20"
version = "3.2.21"
dependencies = [
"anyhow",
"base64",
@@ -1108,7 +1108,7 @@ dependencies = [
"futures-signals",
"gloo-render 0.2.0",
"gloo-storage 0.3.0",
"gloo-timers 0.3.0",
"gloo-timers 0.2.6",
"gloo-utils 0.2.0",
"implicit-clone",
"js-sys",
@@ -1621,6 +1621,8 @@ version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
dependencies = [
"futures-channel",
"futures-core",
"js-sys",
"wasm-bindgen",
]
@@ -3791,7 +3793,7 @@ dependencies = [
[[package]]
name = "shared"
version = "3.2.20"
version = "3.2.21"
dependencies = [
"base64",
"bitflags 2.10.0",
@@ -4354,7 +4356,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "tuliprox"
version = "3.2.20"
version = "3.2.21"
dependencies = [
"arc-swap",
"async-compression",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "tuliprox"
version = "3.2.20"
version = "3.2.21"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+1 -1
View File
@@ -1146,7 +1146,7 @@ pub async fn local_stream_response(
fn is_path_within_allowed_directories(sub_path: &Path, root_paths: &[String]) -> bool {
for root_path in root_paths {
if sub_path.starts_with(&PathBuf::from(root_path)) {
if sub_path.starts_with(PathBuf::from(root_path)) {
return true;
}
}
+4 -4
View File
@@ -438,14 +438,14 @@ pub struct TmdbSeason {
impl TmdbSeason {
pub fn to_meta_data(&self) -> SeasonMetadata {
SeasonMetadata {
id: self.id.clone(),
id: self.id,
air_date: self.air_date.clone(),
episode_count: self.episode_count.clone(),
episode_count: self.episode_count,
name: self.name.clone(),
overview: self.overview.clone(),
poster_path: self.poster_path.clone(),
season_number: self.season_number.clone(),
vote_average: self.vote_average.clone(),
season_number: self.season_number,
vote_average: self.vote_average,
episodes: self.episodes.clone(),
networks: self.networks.clone(),
credits: self.credits.clone(),
+1
View File
@@ -472,6 +472,7 @@ where
}
}
#[allow(clippy::ref_option)]
fn serialize_episodes<S>(
episodes: &Option<Vec<XtreamSeriesInfoEpisode>>,
serializer: S,
+5 -5
View File
@@ -104,7 +104,7 @@ fn to_playlist_item(entry: &MetadataCacheEntry, input_name: &str, group_name: &s
id: episode.id.to_string(),
// we use parent_code for local series to find the parent series info and straighten the virtual_ids
parent_code: entry.uuid.clone(),
uuid: generate_playlist_uuid(&input_name, &episode.id.to_string(), PlaylistItemType::LocalSeries, &episode.direct_source),
uuid: generate_playlist_uuid(input_name, &episode.id.to_string(), PlaylistItemType::LocalSeries, &episode.direct_source),
name: episode.title.clone(),
group: group_name.to_string(),
title: episode.title.clone(),
@@ -241,9 +241,9 @@ pub fn metadata_cache_entry_to_xtream_series_info(
youtube_trailer,
episode_run_time: String::from("0"),
category_id: 0,
tmdb_id: series.tmdb_id.clone(),
tmdb: series.tmdb_id.clone(),
year: series.year.clone(),
tmdb_id: series.tmdb_id,
tmdb: series.tmdb_id,
year: series.year,
};
// seasons are not delivered through xtream get_series_info.
@@ -288,7 +288,7 @@ pub fn metadata_cache_entry_to_xtream_series_info(
releaseDate: episode_release_date.clone(),
releasedate: episode_release_date,
plot: episode.plot.clone().unwrap_or_default(),
duration_secs: episode.runtime.map(|r| r * 60).unwrap_or(0),
duration_secs: episode.runtime.map_or(0, |r| r * 60),
duration: episode.runtime
.map(|r| format!("{:02}:{:02}:00", r / 60, r % 60))
.unwrap_or_default(),
@@ -171,7 +171,7 @@ fn rewrite_local_series_info_episode_virtual_id(playlist: &mut [PlaylistGroup],
}
}
if let Ok(s) = serde_json::to_string(&series_info) {
header.additional_properties = RawValue::from_string(s).ok()
header.additional_properties = RawValue::from_string(s).ok();
}
}
}
@@ -78,11 +78,10 @@ impl XtreamPlaylistIterator {
fn matches_filters(cluster: XtreamCluster, filter_ids: Option<&HashSet<u32>>, item: &XtreamPlaylistItem) -> bool {
if cluster == XtreamCluster::Series {
if !matches!(item.item_type, PlaylistItemType::SeriesInfo | PlaylistItemType::LocalSeriesInfo) {
if cluster == XtreamCluster::Series
&& !matches!(item.item_type, PlaylistItemType::SeriesInfo | PlaylistItemType::LocalSeriesInfo) {
return false;
}
}
// category_id-Filter
if let Some(set) = filter_ids {
+2 -2
View File
@@ -1,10 +1,10 @@
[package]
name = "frontend"
version = "3.2.20"
version = "3.2.21"
edition = "2021"
[dependencies]
shared = { version = "3.2.20", path = "../shared" }
shared = { version = "3.2.21", path = "../shared" }
chrono = "0"
yew = "0.21"
yew-router = "0.18"
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "shared"
version = "3.2.20"
version = "3.2.21"
edition = "2021"
[dependencies]