Feature/for each genre review (#541)

* New Features
Added for_each DSL construct for iterating over playlist item fields, with split() function support.
Added "genre" as a queryable and editable playlist item field.

Bug Fixes
Improved short EPG request handling with automatic default limits.
Fixed EPG timestamp formatting to use UTC consistently.
This commit is contained in:
euzu
2026-01-26 23:04:37 +01:00
committed by GitHub
parent 6ae663f024
commit e01197cf52
37 changed files with 629 additions and 461 deletions
+7 -6
View File
@@ -9,8 +9,8 @@ use tokio::sync::{Mutex, OwnedRwLockWriteGuard, RwLock};
use tokio::task::JoinSet;
use crate::api::model::{EventManager, EventMessage, PlaylistStorageState, UpdateGuard};
use crate::messaging::{send_message};
use crate::model::messaging::{MessageContent};
use crate::messaging::send_message;
use crate::model::messaging::MessageContent;
use crate::model::Epg;
@@ -35,16 +35,17 @@ use crate::utils::{debug_if_enabled, trace_if_enabled};
use futures::StreamExt;
use indexmap::IndexMap;
use log::{debug, error, info, log_enabled, warn, Level};
use shared::concat_string;
use shared::error::{get_errors_notify_message, notify_err, TuliproxError};
use shared::foundation::filter::{get_field_value, set_field_value, Filter, ValueAccessor, ValueProvider};
use shared::foundation::{get_field_value, set_field_value, ValueAccessor, ValueProvider};
use shared::foundation::Filter;
use shared::model::xtream_const::XTREAM_CLUSTER;
use shared::model::UUIDType;
use shared::model::{CounterModifier, FieldGetAccessor, FieldSetAccessor, InputType, ItemField,
PlaylistGroup, PlaylistItem, PlaylistItemType, PlaylistUpdateState,
ProcessingOrder, XtreamCluster};
use shared::utils::{create_alias_uuid, default_as_default, interner_gc, Internable};
use std::time::Instant;
use shared::concat_string;
use shared::model::UUIDType;
fn is_valid(pli: &PlaylistItem, filter: &Filter, match_as_ascii: bool) -> bool {
let provider = ValueProvider { pli, match_as_ascii };
@@ -866,7 +867,7 @@ pub async fn exec_processing(client: &reqwest::Client, app_config: Arc<AppConfig
event_manager: Option<Arc<EventManager>>, playlist_state: Option<Arc<PlaylistStorageState>>,
update_guard: Option<UpdateGuard>,
disabled_headers: Option<ReverseProxyDisabledHeaderConfig>) {
let _guard = if let Some(guard) = update_guard {
let _guard = if let Some(guard) = update_guard {
if let Some(permit) = guard.try_playlist() {
Some(permit)
} else {
+2 -2
View File
@@ -1,5 +1,5 @@
use crate::model::{ConfigSortRule, ConfigTarget};
use shared::foundation::filter::ValueProvider;
use shared::foundation::ValueProvider;
use shared::model::{PlaylistGroup, SortOrder, SortTarget};
use std::cmp::Ordering;
use std::sync::Arc;
@@ -240,7 +240,7 @@ fn sort_channels_in_groups(
mod tests {
use crate::model::ConfigSortRule;
use crate::processing::processor::sort::playlist_comparator;
use shared::foundation::filter::Filter;
use shared::foundation::Filter;
use shared::model::{ItemField, PlaylistItem, PlaylistItemHeader, SortOrder, SortTarget};
use std::cmp::Ordering;
use std::sync::Arc;