clapper: Ensure redirects for an item are from single source

In cases where there are multiple objects resolving a playlist at once
(e.g. player starts playing playlist item that Media Scanner also works on),
just ignore parsing results from the other parser. We keep/use parsing
results from whichever parser parsed the playlist first.
This commit is contained in:
Rafał Dzięgiel
2025-11-22 20:59:13 +01:00
parent d7221846bd
commit 5eb2cf2eb8

View File

@@ -54,6 +54,7 @@ struct _ClapperMediaItem
/* Whether using title from URI */
gboolean title_is_parsed;
GType redirects_src_type;
gchar *redirect_uri;
gchar *cache_uri;
@@ -684,6 +685,8 @@ static inline gboolean
clapper_media_item_set_redirect_uri (ClapperMediaItem *self, const gchar *redirect_uri,
GstObject *redirect_src)
{
GType src_type;
/* Safety checks */
if (G_UNLIKELY (!redirect_uri)) {
GST_ERROR_OBJECT (self, "Received redirect request without an URI set");
@@ -694,6 +697,18 @@ clapper_media_item_set_redirect_uri (ClapperMediaItem *self, const gchar *redire
return FALSE;
}
/* Only allow redirects determined by the same source type, otherwise
* we would start mixing URIs when multiple sources message them */
src_type = G_OBJECT_TYPE (redirect_src);
if (self->redirects_src_type == 0) {
self->redirects_src_type = src_type;
} else if (self->redirects_src_type != src_type) {
GST_LOG_OBJECT (self, "Ignoring redirection from different source: %s",
G_OBJECT_TYPE_NAME (redirect_src));
return FALSE;
}
g_set_str (&self->redirect_uri, redirect_uri);
GST_DEBUG_OBJECT (self, "Set redirect URI: \"%s\", source: %s",
self->redirect_uri, G_OBJECT_TYPE_NAME (redirect_src));