X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=inline;f=modules%2Fdemux%2Fplaylist%2Fshoutcast.c;h=e5257de3dd1d61b001f0f744e7b36e9367017d6e;hb=7d5bf1ea1baaaad1dbd494312b725e18b00c1de9;hp=14330329a81b1cc1036f12fb6e756ab7fee769a1;hpb=db5d2044c2d6828d22fe15200ed48a1a79f1c70a;p=vlc diff --git a/modules/demux/playlist/shoutcast.c b/modules/demux/playlist/shoutcast.c index 14330329a8..e5257de3dd 100644 --- a/modules/demux/playlist/shoutcast.c +++ b/modules/demux/playlist/shoutcast.c @@ -25,26 +25,25 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* malloc(), free() */ -#include /* isspace() */ -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include -#include /* ENOMEM */ #include "playlist.h" #include "vlc_xml.h" struct demux_sys_t { - playlist_t *p_playlist; - playlist_item_t *p_current; + input_item_t *p_current_input; xml_t *p_xml; xml_reader_t *p_xml_reader; - vlc_bool_t b_adult; + bool b_adult; }; /* duplicate from modules/services_discovery/shout.c */ @@ -64,38 +63,21 @@ static int DemuxStation( demux_t *p_demux ); /***************************************************************************** * Import_Shoutcast: main import function *****************************************************************************/ -int E_(Import_Shoutcast)( vlc_object_t *p_this ) +int Import_Shoutcast( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t *)p_this; - demux_sys_t *p_sys; - - char *psz_ext; - psz_ext = strrchr ( p_demux->psz_path, '.' ); - - if( !p_demux->psz_demux || strcmp(p_demux->psz_demux, "shout-winamp") ) - { + if( !demux_IsForced( p_demux, "shout-winamp" ) ) return VLC_EGENERIC; - } - msg_Dbg( p_demux, "using shoutcast playlist import"); - p_demux->pf_control = Control; - p_demux->pf_demux = Demux; - p_demux->p_sys = p_sys = malloc( sizeof(demux_sys_t) ); - if( p_sys == NULL ) - { - msg_Err( p_demux, "out of memory" ); - return VLC_ENOMEM; - } - - p_sys->p_playlist = NULL; - p_sys->p_xml = NULL; - p_sys->p_xml_reader = NULL; + STANDARD_DEMUX_INIT_MSG( "using shoutcast playlist reader" ); + p_demux->p_sys->p_xml = NULL; + p_demux->p_sys->p_xml_reader = NULL; /* Do we want to list adult content ? */ var_Create( p_demux, "shoutcast-show-adult", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); - p_sys->b_adult = var_GetBool( p_demux, "shoutcast-show-adult" ); + p_demux->p_sys->b_adult = var_GetBool( p_demux, "shoutcast-show-adult" ); return VLC_SUCCESS; } @@ -103,13 +85,11 @@ int E_(Import_Shoutcast)( vlc_object_t *p_this ) /***************************************************************************** * Deactivate: frees unused data *****************************************************************************/ -void E_(Close_Shoutcast)( vlc_object_t *p_this ) +void Close_Shoutcast( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t *)p_this; demux_sys_t *p_sys = p_demux->p_sys; - if( p_sys->p_playlist ) - vlc_object_release( p_sys->p_playlist ); if( p_sys->p_xml_reader ) xml_ReaderDelete( p_sys->p_xml, p_sys->p_xml_reader ); if( p_sys->p_xml ) @@ -120,30 +100,11 @@ void E_(Close_Shoutcast)( vlc_object_t *p_this ) static int Demux( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; - playlist_t *p_playlist; - - vlc_bool_t b_play; - xml_t *p_xml; xml_reader_t *p_xml_reader; - char *psz_eltname = NULL; - - - p_playlist = (playlist_t *) vlc_object_find( p_demux, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( !p_playlist ) - { - msg_Err( p_demux, "can't find playlist" ); - return -1; - } - p_sys->p_playlist = p_playlist; - - b_play = E_(FindItem)( p_demux, p_playlist, &p_sys->p_current ); - - msg_Warn( p_demux, "item: %s", p_sys->p_current->input.psz_name ); - playlist_ItemToNode( p_playlist, p_sys->p_current ); - p_sys->p_current->input.i_type = ITEM_TYPE_PLAYLIST; + INIT_PLAYLIST_STUFF; + p_sys->p_current_input = p_current_input; p_xml = p_sys->p_xml = xml_Create( p_demux ); if( !p_xml ) return -1; @@ -152,7 +113,6 @@ static int Demux( demux_t *p_demux ) if( !p_xml_reader ) return -1; p_sys->p_xml_reader = p_xml_reader; - /* xml */ /* check root node */ if( xml_ReaderRead( p_xml_reader ) != 1 ) { @@ -167,7 +127,7 @@ static int Demux( demux_t *p_demux ) { msg_Err( p_demux, "invalid root node %i, %s", xml_ReaderNodeType( p_xml_reader ), psz_eltname ); - if( psz_eltname ) free( psz_eltname ); + free( psz_eltname ); return -1; } @@ -184,19 +144,8 @@ static int Demux( demux_t *p_demux ) if( DemuxStation( p_demux ) ) return -1; } - /* Go back and play the playlist */ - if( b_play && p_playlist->status.p_item && - p_playlist->status.p_item->i_children > 0 ) - { - playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, - p_playlist->status.i_view, - p_playlist->status.p_item, - p_playlist->status.p_item->pp_children[0] ); - } - - vlc_object_release( p_playlist ); - p_sys->p_playlist = NULL; - return VLC_SUCCESS; + HANDLE_PLAY_AND_RELEASE; + return 0; /* Needed for correct operation of go back */ } #define GET_VALUE( a ) \ @@ -214,8 +163,8 @@ static int DemuxGenre( demux_t *p_demux ) demux_sys_t *p_sys = p_demux->p_sys; char *psz_name = NULL; /* genre name */ char *psz_eltname = NULL; /* tag name */ + input_item_t *p_input; -#define FREE(a) if( a ) free( a ); a = NULL; while( xml_ReaderRead( p_sys->p_xml_reader ) == 1 ) { int i_type; @@ -234,7 +183,6 @@ static int DemuxGenre( demux_t *p_demux ) psz_eltname = xml_ReaderName( p_sys->p_xml_reader ); if( !psz_eltname ) return -1; - if( !strcmp( psz_eltname, "genre" ) ) { // Read the attributes @@ -245,8 +193,8 @@ static int DemuxGenre( demux_t *p_demux ) xml_ReaderValue( p_sys->p_xml_reader ); if( !psz_attrname || !psz_attrvalue ) { - FREE(psz_attrname); - FREE(psz_attrvalue); + FREENULL(psz_attrname); + FREENULL(psz_attrvalue); free(psz_eltname); /*FIXME: isn't return a bit too much. what about break*/ return -1; @@ -257,8 +205,7 @@ static int DemuxGenre( demux_t *p_demux ) { msg_Warn( p_demux, "unexpected attribure %s in element %s", - psz_attrname, - psz_eltname ); + psz_attrname,psz_eltname ); } free( psz_attrname ); free( psz_attrvalue ); @@ -277,29 +224,19 @@ static int DemuxGenre( demux_t *p_demux ) if( !psz_eltname ) return -1; if( !strcmp( psz_eltname, "genre" ) ) { - playlist_item_t *p_item; - char *psz_mrl = malloc( strlen( SHOUTCAST_BASE_URL ) - + strlen( "?genre=" ) + strlen( psz_name ) + 1 ); - sprintf( psz_mrl, SHOUTCAST_BASE_URL "?genre=%s", - psz_name ); - p_item = playlist_ItemNew( p_sys->p_playlist, psz_mrl, - psz_name ); - free( psz_mrl ); - playlist_NodeAddItem( p_sys->p_playlist, p_item, - p_sys->p_current->pp_parents[0]->i_view, - p_sys->p_current, PLAYLIST_APPEND, - PLAYLIST_END ); - - /* We need to declare the parents of the node as the - * * same of the parent's ones */ - playlist_CopyParents( p_sys->p_current, p_item ); - - vlc_input_item_CopyOptions( &p_sys->p_current->input, - &p_item->input ); - - FREE( psz_name ); + char* psz_mrl; + if( asprintf( &psz_mrl, SHOUTCAST_BASE_URL "?genre=%s", + psz_name ) != -1 ) + { + p_input = input_item_New( p_demux, psz_mrl, psz_name ); + input_item_CopyOptions( p_sys->p_current_input, p_input ); + free( psz_mrl ); + input_item_AddSubItem( p_sys->p_current_input, p_input ); + vlc_gc_decref( p_input ); + } + FREENULL( psz_name ); } - FREE( psz_eltname ); + FREENULL( psz_eltname ); break; } } @@ -334,6 +271,7 @@ static int DemuxGenre( demux_t *p_demux ) static int DemuxStation( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; + input_item_t *p_input; char *psz_base = NULL; /* */ @@ -379,9 +317,9 @@ static int DemuxStation( demux_t *p_demux ) xml_ReaderValue( p_sys->p_xml_reader ); if( !psz_attrname || !psz_attrvalue ) { - free(psz_eltname); - FREE(psz_attrname); - FREE(psz_attrvalue); + free( psz_eltname ); + free( psz_attrname ); + free( psz_attrvalue ); return -1; } @@ -390,8 +328,7 @@ static int DemuxStation( demux_t *p_demux ) { msg_Warn( p_demux, "unexpected attribure %s in element %s", - psz_attrname, - psz_eltname ); + psz_attrname, psz_eltname ); } free( psz_attrname ); free( psz_attrvalue ); @@ -406,9 +343,9 @@ static int DemuxStation( demux_t *p_demux ) xml_ReaderValue( p_sys->p_xml_reader ); if( !psz_attrname || !psz_attrvalue ) { - free(psz_eltname); - FREE(psz_attrname); - FREE(psz_attrvalue); + free( psz_eltname ); + free( psz_attrname ); + free( psz_attrvalue ); return -1; } @@ -424,15 +361,14 @@ static int DemuxStation( demux_t *p_demux ) else { msg_Warn( p_demux, - "unexpected attribure %s in element %s", - psz_attrname, - psz_eltname ); + "unexpected attribute %s in element %s", + psz_attrname, psz_eltname ); } free( psz_attrname ); free( psz_attrvalue ); } } - free(psz_eltname); + free( psz_eltname ); break; case XML_READER_TEXT: @@ -447,106 +383,49 @@ static int DemuxStation( demux_t *p_demux ) ( psz_base || ( psz_rt && psz_load && ( p_sys->b_adult || strcmp( psz_rt, "NC17" ) ) ) ) ) { - playlist_item_t *p_item; char *psz_mrl = NULL; if( psz_rt || psz_load ) { /* tv */ - psz_mrl = malloc( strlen( SHOUTCAST_TV_TUNEIN_URL ) - + strlen( psz_id ) + 1 ); - sprintf( psz_mrl, SHOUTCAST_TV_TUNEIN_URL "%s", - psz_id ); + if( asprintf( &psz_mrl, SHOUTCAST_TV_TUNEIN_URL "%s", + psz_id ) == -1) + psz_mrl = NULL; } else { /* radio */ - psz_mrl = malloc( strlen( SHOUTCAST_TUNEIN_BASE_URL ) - + strlen( psz_base ) + strlen( "?id=" ) - + strlen( psz_id ) + 1 ); - sprintf( psz_mrl, SHOUTCAST_TUNEIN_BASE_URL "%s?id=%s", - psz_base, psz_id ); + if( asprintf( &psz_mrl, SHOUTCAST_TUNEIN_BASE_URL "%s?id=%s", + psz_base, psz_id ) == -1 ) + psz_mrl = NULL; } - p_item = playlist_ItemNew( p_sys->p_playlist, psz_mrl, - psz_name ); + p_input = input_item_New( p_demux, psz_mrl, psz_name ); + input_item_CopyOptions( p_sys->p_current_input, p_input ); free( psz_mrl ); - if( psz_mt ) - { - vlc_input_item_AddInfo( &p_item->input, - _( "Shoutcast" ), - _( "Mime type" ), - "%s", - psz_mt ); - } - if( psz_br ) - { - vlc_input_item_AddInfo( &p_item->input, - _( "Shoutcast" ), - _( "Bitrate" ), - "%s", - psz_br ); - } +#define SADD_INFO( type, field ) \ + if( field ) \ + input_item_AddInfo( p_input, _("Shoutcast"), \ + vlc_gettext(type), "%s", field ) + SADD_INFO( N_("Mime"), psz_mt ); + SADD_INFO( N_("Bitrate"), psz_br ); + SADD_INFO( N_("Listeners"), psz_lc ); + SADD_INFO( N_("Load"), psz_load ); if( psz_genre ) - { - vlc_input_item_AddInfo( &p_item->input, - _(VLC_META_INFO_CAT), - _(VLC_META_GENRE), - "%s", - psz_genre ); - } + input_item_SetGenre( p_input, psz_genre ); if( psz_ct ) - { - vlc_input_item_AddInfo( &p_item->input, - _(VLC_META_INFO_CAT), - _(VLC_META_NOW_PLAYING), - "%s", - psz_ct ); - } - if( psz_lc ) - { - vlc_input_item_AddInfo( &p_item->input, - _( "Shoutcast" ), - _( "Listeners" ), - "%s", - psz_lc ); - } + input_item_SetNowPlaying( p_input, psz_ct ); if( psz_rt ) - { - vlc_input_item_AddInfo( &p_item->input, - _(VLC_META_INFO_CAT), - _(VLC_META_RATING), - "%s", - psz_rt ); - } - if( psz_load ) - { - vlc_input_item_AddInfo( &p_item->input, - _( "Shoutcast" ), - _( "Load" ), - "%s", - psz_load ); - } - - playlist_NodeAddItem( p_sys->p_playlist, p_item, - p_sys->p_current->pp_parents[0]->i_view, - p_sys->p_current, PLAYLIST_APPEND, - PLAYLIST_END ); - - /* We need to declare the parents of the node as the - * * same of the parent's ones */ - playlist_CopyParents( p_sys->p_current, p_item ); - - vlc_input_item_CopyOptions( &p_sys->p_current->input, - &p_item->input ); - - FREE( psz_name ); - FREE( psz_mt ) - FREE( psz_id ) - FREE( psz_br ) - FREE( psz_genre ) - FREE( psz_ct ) - FREE( psz_lc ) - FREE( psz_rt ) + input_item_SetRating( p_input, psz_rt ); + input_item_AddSubItem( p_sys->p_current_input, p_input ); + vlc_gc_decref( p_input ); + FREENULL( psz_name ); + FREENULL( psz_mt ); + FREENULL( psz_id ); + FREENULL( psz_br ); + FREENULL( psz_genre ); + FREENULL( psz_ct ); + FREENULL( psz_lc ); + FREENULL( psz_rt ); } free( psz_eltname ); break; @@ -554,9 +433,9 @@ static int DemuxStation( demux_t *p_demux ) } return 0; } -#undef FREE static int Control( demux_t *p_demux, int i_query, va_list args ) { + VLC_UNUSED(p_demux); VLC_UNUSED(i_query); VLC_UNUSED(args); return VLC_EGENERIC; }