From d331641e8818a4be2b6aa13d0a32b6ad7311698a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 5 Dec 2025 23:30:56 +0100 Subject: [PATCH 1/2] clapper: playlist-demux: Support searching for exclusions Sometimes data is similar and can be determined to be a playlist by NOT including some specific syntax (e.g. HLS). For this reason add ability to define an exclusion requirement for playlist parsers. --- src/lib/clapper/gst/clapper-playlist-demux.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lib/clapper/gst/clapper-playlist-demux.c b/src/lib/clapper/gst/clapper-playlist-demux.c index 7a668bb0..3f747e1f 100644 --- a/src/lib/clapper/gst/clapper-playlist-demux.c +++ b/src/lib/clapper/gst/clapper-playlist-demux.c @@ -67,7 +67,7 @@ static GstStaticCaps clapper_claps_caps = GST_STATIC_CAPS (CLAPPER_CLAPS_MEDIA_T static void clapper_playlist_type_find (GstTypeFind *tf, ClapperEnhancerProxy *proxy) { - const gchar *prefix, *contains, *regex, *module_name; + const gchar *prefix, *contains, *excludes, *regex, *module_name; if (!clapper_enhancer_proxy_get_target_creation_allowed (proxy)) return; @@ -81,9 +81,10 @@ clapper_playlist_type_find (GstTypeFind *tf, ClapperEnhancerProxy *proxy) } contains = clapper_enhancer_proxy_get_extra_data (proxy, "X-Data-Contains"); + excludes = clapper_enhancer_proxy_get_extra_data (proxy, "X-Data-Excludes"); regex = clapper_enhancer_proxy_get_extra_data (proxy, "X-Data-Regex"); - if (contains || regex) { + if (contains || excludes || regex) { const gchar *data; guint data_size = DATA_CHUNK_SIZE; @@ -101,7 +102,8 @@ clapper_playlist_type_find (GstTypeFind *tf, ClapperEnhancerProxy *proxy) return; } - if (contains && !g_strstr_len (data, data_size, contains)) + if ((contains && !g_strstr_len (data, data_size, contains)) + || (excludes && g_strstr_len (data, data_size, excludes))) return; if (regex) { @@ -180,6 +182,8 @@ type_find_register (GstPlugin *plugin) for (i = 0; i < n_proxies; ++i) { ClapperEnhancerProxy *proxy = clapper_enhancer_proxy_list_peek_proxy (global_proxies, i); + /* No "X-Data-Excludes" check here, because it can not be + * used alone to determine whether data is a playlist */ if (clapper_enhancer_proxy_target_has_interface (proxy, CLAPPER_TYPE_PLAYLISTABLE) && (clapper_enhancer_proxy_get_extra_data (proxy, "X-Data-Prefix") || clapper_enhancer_proxy_get_extra_data (proxy, "X-Data-Contains") From 5e62e89aefef39d91913c13df5dff43c7ab78b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 5 Dec 2025 23:33:07 +0100 Subject: [PATCH 2/2] doc: clapper: Document excludes keys in playlistables --- doc/reference/clapper/playlistable-enhancers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/reference/clapper/playlistable-enhancers.md b/doc/reference/clapper/playlistable-enhancers.md index 8308369c..d51e415e 100644 --- a/doc/reference/clapper/playlistable-enhancers.md +++ b/doc/reference/clapper/playlistable-enhancers.md @@ -24,6 +24,7 @@ Additional fields for `.plugin` info file: * `X-Data-Prefix` - describe text that data should start with * `X-Data-Contains` - data must contain given phrase +* `X-Data-Excludes` - data must not contain given phrase * `X-Data-Regex` - regular expression to run on data These are used by `typefinder` to determine whether given data is a playlist for