loadsave.c 5.3 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
 *
 * 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
dionoea's avatar
dionoea committed
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 23 24 25
 *****************************************************************************/
#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

#include "vlc_playlist.h"
34
#include "charset.h"
35

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

38
/**
zorglub's avatar
zorglub committed
39 40
 * Import a certain playlist file into the library
 * This file will get inserted as a new category
zorglub's avatar
zorglub committed
41
 *
zorglub's avatar
zorglub committed
42
 * XXX: TODO
43 44
 * \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
45
 * \return VLC_SUCCESS on success
46
 */
zorglub's avatar
zorglub committed
47
int playlist_Import( playlist_t * p_playlist, const char *psz_filename )
48
{
zorglub's avatar
zorglub committed
49 50 51
    playlist_item_t *p_item;
    char *psz_uri;
    int i_id;
52

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


zorglub's avatar
zorglub committed
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 86
    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
87
    msg_Info( p_playlist, "clearing playlist");
zorglub's avatar
zorglub committed
88 89 90
    playlist_Clear( p_playlist );


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

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

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

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

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

107 108
/**
 * Export a playlist to a certain type of playlistfile
zorglub's avatar
zorglub committed
109
 *
110 111 112
 * \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
113
 * \return VLC_SUCCESS on success
114
 */
zorglub's avatar
zorglub committed
115 116
int playlist_Export( playlist_t * p_playlist, const char *psz_filename ,
                     const char *psz_type)
117
{
zorglub's avatar
zorglub committed
118 119
    module_t *p_module;
    playlist_export_t *p_export;
120

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

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

zorglub's avatar
zorglub committed
141 142 143
    p_playlist->p_private = (void *)p_export;
    /* Lock the playlist */
    vlc_mutex_lock( &p_playlist->object_lock );
144

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

155
    /* Clean up */
zorglub's avatar
zorglub committed
156
    fclose( p_export->p_file );
157 158 159 160
    if ( p_export->psz_filename )
        free( p_export->psz_filename );
    free ( p_export );
    p_playlist->p_private = NULL;
161 162
    vlc_mutex_unlock( &p_playlist->object_lock );

zorglub's avatar
zorglub committed
163
    return VLC_SUCCESS;
164
}