X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fservices_discovery%2Fshout.c;h=b8f40f112a7304f4a5c38156b07096778240a92e;hb=66ee062c868b962cdf7731b5b5bdedde29f22bf7;hp=bab1f0204b8370572e9e95697daa8f13f792cf25;hpb=d11fd0d1e5433a5299fbf0f0150178178ebd3f83;p=vlc diff --git a/modules/services_discovery/shout.c b/modules/services_discovery/shout.c index bab1f0204b..b8f40f112a 100644 --- a/modules/services_discovery/shout.c +++ b/modules/services_discovery/shout.c @@ -72,7 +72,7 @@ static const struct shout_item_t p_frenchtv[] = { static const struct shout_item_t p_items[] = { item( N_("Shoutcast Radio"), "http/shout-winamp://www.shoutcast.com/sbin/newxml.phtml" ), item( N_("Shoutcast TV"), "http/shout-winamp://www.shoutcast.com/sbin/newtvlister.phtml?alltv=1" ), - item( N_("Freebox TV"), "http://mafreebox.freebox.fr/freeboxtv/playlist.m3u" ), + itemWithOption( N_("Freebox TV"),"http://mafreebox.freebox.fr/freeboxtv/playlist.m3u", "deinterlace=1"), itemWithChildren(N_("French TV"), p_frenchtv ), endItem() }; @@ -85,6 +85,7 @@ static const struct shout_item_t p_items[] = { struct shout_category_t { services_discovery_t * p_sd; const char * psz_category; + const struct shout_item_t * p_parent; }; /* Main functions */ @@ -100,48 +101,57 @@ OPEN( ShoutTV ) OPEN( Freebox ) OPEN( FrenchTV ) -vlc_module_begin(); - set_category( CAT_PLAYLIST ); - set_subcategory( SUBCAT_PLAYLIST_SD ); +#undef OPEN - add_obsolete_integer( "shoutcast-limit" ); +static int vlc_sd_probe_Open( vlc_object_t * ); - set_shortname( "Shoutcast"); - set_description( N_("Shoutcast radio listings") ); - set_capability( "services_discovery", 0 ); - set_callbacks( OpenShoutRadio, Close ); - add_shortcut( "shoutcast" ); +vlc_module_begin () + set_category( CAT_PLAYLIST ) + set_subcategory( SUBCAT_PLAYLIST_SD ) - add_submodule(); - set_shortname( "ShoutcastTV" ); - set_description( N_("Shoutcast TV listings") ); - set_capability( "services_discovery", 0 ); - set_callbacks( OpenShoutTV, Close ); - add_shortcut( "shoutcasttv" ); + add_obsolete_integer( "shoutcast-limit" ) - add_submodule(); - set_shortname( "frenchtv"); - set_description( N_("French TV") ); - set_capability( "services_discovery", 0 ); - set_callbacks( OpenFrenchTV, Close ); - add_shortcut( "frenchtv" ); + set_shortname( "Shoutcast") + set_description( N_("Shoutcast Radio") ) + set_capability( "services_discovery", 0 ) + set_callbacks( OpenShoutRadio, Close ) + add_shortcut( "shoutcast" ) - add_submodule(); - set_shortname( "Freebox"); - set_description( N_("Freebox TV listing (French ISP free.fr services)") ); - set_capability( "services_discovery", 0 ); - set_callbacks( OpenFreebox, Close ); - add_shortcut( "freebox" ); + add_submodule () + set_shortname( "ShoutcastTV" ) + set_description( N_("Shoutcast TV") ) + set_capability( "services_discovery", 0 ) + set_callbacks( OpenShoutTV, Close ) + add_shortcut( "shoutcasttv" ) -vlc_module_end(); + add_submodule () + set_shortname( "frenchtv") + set_description( N_("French TV") ) + set_capability( "services_discovery", 0 ) + set_callbacks( OpenFrenchTV, Close ) + add_shortcut( "frenchtv" ) + + add_submodule () + set_shortname( "Freebox") + set_description( N_("Freebox TV") ) + set_capability( "services_discovery", 0 ) + set_callbacks( OpenFreebox, Close ) + add_shortcut( "freebox" ) + + VLC_SD_PROBE_SUBMODULE +vlc_module_end () /***************************************************************************** * Local prototypes *****************************************************************************/ -static void Run( services_discovery_t *p_sd ); - +static void *Run( void * ); +struct services_discovery_sys_t +{ + vlc_thread_t thread; + enum type_e i_type; +}; /***************************************************************************** * Open: initialize and create stuff @@ -149,9 +159,17 @@ static void Run( services_discovery_t *p_sd ); static int Open( vlc_object_t *p_this, enum type_e i_type ) { services_discovery_t *p_sd = ( services_discovery_t* )p_this; - services_discovery_SetLocalizedName( p_sd, _(p_items[i_type].psz_name) ); - p_sd->pf_run = Run; - p_sd->p_sys = (void *)i_type; + + p_sd->p_sys = malloc (sizeof (*(p_sd->p_sys))); + if (p_sd->p_sys == NULL) + return VLC_ENOMEM; + + p_sd->p_sys->i_type = i_type; + if (vlc_clone (&p_sd->p_sys->thread, Run, p_sd, VLC_THREAD_PRIORITY_LOW)) + { + free (p_sd->p_sys); + return VLC_EGENERIC; + } return VLC_SUCCESS; } @@ -161,9 +179,13 @@ static int Open( vlc_object_t *p_this, enum type_e i_type ) static void ItemAdded( const vlc_event_t * p_event, void * user_data ) { struct shout_category_t * params = user_data; - services_discovery_AddItem( params->p_sd, - p_event->u.input_item_subitem_added.p_new_child, - params->psz_category ); + const struct shout_item_t * p_parent = params->p_parent; + input_item_t * p_input = p_event->u.input_item_subitem_added.p_new_child; + + for(int i = 0; p_parent->ppsz_options[i] != NULL; i++) + input_item_AddOption( p_input, p_parent->ppsz_options[i], VLC_INPUT_OPTION_TRUSTED); + + services_discovery_AddItem( params->p_sd, p_input, params->psz_category ); } /***************************************************************************** @@ -172,16 +194,14 @@ static void ItemAdded( const vlc_event_t * p_event, void * user_data ) static input_item_t * CreateInputItemFromShoutItem( services_discovery_t *p_sd, const struct shout_item_t * p_item ) { - int i; /* Create the item */ - input_item_t *p_input = input_item_NewExt( p_sd, - p_item->psz_url, _(p_item->psz_name), - 0, NULL, -1 ); + input_item_t *p_input = input_item_New( p_sd, p_item->psz_url, + vlc_gettext(p_item->psz_name) ); /* Copy options */ - for( i = 0; p_item->ppsz_options[i] != NULL; i++ ) - input_item_AddOption( p_input, p_item->ppsz_options[i] ); - input_item_AddOption( p_input, "no-playlist-autostart" ); + for(int i = 0; p_item->ppsz_options[i] != NULL; i++) + input_item_AddOption( p_input, p_item->ppsz_options[i], VLC_INPUT_OPTION_TRUSTED ); + input_item_AddOption( p_input, "no-playlist-autostart", VLC_INPUT_OPTION_TRUSTED ); return p_input; } @@ -193,7 +213,7 @@ static void AddSubitemsOfShoutItemURL( services_discovery_t *p_sd, const struct shout_item_t * p_item, const char * psz_category ) { - struct shout_category_t category = { p_sd, psz_category }; + struct shout_category_t category = { p_sd, psz_category, p_item }; /* Create the item */ input_item_t *p_input = CreateInputItemFromShoutItem( p_sd, p_item ); @@ -201,7 +221,7 @@ static void AddSubitemsOfShoutItemURL( services_discovery_t *p_sd, /* Read every subitems, and add them in ItemAdded */ vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemAdded, ItemAdded, &category ); - input_Read( p_sd, p_input, true ); + input_Read( p_sd, p_input ); vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded, ItemAdded, &category ); @@ -211,15 +231,19 @@ static void AddSubitemsOfShoutItemURL( services_discovery_t *p_sd, /***************************************************************************** * Run: *****************************************************************************/ -static void Run( services_discovery_t *p_sd ) +static void *Run( void *data ) { - enum type_e i_type = (enum type_e)p_sd->p_sys; + services_discovery_t *p_sd = data; + services_discovery_sys_t *p_sys = p_sd->p_sys; + enum type_e i_type = p_sys->i_type; int i, j; + int canc = vlc_savecancel(); if( !p_items[i_type].p_children ) { AddSubitemsOfShoutItemURL( p_sd, &p_items[i_type], NULL ); - return; + vlc_restorecancel(canc); + return NULL; } for( i = 0; p_items[i_type].p_children[i].psz_name; i++ ) { @@ -238,6 +262,8 @@ static void Run( services_discovery_t *p_sd ) vlc_gc_decref( p_input ); } } + vlc_restorecancel(canc); + return NULL; } /***************************************************************************** @@ -245,5 +271,19 @@ static void Run( services_discovery_t *p_sd ) *****************************************************************************/ static void Close( vlc_object_t *p_this ) { - VLC_UNUSED(p_this); + services_discovery_t *p_sd = (services_discovery_t *)p_this; + services_discovery_sys_t *p_sys = p_sd->p_sys; + + vlc_join (p_sys->thread, NULL); + free (p_sys); +} + +static int vlc_sd_probe_Open( vlc_object_t *obj ) +{ + vlc_probe_t *probe = (vlc_probe_t *)obj; + + vlc_sd_probe_Add( probe, "shoutcast", N_("Shoutcast Radio") ); + vlc_sd_probe_Add( probe, "shoutcasttv", N_("Shoutcast TV") ); + vlc_sd_probe_Add( probe, "frenchtv", N_("French TV") ); + return VLC_PROBE_CONTINUE; }