From 12087b5571643095d90eb5ecc1825594d93e31da Mon Sep 17 00:00:00 2001 From: Pierre d'Herbemont Date: Sat, 19 Jan 2008 20:56:18 +0000 Subject: [PATCH] services/discovery/shout.c: Add a French TV service discovery. For now it only has C+ and les guignols. --- modules/services_discovery/shout.c | 132 ++++++++++++++++++++++++----- 1 file changed, 111 insertions(+), 21 deletions(-) diff --git a/modules/services_discovery/shout.c b/modules/services_discovery/shout.c index 6172df0afb..b66e9b0777 100644 --- a/modules/services_discovery/shout.c +++ b/modules/services_discovery/shout.c @@ -34,35 +34,66 @@ * Module descriptor *****************************************************************************/ -enum type_e { ShoutRadio = 0, ShoutTV = 1, Freebox = 2 }; +enum type_e { ShoutRadio = 0, ShoutTV = 1, Freebox = 2, FrenchTV = 3 }; static int Open( vlc_object_t *, enum type_e ); static void Close( vlc_object_t * ); -static const struct +struct shout_item_t { const char *psz_url; const char *psz_name; const char *ppsz_options[2]; -} p_items[] = { - { "http/shout-winamp://www.shoutcast.com/sbin/newxml.phtml", - N_("Shoutcast Radio"), { NULL } }, - { "http/shout-winamp://www.shoutcast.com/sbin/newtvlister.phtml?alltv=1", - N_("Shoutcast TV"), { NULL } }, - { "http://mafreebox.freebox.fr/freeboxtv/playlist.m3u", - N_("Freebox TV"), { "m3u-extvlcopt=1", NULL } }, + const struct shout_item_t * p_children; +}; + +#define endItem( ) { NULL, NULL, { NULL }, NULL } +#define item( title, url ) { url, title, { NULL }, NULL } +#define itemWithOption( title, url, option ) { url, title, { option, NULL }, NULL } +#define itemWithChildren( title, children ) { "vlc:skip", title, { NULL }, children } + +/* WARN: We support only two levels */ + +static const struct shout_item_t p_frenchtv_canalplus[] = { + item( N_("Les Guignols"), "http://www.canalplus.fr/index.php?pid=1784" ), + endItem() +}; + +static const struct shout_item_t p_frenchtv[] = { + itemWithChildren( N_("Canal +"), p_frenchtv_canalplus ), + endItem() +}; + +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" ), + itemWithOption ( N_("Freebox TV"), "http://mafreebox.freebox.fr/freeboxtv/playlist.m3u", "m3u-extvlcopt=1" ), + itemWithChildren(N_("French TV"), p_frenchtv ), + endItem() +}; + +#undef endItem +#undef item +#undef itemWithOptions +#undef itemWithChildren + +struct shout_category_t { + services_discovery_t * p_sd; + const char * psz_category; }; /* Main functions */ #define OPEN( type ) \ static int Open ## type ( vlc_object_t *p_this ) \ { \ + msg_Dbg( p_this, "Starting " #type ); \ return Open( p_this, type ); \ } OPEN( ShoutRadio ) OPEN( ShoutTV ) OPEN( Freebox ) +OPEN( FrenchTV ) vlc_module_begin(); set_category( CAT_PLAYLIST ); @@ -83,6 +114,13 @@ vlc_module_begin(); set_callbacks( OpenShoutTV, Close ); add_shortcut( "shoutcasttv" ); + add_submodule(); + set_shortname( "frenchtv"); + set_description( _("French TV") ); + set_capability( "services_discovery", 0 ); + set_callbacks( OpenFrenchTV, Close ); + add_shortcut( "frenchtv" ); + add_submodule(); set_shortname( "Freebox"); set_description( _("Freebox TV listing (French ISP free.fr services)") ); @@ -117,34 +155,86 @@ 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 ) { - services_discovery_t *p_sd = user_data; - services_discovery_AddItem( p_sd, + struct shout_category_t * params = user_data; + services_discovery_AddItem( params->p_sd, p_event->u.input_item_subitem_added.p_new_child, - NULL /* no category */ ); + params->psz_category ); } /***************************************************************************** - * Run: + * CreateInputItemFromShoutItem: *****************************************************************************/ -static void Run( services_discovery_t *p_sd ) +static input_item_t * CreateInputItemFromShoutItem( services_discovery_t *p_sd, + const struct shout_item_t * p_item ) { - enum type_e i_type = (enum type_e)p_sd->p_sys; int i; + /* Create the item */ input_item_t *p_input = input_ItemNewExt( p_sd, - p_items[i_type].psz_url, _(p_items[i_type].psz_name), - 0, NULL, -1 ); - for( i = 0; p_items[i_type].ppsz_options[i] != NULL; i++ ) - input_ItemAddOption( p_input, p_items[i_type].ppsz_options[i] ); + p_item->psz_url, _(p_item->psz_name), + 0, NULL, -1 ); + + /* Copy options */ + for( i = 0; p_item->ppsz_options[i] != NULL; i++ ) + input_ItemAddOption( p_input, p_item->ppsz_options[i] ); input_ItemAddOption( p_input, "no-playlist-autostart" ); + return p_input; +} + +/***************************************************************************** + * AddSubitemsOfShoutItemURL: + *****************************************************************************/ +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 }; + + /* Create the item */ + input_item_t *p_input = CreateInputItemFromShoutItem( p_sd, p_item ); + + /* Read every subitems, and add them in ItemAdded */ vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemAdded, - ItemAdded, p_sd ); + ItemAdded, &category ); input_Read( p_sd, p_input, VLC_TRUE ); vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded, - ItemAdded, p_sd ); + ItemAdded, &category ); + vlc_gc_decref( p_input ); } +/***************************************************************************** + * Run: + *****************************************************************************/ +static void Run( services_discovery_t *p_sd ) +{ + enum type_e i_type = (enum type_e)p_sd->p_sys; + int i, j; + + if( !p_items[i_type].p_children ) + { + AddSubitemsOfShoutItemURL( p_sd, &p_items[i_type], NULL ); + return; + } + for( i = 0; p_items[i_type].p_children[i].psz_name; i++ ) + { + const struct shout_item_t * p_subitem = &p_items[i_type].p_children[i]; + if( !p_subitem->p_children ) + { + AddSubitemsOfShoutItemURL( p_sd, p_subitem, p_subitem->psz_name ); + continue; + } + for( j = 0; p_subitem->p_children[j].psz_name; j++ ) + { + input_item_t *p_input = CreateInputItemFromShoutItem( p_sd, &p_subitem->p_children[j] ); + services_discovery_AddItem( p_sd, + p_input, + p_subitem->psz_name ); + vlc_gc_decref( p_input ); + } + } +} + /***************************************************************************** * Close: *****************************************************************************/ -- 2.39.2