+ services_discovery_sys_t *p_sys = p_sd->p_sys;
+
+ /* Launch the callback associated with this variable */
+ var_Create( p_sd, "podcast-urls", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
+ var_AddCallback( p_sd, "podcast-urls", UrlsChange, p_sys );
+
+ while( vlc_object_alive (p_sd) )
+ {
+ int i;
+ if( p_sys->b_update == true )
+ {
+ msg_Dbg( p_sd, "Update required" );
+ char* psz_urls = var_GetNonEmptyString( p_sd, "podcast-urls" );
+ if( psz_urls != NULL )
+ ParseUrls( p_sd, psz_urls );
+ free( psz_urls );
+ p_sys->b_update = false;
+ }
+
+ for( i = 0; i < p_sd->p_sys->i_input; i++ )
+ {
+ if( p_sd->p_sys->pp_input[i]->b_eof
+ || p_sd->p_sys->pp_input[i]->b_error )
+ {
+ input_StopThread( p_sd->p_sys->pp_input[i] );
+ vlc_object_release( p_sd->p_sys->pp_input[i] );
+ p_sd->p_sys->pp_input[i] = NULL;
+ REMOVE_ELEM( p_sys->pp_input, p_sys->i_input, i );
+ i--;
+ }
+ }
+ msleep( 500 );
+ }
+}
+
+static int UrlsChange( vlc_object_t *p_this, char const *psz_var,
+ vlc_value_t oldval, vlc_value_t newval,
+ void *p_data )
+{
+ VLC_UNUSED(p_this); VLC_UNUSED(psz_var); VLC_UNUSED(oldval);
+ VLC_UNUSED(newval);
+ services_discovery_sys_t *p_sys = (services_discovery_sys_t *)p_data;
+ p_sys->b_update = true;
+ return VLC_SUCCESS;
+}
+
+static void ParseUrls( services_discovery_t *p_sd, char *psz_urls )
+{
+ services_discovery_sys_t *p_sys = p_sd->p_sys;
+ for( ;; )