📄 shoutcast.c
字号:
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_eltname ); break; } } return 0;}/* radio stations: * <stationlist> * <tunein base="/sbin/tunein-station.pls"></tunein> * <station name="the name" * mt="mime type" * id="the id" * br="bit rate" * genre="A big genre string" * ct="current track name/author/..." * lc="listener count"></station> * </stationlist> * * TV stations: * <stationlist> * <tunein base="/sbin/tunein-station.pls"></tunein> * <station name="the name" * id="the id" * br="bit rate" * rt="rating" * load="server load ?" * ct="current track name/author/..." * genre="A big genre string" * lc="listener count"></station> * </stationlist> **/static int DemuxStation( demux_t *p_demux ){ demux_sys_t *p_sys = p_demux->p_sys; char *psz_base = NULL; /* */ char *psz_name = NULL; /* genre name */ char *psz_mt = NULL; /* mime type */ char *psz_id = NULL; /* id */ char *psz_br = NULL; /* bit rate */ char *psz_genre = NULL; /* genre */ char *psz_ct = NULL; /* current track */ char *psz_lc = NULL; /* listener count */ /* If these are set then it's *not* a radio but a TV */ char *psz_rt = NULL; /* rating for shoutcast TV */ char *psz_load = NULL; /* load for shoutcast TV */ char *psz_eltname = NULL; /* tag name */ while( xml_ReaderRead( p_sys->p_xml_reader ) == 1 ) { int i_type; // Get the node type i_type = xml_ReaderNodeType( p_sys->p_xml_reader ); switch( i_type ) { // Error case -1: return -1; break; case XML_READER_STARTELEM: // Read the element name psz_eltname = xml_ReaderName( p_sys->p_xml_reader ); if( !psz_eltname ) return -1; // Read the attributes if( !strcmp( psz_eltname, "tunein" ) ) { while( xml_ReaderNextAttr( p_sys->p_xml_reader ) == VLC_SUCCESS ) { char *psz_attrname = xml_ReaderName( p_sys->p_xml_reader ); char *psz_attrvalue = xml_ReaderValue( p_sys->p_xml_reader ); if( !psz_attrname || !psz_attrvalue ) { free(psz_eltname); FREE(psz_attrname); FREE(psz_attrvalue); return -1; } GET_VALUE( base ) else { msg_Warn( p_demux, "unexpected attribure %s in element %s", psz_attrname, psz_eltname ); } free( psz_attrname ); free( psz_attrvalue ); } } else if( !strcmp( psz_eltname, "station" ) ) { while( xml_ReaderNextAttr( p_sys->p_xml_reader ) == VLC_SUCCESS ) { char *psz_attrname = xml_ReaderName( p_sys->p_xml_reader ); char *psz_attrvalue = xml_ReaderValue( p_sys->p_xml_reader ); if( !psz_attrname || !psz_attrvalue ) { free(psz_eltname); FREE(psz_attrname); FREE(psz_attrvalue); return -1; } GET_VALUE( name ) else GET_VALUE( mt ) else GET_VALUE( id ) else GET_VALUE( br ) else GET_VALUE( genre ) else GET_VALUE( ct ) else GET_VALUE( lc ) else GET_VALUE( rt ) else GET_VALUE( load ) else { msg_Warn( p_demux, "unexpected attribure %s in element %s", psz_attrname, psz_eltname ); } free( psz_attrname ); free( psz_attrvalue ); } } free(psz_eltname); break; case XML_READER_TEXT: break; // End element case XML_READER_ENDELEM: // Read the element name psz_eltname = xml_ReaderName( p_sys->p_xml_reader ); if( !psz_eltname ) return -1; if( !strcmp( psz_eltname, "station" ) && ( 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 ); } 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 ); } p_item = playlist_ItemNew( p_sys->p_playlist, psz_mrl, psz_name ); 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 ); } if( psz_genre ) { vlc_input_item_AddInfo( &p_item->input, _(VLC_META_INFO_CAT), _(VLC_META_GENRE), "%s", 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 ); } 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 ) } free( psz_eltname ); break; } } return 0;}#undef FREEstatic int Control( demux_t *p_demux, int i_query, va_list args ){ return VLC_EGENERIC;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -