loadsave.c 5.01 KB
Newer Older
1 2 3
/*****************************************************************************
 * loadsave.c : Playlist loading / saving functions
 *****************************************************************************
4
 * Copyright (C) 1999-2004 the VideoLAN team
zorglub's avatar
zorglub committed
5
 * $Id$
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
 *
 * Authors: Samuel Hocevar <sam@zoy.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.
 *****************************************************************************/
#include <stdlib.h>                                      /* free(), strtol() */
#include <stdio.h>                                              /* sprintf() */
#include <string.h>                                            /* strerror() */
26
#include <errno.h>
27 28 29 30

#include <vlc/vlc.h>
#include <vlc/vout.h>
#include <vlc/sout.h>
Laurent Aimar's avatar
Laurent Aimar committed
31
#include <vlc/input.h>
32 33 34

#include "vlc_playlist.h"

zorglub's avatar
zorglub committed
35
#define PLAYLIST_FILE_HEADER  "# vlc playlist file version 0.5"
36

37
/**
zorglub's avatar
zorglub committed
38 39
 * Import a certain playlist file into the library
 * This file will get inserted as a new category
zorglub's avatar
zorglub committed
40
 *
zorglub's avatar
zorglub committed
41
 * XXX: TODO
42 43
 * \param p_playlist the playlist to which the new items will be added
 * \param psz_filename the name of the playlistfile to import
zorglub's avatar
zorglub committed
44
 * \return VLC_SUCCESS on success
45
 */
zorglub's avatar
zorglub committed
46
int playlist_Import( playlist_t * p_playlist, const char *psz_filename )
47
{
zorglub's avatar
zorglub committed
48 49 50
    playlist_item_t *p_item;
    char *psz_uri;
    int i_id;
51

zorglub's avatar
zorglub committed
52
    msg_Info( p_playlist, "clearing playlist");
zorglub's avatar
zorglub committed
53
    playlist_Clear( p_playlist );
54 55


zorglub's avatar
zorglub committed
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
    psz_uri = (char *)malloc(sizeof(char)*strlen(psz_filename) + 17 );
    sprintf( psz_uri, "file/playlist://%s", psz_filename);

    i_id = playlist_Add( p_playlist, psz_uri, psz_uri,
                  PLAYLIST_INSERT  , PLAYLIST_END);

    vlc_mutex_lock( &p_playlist->object_lock );
    p_item = playlist_ItemGetById( p_playlist, i_id );
    p_item->b_autodeletion = VLC_TRUE;
    vlc_mutex_unlock( &p_playlist->object_lock );

    playlist_Play(p_playlist);

    return VLC_SUCCESS;
}

/**
 * Load a certain playlist file into the playlist
 * This file will replace the contents of the "current" view
 *
 * \param p_playlist the playlist to which the new items will be added
 * \param psz_filename the name of the playlistfile to import
 * \return VLC_SUCCESS on success
 */
int playlist_Load( playlist_t * p_playlist, const char *psz_filename )
{
    playlist_item_t *p_item;
    char *psz_uri;
    int i_id;

zorglub's avatar
zorglub committed
86
    msg_Info( p_playlist, "clearing playlist");
zorglub's avatar
zorglub committed
87 88 89
    playlist_Clear( p_playlist );


zorglub's avatar
zorglub committed
90 91
    psz_uri = (char *)malloc(sizeof(char)*strlen(psz_filename) + 17 );
    sprintf( psz_uri, "file/playlist://%s", psz_filename);
92

zorglub's avatar
zorglub committed
93
    i_id = playlist_Add( p_playlist, psz_uri, psz_uri,
zorglub's avatar
zorglub committed
94
                  PLAYLIST_INSERT  , PLAYLIST_END);
95

zorglub's avatar
zorglub committed
96
    vlc_mutex_lock( &p_playlist->object_lock );
97
    p_item = playlist_ItemGetById( p_playlist, i_id );
zorglub's avatar
zorglub committed
98
    p_item->b_autodeletion = VLC_TRUE;
zorglub's avatar
zorglub committed
99
    vlc_mutex_unlock( &p_playlist->object_lock );
100

zorglub's avatar
zorglub committed
101 102
    playlist_Play(p_playlist);

zorglub's avatar
zorglub committed
103
    return VLC_SUCCESS;
104 105
}

106 107
/**
 * Export a playlist to a certain type of playlistfile
zorglub's avatar
zorglub committed
108
 *
109 110 111
 * \param p_playlist the playlist to export
 * \param psz_filename the location where the exported file will be saved
 * \param psz_type the type of playlist file to create.
zorglub's avatar
zorglub committed
112
 * \return VLC_SUCCESS on success
113
 */
zorglub's avatar
zorglub committed
114 115
int playlist_Export( playlist_t * p_playlist, const char *psz_filename ,
                     const char *psz_type)
116
{
zorglub's avatar
zorglub committed
117 118
    module_t *p_module;
    playlist_export_t *p_export;
119

zorglub's avatar
zorglub committed
120
    msg_Info( p_playlist, "saving playlist to file %s", psz_filename );
121

zorglub's avatar
zorglub committed
122 123 124 125
    /* Prepare the playlist_export_t structure */
    p_export = (playlist_export_t *)malloc( sizeof(playlist_export_t) );
    if( !p_export)
    {
zorglub's avatar
zorglub committed
126
        msg_Err( p_playlist, "out of memory");
zorglub's avatar
zorglub committed
127 128 129 130
        return VLC_ENOMEM;
    }
    p_export->p_file = fopen( psz_filename, "wt" );
    if( !p_export->p_file )
131
    {
zorglub's avatar
zorglub committed
132
        msg_Err( p_playlist , "could not create playlist file %s"
gbazin's avatar
 
gbazin committed
133 134
                 " (%s)", psz_filename, strerror(errno) );
        return VLC_EGENERIC;
135 136
    }

zorglub's avatar
zorglub committed
137 138 139
    p_playlist->p_private = (void *)p_export;
    /* Lock the playlist */
    vlc_mutex_lock( &p_playlist->object_lock );
140

zorglub's avatar
zorglub committed
141
    /* And call the module ! All work is done now */
gbazin's avatar
 
gbazin committed
142
    p_module = module_Need( p_playlist, "playlist export", psz_type, VLC_TRUE);
zorglub's avatar
zorglub committed
143
    if( !p_module )
144
    {
zorglub's avatar
zorglub committed
145
        msg_Warn( p_playlist, "failed to export playlist" );
zorglub's avatar
zorglub committed
146 147
        vlc_mutex_unlock( &p_playlist->object_lock );
        return VLC_ENOOBJ;
148
    }
zorglub's avatar
zorglub committed
149
    module_Unneed( p_playlist , p_module );
150

zorglub's avatar
zorglub committed
151
    fclose( p_export->p_file );
152 153 154

    vlc_mutex_unlock( &p_playlist->object_lock );

zorglub's avatar
zorglub committed
155
    return VLC_SUCCESS;
156
}