]> git.sesse.net Git - vlc/blob - modules/demux/playlist/wpl.c
xspf: Don't nop item->psz_nam
[vlc] / modules / demux / playlist / wpl.c
1 /*****************************************************************************
2  * wpl.c : WPL playlist format import
3  *****************************************************************************
4  * Copyright (C) 2009 the VideoLAN team
5  *
6  * Authors: Su Heaven <suheaven@gmail.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21  *****************************************************************************/
22
23 /*****************************************************************************
24  * Preamble
25  *****************************************************************************/
26
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include <vlc_common.h>
32 #include <vlc_demux.h>
33 #include <vlc_charset.h>
34
35 #include "playlist.h"
36
37 struct demux_sys_t
38 {
39     char *psz_prefix;
40 };
41
42 /*****************************************************************************
43  * Local prototypes
44  *****************************************************************************/
45 static int Demux( demux_t *p_demux);
46 static int Control( demux_t *p_demux, int i_query, va_list args );
47 static char* ParseUriValue(char* psz_string);
48
49 /*****************************************************************************
50  * Import_WPL: main import function
51  *****************************************************************************/
52 int Import_WPL( vlc_object_t *p_this )
53 {
54     demux_t *p_demux = (demux_t *)p_this;
55     const uint8_t *p_peek;
56     CHECK_PEEK( p_peek, 8 );
57
58     if(! ( demux_IsPathExtension( p_demux, ".wpl" ) || demux_IsForced( p_demux,  "wpl" )))
59         return VLC_EGENERIC;
60
61     STANDARD_DEMUX_INIT_MSG( "found valid WPL playlist" );
62     p_demux->p_sys->psz_prefix = FindPrefix( p_demux );
63
64     return VLC_SUCCESS;
65 }
66
67
68
69 /*****************************************************************************
70  * Deactivate: frees unused data
71  *****************************************************************************/
72 void Close_WPL( vlc_object_t *p_this )
73 {
74     demux_t *p_demux = (demux_t *)p_this;
75     free( p_demux->p_sys->psz_prefix );
76     free( p_demux->p_sys );
77 }
78
79 static inline void MaybeFromLocaleRep (char **str)
80 {
81     char *const orig_str = *str;
82
83     if ((orig_str != NULL) && !IsUTF8 (orig_str))
84     {
85         *str = FromLocaleDup (orig_str);
86         free (orig_str);
87     }
88 }
89
90
91 static int Demux( demux_t *p_demux )
92 {
93     char       *psz_line;
94     char       *psz_uri = NULL;
95     char       *psz_parse;
96     input_item_t *p_input;
97
98     INIT_PLAYLIST_STUFF;
99
100     psz_line = stream_ReadLine( p_demux->s );
101     while( psz_line )
102     {
103         psz_parse = psz_line;
104         /* Skip leading tabs and spaces */
105         while( *psz_parse == ' '  || *psz_parse == '\t' ||
106                *psz_parse == '\n' || *psz_parse == '\r' )
107             psz_parse++;
108
109         /* if the line is the uri of the media item */
110         if( !strncasecmp( psz_parse, "<media src=\"", strlen( "<media src=\"" ) ) )
111         {
112             psz_uri = ParseUriValue( psz_parse );
113             if( !EMPTY_STR(psz_uri) )
114             {
115                 psz_uri = ProcessMRL( psz_uri, p_demux->p_sys->psz_prefix );
116                 MaybeFromLocaleRep( &psz_uri );
117                 p_input = input_item_NewExt( p_demux, psz_uri, psz_uri,
118                                         0, NULL, 0, -1 );
119                 input_item_AddSubItem( p_current_input, p_input );
120             }
121             free( psz_uri );
122         }
123
124         /* Fetch another line */
125         free( psz_line );
126         psz_line = stream_ReadLine( p_demux->s );
127
128     }
129     HANDLE_PLAY_AND_RELEASE;
130     var_Destroy( p_demux, "wpl-extvlcopt" );
131     return 0; /* Needed for correct operation of go back */
132 }
133
134 static int Control( demux_t *p_demux, int i_query, va_list args )
135 {
136     VLC_UNUSED(p_demux); VLC_UNUSED(i_query); VLC_UNUSED(args);
137     return VLC_EGENERIC;
138 }
139
140 static char* ParseUriValue( char* psz_string )
141 {
142     int i_len = strlen( psz_string );
143     if( i_len <= 3 )
144         return NULL;
145     char* psz_value = calloc( i_len, 1 );
146     if( !psz_value )
147         return NULL;
148
149     sscanf( psz_string, "%*[^=]=\"%[^\r\t\n\"]", psz_value );
150
151     return psz_value;
152 }
153
154