X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fdemux%2Fplaylist%2Fpls.c;h=6bd42f081c8175650d94129b3fc8ac8f7fd8841e;hb=f60b4c79acaf0412280672f83677a96e74dacb65;hp=bc76f0365312a2621c13bd18dc0ba547090eb04f;hpb=48d234df3026acb36ca0de40b0731206f9a44453;p=vlc diff --git a/modules/demux/playlist/pls.c b/modules/demux/playlist/pls.c index bc76f03653..6bd42f081c 100644 --- a/modules/demux/playlist/pls.c +++ b/modules/demux/playlist/pls.c @@ -1,11 +1,11 @@ /***************************************************************************** * pls.c : PLS playlist format import ***************************************************************************** - * Copyright (C) 2004 VideoLAN + * Copyright (C) 2004 the VideoLAN team * $Id$ * * Authors: Clément Stenac - * Authors: Sigmund Augdal + * Authors: Sigmund Augdal Helberg * * 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 @@ -48,21 +48,17 @@ static int Control( demux_t *p_demux, int i_query, va_list args ); /***************************************************************************** * Import_PLS: main import function *****************************************************************************/ -int Import_PLS( vlc_object_t *p_this ) +int E_(Import_PLS)( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t *)p_this; uint8_t *p_peek; char *psz_ext; - if( stream_Peek( p_demux->s , &p_peek, 7 ) < 7 ) - { - msg_Err( p_demux, "cannot peek" ); - return VLC_EGENERIC; - } + if( stream_Peek( p_demux->s , &p_peek, 7 ) < 7 ) return VLC_EGENERIC; psz_ext = strrchr ( p_demux->psz_path, '.' ); - if( !strncasecmp( p_peek, "[playlist]", 10 ) ) + if( !strncasecmp( (char *)p_peek, "[playlist]", 10 ) ) { ; } @@ -71,12 +67,8 @@ int Import_PLS( vlc_object_t *p_this ) { ; } - else - { - msg_Warn(p_demux, "pls import module discarded"); - return VLC_EGENERIC; - - } + else return VLC_EGENERIC; + msg_Dbg( p_demux, "found valid PLS playlist file"); p_demux->pf_control = Control; @@ -87,7 +79,7 @@ int Import_PLS( vlc_object_t *p_this ) msg_Err( p_demux, "Out of memory" ); return VLC_ENOMEM; } - p_demux->p_sys->psz_prefix = FindPrefix( p_demux ); + p_demux->p_sys->psz_prefix = E_(FindPrefix)( p_demux ); return VLC_SUCCESS; } @@ -95,7 +87,7 @@ int Import_PLS( vlc_object_t *p_this ) /***************************************************************************** * Deactivate: frees unused data *****************************************************************************/ -void Close_PLS( vlc_object_t *p_this ) +void E_(Close_PLS)( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t *)p_this; if( p_demux->p_sys->psz_prefix ) @@ -108,7 +100,7 @@ void Close_PLS( vlc_object_t *p_this ) static int Demux( demux_t *p_demux ) { mtime_t i_duration = -1; - char *psz_name = NULL; + char *psz_name = NULL; char *psz_line; char *psz_mrl = NULL; char *psz_key; @@ -119,6 +111,7 @@ static int Demux( demux_t *p_demux ) int i_new_item = 0; int i_key_length; playlist_item_t *p_parent; + vlc_bool_t b_play; p_playlist = (playlist_t *) vlc_object_find( p_demux, VLC_OBJECT_PLAYLIST, FIND_PARENT ); @@ -127,15 +120,16 @@ static int Demux( demux_t *p_demux ) msg_Err( p_demux, "can't find playlist" ); return -1; } - p_parent = p_playlist->status.p_item; + + b_play = E_(FindItem)( p_demux, p_playlist, &p_parent ); p_parent->input.i_type = ITEM_TYPE_PLAYLIST; -// p_playlist->pp_items[p_playlist->i_index]->b_autodeletion = VLC_TRUE; - /* Change the item to a node */ - if( p_parent->i_children == -1) - { - playlist_ItemToNode( p_playlist,p_parent ); - } + /* Change the item to a node */ + if( p_parent->i_children == -1) + { + playlist_ItemToNode( p_playlist,p_parent ); + } + while( ( psz_line = stream_ReadLine( p_demux->s ) ) ) { if( !strncasecmp( psz_line, "[playlist]", sizeof("[playlist]")-1 ) ) @@ -193,12 +187,12 @@ static int Demux( demux_t *p_demux ) { playlist_item_t *p_item = playlist_ItemNew( p_playlist, psz_mrl, psz_name ); - - playlist_NodeAddItem( p_playlist,p_item, - p_parent->pp_parents[0]->i_view, - p_parent, - PLAYLIST_APPEND, PLAYLIST_END ); - + + playlist_NodeAddItem( p_playlist,p_item, + p_parent->pp_parents[0]->i_view, + p_parent, + PLAYLIST_APPEND, PLAYLIST_END ); + playlist_CopyParents( p_parent, p_item ); if( i_duration != -1 ) { @@ -207,6 +201,9 @@ static int Demux( demux_t *p_demux ) i_position++; free( psz_mrl ); psz_mrl = NULL; + + vlc_input_item_CopyOptions( &p_parent->input, + &p_item->input ); } else { @@ -223,7 +220,7 @@ static int Demux( demux_t *p_demux ) } if( !strncasecmp( psz_key, "file", sizeof("file") -1 ) ) { - psz_mrl = ProcessMRL( psz_value, p_demux->p_sys->psz_prefix ); + psz_mrl = E_(ProcessMRL)( psz_value, p_demux->p_sys->psz_prefix ); } else if( !strncasecmp( psz_key, "title", sizeof("title") -1 ) ) { @@ -248,12 +245,12 @@ static int Demux( demux_t *p_demux ) { playlist_item_t *p_item = playlist_ItemNew( p_playlist, psz_mrl, psz_name ); - - playlist_NodeAddItem( p_playlist,p_item, - p_parent->pp_parents[0]->i_view, - p_parent, - PLAYLIST_APPEND, PLAYLIST_END ); - + + playlist_NodeAddItem( p_playlist,p_item, + p_parent->pp_parents[0]->i_view, + p_parent, + PLAYLIST_APPEND, PLAYLIST_END ); + playlist_CopyParents( p_parent, p_item ); if( i_duration != -1 ) { @@ -261,6 +258,9 @@ static int Demux( demux_t *p_demux ) } free( psz_mrl ); psz_mrl = NULL; + + vlc_input_item_CopyOptions( &p_parent->input, + &p_item->input ); } else { @@ -272,8 +272,14 @@ static int Demux( demux_t *p_demux ) psz_name = NULL; } - playlist_Control( p_playlist, PLAYLIST_VIEWPLAY,p_playlist->status.i_view, - p_playlist->status.p_item, NULL ); + if( b_play && p_playlist->status.p_item && + p_playlist->status.p_item->i_children > 0 ) + { + playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, + p_playlist->status.i_view, + p_playlist->status.p_item, + p_playlist->status.p_item->pp_children[0] ); + } vlc_object_release( p_playlist ); return VLC_SUCCESS; }