From 4552cb1eacb8768236a1c0f4976618dba580e68b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Boris=20Dor=C3=A8s?= Date: Fri, 13 Dec 2002 16:26:35 +0000 Subject: [PATCH] - vlc_playlist.h, playlist.c: added the ability to save a playlist to and restore it from a file chosen by the user. - win32/*: - implementation of the previous feature in the win32 interface > -> what the other interfaces need to do to support it is simply to > call the two following functions: > int playlist_LoadFile(playlist_t *p_playlist,const char *psz_filename); > int playlist_SaveFile(playlist_t *p_playlist,const char *psz_filename); > where psz_filename is the name of the destination/source file. - ability to open several files at a time --- include/vlc_playlist.h | 5 +- modules/gui/win32/mainframe.cpp | 5 +- modules/gui/win32/mainframe.dfm | 7 +- modules/gui/win32/playlist.cpp | 26 ++++++ modules/gui/win32/playlist.dfm | 48 ++++++++-- modules/gui/win32/playlist.h | 13 ++- src/playlist/playlist.c | 150 +++++++++++++++++++++++++++++--- 7 files changed, 225 insertions(+), 29 deletions(-) diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h index 8ca7ebb65d..8492740114 100644 --- a/include/vlc_playlist.h +++ b/include/vlc_playlist.h @@ -2,7 +2,7 @@ * vlc_playlist.h : Playlist functions ***************************************************************************** * Copyright (C) 1999, 2000, 2001, 2002 VideoLAN - * $Id: vlc_playlist.h,v 1.6 2002/12/03 23:36:41 gitan Exp $ + * $Id: vlc_playlist.h,v 1.7 2002/12/13 16:26:34 babal Exp $ * * Authors: Samuel Hocevar * @@ -72,4 +72,5 @@ VLC_EXPORT( void, playlist_Command, ( playlist_t *, int, int ) ); VLC_EXPORT( int, playlist_Add, ( playlist_t *, const char *, int, int ) ); VLC_EXPORT( int, playlist_AddItem, ( playlist_t *, playlist_item_t *, int, int ) ); VLC_EXPORT( int, playlist_Delete, ( playlist_t *, int ) ); - +VLC_EXPORT( int, playlist_LoadFile, ( playlist_t *, const char * ) ); +VLC_EXPORT( int, playlist_SaveFile, ( playlist_t *, const char * ) ); diff --git a/modules/gui/win32/mainframe.cpp b/modules/gui/win32/mainframe.cpp index 130a7bfc4e..add53a7dc2 100644 --- a/modules/gui/win32/mainframe.cpp +++ b/modules/gui/win32/mainframe.cpp @@ -147,8 +147,9 @@ void __fastcall TMainFrameDlg::OpenFileActionExecute( TObject *Sender ) if( OpenDialog1->Execute() ) { /* add the new file to the interface playlist */ - p_intf->p_sys->p_playwin->Add( OpenDialog1->FileName, - PLAYLIST_APPEND | PLAYLIST_GO, + for ( int i = 0 ; i < OpenDialog1->Files->Count ; i++ ) + p_intf->p_sys->p_playwin->Add( OpenDialog1->Files->Strings[i], + PLAYLIST_APPEND, PLAYLIST_END ); }; } diff --git a/modules/gui/win32/mainframe.dfm b/modules/gui/win32/mainframe.dfm index 9407a51015..356353b4bb 100644 --- a/modules/gui/win32/mainframe.dfm +++ b/modules/gui/win32/mainframe.dfm @@ -1,6 +1,6 @@ object MainFrameDlg: TMainFrameDlg - Left = 285 - Top = 170 + Left = 356 + Top = 227 Width = 541 Height = 306 BorderIcons = [biSystemMenu, biMinimize] @@ -256,7 +256,7 @@ object MainFrameDlg: TMainFrameDlg end object StatusBar: TStatusBar Left = 0 - Top = 241 + Top = 238 Width = 533 Height = 19 Panels = <> @@ -564,6 +564,7 @@ object MainFrameDlg: TMainFrameDlg end object OpenDialog1: TOpenDialog Filter = 'All Files (*.*)|*.*' + Options = [ofHideReadOnly, ofAllowMultiSelect, ofEnableSizing] Left = 8 Top = 208 end diff --git a/modules/gui/win32/playlist.cpp b/modules/gui/win32/playlist.cpp index 4508156194..f659f06c0f 100644 --- a/modules/gui/win32/playlist.cpp +++ b/modules/gui/win32/playlist.cpp @@ -411,3 +411,29 @@ void __fastcall TPlaylistDlg::Next() } //--------------------------------------------------------------------------- + +void __fastcall TPlaylistDlg::MenuFileCloseClick(TObject *Sender) +{ + Hide(); +} +//--------------------------------------------------------------------------- + +void __fastcall TPlaylistDlg::MenuFileOpenClick(TObject *Sender) +{ + if ( PlaylistOpenDlg->Execute() ) + { + playlist_LoadFile ( p_playlist , PlaylistOpenDlg->FileName.c_str() ); + UpdateGrid(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPlaylistDlg::MenuFileSaveClick(TObject *Sender) +{ + if ( PlaylistSaveDlg->Execute() ) + { + playlist_SaveFile ( p_playlist , PlaylistSaveDlg->FileName.c_str() ); + } +} +//--------------------------------------------------------------------------- + diff --git a/modules/gui/win32/playlist.dfm b/modules/gui/win32/playlist.dfm index c3567550dd..a9afc6fe84 100644 --- a/modules/gui/win32/playlist.dfm +++ b/modules/gui/win32/playlist.dfm @@ -1,6 +1,6 @@ object PlaylistDlg: TPlaylistDlg - Left = 346 - Top = 231 + Left = 433 + Top = 308 Width = 335 Height = 436 Caption = 'Playlist' @@ -58,23 +58,41 @@ object PlaylistDlg: TPlaylistDlg end object MainMenuPlaylist: TMainMenu Left = 8 - Top = 352 + Top = 8 + object MenuFile: TMenuItem + Caption = '&File' + object MenuFileOpen: TMenuItem + Caption = '&Open...' + OnClick = MenuFileOpenClick + end + object MenuFileSave: TMenuItem + Caption = '&Save...' + OnClick = MenuFileSaveClick + end + object N3: TMenuItem + Caption = '-' + end + object MenuFileClose: TMenuItem + Caption = '&Close' + OnClick = MenuFileCloseClick + end + end object MenuAdd: TMenuItem Tag = 3 Caption = '&Add' object MenuAddFile: TMenuItem Tag = 3 - Caption = '&File' + Caption = '&File...' OnClick = MenuAddFileClick end object MenuAddDisc: TMenuItem Tag = 3 - Caption = '&Disc' + Caption = '&Disc...' OnClick = MenuAddDiscClick end object MenuAddNet: TMenuItem Tag = 3 - Caption = '&Network' + Caption = '&Network...' OnClick = MenuAddNetClick end object MenuAddUrl: TMenuItem @@ -112,7 +130,7 @@ object PlaylistDlg: TPlaylistDlg end object PopupMenuPlaylist: TPopupMenu Left = 40 - Top = 352 + Top = 8 object PopupPlay: TMenuItem Tag = 3 Action = PlayStreamAction @@ -145,8 +163,8 @@ object PlaylistDlg: TPlaylistDlg end end object ActionList1: TActionList - Left = 264 - Top = 352 + Left = 72 + Top = 8 object InvertSelectionAction: TAction Tag = 3 Caption = 'Invert' @@ -178,4 +196,16 @@ object PlaylistDlg: TPlaylistDlg OnExecute = PlayStreamActionExecute end end + object PlaylistOpenDlg: TOpenDialog + Filter = 'All files(*.*)|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 136 + Top = 8 + end + object PlaylistSaveDlg: TSaveDialog + Filter = 'All files(*.*)|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofEnableSizing] + Left = 104 + Top = 8 + end end diff --git a/modules/gui/win32/playlist.h b/modules/gui/win32/playlist.h index 4e713a6b40..3a859fc98b 100644 --- a/modules/gui/win32/playlist.h +++ b/modules/gui/win32/playlist.h @@ -33,7 +33,8 @@ #include #include -#include /* for drag and drop */ +#include +#include /* for drag and drop */ /***************************************************************************** * This message is sent to the controls registered as drop targets @@ -72,6 +73,13 @@ __published: // IDE-managed Components TAction *DeleteSelectionAction; TAction *DeleteAllAction; TAction *PlayStreamAction; + TMenuItem *MenuFile; + TMenuItem *MenuFileOpen; + TMenuItem *MenuFileSave; + TMenuItem *N3; + TMenuItem *MenuFileClose; + TOpenDialog *PlaylistOpenDlg; + TSaveDialog *PlaylistSaveDlg; void __fastcall FormShow( TObject *Sender ); void __fastcall FormHide( TObject *Sender ); void __fastcall BitBtnOkClick( TObject *Sender ); @@ -88,6 +96,9 @@ __published: // IDE-managed Components void __fastcall DeleteSelectionActionExecute( TObject *Sender ); void __fastcall DeleteAllActionExecute( TObject *Sender ); void __fastcall PlayStreamActionExecute( TObject *Sender ); + void __fastcall MenuFileCloseClick(TObject *Sender); + void __fastcall MenuFileOpenClick(TObject *Sender); + void __fastcall MenuFileSaveClick(TObject *Sender); private: // User declarations char * __fastcall rindex( char *s, char c ); intf_thread_t *p_intf; diff --git a/src/playlist/playlist.c b/src/playlist/playlist.c index bd42705973..9a57a6e799 100644 --- a/src/playlist/playlist.c +++ b/src/playlist/playlist.c @@ -2,7 +2,7 @@ * playlist.c : Playlist management functions ***************************************************************************** * Copyright (C) 1999-2001 VideoLAN - * $Id: playlist.c,v 1.29 2002/12/07 22:15:10 gitan Exp $ + * $Id: playlist.c,v 1.30 2002/12/13 16:26:35 babal Exp $ * * Authors: Samuel Hocevar * @@ -34,6 +34,13 @@ #define PLAYLIST_STOPPED 0 #define PLAYLIST_RUNNING 1 +#define PLAYLIST_FILE_HEADER_0_5 "# vlc playlist file version 0.5" +#ifdef WIN32 +# define PLAYLIST_FILE_EOL "\r\n" +#else +# define PLAYLIST_FILE_EOL "\n" +#endif + /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -103,8 +110,8 @@ void playlist_Destroy( playlist_t * p_playlist ) int playlist_Add( playlist_t *p_playlist, const char * psz_target, int i_mode, int i_pos ) { - playlist_item_t * p_item; - + playlist_item_t * p_item; + p_item = malloc( sizeof( playlist_item_t ) ); if( p_item == NULL ) { @@ -128,20 +135,20 @@ int playlist_AddItem( playlist_t *p_playlist, playlist_item_t * p_item, vlc_mutex_lock( &p_playlist->object_lock ); /* - * CHECK_INSERT : checks if the item is already enqued before + * CHECK_INSERT : checks if the item is already enqued before * enqueing it */ if ( i_mode & PLAYLIST_CHECK_INSERT ) { int j; - + if ( p_playlist->pp_items ) { for ( j = 0; j < p_playlist->i_size; j++ ) { if ( !strcmp( p_playlist->pp_items[j]->psz_uri, p_item->psz_uri ) ) { - if( p_item->psz_name ) + if( p_item->psz_name ) { free( p_item->psz_name ); } @@ -151,7 +158,7 @@ int playlist_AddItem( playlist_t *p_playlist, playlist_item_t * p_item, } free( p_item ); vlc_mutex_unlock( &p_playlist->object_lock ); - return 0; + return 0; } } } @@ -159,9 +166,9 @@ int playlist_AddItem( playlist_t *p_playlist, playlist_item_t * p_item, i_mode |= PLAYLIST_APPEND; } - + msg_Dbg( p_playlist, "adding playlist item « %s »", p_item->psz_name ); - + /* Create the new playlist item */ @@ -299,10 +306,10 @@ void playlist_Command( playlist_t * p_playlist, int i_command, int i_arg ) case PLAYLIST_PLAY: p_playlist->i_status = PLAYLIST_RUNNING; - if ( p_playlist->p_input ) - { + if ( p_playlist->p_input ) + { input_SetStatus( p_playlist->p_input, INPUT_STATUS_PLAY ); - } + } break; case PLAYLIST_SKIP: @@ -550,3 +557,122 @@ static void Poubellize ( playlist_t *p_playlist, input_thread_t *p_input ) msg_Dbg( p_playlist, "poubellizing input %i\n", p_input->i_object_id ); } +/***************************************************************************** + * playlist_LoadFile: load a playlist file. + ****************************************************************************/ +int playlist_LoadFile( playlist_t * p_playlist, const char *psz_filename ) +{ + FILE *file; + char line[1024]; + int i_current_status; + int i; + + msg_Dbg( p_playlist, "opening playlist file %s", psz_filename ); + + file = fopen( psz_filename, "rt" ); + if( !file ) + { + msg_Err( p_playlist, "playlist file %s does not exist", psz_filename ); + return -1; + } + fseek( file, 0L, SEEK_SET ); + + /* check the file is not empty */ + if ( ! fgets( line, 1024, file ) ) + { + msg_Err( p_playlist, "playlist file %s is empty", psz_filename ); + fclose( file ); + return -1; + } + + /* get rid of line feed */ + if( line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r' ) + { + line[strlen(line)-1] = (char)0; + if( line[strlen(line)-1] == '\r' ) line[strlen(line)-1] = (char)0; + } + /* check the file format is valid */ + if ( strcmp ( line , PLAYLIST_FILE_HEADER_0_5 ) ) + { + msg_Err( p_playlist, "playlist file %s format is unsupported" + , psz_filename ); + fclose( file ); + return -1; + } + + /* stop playing */ + i_current_status = p_playlist->i_status; + if ( p_playlist->i_status != PLAYLIST_STOPPED ) + { + playlist_Stop ( p_playlist ); + } + + /* delete current content of the playlist */ + for( i = p_playlist->i_size - 1; i >= 0; i-- ) + { + playlist_Delete ( p_playlist , i ); + } + + /* simply add each line */ + while( fgets( line, 1024, file ) ) + { + /* ignore comments or empty lines */ + if( (line[0] == '#') || (line[0] == '\r') || (line[0] == '\n') + || (line[0] == (char)0) ) + continue; + + /* get rid of line feed */ + if( line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r' ) + { + line[strlen(line)-1] = (char)0; + if( line[strlen(line)-1] == '\r' ) line[strlen(line)-1] = (char)0; + } + + playlist_Add ( p_playlist , (char*) &line , PLAYLIST_APPEND , PLAYLIST_END ); + } + + /* start playing */ + if ( i_current_status != PLAYLIST_STOPPED ) + { + playlist_Play ( p_playlist ); + } + + fclose( file ); + + return 0; +} + +/***************************************************************************** + * playlist_SaveFile: Save a playlist in a file. + *****************************************************************************/ +int playlist_SaveFile( playlist_t * p_playlist, const char * psz_filename ) +{ + FILE *file; + int i; + + vlc_mutex_lock( &p_playlist->object_lock ); + + msg_Dbg( p_playlist, "saving playlist file %s", psz_filename ); + + file = fopen( psz_filename, "wt" ); + if( !file ) + { + msg_Err( p_playlist , "could not create playlist file %s" + , psz_filename ); + return -1; + } + + fprintf( file , PLAYLIST_FILE_HEADER_0_5 PLAYLIST_FILE_EOL ); + + for ( i = 0 ; i < p_playlist->i_size ; i++ ) + { + fprintf( file , p_playlist->pp_items[i]->psz_uri ); + fprintf( file , PLAYLIST_FILE_EOL ); + } + + fclose( file ); + + vlc_mutex_unlock( &p_playlist->object_lock ); + + return 0; +} -- 2.39.5