AX_ADD_PLUGINS([trivial_mixer spdif_mixer float32_mixer])
AX_ADD_PLUGINS([aout_file])
AX_ADD_PLUGINS([i420_rgb i420_yuy2 i422_yuy2 i420_ymga])
-AX_ADD_PLUGINS([id3 m3u playlist export sgimb])
+AX_ADD_PLUGINS([id3 m3u sgimb])
AX_ADD_PLUGINS([rawvideo])
AX_ADD_PLUGINS([wav araw demuxdump demuxsub adpcm a52sys dtssys au])
AX_ADD_PLUGINS([access_file access_udp access_tcp access_http ipv4 access_mms])
fi fi
fi
+dnl
+dnl libxml2
+dnl
+XML2_PATH="${PATH}"
+AC_ARG_WITH(xml2-config-path,
+ [ --with-xml2-config-path=PATH xml2-config path (default search in \$PATH)],
+ [ if test "${with_xml2_config_path}" != "no"; then
+ XML2_PATH="${with_xml2_config_path}:${PATH}"
+ fi ])
+ AC_PATH_PROG(XML2_CONFIG, xml2-config, no, ${XML2_PATH})
+ AC_MSG_WARN([trucmuche0])
+
+ if test "${XML2_CONFIG}" != "no"; then
+ AC_MSG_WARN([trucmuche2])
+ AX_ADD_CPPFLAGS([skins2],[`${XML2_CONFIG} --cflags`])
+ AX_ADD_CFLAGS([playlist export],[`${XML2_CONFIG} --cflags`])
+ AX_ADD_LDFLAGS([skins2 playlist export],[`${XML2_CONFIG} --libs`])
+ AC_MSG_WARN([trucmuche3])
+ dnl skins2 and playlist depend on the xmlTextReader extension
+ AC_CHECK_LIB(xml2,xmlTextReaderConstName,
+ [ AC_MSG_WARN([trucmuche4])
+AX_ADD_PLUGINS([playlist export])],
+ [
+ skins2_missing_lib="yes"
+ AC_MSG_WARN([trucmuche5])
+ AC_MSG_WARN([libxml2 missing the xmlTextReader extension, you should update your version])
+ AC_MSG_WARN([You will not be able to import/export playlists])
+ if test "${enable_skins2}" = "yes"; then
+ AC_MSG_WARN([trucmuche6])
+ AC_MSG_ERROR([libxml2 missing the xmlTextReader extension (required for skins2)])
+ fi])
+ else
+ skins2_missing_lib="yes"
+ AC_MSG_ERROR([Could not find libxml2. You will not be able to import/export playlists])
+ if test "${enable_skins2}" = "yes"; then
+ AC_MSG_ERROR([Could not find libxml2 (required for skins2)])
+ fi
+ fi
+
+
+
+
dnl
dnl Skins2 module
dnl
fi
fi
- dnl libxml2
- XML2_PATH="${PATH}"
- AC_ARG_WITH(xml2-config-path,
- [ --with-xml2-config-path=PATH xml2-config path (default search in \$PATH)],
- [ if test "${with_xml2_config_path}" != "no"; then
- XML2_PATH="${with_xml2_config_path}:${PATH}"
- fi ])
- AC_PATH_PROG(XML2_CONFIG, xml2-config, no, ${XML2_PATH})
- if test "${XML2_CONFIG}" != "no"; then
- AX_ADD_CPPFLAGS([skins2],[`${XML2_CONFIG} --cflags`])
- AX_ADD_LDFLAGS([skins2],[`${XML2_CONFIG} --libs`])
- dnl skins2 depends on the xmlTextReader extension
- LDFLAGS="${LDFLAGS_save} ${LDFLAGS_skins2}"
- AC_CHECK_LIB(xml2,xmlTextReaderConstName,[],[
- skins2_missing_lib="yes"
- AC_MSG_WARN([libxml2 missing the xmlTextReader extension, you should update your version])
- if test "${enable_skins2}" = "yes"; then
- AC_MSG_ERROR([libxml2 missing the xmlTextReader extension (required for skins2)])
- fi])
- LDFLAGS="${LDFLAGS_save}"
- else
- skins2_missing_lib="yes"
- if test "${enable_skins2}" = "yes"; then
- AC_MSG_ERROR([Could not find libxml2 (required for skins2)])
- fi
- fi
+ LDFLAGS="${LDFLAGS_save} ${LDFLAGS_skins2}"
if test "${skins2_missing_lib}" = "no" && (test "${SYS}" = "mingw32" -o "${SYS}" = "cygwin"); then
AX_ADD_PLUGINS([skins2])
* m3u.c: a meta demux to parse pls, m3u, asx et b4s playlists
*****************************************************************************
* Copyright (C) 2001-2004 VideoLAN
- * $Id: m3u.c,v 1.26 2004/01/25 20:05:28 hartman Exp $
+ * $Id$
*
* Authors: Sigmund Augdal <sigmunau@idi.ntnu.no>
* Gildas Bazin <gbazin@netcourrier.com>
{
i_type2 = TYPE_ASX;
}
+#if 0
else if ( !strncasecmp( p_peek, "<?xml", sizeof("<?xml") -1 ) )
{
i_type2 = TYPE_B4S;
}
+#endif
}
}
if ( i_type == TYPE_UNKNOWN && i_type2 == TYPE_UNKNOWN)
playlist.h \
old.c \
m3u.c \
+ native.c \
pls.c
--- /dev/null
+/*****************************************************************************
+ * native.c : Native playlist format import
+ *****************************************************************************
+ * Copyright (C) 2004 VideoLAN
+ * $Id: old.c 6961 2004-03-05 17:34:23Z sam $
+ *
+ * Authors: Clément Stenac <zorglub@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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <stdlib.h> /* malloc(), free() */
+
+#include <vlc/vlc.h>
+#include <vlc/intf.h>
+
+#include <errno.h> /* ENOMEM */
+
+#include <libxml/xmlreader.h>
+#include <libxml/encoding.h>
+
+#define HEADER "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<playlist"
+
+#define CHUNK_SIZE 256
+
+typedef struct attribute_s {
+ xmlChar *pxsz_attrname;
+ xmlChar *pxsz_attrvalue;
+} attribute_t;
+
+
+struct demux_sys_t
+{
+ /* Playlist elements */
+ playlist_t *p_playlist;
+ playlist_item_t *p_item;
+ char *psz_category;
+
+ /* XML Parsing elements */
+ xmlChar *pxsz_elemname;
+ xmlChar *pxsz_attrname;
+ xmlChar *pxsz_attrvalue;
+ int i_attributes;
+ attribute_t **pp_attributes;
+};
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+int Import_Native ( vlc_object_t * );
+int HandleBeginningElement( demux_t *p_demux );
+int HandleEndingElement( demux_t *p_demux );
+char *SearchAttribute( int i_attribute,attribute_t **pp_attributes,
+ char *psz_name );
+static int Demux( demux_t *p_demux);
+static int Control( demux_t *p_demux, int i_query, va_list args );
+
+/*****************************************************************************
+ * Import_Native : main import function
+ *****************************************************************************/
+int Import_Native(vlc_object_t *p_this )
+{
+ demux_t *p_demux = (demux_t *)p_this;
+
+ demux_sys_t *p_sys = (demux_sys_t *)malloc( sizeof( demux_sys_t ) );
+
+ p_demux->p_sys = p_sys;
+
+ uint8_t *p_peek;
+
+ if( stream_Peek( p_demux->s, &p_peek, 8 ) < 8 )
+ {
+ msg_Err( p_demux, "cannot peek" );
+ return VLC_EGENERIC;
+ }
+
+ if( strncmp( p_peek, HEADER , 40 ) )
+ {
+ msg_Warn(p_demux, "native import module discarded: invalid file");
+ return VLC_EGENERIC;
+ }
+ msg_Dbg( p_demux, "found valid native playlist file");
+
+ p_sys->p_playlist = (playlist_t*)vlc_object_find( p_demux,
+ VLC_OBJECT_PLAYLIST, FIND_PARENT );
+
+ if( !p_sys->p_playlist )
+ {
+ msg_Err( p_demux, "cannot attach playlist" );
+ return VLC_EGENERIC;
+ }
+ p_sys->p_playlist->pp_items[p_sys->p_playlist->i_index]->b_autodeletion =
+ VLC_TRUE;
+
+ p_sys->p_item = NULL;
+ p_sys->psz_category = NULL;
+
+ p_sys->pp_attributes = NULL;
+ p_sys->i_attributes = 0;
+
+ p_demux->pf_control = Control;
+ p_demux->pf_demux = Demux;
+
+ return VLC_SUCCESS;
+}
+
+void Close_Native( 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 )
+ {
+ if( p_sys->psz_category != NULL ) free( p_sys->psz_category );
+ if( p_sys->pxsz_elemname != NULL) free( p_sys->pxsz_elemname );
+
+ if( p_sys->p_playlist )
+ {
+ vlc_object_release( p_sys->p_playlist );
+ }
+ free( p_sys );
+ }
+}
+
+static int Demux( demux_t *p_demux)
+{
+ char *psz_file=(char *)malloc( sizeof( char ) );
+ int i_size = 0;
+ int i_ret, i;
+ xmlTextReaderPtr p_reader;
+
+ uint8_t p_peek[CHUNK_SIZE];
+
+ demux_sys_t *p_sys = p_demux->p_sys;
+
+ msg_Dbg( p_demux, "building playlist string" );
+
+ /* Build the string containing the playlist */
+ while( 1 )
+ {
+ i_ret = stream_Read( p_demux->s, p_peek, CHUNK_SIZE );
+ i_size+= i_ret;
+ psz_file = (char *)realloc( psz_file, i_size + 1242 );
+ memcpy( psz_file + i_size - i_ret, p_peek, CHUNK_SIZE );
+ if( i_ret < CHUNK_SIZE )
+ {
+ break;
+ }
+ }
+ psz_file[i_size]=0;
+
+ msg_Dbg( p_demux, "parsing playlist");
+ /* Create the XML parser */
+ p_reader = xmlReaderForMemory( psz_file, i_size, NULL, "UTF-8", 0 );
+
+ if( !p_reader )
+ {
+ msg_Warn( p_demux, "Unable to parse");
+ return VLC_EGENERIC;
+ }
+
+ i_ret = xmlTextReaderRead( p_reader );
+
+ /* Start the main parsing loop */
+ while( i_ret == 1)
+ {
+ int i_type = xmlTextReaderNodeType( p_reader );
+ switch( i_type )
+ {
+ /* -1 = error */
+ case -1:
+ return VLC_EGENERIC;
+ break;
+
+ /* 1 = Beginning of an element */
+ case 1:
+ {
+ /* Clean attributes of previous element */
+ for(i = 0 ; i < p_sys->i_attributes ; i++ )
+ {
+ if( p_sys->pp_attributes[i]->pxsz_attrname )
+ {
+ free( p_sys->pp_attributes[i]->pxsz_attrname );
+ }
+ if( p_sys->pp_attributes[i]->pxsz_attrvalue )
+ {
+ free( p_sys->pp_attributes[i]->pxsz_attrvalue );
+ }
+ free( p_sys->pp_attributes[i] );
+ }
+ p_sys->i_attributes = 0;
+ p_sys->pp_attributes = NULL;
+
+ p_sys->pxsz_elemname = xmlTextReaderName( p_reader );
+ if( !p_sys->pxsz_elemname )
+ {
+ return VLC_EGENERIC;
+ }
+ /* Get all attributes */
+ while( xmlTextReaderMoveToNextAttribute( p_reader ) == 1 )
+ {
+ attribute_t *p_attribute =
+ (attribute_t *)malloc( sizeof(attribute_t) );
+ p_attribute->pxsz_attrname = xmlTextReaderName( p_reader );
+ p_attribute->pxsz_attrvalue = xmlTextReaderValue( p_reader );
+
+ if( !p_attribute->pxsz_attrname ||
+ !p_attribute->pxsz_attrvalue )
+ {
+ return VLC_EGENERIC;
+ }
+ INSERT_ELEM( p_sys->pp_attributes,
+ p_sys->i_attributes,
+ p_sys->i_attributes,
+ p_attribute );
+ }
+ HandleBeginningElement( p_demux );
+ break;
+ }
+
+ /* 15 = End of an element */
+ case 15:
+ p_sys->pxsz_elemname = xmlTextReaderName( p_reader );
+ if( !p_sys->pxsz_elemname )
+ {
+ return VLC_EGENERIC;
+ }
+ HandleEndingElement( p_demux );
+ break;
+ }
+ i_ret= xmlTextReaderRead( p_reader );
+ }
+ if( p_sys->p_item )
+ {
+ /* We still have an item. Add it */
+ playlist_AddItem( p_sys->p_playlist, p_sys->p_item,
+ PLAYLIST_APPEND, PLAYLIST_END );
+ p_sys->p_item = NULL;
+ }
+
+ p_demux->b_die = VLC_TRUE;
+ return VLC_SUCCESS;
+}
+
+static int Control( demux_t *p_demux, int i_query, va_list args )
+{
+ return VLC_EGENERIC;
+}
+
+int HandleBeginningElement( demux_t *p_demux )
+{
+ demux_sys_t *p_sys = p_demux->p_sys;
+
+ if( !strcmp( p_sys->pxsz_elemname, "item" ) )
+ {
+ char *psz_uri,*psz_name,*psz_duration;
+ if( p_sys->p_item )
+ {
+ /* We already have an item. Assume that it is because
+ * we have <item name="" uri="" /> */
+ playlist_AddItem( p_sys->p_playlist, p_sys->p_item,
+ PLAYLIST_APPEND, PLAYLIST_END );
+ p_sys->p_item = NULL;
+ }
+ psz_uri = SearchAttribute( p_sys->i_attributes,
+ p_sys->pp_attributes, "uri" );
+ psz_name = SearchAttribute( p_sys->i_attributes,
+ p_sys->pp_attributes, "name" );
+ psz_duration = SearchAttribute( p_sys->i_attributes,
+ p_sys->pp_attributes, "duration");
+ if( !psz_uri )
+ {
+ return VLC_EGENERIC;
+ }
+ p_sys->p_item = playlist_ItemNew( p_sys->p_playlist ,
+ psz_uri, psz_name );
+ }
+ else if( !strcmp( p_sys->pxsz_elemname, "category" ) )
+ {
+ if( !p_sys->p_item)
+ {
+ msg_Warn( p_demux, "trying to set category without item" );
+ return VLC_EGENERIC;
+ }
+ p_sys->psz_category = SearchAttribute( p_sys->i_attributes,
+ p_sys->pp_attributes,
+ "name" );
+ }
+ else if( !strcmp( p_sys->pxsz_elemname, "info" ) )
+ {
+ char *psz_name, *psz_value;
+ if( !p_sys->psz_category || !p_sys->p_item )
+ {
+ msg_Warn( p_demux, "trying to set info without item or category" );
+ }
+ psz_name = SearchAttribute( p_sys->i_attributes,
+ p_sys->pp_attributes,
+ "name" );
+ psz_value = SearchAttribute( p_sys->i_attributes,
+ p_sys->pp_attributes,
+ "value" );
+ playlist_ItemAddInfo( p_sys->p_item, p_sys->psz_category,
+ psz_name, psz_value );
+ }
+ else if( !strcmp( p_sys->pxsz_elemname, "option" ) )
+ {
+ char *psz_name;
+ if( !p_sys->p_item )
+ {
+ msg_Warn( p_demux, "trying to set category without item" );
+ return VLC_EGENERIC;
+ }
+ psz_name = SearchAttribute( p_sys->i_attributes,
+ p_sys->pp_attributes,
+ "name" );
+ if( psz_name )
+ {
+ playlist_ItemAddOption( p_sys->p_item, psz_name );
+ }
+ }
+ return VLC_SUCCESS;
+}
+
+int HandleEndingElement( demux_t *p_demux )
+{
+ int i;
+ demux_sys_t *p_sys = p_demux->p_sys;
+
+ if( !strcmp( p_sys->pxsz_elemname, "item" ) )
+ {
+ /* Add the item to the playlist */
+ if( p_sys->p_item )
+ {
+ playlist_AddItem( p_sys->p_playlist, p_sys->p_item,
+ PLAYLIST_APPEND, PLAYLIST_END );
+ p_sys->p_item = NULL;
+ }
+ }
+ else if (!strcmp( p_sys->pxsz_elemname, "category" ) )
+ {
+ p_sys->psz_category = NULL;
+ }
+
+ /* Clear attribute list */
+ for(i = 0 ; i < p_sys->i_attributes ; i++ )
+ {
+ if( p_sys->pp_attributes[i]->pxsz_attrname )
+ {
+ free( p_sys->pp_attributes[i]->pxsz_attrname );
+ }
+ if( p_sys->pp_attributes[i]->pxsz_attrvalue )
+ {
+ free( p_sys->pp_attributes[i]->pxsz_attrvalue );
+ }
+ free( p_sys->pp_attributes[i] );
+ }
+ p_sys->i_attributes = 0;
+ return VLC_SUCCESS;
+}
+
+char *SearchAttribute( int i_attribute,attribute_t **pp_attributes, char *psz_name )
+{
+ int i, i_size, i_iso_size, i_read;
+ char *psz_iso, *psz_value;
+ for( i = 0 ; i < i_attribute ; i++ )
+ {
+ if( !strcmp( (char *)pp_attributes[i]->pxsz_attrname , psz_name ) )
+ {
+ psz_value = (char *)pp_attributes[i]->pxsz_attrvalue;
+ i_size = sizeof( char ) * strlen(psz_value);
+ i_iso_size = 2*i_size + 1;
+ psz_iso = (char *)malloc( sizeof(char) * i_iso_size );
+ i_read = UTF8Toisolat1( psz_iso, &i_iso_size, psz_value, &i_size) ;
+ psz_iso[i_iso_size ]=0;
+ return psz_iso;
+ }
+ }
+ return NULL;
+}
* playlist.c : Playlist import module
*****************************************************************************
* Copyright (C) 2004 VideoLAN
- * $Id: playlist.c,v 1.5 2004/02/13 23:54:42 gbazin Exp $
+ * $Id$
*
* Authors: Clément Stenac <zorglub@videolan.org>
*
set_capability( "demux2" , 10 );
set_callbacks( Import_Old , NULL );
+ add_submodule();
+ set_description( _("Native playlist import") );
+ add_shortcut( "playlist" );
+ add_shortcut( "native-open" );
+ set_capability( "demux2" , 10 );
+ set_callbacks( Import_Native , Close_Native );
add_submodule();
set_description( _("M3U playlist import") );
add_shortcut( "m3u-open" );
* playlist.h: Playlist import module common functions
*****************************************************************************
* Copyright (C) 2004 VideoLAN
- * $Id: playlist.h,v 1.1 2004/01/11 17:46:58 sigmunau Exp $
+ * $Id$
*
* Authors: Sigmund Augdal <sigmunau@idi.ntnu.no>
*
int Import_Old ( vlc_object_t * );
int Import_M3U ( vlc_object_t * );
+int Import_Native ( vlc_object_t * );
+int Close_Native ( vlc_object_t * );
+
void Close_M3U ( vlc_object_t * );
int Import_PLS ( vlc_object_t * );
void Close_PLS ( vlc_object_t * );
char *psz_desc;
char *psz_filter;
char *psz_module;
- } formats[] = {{ _("M3U file"), "*.m3u", "export-m3u" },
+ } formats[] = {{ _("Native VLC playlist"), "*.vlp", "export-native" },
+ { _("M3U file"), "*.m3u", "export-m3u" },
{ _("PLS file"), "*.pls", "export-pls" }};
wxString filter = wxT("");
* native.c : Native playlist export module
*****************************************************************************
* Copyright (C) 2004 VideoLAN
- * $Id: native.c,v 1.2 2004/02/22 15:52:33 zorglub Exp $
+ * $Id$
*
* Authors: Clément Stenac <zorglub@videolan.org>
*
#include <errno.h> /* ENOMEM */
+#include <libxml/xmlwriter.h>
+#include <libxml/encoding.h>
+#define ENCODING "UTF-8"
+
/*****************************************************************************
* Local prototypes
*****************************************************************************/
int Export_Native ( vlc_object_t * );
+char *ToUTF8( char *);
/*****************************************************************************
* Native: main export function
int Export_Native( vlc_object_t *p_this )
{
playlist_t *p_playlist = (playlist_t*)p_this;
+ playlist_export_t *p_export = (playlist_export_t *)p_playlist->p_private;
+
+ int i,j,k;
+
+ char *psz_name="VLC Playlist";
+ int i_version = 1;
+
+ int i_ret;
+ xmlTextWriterPtr p_writer;
+ xmlBufferPtr p_buf;
+ xmlChar *tmp;
msg_Dbg(p_playlist, "Saving using native format");
- return VLC_SUCCESS;
+
+ /* Create a new XmlWriter */
+ p_buf = xmlBufferCreate();
+ if ( !p_buf )
+ {
+ msg_Warn( p_playlist, "Unable to create XML buffer" );
+ return VLC_EGENERIC;
+ }
+
+ /* Create a new XmlWriter */
+ p_writer = xmlNewTextWriterMemory( p_buf, 0);
+ if ( !p_writer)
+ {
+ msg_Dbg( p_playlist, "Unable to create XML writer" );
+ return VLC_EGENERIC;
+ }
+
+ /* Make a beautiful output */
+ i_ret = xmlTextWriterSetIndent( p_writer, 1 );
+
+ /* Start the document */
+ i_ret = xmlTextWriterStartDocument(p_writer, NULL, ENCODING, NULL);
+ if (i_ret < 0)
+ {
+ return VLC_EGENERIC;
+ }
+
+ i_ret = xmlTextWriterStartElement( p_writer, BAD_CAST "playlist");
+ if (i_ret < 0)
+ {
+ msg_Dbg( p_playlist, "Unable to write root node");
+ return VLC_EGENERIC;
+ }
+
+ for( i = 0; i< p_playlist->i_size ; i++)
+ {
+ playlist_item_t *p_item= p_playlist->pp_items[i];
+ char *psz_utf8 = NULL;
+ i_ret = xmlTextWriterStartElement( p_writer, BAD_CAST "item");
+
+ /* Write item attributes */
+ psz_utf8 = ToUTF8( p_item->input.psz_uri );
+ if( !psz_utf8 ) return VLC_EGENERIC;
+ i_ret = xmlTextWriterWriteAttribute( p_writer, "uri",
+ psz_utf8 );
+ free( psz_utf8 );
+
+ psz_utf8 = ToUTF8( p_item->input.psz_name );
+ if( !psz_utf8 ) return VLC_EGENERIC;
+ i_ret = xmlTextWriterWriteAttribute( p_writer, "name",
+ psz_utf8 );
+ free( psz_utf8 );
+
+ /* Write categories */
+ for( j = 0; j< p_item->input.i_categories ; j++ )
+ {
+ info_category_t *p_cat = p_item->input.pp_categories[j];
+ if( p_cat->i_infos > 0 )
+ {
+ i_ret = xmlTextWriterStartElement( p_writer,
+ "category" );
+
+ psz_utf8 = ToUTF8( p_cat->psz_name );
+ if( !psz_utf8 ) return VLC_EGENERIC;
+ i_ret = xmlTextWriterWriteAttribute( p_writer, "name",
+ psz_utf8 );
+ free( psz_utf8 );
+
+ for( k = 0; k< p_cat->i_infos; k++)
+ {
+ i_ret = xmlTextWriterStartElement( p_writer,"info" );
+
+ psz_utf8 = ToUTF8( p_cat->pp_infos[k]->psz_name);
+ if( !psz_utf8 ) return VLC_EGENERIC;
+ i_ret = xmlTextWriterWriteAttribute( p_writer,"name",
+ psz_utf8 );
+ free( psz_utf8 );
+
+ psz_utf8 = ToUTF8( p_cat->pp_infos[k]->psz_value);
+ if( !psz_utf8 ) return VLC_EGENERIC;
+ i_ret = xmlTextWriterWriteAttribute( p_writer,"value",
+ psz_utf8 );
+ free( psz_utf8 );
+
+ i_ret = xmlTextWriterEndElement( p_writer );
+ }
+ /* Finish category */
+ i_ret = xmlTextWriterEndElement( p_writer);
+ }
+ }
+ for( j = 0; j< p_item->input.i_options ; j++ )
+ {
+ i_ret = xmlTextWriterStartElement( p_writer,
+ "option" );
+ psz_utf8 = ToUTF8( p_item->input.ppsz_options[j] );
+ if( !psz_utf8 ) return VLC_EGENERIC;
+ i_ret = xmlTextWriterWriteAttribute( p_writer, "name",
+ psz_utf8 );
+ }
+ /* Finish item */
+ i_ret = xmlTextWriterEndElement( p_writer );
+ }
+ /* Finish playlist */
+ i_ret = xmlTextWriterEndElement( p_writer );
+
+ i_ret = xmlTextWriterEndDocument(p_writer);
+ xmlFreeTextWriter(p_writer);
+
+ fprintf( p_export->p_file, "%s", (const char *) p_buf->content);
+#if 0
+ /* Write items */
+ for( i = 0; i< p_playlist->i_size ; i++)
+ {
+ playlist_item_t *p_item= p_playlist->pp_items[i];
+ ItemStripEntities( p_item );
+ fprintf( p_export->p_file," <item uri=\"%s\" name=\"%s\"",
+ p_item->psz_uri,
+ p_item->psz_name );
+ if( p_item->i_duration != -1 )
+ {
+ fprintf( p_export->p_file, "duration=\""I64Fi"\""
+ p_item->i_duration )
+ }
+ if( p_item->b_enabled != 1 )
+ {
+ fprintf( p_export->p_file," enabled=\"%i\"", p_item->b_enabled );
+ }
+ if( p_item->i_group != 1 )
+ {
+ fprintf( p_export->p_file,"group=\"%i\"", p_item->i_group );
+ }
+ if( p_item->i_played > 0 )
+ {
+ fprintf( p_export->p_file," played=\"%i\"",p_item->i_nb_played );
+ }
+ fprintf( p_export->p_file, ">\n" );
+
+ for( j = 0; j< p_item->i_categories ; j++ )
+ {
+ item_info_category_t *p_cat = p_item->pp_categories[j];
+ if( p_cat->i_infos > 0 )
+ {
+ fprintf( p_export->p_file," <category name=\"%s\">\n",
+ p_cat->psz_name);
+ for( k = 0; k< p_cat->i_infos; k++)
+ {
+ fprintf( p_export->p_file,
+ " <info name=\"%s\" value=\"%s\" />\n",
+ p_cat->pp_infos[k]->psz_name,
+ p_cat->pp_infos[k]->psz_value );
+ }
+ fprintf( p_export->p_file," </category>\n" );
+ }
+ }
+ for( j = 0; j< p_item->i_options ; j++ )
+ {
+ fprintf( p_export->p_file," <option name=\"%s\">\n",
+ p_item->ppsz_options[j]);
+ }
+ fprintf( p_export->p_file, " </item>\n");
+ }
+
+ /* Write groups */
+ for( i = 0; i< p_playlist->i_groups ; i++)
+ {
+ fprintf( p_export->p_file," <group name=\"%s\" id=\"%i\" />\n",
+ p_playlist->pp_groups[i]->psz_name,
+ p_playlist->pp_groups[i]->i_id );
+ }
+
+ /* Write footer */
+ fprintf( p_export->p_file,"</playlist>\n" );
+#endif
+ return VLC_SUCCESS;
}
+
+char *ToUTF8( char *psz_in )
+{
+ int i_in = strlen( psz_in );
+ int i_out = 2*i_in + 1;
+ char *psz_out = (char *)malloc( sizeof(char) * i_out );
+
+ isolat1ToUTF8( psz_out, &i_out, psz_in, &i_in );
+ psz_out[ i_out ] = 0;
+ return psz_out;
+}
+