]> git.sesse.net Git - vlc/commitdiff
Add Google Video Playlist parsing support (stuff like http://video.google.com/videogv...
authorAntoine Cellerier <dionoea@videolan.org>
Fri, 7 Jul 2006 20:24:11 +0000 (20:24 +0000)
committerAntoine Cellerier <dionoea@videolan.org>
Fri, 7 Jul 2006 20:24:11 +0000 (20:24 +0000)
modules/demux/playlist/Modules.am
modules/demux/playlist/gvp.c [new file with mode: 0644]
modules/demux/playlist/playlist.c
modules/demux/playlist/playlist.h

index 9ca3c9eed8843249e883baa4353e993099674462..07e9b7b3a4e18b708c8e8e45dad442d29480106c 100644 (file)
@@ -13,6 +13,7 @@ SOURCES_playlist = \
        asx.c \
        sgimb.c \
        qtl.c \
+       gvp.c \
        $(NULL)
 
 
diff --git a/modules/demux/playlist/gvp.c b/modules/demux/playlist/gvp.c
new file mode 100644 (file)
index 0000000..dda6b4b
--- /dev/null
@@ -0,0 +1,231 @@
+/*****************************************************************************
+ * gvp.c: Google Video Playlist demuxer
+ *****************************************************************************
+ * Copyright (C) 2006 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Antoine Cellerier <dionoea @t videolan d.t 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+/**
+ * Format seems to be:
+ * gvp_version:<version> (1.1)
+ * url:<the media's url>
+ * docid:<integer>
+ * duration:<integer ms ?>
+ * title:<the title>
+ * description:<desc line1>^M
+ * description:<desc linei>^M
+ * description:<desc final line (no ^M)>
+ * lines starting with # are comments
+ */
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <stdlib.h>                                      /* malloc(), free() */
+
+#include <vlc/vlc.h>
+#include <vlc/input.h>
+#include <vlc/intf.h>
+
+#include <errno.h>                                                 /* ENOMEM */
+#include "playlist.h"
+
+#define MAX_LINE 1024
+
+struct demux_sys_t
+{
+    playlist_t *p_playlist;
+    playlist_item_t *p_current;
+    playlist_item_t *p_item_in_category;
+    int i_parent_id;
+};
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+static int Demux( demux_t *p_demux);
+static int Control( demux_t *p_demux, int i_query, va_list args );
+
+/*****************************************************************************
+ * Import_GVP: main import function
+ *****************************************************************************/
+int E_(Import_GVP)( vlc_object_t *p_this )
+{
+    demux_t *p_demux = (demux_t *)p_this;
+    demux_sys_t *p_sys;
+
+    int i_size;
+    byte_t *p_peek;
+
+    i_size = stream_Peek( p_demux->s, &p_peek, MAX_LINE );
+    if( !strstr( (char*)p_peek, "gvp_version:" ) )
+    {
+        return VLC_EGENERIC;
+    }
+
+    msg_Dbg( p_demux, "using Google Video Playlist (gvp) import");
+
+    p_demux->pf_control = Control;
+    p_demux->pf_demux = Demux;
+    p_demux->p_sys = p_sys = malloc( sizeof(demux_sys_t) );
+    if( p_sys == NULL )
+    {
+        msg_Err( p_demux, "out of memory" );
+        return VLC_ENOMEM;
+    }
+
+    p_sys->p_playlist = NULL;
+
+    return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ * Deactivate: frees unused data
+ *****************************************************************************/
+void E_(Close_GVP)( vlc_object_t *p_this )
+{
+    demux_t *p_demux = (demux_t *)p_this;
+    demux_sys_t *p_sys = p_demux->p_sys;
+
+    if( p_sys->p_playlist )
+        vlc_object_release( p_sys->p_playlist );
+    free( p_sys );
+}
+
+static int Demux( demux_t *p_demux )
+{
+    demux_sys_t *p_sys = p_demux->p_sys;
+
+    INIT_PLAYLIST_STUFF;
+
+    p_sys->p_playlist = p_playlist;
+    p_sys->p_current = p_current;
+    p_sys->i_parent_id = i_parent_id;
+    p_sys->p_item_in_category = p_item_in_category;
+
+    char *psz_line;
+    char *psz_attrvalue;
+
+    char *psz_version = NULL;
+    char *psz_url = NULL;
+    char *psz_docid = NULL;
+    int i_duration = -1;
+    char *psz_title = NULL;
+    char *psz_description = NULL;
+
+    while( ( psz_line = stream_ReadLine( p_demux->s ) ) )
+    {
+        if( *psz_line == '#' )
+        {
+            /* This is a comment */
+            free( psz_line );
+            continue;
+        }
+        psz_attrvalue = strchr( psz_line, ':' );
+        if( !psz_attrvalue )
+        {
+            msg_Dbg( p_demux, "Unable to parse line (%s)", psz_line );
+            free( psz_line );
+            continue;
+        }
+        *psz_attrvalue = '\0';
+        psz_attrvalue++;
+        if( !strcmp( psz_line, "gvp_version" ) )
+        {
+            psz_version = strdup( psz_attrvalue );
+        }
+        else if( !strcmp( psz_line, "url" ) )
+        {
+            psz_url = strdup( psz_attrvalue );
+        }
+        else if( !strcmp( psz_line, "docid" ) )
+        {
+            psz_docid = strdup( psz_attrvalue );
+        }
+        else if( !strcmp( psz_line, "duration" ) )
+        {
+            i_duration = atoi( psz_attrvalue );
+        }
+        else if( !strcmp( psz_line, "title" ) )
+        {
+            psz_title = strdup( psz_attrvalue );
+        }
+        else if( !strcmp( psz_line, "description" ) )
+        {
+            char *buf;
+            if( !psz_description )
+            {
+                psz_description = strdup( psz_attrvalue );
+            }
+            else
+            {
+                /* handle multi-line descriptions */
+                buf = malloc( strlen( psz_description )
+                            + strlen( psz_attrvalue ) + 2 );
+                sprintf( buf, "%s\n%s", psz_description, psz_attrvalue );
+                free( psz_description );
+                psz_description = buf;
+            }
+            /* remove ^M char at the end of the line (if any) */
+            buf = psz_description + strlen( psz_description );
+            if( buf != psz_description )
+            {
+                buf--;
+                if( *buf == '\r' ) *buf = '\0';
+            }
+        }
+        free( psz_line );
+    }
+
+    if( !psz_url )
+    {
+        msg_Err( p_demux, "URL not found" );
+    }
+    else
+    {
+        p_input = input_ItemNewExt( p_sys->p_playlist,
+                                    psz_url, psz_title, 0, NULL, -1 );
+#define SADD_INFO( type, field ) if( field ) { vlc_input_item_AddInfo( \
+                    p_input, _("Google Video"), _(type), "%s", field ) ; }
+        SADD_INFO( "gvp_version", psz_version );
+        SADD_INFO( "docid", psz_docid );
+        SADD_INFO( "description", psz_description );
+        playlist_AddWhereverNeeded( p_sys->p_playlist, p_input,
+                            p_sys->p_current, p_sys->p_item_in_category,
+                            (p_sys->i_parent_id > 0 ) ? VLC_TRUE: VLC_FALSE,
+                            PLAYLIST_APPEND );
+    }
+
+    HANDLE_PLAY_AND_RELEASE;
+
+    free( psz_version );
+    free( psz_url );
+    free( psz_docid );
+    free( psz_title );
+    free( psz_description );
+
+    p_sys->p_playlist = NULL;
+
+    return VLC_SUCCESS;
+}
+
+static int Control( demux_t *p_demux, int i_query, va_list args )
+{
+    return VLC_EGENERIC;
+}
index e1d6336f1f172c5ef856fb384760a9856918e6c8..eb983a192181cf8abd1cac00e1a774615c93821f 100644 (file)
@@ -111,6 +111,11 @@ vlc_module_begin();
         add_shortcut( "qtl" );
         set_capability( "demux2", 10 );
         set_callbacks( E_(Import_QTL), E_(Close_QTL) );
+    add_submodule();
+        set_description( _("Google Video Playlist importer") );
+        add_shortcut( "gvp" );
+        set_capability( "demux2", 10 );
+        set_callbacks( E_(Import_GVP), E_(Close_GVP) );
 vlc_module_end();
 
 
index 610404651a6f130d63441602795df27b9ecbe8d5..a8939e4f23cd50105adf44d1f49dbfe73fd1740e 100644 (file)
@@ -62,6 +62,9 @@ void E_(Close_SGIMB) ( vlc_object_t * );
 int E_(Import_QTL) ( vlc_object_t * );
 void E_(Close_QTL) ( vlc_object_t * );
 
+int E_(Import_GVP) ( vlc_object_t * );
+void E_(Close_GVP) ( vlc_object_t * );
+
 #define INIT_PLAYLIST_STUFF \
     int i_parent_id; \
     vlc_bool_t b_play; \