X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Fplaylist%2Fm3u.c;h=4cc4a1d405631a70a4cb121e90635c2e2e2fc40a;hb=b06464e4a8277e77dd7da3053b40d881e4861ee6;hp=14d4512fb6da1d486f242e71b27bc18f20418827;hpb=ae27ee8f4fa6b6d6090ccb48a0bc8509b512f0ce;p=vlc diff --git a/modules/misc/playlist/m3u.c b/modules/misc/playlist/m3u.c index 14d4512fb6..4cc4a1d405 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() */ -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include #include /* ENOMEM */ +#include + /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -39,51 +47,80 @@ int Export_M3U ( vlc_object_t * ); /***************************************************************************** * Export_M3U: main export function *****************************************************************************/ -int Export_M3U( vlc_object_t *p_this ) +static void DoChildren( playlist_t *p_playlist, playlist_export_t *p_export, + playlist_item_t *p_root ) { - playlist_t *p_playlist = (playlist_t*)p_this; - playlist_export_t *p_export = (playlist_export_t *)p_playlist->p_private; int i, j; - 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++) + for( i = 0; i< p_root->i_children ; i++) { - if( (p_playlist->pp_items[i]->i_flags & PLAYLIST_SAVE_FLAG) == 0 ) + 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 */ - if( p_playlist->pp_items[i]->input.psz_name && - strcmp( p_playlist->pp_items[i]->input.psz_name, - p_playlist->pp_items[i]->input.psz_uri ) ) + + 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_author = - vlc_input_item_GetInfo( &p_playlist->pp_items[i]->input, - _("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 ); + 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 */ - for( j = 0; j < p_playlist->pp_items[i]->input.i_options; j++ ) + 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_playlist->pp_items[i]->input.ppsz_options[j][0] == ':' ? - p_playlist->pp_items[i]->input.ppsz_options[j] + 1 : - p_playlist->pp_items[i]->input.ppsz_options[j] ); + 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", - p_playlist->pp_items[i]->input.psz_uri ); + 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; + + msg_Dbg(p_playlist, "saving using M3U format"); + + /* Write header */ + fprintf( p_export->p_file, "#EXTM3U\n" ); + + DoChildren( p_playlist, p_export, p_export->p_root ); return VLC_SUCCESS; }