From f724b176e9ea325a328d5e6503739fe7145b5486 Mon Sep 17 00:00:00 2001 From: euzu Date: Fri, 23 May 2025 09:39:42 +0200 Subject: [PATCH 1/2] Fixed trailing comma on playlist stream iterator with filter --- src/repository/m3u_playlist_iterator.rs | 18 +++++++++++++++++- src/repository/xtream_playlist_iterator.rs | 20 ++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/repository/m3u_playlist_iterator.rs b/src/repository/m3u_playlist_iterator.rs index ccc5172e2..7a13f3b4f 100644 --- a/src/repository/m3u_playlist_iterator.rs +++ b/src/repository/m3u_playlist_iterator.rs @@ -23,6 +23,7 @@ pub struct M3uPlaylistIterator { rewrite_resource: bool, proxy_type: ProxyType, filter: Option>, + lookup_item: Option<(M3uPlaylistItem, bool)>, _file_lock: FileReadGuard, } @@ -57,6 +58,7 @@ impl M3uPlaylistIterator { proxy_type: user.proxy.clone(), _file_lock: file_lock, // Save lock inside struct rewrite_resource: cfg.is_reverse_proxy_resource_rewrite_enabled(), + lookup_item: None, }) } @@ -94,7 +96,21 @@ impl M3uPlaylistIterator { fn get_next(&mut self) -> Option<(M3uPlaylistItem, bool)> { let entry = if let Some(set) = &self.filter { - self.reader.find(|(pli, _has_next)| set.contains(&pli.group.to_string())) + if let Some((current_item, _)) = self.lookup_item.take() { + let next_valid = self.reader.find(|(pli, _)| set.contains(&pli.group.to_string())); + self.lookup_item = next_valid; + let has_next = self.lookup_item.is_some(); + Some((current_item, has_next)) + } else { + let current_item = self.reader.find(|(item, _)| set.contains(&item.group.to_string())); + if let Some((item, _)) = current_item { + self.lookup_item = self.reader.find(|(item, _)| set.contains(&item.group.to_string())); + let has_next = self.lookup_item.is_some(); + Some((item, has_next)) + } else { + None + } + } } else { self.reader.next() }; diff --git a/src/repository/xtream_playlist_iterator.rs b/src/repository/xtream_playlist_iterator.rs index 3a31ca2dc..513764e77 100644 --- a/src/repository/xtream_playlist_iterator.rs +++ b/src/repository/xtream_playlist_iterator.rs @@ -15,9 +15,10 @@ pub struct XtreamPlaylistIterator { reader: IndexedDocumentIterator, options: XtreamMappingOptions, filter: Option>, - _file_lock: FileReadGuard, base_url: String, user: ProxyUserCredentials, + lookup_item: Option<(XtreamPlaylistItem, bool)>, // this is for filtered iteration + _file_lock: FileReadGuard, } impl XtreamPlaylistIterator { @@ -51,6 +52,7 @@ impl XtreamPlaylistIterator { _file_lock: file_lock, base_url: server_info.get_base_url(), user: user.clone(), + lookup_item: None, }) } else { Err(info_err!(format!("Failed to find xtream storage for target {}", &target.name))) @@ -63,7 +65,21 @@ impl XtreamPlaylistIterator { return None; } if let Some(set) = &self.filter { - self.reader.find(|(pli, _has_next)| set.contains(&pli.category_id.to_string())) + if let Some((current_item, _)) = self.lookup_item.take() { + let next_valid = self.reader.find(|(pli, _)| set.contains(&pli.category_id.to_string())); + self.lookup_item = next_valid; + let has_next = self.lookup_item.is_some(); + Some((current_item, has_next)) + } else { + let current_item = self.reader.find(|(item, _)| set.contains(&item.category_id.to_string())); + if let Some((item, _)) = current_item { + self.lookup_item = self.reader.find(|(item, _)| set.contains(&item.category_id.to_string())); + let has_next = self.lookup_item.is_some(); + Some((item, has_next)) + } else { + None + } + } } else { self.reader.next() } From 66456423b25cd89e4cb38646a33cf5c75d6be83c Mon Sep 17 00:00:00 2001 From: euzu Date: Fri, 23 May 2025 09:47:35 +0200 Subject: [PATCH 2/2] Fixed trailing comma on playlist stream iterator with filter --- src/repository/m3u_playlist_iterator.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/repository/m3u_playlist_iterator.rs b/src/repository/m3u_playlist_iterator.rs index 7a13f3b4f..0bb9ade32 100644 --- a/src/repository/m3u_playlist_iterator.rs +++ b/src/repository/m3u_playlist_iterator.rs @@ -116,7 +116,7 @@ impl M3uPlaylistIterator { }; // TODO hls and unknown reverse proxy - entry.map(|(mut m3u_pli, _has_next)| { + entry.map(|(mut m3u_pli, has_next)| { let is_redirect = self.proxy_type.is_redirect(m3u_pli.item_type) || self.target_options.as_ref().and_then(|o| o.force_redirect.as_ref()).is_some_and(|f| f.has_cluster(m3u_pli.item_type)); let should_rewrite_urls = if is_redirect { self.mask_redirect_url} else { true }; let rewrite_urls = if should_rewrite_urls { @@ -130,7 +130,7 @@ impl M3uPlaylistIterator { m3u_pli.t_stream_url = stream_url.to_string(); m3u_pli.t_resource_url = resource_url.map(|s| s.to_string()); - (m3u_pli, self.reader.has_next()) + (m3u_pli, has_next) }) } }