X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Fplaylist%2Fm3u.c;h=05b6b210c98dfcc7c2bf70e55746694cfe11347c;hb=c0a898e18e7fce541be58980f09ca199b736dc1c;hp=8debb706e34926d77f3e196081bf2482772f8e16;hpb=562ab59b24114e526144b59b5967224de432412a;p=vlc diff --git a/modules/misc/playlist/m3u.c b/modules/misc/playlist/m3u.c index 8debb706e3..05b6b210c9 100644 --- a/modules/misc/playlist/m3u.c +++ b/modules/misc/playlist/m3u.c @@ -1,10 +1,10 @@ /***************************************************************************** * m3u.c : M3U playlist export module ***************************************************************************** - * Copyright (C) 2004 VideoLAN + * Copyright (C) 2004 the VideoLAN team * $Id$ * - * Authors: Clément Stenac + * Authors: Clément Stenac * * 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 @@ -18,19 +18,27 @@ * * 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. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* malloc(), free() */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif #include -#include +#include +#include +#include +#include #include /* ENOMEM */ +#include + /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -39,32 +47,80 @@ int Export_M3U ( vlc_object_t * ); /***************************************************************************** * Export_M3U: main export function *****************************************************************************/ +static void DoChildren( playlist_t *p_playlist, playlist_export_t *p_export, + playlist_item_t *p_root ) +{ + int i, j; + + /* Go through the playlist and add items */ + for( i = 0; i< p_root->i_children ; i++) + { + playlist_item_t *p_current = p_root->pp_children[i]; + assert( p_current ); + + if( p_current->i_flags & PLAYLIST_SAVE_FLAG ) + continue; + + if( p_current->i_children >= 0 ) + { + DoChildren( p_playlist, p_export, p_current ); + continue; + } + + /* General info */ + + char *psz_uri = input_item_GetURI( p_current->p_input ); + + assert( psz_uri ); + + char *psz_name = input_item_GetName( p_current->p_input ); + if( psz_name && strcmp( psz_uri, psz_name ) ) + { + char *psz_artist = input_item_GetArtist( p_current->p_input ); + if( psz_artist == NULL ) psz_artist = strdup( "" ); + mtime_t i_duration = input_item_GetDuration( p_current->p_input ); + if( psz_artist && *psz_artist ) + { + /* write EXTINF with artist */ + fprintf( p_export->p_file, "#EXTINF:%i,%s - %s\n", + (int)( i_duration / 1000000 ), psz_artist, psz_name); + } + else + { + /* write EXTINF without artist */ + fprintf( p_export->p_file, "#EXTINF:%i,%s\n", + (int)( i_duration / 1000000 ), psz_name); + } + free( psz_artist ); + } + free( psz_name ); + + /* VLC specific options */ + vlc_mutex_lock( &p_current->p_input->lock ); + for( j = 0; j < p_current->p_input->i_options; j++ ) + { + fprintf( p_export->p_file, "#EXTVLCOPT:%s\n", + p_current->p_input->ppsz_options[j][0] == ':' ? + p_current->p_input->ppsz_options[j] + 1 : + p_current->p_input->ppsz_options[j] ); + } + vlc_mutex_unlock( &p_current->p_input->lock ); + + fprintf( p_export->p_file, "%s\n", psz_uri ); + free( psz_uri ); + } +} + int Export_M3U( 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; - msg_Dbg(p_playlist, "Saving using M3U format"); + msg_Dbg(p_playlist, "saving using M3U format"); /* Write header */ fprintf( p_export->p_file, "#EXTM3U\n" ); - /* Go through the playlist and add items */ - for( i = 0; i< p_playlist->i_size ; i++) - { - if( strcmp( p_playlist->pp_items[i]->input.psz_name, - p_playlist->pp_items[i]->input.psz_uri ) ) - { - char *psz_author = playlist_GetInfo( p_playlist, i, _("General"), - _("Author") ); - fprintf( p_export->p_file,"#EXTINF:%i,%s%s\n", - (int)(p_playlist->pp_items[i]->input.i_duration/1000000), - psz_author ? psz_author : "", - p_playlist->pp_items[i]->input.psz_name ); - } - fprintf( p_export->p_file, "%s\n", - p_playlist->pp_items[i]->input.psz_uri ); - } + DoChildren( p_playlist, p_export, p_export->p_root ); return VLC_SUCCESS; }