From f2f15f46eca071e5118bd115fc298cb507872fe4 Mon Sep 17 00:00:00 2001 From: bl4 <bl4@playker.info> Date: Sun, 15 Jun 2008 14:58:40 +0200 Subject: [PATCH] M3U playlist detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémi Denis-Courmont <rdenis@simphalempin.com> --- modules/demux/playlist/m3u.c | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/modules/demux/playlist/m3u.c b/modules/demux/playlist/m3u.c index 1a054a29f0..49e4869583 100644 --- a/modules/demux/playlist/m3u.c +++ b/modules/demux/playlist/m3u.c @@ -47,6 +47,7 @@ struct demux_sys_t static int Demux( demux_t *p_demux); static int Control( demux_t *p_demux, int i_query, va_list args ); static void parseEXTINF( char *psz_string, char **ppsz_artist, char **ppsz_name, int *pi_duration ); +static bool ContainsURL( demux_t *p_demux ); /***************************************************************************** * Import_M3U: main import function @@ -61,7 +62,7 @@ int Import_M3U( vlc_object_t *p_this ) demux_IsPathExtension( p_demux, ".m3u" ) || demux_IsPathExtension( p_demux, ".vlc" ) || /* A .ram file can contain a single rtsp link */ demux_IsPathExtension( p_demux, ".ram" ) || demux_IsPathExtension( p_demux, ".rm" ) || - demux_IsForced( p_demux, "m3u" ) ) ) + demux_IsForced( p_demux, "m3u" ) || ContainsURL( p_demux ) ) ) return VLC_EGENERIC; STANDARD_DEMUX_INIT_MSG( "found valid M3U playlist" ); @@ -70,6 +71,41 @@ int Import_M3U( vlc_object_t *p_this ) return VLC_SUCCESS; } +static bool ContainsURL( demux_t *p_demux ) +{ + uint8_t *p_peek; + int i_peek; + uint8_t *p_peek_end; + + i_peek = stream_Peek( p_demux->s, &p_peek, 1024 ); + if( i_peek <= 0 ) return false; + p_peek_end = p_peek + i_peek; + + while( p_peek + sizeof( "https://" ) < p_peek_end ) + { + /* One line starting with an URL is enough */ + if( !strncasecmp( p_peek, "http://", sizeof( "http://" ) - 1 ) || + !strncasecmp( p_peek, "mms://", sizeof( "mms://" ) - 1 ) || + !strncasecmp( p_peek, "rtsp://", sizeof( "rtsp://" ) - 1 ) || + !strncasecmp( p_peek, "https://", sizeof( "https://" ) - 1 ) || + !strncasecmp( p_peek, "ftp://", sizeof( "ftp://" ) - 1 ) ) + { + return true; + } + /* Comments and blank lines are ignored */ + else if( *p_peek != '#' && *p_peek != '\n' && *p_peek != '\r') + { + return false; + } + + while( p_peek < p_peek_end && *p_peek != '\n' ) + p_peek++; + if ( *p_peek == '\n' ) + p_peek++; + } + return false; +} + /***************************************************************************** * Deactivate: frees unused data *****************************************************************************/ -- 2.25.4