Commit 7c4a54f9 authored by Clément Stenac's avatar Clément Stenac

Fix XSPF (Closes:#651)

parent 19607df8
...@@ -57,14 +57,6 @@ vlc_module_begin(); ...@@ -57,14 +57,6 @@ vlc_module_begin();
add_shortcut( "old-open" ); add_shortcut( "old-open" );
set_capability( "demux2", 10 ); set_capability( "demux2", 10 );
set_callbacks( E_(Import_Old), NULL ); set_callbacks( E_(Import_Old), NULL );
#if 0
add_submodule();
set_description( _("Native playlist import") );
add_shortcut( "playlist" );
add_shortcut( "native-open" );
set_capability( "demux2", 10 );
set_callbacks( E_(Import_Native), E_(Close_Native) );
#endif
add_submodule(); add_submodule();
set_description( _("M3U playlist import") ); set_description( _("M3U playlist import") );
add_shortcut( "m3u-open" ); add_shortcut( "m3u-open" );
......
/****************************************************************************** /*******************************************************************************
* Copyright (C) 2006 Daniel Stränger <vlc at schmaller dot de> * Copyright (C) 2006 Daniel Stränger <vlc at schmaller dot de>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -29,6 +29,12 @@ ...@@ -29,6 +29,12 @@
#include "vlc_strings.h" #include "vlc_strings.h"
#include "xspf.h" #include "xspf.h"
struct demux_sys_t
{
playlist_item_t *p_item_in_category;
int i_parent_id;
};
/** /**
* \brief XSPF submodule initialization function * \brief XSPF submodule initialization function
*/ */
...@@ -50,6 +56,8 @@ int E_(xspf_import_Activate)( vlc_object_t *p_this ) ...@@ -50,6 +56,8 @@ int E_(xspf_import_Activate)( vlc_object_t *p_this )
} }
msg_Dbg( p_demux, "using xspf playlist import"); msg_Dbg( p_demux, "using xspf playlist import");
p_demux->p_sys = (demux_sys_t*)malloc(sizeof(demux_sys_t ) );
p_demux->pf_control = xspf_import_Control; p_demux->pf_control = xspf_import_Control;
p_demux->pf_demux = xspf_import_Demux; p_demux->pf_demux = xspf_import_Demux;
...@@ -61,16 +69,13 @@ int E_(xspf_import_Activate)( vlc_object_t *p_this ) ...@@ -61,16 +69,13 @@ int E_(xspf_import_Activate)( vlc_object_t *p_this )
*/ */
int xspf_import_Demux( demux_t *p_demux ) int xspf_import_Demux( demux_t *p_demux )
{ {
#if 0
playlist_t *p_playlist = NULL;
playlist_item_t *p_current = NULL;
vlc_bool_t b_play;
int i_ret = VLC_SUCCESS; int i_ret = VLC_SUCCESS;
xml_t *p_xml = NULL; xml_t *p_xml = NULL;
xml_reader_t *p_xml_reader = NULL; xml_reader_t *p_xml_reader = NULL;
char *psz_name = NULL; char *psz_name = NULL;
INIT_PLAYLIST_STUFF;
p_demux->p_sys->p_item_in_category = p_item_in_category;
p_demux->p_sys->i_parent_id = i_parent_id;
/* create new xml parser from stream */ /* create new xml parser from stream */
p_xml = xml_Create( p_demux ); p_xml = xml_Create( p_demux );
...@@ -90,11 +95,12 @@ int xspf_import_Demux( demux_t *p_demux ) ...@@ -90,11 +95,12 @@ int xspf_import_Demux( demux_t *p_demux )
msg_Err( p_demux, "can't read xml stream" ); msg_Err( p_demux, "can't read xml stream" );
i_ret = VLC_EGENERIC; i_ret = VLC_EGENERIC;
} }
/* checking root nody type */ /* checking root node type */
if ( i_ret == VLC_SUCCESS ) if ( i_ret == VLC_SUCCESS )
if( xml_ReaderNodeType( p_xml_reader ) != XML_READER_STARTELEM ) if( xml_ReaderNodeType( p_xml_reader ) != XML_READER_STARTELEM )
{ {
msg_Err( p_demux, "invalid root node type: %i", xml_ReaderNodeType( p_xml_reader ) ); msg_Err( p_demux, "invalid root node type: %i",
xml_ReaderNodeType( p_xml_reader ) );
i_ret = VLC_EGENERIC; i_ret = VLC_EGENERIC;
} }
/* checking root node name */ /* checking root node name */
...@@ -107,45 +113,15 @@ int xspf_import_Demux( demux_t *p_demux ) ...@@ -107,45 +113,15 @@ int xspf_import_Demux( demux_t *p_demux )
} }
FREE_NAME(); FREE_NAME();
/* get the playlist ... */ i_ret = parse_playlist_node( p_demux, p_playlist, p_current, NULL,
if ( i_ret == VLC_SUCCESS )
{
p_playlist = (playlist_t *) vlc_object_find( p_demux, VLC_OBJECT_PLAYLIST, FIND_PARENT );
if( !p_playlist )
{
msg_Err( p_demux, "can't find playlist" );
i_ret = VLC_ENOOBJ;
}
}
/* ... and its current item (to convert it to a node) */
if ( i_ret == VLC_SUCCESS )
{
b_play = E_(FindItem)( p_demux, p_playlist, &p_current );
playlist_ItemToNode( p_playlist, p_current );
p_current->input.i_type = ITEM_TYPE_PLAYLIST;
/* parse the playlist node */
i_ret = parse_playlist_node( p_demux, p_playlist, p_current,
p_xml_reader, "playlist" ); p_xml_reader, "playlist" );
/* true/false - success/egeneric mapping */ HANDLE_PLAY_AND_RELEASE;
i_ret = ( i_ret==VLC_TRUE ? VLC_SUCCESS : VLC_EGENERIC );
if( b_play )
{
playlist_Control( p_playlist, PLAYLIST_VIEWPLAY,
p_playlist->status.i_view,
p_playlist->status.p_item, NULL );
}
}
if ( p_playlist )
vlc_object_release( p_playlist );
if ( p_xml_reader ) if ( p_xml_reader )
xml_ReaderDelete( p_xml, p_xml_reader ); xml_ReaderDelete( p_xml, p_xml_reader );
if ( p_xml ) if ( p_xml )
xml_Delete( p_xml ); xml_Delete( p_xml );
return i_ret; return i_ret;
#endif
return 0; return 0;
} }
...@@ -154,7 +130,7 @@ int xspf_import_Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -154,7 +130,7 @@ int xspf_import_Control( demux_t *p_demux, int i_query, va_list args )
{ {
return VLC_EGENERIC; return VLC_EGENERIC;
} }
#if 0
/** /**
* \brief parse the root node of a XSPF playlist * \brief parse the root node of a XSPF playlist
* \param p_demux demuxer instance * \param p_demux demuxer instance
...@@ -253,7 +229,7 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE ...@@ -253,7 +229,7 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE
{ {
if ( p_handler->pf_handler.cmplx( p_demux, if ( p_handler->pf_handler.cmplx( p_demux,
p_playlist, p_playlist,
p_item, p_item,NULL,
p_xml_reader, p_xml_reader,
p_handler->name ) ) p_handler->name ) )
{ {
...@@ -307,7 +283,7 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE ...@@ -307,7 +283,7 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE
if ( p_handler->pf_handler.smpl ) if ( p_handler->pf_handler.smpl )
{ {
p_handler->pf_handler.smpl( p_item, p_handler->name, p_handler->pf_handler.smpl( p_item, NULL, p_handler->name,
psz_value ); psz_value );
} }
FREE_ATT(); FREE_ATT();
...@@ -357,8 +333,8 @@ static vlc_bool_t parse_tracklist_node COMPLEX_INTERFACE ...@@ -357,8 +333,8 @@ static vlc_bool_t parse_tracklist_node COMPLEX_INTERFACE
FREE_NAME(); FREE_NAME();
/* parse the track data in a separate function */ /* parse the track data in a separate function */
if ( parse_track_node( p_demux, p_playlist, p_item, p_xml_reader, if ( parse_track_node( p_demux, p_playlist, p_item, NULL,
"track" ) == VLC_TRUE ) p_xml_reader,"track" ) == VLC_TRUE )
i_ntracks++; i_ntracks++;
} }
else if ( i_node == XML_READER_ENDELEM ) else if ( i_node == XML_READER_ENDELEM )
...@@ -392,7 +368,7 @@ static vlc_bool_t parse_tracklist_node COMPLEX_INTERFACE ...@@ -392,7 +368,7 @@ static vlc_bool_t parse_tracklist_node COMPLEX_INTERFACE
*/ */
static vlc_bool_t parse_track_node COMPLEX_INTERFACE static vlc_bool_t parse_track_node COMPLEX_INTERFACE
{ {
playlist_item_t *p_new=NULL; input_item_t *p_new_input = NULL;
int i_node; int i_node;
char *psz_name=NULL; char *psz_name=NULL;
char *psz_value=NULL; char *psz_value=NULL;
...@@ -446,7 +422,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE ...@@ -446,7 +422,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE
/* complex content is parsed in a separate function */ /* complex content is parsed in a separate function */
if ( p_handler->type == COMPLEX_CONTENT ) if ( p_handler->type == COMPLEX_CONTENT )
{ {
if ( !p_new ) if ( !p_new_input )
{ {
msg_Err( p_demux, msg_Err( p_demux,
"at <%s> level no new item has been allocated", "at <%s> level no new item has been allocated",
...@@ -456,7 +432,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE ...@@ -456,7 +432,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE
} }
if ( p_handler->pf_handler.cmplx( p_demux, if ( p_handler->pf_handler.cmplx( p_demux,
p_playlist, p_playlist,
p_new, NULL, p_new_input,
p_xml_reader, p_xml_reader,
p_handler->name ) ) p_handler->name ) )
{ {
...@@ -496,6 +472,11 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE ...@@ -496,6 +472,11 @@ 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();
/* Add it */
playlist_AddWhereverNeeded( p_playlist, p_new_input,
p_item, p_demux->p_sys->p_item_in_category,
(p_demux->p_sys->i_parent_id >0 ) ? VLC_TRUE:
VLC_FALSE, PLAYLIST_APPEND );
return VLC_TRUE; return VLC_TRUE;
} }
/* there MUST have been a start tag for that element name */ /* there MUST have been a start tag for that element name */
...@@ -511,19 +492,25 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE ...@@ -511,19 +492,25 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE
/* special case: location */ /* special case: location */
if ( !strcmp( p_handler->name, "location" ) ) if ( !strcmp( p_handler->name, "location" ) )
{ {
char *psz_uri=NULL;
/* there MUST NOT be an item */ /* there MUST NOT be an item */
if ( p_new ) if ( p_new_input )
{ {
msg_Err( p_demux, msg_Err( p_demux, "item <%s> already created",
"a new item has just been created <%s>",
psz_name ); psz_name );
FREE_ATT(); FREE_ATT();
return VLC_FALSE; return VLC_FALSE;
} }
/* create it now */ psz_uri = unescape_URI_duplicate( psz_value );
if ( insert_new_item( p_playlist, p_item,
&p_new, psz_value ) ) if ( psz_uri )
{ {
p_new_input = input_ItemNewExt( p_playlist, psz_uri,
NULL, 0, NULL, -1 );
p_new_input->p_meta = vlc_meta_New();
free( psz_uri );
vlc_input_item_CopyOptions( p_item->p_input, p_new_input );
psz_uri = NULL;
FREE_ATT(); FREE_ATT();
p_handler = NULL; p_handler = NULL;
} }
...@@ -536,17 +523,17 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE ...@@ -536,17 +523,17 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE
else else
{ {
/* there MUST be an item */ /* there MUST be an item */
if ( !p_new ) if ( !p_new_input )
{ {
msg_Err( p_demux, msg_Err( p_demux, "item not yet created at <%s>",
"an item hasn't been created yet <%s>",
psz_name ); psz_name );
FREE_ATT(); FREE_ATT();
return VLC_FALSE; return VLC_FALSE;
} }
if ( p_handler->pf_handler.smpl ) if ( p_handler->pf_handler.smpl )
{ {
p_handler->pf_handler.smpl( p_new, p_handler->name, p_handler->pf_handler.smpl( NULL, p_input,
p_handler->name,
psz_value ); psz_value );
FREE_ATT(); FREE_ATT();
} }
...@@ -574,7 +561,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE ...@@ -574,7 +561,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE
static vlc_bool_t set_item_info SIMPLE_INTERFACE static vlc_bool_t set_item_info SIMPLE_INTERFACE
{ {
/* exit if setting is impossible */ /* exit if setting is impossible */
if ( !psz_name || !psz_value || !p_item ) if ( !psz_name || !psz_value || !p_input )
return VLC_FALSE; return VLC_FALSE;
/* re-convert xml special characters inside psz_value */ /* re-convert xml special characters inside psz_value */
...@@ -583,49 +570,26 @@ static vlc_bool_t set_item_info SIMPLE_INTERFACE ...@@ -583,49 +570,26 @@ static vlc_bool_t set_item_info SIMPLE_INTERFACE
/* handle each info element in a separate "if" clause */ /* handle each info element in a separate "if" clause */
if ( !strcmp( psz_name, "title" ) ) if ( !strcmp( psz_name, "title" ) )
{ {
if ( playlist_ItemSetName ( p_item, (char *)psz_value ) == VLC_SUCCESS ) p_input->psz_name = strdup( (char*)psz_value );
return VLC_TRUE;
return VLC_FALSE;
} }
else if ( !strcmp( psz_name, "creator" ) ) else if ( !strcmp( psz_name, "creator" ) )
{ {
if ( vlc_input_item_AddInfo( &(p_item->input), vlc_meta_SetArtist( p_input->p_meta, psz_value );
_(VLC_META_INFO_CAT), _(VLC_META_ARTIST),
"%s", psz_value ) == VLC_SUCCESS )
return VLC_TRUE;
return VLC_FALSE;
} }
else if ( !strcmp( psz_name, "album" ) ) else if ( !strcmp( psz_name, "album" ) )
{ {
if ( vlc_input_item_AddInfo( &(p_item->input), vlc_meta_SetAlbum( p_input->p_meta, psz_value );
_(VLC_META_INFO_CAT),
_(VLC_META_COLLECTION),
"%s", psz_value ) == VLC_SUCCESS )
return VLC_TRUE;
return VLC_FALSE;
} else if ( !strcmp( psz_name, "trackNum" ) ) }
else if ( !strcmp( psz_name, "trackNum" ) )
{ {
long i_num = atol( psz_value ); vlc_meta_SetTracknum( p_input->p_meta, psz_value );
if ( i_num > 0 }
&& vlc_input_item_AddInfo( &(p_item->input), else if ( !strcmp( psz_name, "duration" ) )
_(VLC_META_INFO_CAT),
_(VLC_META_SEQ_NUM),
"%s", psz_value ) == VLC_SUCCESS )
return VLC_TRUE;
return VLC_FALSE;
} else if ( !strcmp( psz_name, "duration" ) )
{ {
long i_num = atol( psz_value ); long i_num = atol( psz_value );
if ( i_num > 0 p_input->i_duration = i_num*1000;
&& playlist_ItemSetDuration( p_item, i_num*1000 ) == VLC_SUCCESS )
return VLC_TRUE;
return VLC_FALSE;
} }
return VLC_TRUE; return VLC_TRUE;
} }
...@@ -654,33 +618,3 @@ static vlc_bool_t skip_element COMPLEX_INTERFACE ...@@ -654,33 +618,3 @@ static vlc_bool_t skip_element COMPLEX_INTERFACE
} }
return VLC_FALSE; return VLC_FALSE;
} }
/**
* \brief creates a new playlist item from the given mrl
*/
static vlc_bool_t insert_new_item( playlist_t *p_pl, playlist_item_t *p_cur,
playlist_item_t **pp_new, char *psz_location )
{
char *psz_uri=NULL;
psz_uri = unescape_URI_duplicate( psz_location );
if ( psz_uri )
{
*pp_new = playlist_ItemNew( p_pl, psz_uri, NULL );
free( psz_uri );
psz_uri = NULL;
}
if ( !*pp_new )
return VLC_FALSE;
playlist_NodeAddItem( p_pl, *pp_new, p_cur->pp_parents[0]->i_view,
p_cur, PLAYLIST_APPEND, PLAYLIST_END );
playlist_CopyParents( p_cur, *pp_new );
vlc_input_item_CopyOptions( &p_cur->input, &((*pp_new)->input) );
return VLC_TRUE;
}
#endif
...@@ -30,11 +30,13 @@ ...@@ -30,11 +30,13 @@
#define COMPLEX_CONTENT 2 #define COMPLEX_CONTENT 2
#define SIMPLE_INTERFACE (playlist_item_t *p_item,\ #define SIMPLE_INTERFACE (playlist_item_t *p_item,\
input_item_t *p_input,\
const char *psz_name,\ const char *psz_name,\
char *psz_value) char *psz_value)
#define COMPLEX_INTERFACE (demux_t *p_demux,\ #define COMPLEX_INTERFACE (demux_t *p_demux,\
playlist_t *p_playlist,\ playlist_t *p_playlist,\
playlist_item_t *p_item,\ playlist_item_t *p_item,\
input_item_t *p_input, \
xml_reader_t *p_xml_reader,\ xml_reader_t *p_xml_reader,\
const char *psz_element) const char *psz_element)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment