]> git.sesse.net Git - vlc/blobdiff - modules/misc/lua/meta.c
Export VLC's md5 API.
[vlc] / modules / misc / lua / meta.c
index fa389bd36736cc9ae3e5dba4a21edf3d7b5a02b1..200ae2f6cca1fc27e1d536559267e4168e8674aa 100644 (file)
@@ -42,7 +42,6 @@
 #include <vlc_url.h>
 #include <vlc_strings.h>
 #include <vlc_stream.h>
-#include <vlc_charset.h>
 
 #include "vlc.h"
 #include "libs.h"
@@ -52,7 +51,7 @@
  *****************************************************************************/
 static const luaL_Reg p_reg[] = { { NULL, NULL } };
 
-static lua_State * init( vlc_object_t *p_this, input_item_t * p_item )
+static lua_State * init( vlc_object_t *p_this, input_item_t * p_item, const char *psz_filename )
 {
     lua_State * L = luaL_newstate();
     if( !L )
@@ -72,11 +71,21 @@ static lua_State * init( vlc_object_t *p_this, input_item_t * p_item )
     luaopen_variables( L );
     luaopen_object( L );
     luaopen_misc( L );
+    luaopen_xml( L );
+    luaopen_md5( L );
     luaopen_input_item( L, p_item );
 
     lua_pushlightuserdata( L, p_this );
     lua_setfield( L, -2, "private" );
 
+    if( vlclua_add_modules_path( p_this, L, psz_filename ) )
+    {
+        msg_Warn( p_this, "Error while setting the module search path for %s",
+                  psz_filename );
+        lua_close( L );
+        return NULL;
+    }
+
     return L;
 }
 
@@ -127,14 +136,21 @@ error:
  * pointed by psz_filename.
  *****************************************************************************/
 static int fetch_art( vlc_object_t *p_this, const char * psz_filename,
-                      lua_State * L, void * user_data )
+                      void * user_data )
 {
-    input_item_t * p_input = user_data;
+    input_item_t * p_item = user_data;
     int s;
 
+    lua_State *L = init( p_this, p_item, psz_filename );
+    if( !L )
+        return VLC_EGENERIC;
+
     int i_ret = run(p_this, psz_filename, L, "fetch_art");
     if(i_ret != VLC_SUCCESS)
+    {
+        lua_close( L );
         return i_ret;
+    }
 
     if((s = lua_gettop( L )))
     {
@@ -146,7 +162,8 @@ static int fetch_art( vlc_object_t *p_this, const char * psz_filename,
             if( psz_value && *psz_value != 0 )
             {
                 lua_Dbg( p_this, "setting arturl: %s", psz_value );
-                input_item_SetArtURL ( p_input, psz_value );
+                input_item_SetArtURL ( p_item, psz_value );
+                lua_close( L );
                 return VLC_SUCCESS;
             }
         }
@@ -161,6 +178,7 @@ static int fetch_art( vlc_object_t *p_this, const char * psz_filename,
         msg_Err( p_this, "Script went completely foobar" );
     }
 
+    lua_close( L );
     return VLC_EGENERIC;
 }
 
@@ -169,18 +187,44 @@ static int fetch_art( vlc_object_t *p_this, const char * psz_filename,
  * pointed by psz_filename.
  *****************************************************************************/
 static int read_meta( vlc_object_t *p_this, const char * psz_filename,
-                     lua_State * L, void * user_data )
+                      void * user_data )
 {
-    VLC_UNUSED(user_data);
+    input_item_t * p_item = user_data;
+    lua_State *L = init( p_this, p_item, psz_filename );
+    if( !L )
+        return VLC_EGENERIC;
 
     int i_ret = run(p_this, psz_filename, L, "read_meta");
     if(i_ret != VLC_SUCCESS)
+    {
+        lua_close( L );
         return i_ret;
+    }
 
     // Continue, all "meta reader" are always run.
+    lua_close( L );
     return 1;
 }
 
+
+/*****************************************************************************
+ * Called through lua_scripts_batch_execute to call 'fetch_meta' on the script
+ * pointed by psz_filename.
+ *****************************************************************************/
+static int fetch_meta( vlc_object_t *p_this, const char * psz_filename,
+                       void * user_data )
+{
+    input_item_t * p_item = user_data;
+    lua_State *L = init( p_this, p_item, psz_filename );
+    if( !L )
+        return VLC_EGENERIC;
+
+    int ret = run(p_this, psz_filename, L, "fetch_meta");
+    lua_close( L );
+
+    return ret;
+}
+
 /*****************************************************************************
  * Read meta.
  *****************************************************************************/
@@ -190,13 +234,27 @@ int ReadMeta( vlc_object_t *p_this )
     demux_meta_t *p_demux_meta = (demux_meta_t *)p_this;
     input_item_t *p_item = p_demux_meta->p_item;
 
-    lua_State *L = init( p_this, p_item );
-    int i_ret = vlclua_scripts_batch_execute( p_this, "meta/reader", &read_meta, L, NULL );
-    lua_close( L );
+    int i_ret = vlclua_scripts_batch_execute( p_this, "meta/reader", &read_meta, p_item );
+
+    return i_ret;
+}
+
+
+/*****************************************************************************
+ * Read meta.
+ *****************************************************************************/
+
+int FetchMeta( vlc_object_t *p_this )
+{
+    demux_meta_t *p_demux_meta = (demux_meta_t *)p_this;
+    input_item_t *p_item = p_demux_meta->p_item;
+
+    int i_ret = vlclua_scripts_batch_execute( p_this, "meta/fetcher", &fetch_meta, p_item );
 
     return i_ret;
 }
 
+
 /*****************************************************************************
  * Module entry point for art.
  *****************************************************************************/
@@ -204,15 +262,9 @@ int FindArt( vlc_object_t *p_this )
 {
     art_finder_t *p_finder = (art_finder_t *)p_this;
     input_item_t *p_item = p_finder->p_item;
-    playlist_t *p_playlist = pl_Hold( p_this );
-    if( !p_playlist )
-        return VLC_EGENERIC;
 
-    lua_State *L = init( p_this, p_item );
-    int i_ret = vlclua_scripts_batch_execute( p_this, "meta/art", &fetch_art, L, p_item );
-    lua_close( L );
+    int i_ret = vlclua_scripts_batch_execute( p_this, "meta/art", &fetch_art, p_item );
 
-    pl_Release( p_this );
     return i_ret;
 }