mirror of
https://code.videolan.org/videolan/vlc
synced 2024-09-04 09:11:33 +02:00
* XSPF nested playlist
This commit is contained in:
parent
78010fbc38
commit
890dbc2206
@ -477,7 +477,6 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE
|
|||||||
if( !strcmp( psz_name, psz_element ) )
|
if( !strcmp( psz_name, psz_element ) )
|
||||||
{
|
{
|
||||||
FREE_ATT();
|
FREE_ATT();
|
||||||
input_ItemAddSubItem( p_input_item, p_new_input );
|
|
||||||
if( p_demux->p_sys->i_identifier <
|
if( p_demux->p_sys->i_identifier <
|
||||||
p_demux->p_sys->i_tracklist_entries )
|
p_demux->p_sys->i_tracklist_entries )
|
||||||
{
|
{
|
||||||
@ -655,6 +654,7 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE
|
|||||||
char *psz_application = NULL;
|
char *psz_application = NULL;
|
||||||
int i_node;
|
int i_node;
|
||||||
xml_elem_hnd_t *p_handler = NULL;
|
xml_elem_hnd_t *p_handler = NULL;
|
||||||
|
input_item_t *p_new_input = NULL;
|
||||||
|
|
||||||
xml_elem_hnd_t pl_elements[] =
|
xml_elem_hnd_t pl_elements[] =
|
||||||
{ {"node", COMPLEX_CONTENT, {.cmplx = parse_extension_node} },
|
{ {"node", COMPLEX_CONTENT, {.cmplx = parse_extension_node} },
|
||||||
@ -691,14 +691,24 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* attribute title is mandatory except for <extension> */
|
/* attribute title is mandatory except for <extension> */
|
||||||
if( !strcmp( psz_element, "node" ) && !psz_title )
|
if( !strcmp( psz_element, "node" ) )
|
||||||
|
{
|
||||||
|
if( !psz_title )
|
||||||
{
|
{
|
||||||
msg_Warn( p_demux, "<node> requires \"title\" attribute" );
|
msg_Warn( p_demux, "<node> requires \"title\" attribute" );
|
||||||
return VLC_FALSE;
|
return VLC_FALSE;
|
||||||
}
|
}
|
||||||
free( psz_title );
|
|
||||||
|
|
||||||
if( !strcmp( psz_element, "extension" ) )
|
p_new_input = input_ItemNewWithType( p_playlist, "", psz_title,
|
||||||
|
0, NULL, -1, ITEM_TYPE_DIRECTORY );
|
||||||
|
if( p_new_input )
|
||||||
|
{
|
||||||
|
input_ItemAddSubItem( p_input_item, p_new_input );
|
||||||
|
p_input_item = p_new_input;
|
||||||
|
}
|
||||||
|
free( psz_title );
|
||||||
|
}
|
||||||
|
else if( !strcmp( psz_element, "extension" ) )
|
||||||
{
|
{
|
||||||
if( !psz_application )
|
if( !psz_application )
|
||||||
{
|
{
|
||||||
@ -824,6 +834,7 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE
|
|||||||
*/
|
*/
|
||||||
static vlc_bool_t parse_extitem_node COMPLEX_INTERFACE
|
static vlc_bool_t parse_extitem_node COMPLEX_INTERFACE
|
||||||
{
|
{
|
||||||
|
input_item_t *p_new_input = NULL;
|
||||||
char *psz_name = NULL;
|
char *psz_name = NULL;
|
||||||
char *psz_value = NULL;
|
char *psz_value = NULL;
|
||||||
int i_href = -1;
|
int i_href = -1;
|
||||||
@ -858,13 +869,17 @@ static vlc_bool_t parse_extitem_node COMPLEX_INTERFACE
|
|||||||
return VLC_FALSE;
|
return VLC_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: We can't check the validity of the 'href' attribute if we do parse
|
|
||||||
the extension before the TrackList
|
|
||||||
if( i_href > p_demux->p_sys->i_tracklist_entries )
|
if( i_href > p_demux->p_sys->i_tracklist_entries )
|
||||||
{
|
{
|
||||||
msg_Warn( p_demux, "invalid \"href\" attribute" );
|
msg_Warn( p_demux, "invalid \"href\" attribute" );
|
||||||
return VLC_FALSE;
|
return VLC_FALSE;
|
||||||
}*/
|
}
|
||||||
|
|
||||||
|
p_new_input = p_demux->p_sys->pp_tracklist[ i_href ];
|
||||||
|
if( p_new_input )
|
||||||
|
{
|
||||||
|
input_ItemAddSubItem( p_input_item, p_new_input );
|
||||||
|
}
|
||||||
|
|
||||||
/* fix for #1293 - XTAG sends ENDELEM for self closing tag */
|
/* fix for #1293 - XTAG sends ENDELEM for self closing tag */
|
||||||
/* (libxml sends NONE) */
|
/* (libxml sends NONE) */
|
||||||
|
@ -73,16 +73,6 @@ int E_(xspf_export_playlist)( vlc_object_t *p_this )
|
|||||||
free( psz_temp );
|
free( psz_temp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* export the tree structure in <extension> */
|
|
||||||
fprintf( p_export->p_file, "\t<extension application=\"http://www.videolan.org/vlc/playlist/0\">\n" );
|
|
||||||
i_count = 0;
|
|
||||||
for( i = 0; i < p_node->i_children; i++ )
|
|
||||||
{
|
|
||||||
xspf_extension_item( p_node->pp_children[i], p_export->p_file,
|
|
||||||
&i_count );
|
|
||||||
}
|
|
||||||
fprintf( p_export->p_file, "\t</extension>\n" );
|
|
||||||
|
|
||||||
/* export all items in a flat format */
|
/* export all items in a flat format */
|
||||||
fprintf( p_export->p_file, "\t<trackList>\n" );
|
fprintf( p_export->p_file, "\t<trackList>\n" );
|
||||||
i_count = 0;
|
i_count = 0;
|
||||||
@ -93,6 +83,16 @@ int E_(xspf_export_playlist)( vlc_object_t *p_this )
|
|||||||
}
|
}
|
||||||
fprintf( p_export->p_file, "\t</trackList>\n" );
|
fprintf( p_export->p_file, "\t</trackList>\n" );
|
||||||
|
|
||||||
|
/* export the tree structure in <extension> */
|
||||||
|
fprintf( p_export->p_file, "\t<extension application=\"http://www.videolan.org/vlc/playlist/0\">\n" );
|
||||||
|
i_count = 0;
|
||||||
|
for( i = 0; i < p_node->i_children; i++ )
|
||||||
|
{
|
||||||
|
xspf_extension_item( p_node->pp_children[i], p_export->p_file,
|
||||||
|
&i_count );
|
||||||
|
}
|
||||||
|
fprintf( p_export->p_file, "\t</extension>\n" );
|
||||||
|
|
||||||
/* close the header elements */
|
/* close the header elements */
|
||||||
fprintf( p_export->p_file, "</playlist>\n" );
|
fprintf( p_export->p_file, "</playlist>\n" );
|
||||||
|
|
||||||
|
@ -99,8 +99,11 @@ static void input_item_subitem_added( const vlc_event_t * p_event,
|
|||||||
|
|
||||||
/* The media library input has one and only one option: "meta-file"
|
/* The media library input has one and only one option: "meta-file"
|
||||||
* So we remove that unneeded option. */
|
* So we remove that unneeded option. */
|
||||||
|
if( p_item->i_options == 1 )
|
||||||
|
{
|
||||||
free( p_item->ppsz_options[0] );
|
free( p_item->ppsz_options[0] );
|
||||||
p_item->i_options = 0;
|
p_item->i_options = 0;
|
||||||
|
}
|
||||||
|
|
||||||
playlist_AddInput( p_playlist, p_item, PLAYLIST_APPEND, PLAYLIST_END,
|
playlist_AddInput( p_playlist, p_item, PLAYLIST_APPEND, PLAYLIST_END,
|
||||||
VLC_FALSE, VLC_FALSE );
|
VLC_FALSE, VLC_FALSE );
|
||||||
|
Loading…
Reference in New Issue
Block a user