⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shout.c

📁 VLC Player Source Code
💻 C
字号:
/***************************************************************************** * shout.c:  Shoutcast services discovery module ***************************************************************************** * Copyright (C) 2005-2007 the VideoLAN team * $Id: bab1f0204b8370572e9e95697daa8f13f792cf25 $ * * Authors: Sigmund Augdal Helberg <dnumgis@videolan.org> *          Antoine Cellerier <dionoea -@T- videolan -d.t- org> *          Pierre d'Herbemont <pdherbemont # videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//***************************************************************************** * Includes *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <vlc_plugin.h>#include <vlc_services_discovery.h>/***************************************************************************** * Module descriptor *****************************************************************************/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 * );struct shout_item_t{    const char *psz_url;    const char *psz_name;    const char *ppsz_options[2];    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://nop", title, { NULL }, children }/* WARN: We support only two levels */static const struct shout_item_t p_frenchtv_canalplus[] = {    itemWithOption( N_("Les Guignols"), "http://www.canalplus.fr/index.php?pid=1784", "http-forward-cookies" ),    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" ),    item(            N_("Freebox TV"),      "http://mafreebox.freebox.fr/freeboxtv/playlist.m3u" ),    itemWithChildren(N_("French TV"),        p_frenchtv ),    endItem()};#undef endItem#undef item#undef itemWithOptions#undef itemWithChildrenstruct 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 );    set_subcategory( SUBCAT_PLAYLIST_SD );    add_obsolete_integer( "shoutcast-limit" );        set_shortname( "Shoutcast");        set_description( N_("Shoutcast radio listings") );        set_capability( "services_discovery", 0 );        set_callbacks( OpenShoutRadio, Close );        add_shortcut( "shoutcast" );    add_submodule();        set_shortname( "ShoutcastTV" );        set_description( N_("Shoutcast TV listings") );        set_capability( "services_discovery", 0 );        set_callbacks( OpenShoutTV, Close );        add_shortcut( "shoutcasttv" );    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 listing (French ISP free.fr services)") );        set_capability( "services_discovery", 0 );        set_callbacks( OpenFreebox, Close );        add_shortcut( "freebox" );vlc_module_end();/***************************************************************************** * Local prototypes *****************************************************************************/static void Run( services_discovery_t *p_sd );/***************************************************************************** * Open: initialize and create stuff *****************************************************************************/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;    return VLC_SUCCESS;}/***************************************************************************** * ItemAdded: *****************************************************************************/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 );}/***************************************************************************** * CreateInputItemFromShoutItem: *****************************************************************************/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 );    /* 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" );    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, &category );    input_Read( p_sd, p_input, true );    vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded,                      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: *****************************************************************************/static void Close( vlc_object_t *p_this ){    VLC_UNUSED(p_this);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -