diff --git a/backend/src/api/api_utils.rs b/backend/src/api/api_utils.rs index 395dea33e..89a665073 100644 --- a/backend/src/api/api_utils.rs +++ b/backend/src/api/api_utils.rs @@ -966,6 +966,7 @@ pub async fn stream_response( | PlaylistItemType::LiveDash | PlaylistItemType::Video | PlaylistItemType::Series + | PlaylistItemType::LocalSeries | PlaylistItemType::Catchup ) { let _ = app_state diff --git a/backend/src/processing/processor/playlist.rs b/backend/src/processing/processor/playlist.rs index 51569769c..7bbcf1508 100644 --- a/backend/src/processing/processor/playlist.rs +++ b/backend/src/processing/processor/playlist.rs @@ -152,7 +152,7 @@ fn map_channel(mut channel: PlaylistItem, mapping: &Mapping) -> (PlaylistItem, V (channel, virtual_items, matched) } -fn map_channel_with_aliases(channel: PlaylistItem, mapping: &Mapping) -> Vec { +fn map_channel_and_flatten(channel: PlaylistItem, mapping: &Mapping) -> Vec { let (mapped_channel, mut virtual_items, _matched) = map_channel(channel, mapping); let mut result = Vec::with_capacity(1 + virtual_items.len()); @@ -167,7 +167,7 @@ fn map_playlist(playlist: &mut [PlaylistGroup], target: &ConfigTarget) -> Option let mut grp = playlist_group.clone(); mappings.iter().filter(|&mapping| mapping.mapper.as_ref().is_some_and(|v| !v.is_empty())) .for_each(|mapping| - grp.channels = grp.channels.drain(..).flat_map(|chan| map_channel_with_aliases(chan, mapping)).collect()); + grp.channels = grp.channels.drain(..).flat_map(|chan| map_channel_and_flatten(chan, mapping)).collect()); grp }).collect(); @@ -568,8 +568,8 @@ pub fn process_favourites(playlist: &mut Vec, favourites_cfg: Opt let mut fav_groups: IndexMap> = IndexMap::new(); for pg in playlist.iter() { for pli in &pg.channels { - // skip episodes, only containers or videos/live - if pli.header.item_type == PlaylistItemType::Series { + // series episodes cant be included in favourites + if pli.header.item_type == PlaylistItemType::Series || pli.header.item_type == PlaylistItemType::LocalSeries { continue; } for fav in favourites { diff --git a/backend/src/repository/playlist_repository.rs b/backend/src/repository/playlist_repository.rs index 7d6288488..84321b4fd 100644 --- a/backend/src/repository/playlist_repository.rs +++ b/backend/src/repository/playlist_repository.rs @@ -69,8 +69,7 @@ pub async fn persist_playlist(app_config: &Arc, playlist: &mut [Playl if item_type == PlaylistItemType::LocalSeries { assign_local_series_info_episode_key(&mut local_library_series, header, item_type); - } - if item_type == PlaylistItemType::Series { + } else if item_type == PlaylistItemType::Series { assign_provider_series_info_episode_key(&mut provider_series, header, item_type); } } diff --git a/shared/src/foundation/filter.rs b/shared/src/foundation/filter.rs index 3e9056d17..acbfa63ff 100644 --- a/shared/src/foundation/filter.rs +++ b/shared/src/foundation/filter.rs @@ -194,7 +194,11 @@ impl Filter { Self::TypeComparison(field, item_type) => { if let Some(value) = provider.get(field.as_str()) { get_filter_item_type(&value).is_some_and(|pli_type| { - let is_match = pli_type.eq(item_type); + let is_match = match item_type { + PlaylistItemType::Video => matches!(pli_type, PlaylistItemType::Video | PlaylistItemType::LocalVideo), + PlaylistItemType::Series => matches!(pli_type, PlaylistItemType::Series | PlaylistItemType::LocalSeries), + _ => pli_type.eq(item_type), + }; if log_enabled!(Level::Trace) { if is_match { trace!("Match found: {field:?} {value}"); diff --git a/shared/src/foundation/mapper.rs b/shared/src/foundation/mapper.rs index 2e6f0000c..81b12da65 100644 --- a/shared/src/foundation/mapper.rs +++ b/shared/src/foundation/mapper.rs @@ -3,7 +3,7 @@ use crate::error::{create_tuliprox_error_result, info_err, TuliproxError, TuliproxErrorKind}; use crate::foundation::filter::ValueAccessor; use crate::foundation::mapper::EvalResult::{AnyValue, Failure, Named, Number, Undefined, Value}; -use crate::model::{PatternTemplate, TemplateValue}; +use crate::model::{PatternTemplate, PlaylistItemType, TemplateValue}; use crate::utils::Capitalize; use log::{debug, trace}; use pest::iterators::{Pair, Pairs}; @@ -1247,7 +1247,8 @@ impl Expression { BuiltInFunction::AddFavourite => { let group_name = extract_evaluated_arg_value!(evaluated_args, 0); if let Some(group) = group_name { - if accessor.pli.header.item_type != crate::model::PlaylistItemType::Series { + let item_type = accessor.pli.header.item_type; + if item_type != PlaylistItemType::Series && item_type != PlaylistItemType::LocalSeries { let mut pli = accessor.pli.clone(); pli.header.group.clone_from(group); pli.header.uuid = crate::utils::create_alias_uuid(&accessor.pli.header.uuid, group); @@ -1571,7 +1572,7 @@ mod tests { ..Default::default() } }; - let mut accessor = ValueAccessor { pli: &mut series_info, virtual_items: vec![] }; + let mut accessor = ValueAccessor { pli: &mut series_info, virtual_items: vec![], match_as_ascii: false }; mapper.eval(&mut accessor, None); assert_eq!(accessor.virtual_items.len(), 1); @@ -1583,7 +1584,7 @@ mod tests { ..Default::default() } }; - let mut accessor = ValueAccessor { pli: &mut episode, virtual_items: vec![] }; + let mut accessor = ValueAccessor { pli: &mut episode, virtual_items: vec![], match_as_ascii: false }; mapper.eval(&mut accessor, None); assert_eq!(accessor.virtual_items.len(), 0); }