Commit 058b871e authored by Francois Cartegnie's avatar Francois Cartegnie

finder/fetcher: always use scripts doing local access

parent 8301e1ea
...@@ -21,10 +21,18 @@ ...@@ -21,10 +21,18 @@
#ifndef VLC_ART_FINDER_H #ifndef VLC_ART_FINDER_H
#define VLC_ART_FINDER_H 1 #define VLC_ART_FINDER_H 1
typedef enum meta_fetcher_scope_t
{
FETCHER_SCOPE_LOCAL,
FETCHER_SCOPE_NETWORK,
FETCHER_SCOPE_ANY
} meta_fetcher_scope_t;
typedef struct art_finder_t typedef struct art_finder_t
{ {
VLC_COMMON_MEMBERS VLC_COMMON_MEMBERS
input_item_t *p_item; input_item_t *p_item;
meta_fetcher_scope_t e_scope;
} art_finder_t; } art_finder_t;
#endif #endif
...@@ -126,9 +126,9 @@ static const luaL_Reg p_reg_parse[] = ...@@ -126,9 +126,9 @@ static const luaL_Reg p_reg_parse[] =
* the script pointed by psz_filename. * the script pointed by psz_filename.
*****************************************************************************/ *****************************************************************************/
static int probe_luascript( vlc_object_t *p_this, const char * psz_filename, static int probe_luascript( vlc_object_t *p_this, const char * psz_filename,
void * user_data ) const luabatch_context_t *p_context )
{ {
VLC_UNUSED(user_data); VLC_UNUSED(p_context);
demux_t * p_demux = (demux_t *)p_this; demux_t * p_demux = (demux_t *)p_this;
p_demux->p_sys->psz_filename = strdup(psz_filename); p_demux->p_sys->psz_filename = strdup(psz_filename);
......
...@@ -67,7 +67,7 @@ static const char caps[][20] = { ...@@ -67,7 +67,7 @@ static const char caps[][20] = {
static int ScanExtensions( extensions_manager_t *p_this ); static int ScanExtensions( extensions_manager_t *p_this );
static int ScanLuaCallback( vlc_object_t *p_this, const char *psz_script, static int ScanLuaCallback( vlc_object_t *p_this, const char *psz_script,
void *dummy ); const struct luabatch_context_t * );
static int Control( extensions_manager_t *, int, va_list ); static int Control( extensions_manager_t *, int, va_list );
static int GetMenuEntries( extensions_manager_t *p_mgr, extension_t *p_ext, static int GetMenuEntries( extensions_manager_t *p_mgr, extension_t *p_ext,
char ***pppsz_titles, uint16_t **ppi_ids ); char ***pppsz_titles, uint16_t **ppi_ids );
...@@ -275,7 +275,7 @@ static int vlclua_extension_require( lua_State *L ) ...@@ -275,7 +275,7 @@ static int vlclua_extension_require( lua_State *L )
* @param dummy: unused * @param dummy: unused
**/ **/
int ScanLuaCallback( vlc_object_t *p_this, const char *psz_filename, int ScanLuaCallback( vlc_object_t *p_this, const char *psz_filename,
void *dummy ) const struct luabatch_context_t *dummy )
{ {
VLC_UNUSED(dummy); VLC_UNUSED(dummy);
extensions_manager_t *p_mgr = ( extensions_manager_t* ) p_this; extensions_manager_t *p_mgr = ( extensions_manager_t* ) p_this;
......
...@@ -89,7 +89,8 @@ static lua_State * init( vlc_object_t *p_this, input_item_t * p_item, const char ...@@ -89,7 +89,8 @@ static lua_State * init( vlc_object_t *p_this, input_item_t * p_item, const char
* Run a lua entry point function * Run a lua entry point function
*****************************************************************************/ *****************************************************************************/
static int run( vlc_object_t *p_this, const char * psz_filename, static int run( vlc_object_t *p_this, const char * psz_filename,
lua_State * L, const char *luafunction ) lua_State * L, const char *luafunction,
const luabatch_context_t *p_context )
{ {
/* Ugly hack to delete previous versions of the fetchart() /* Ugly hack to delete previous versions of the fetchart()
* functions. */ * functions. */
...@@ -104,6 +105,26 @@ static int run( vlc_object_t *p_this, const char * psz_filename, ...@@ -104,6 +105,26 @@ static int run( vlc_object_t *p_this, const char * psz_filename,
goto error; goto error;
} }
meta_fetcher_scope_t e_scope = FETCHER_SCOPE_NETWORK; /* default to restricted one */
lua_getglobal( L, "descriptor" );
if( lua_isfunction( L, lua_gettop( L ) ) && !lua_pcall( L, 0, 1, 0 ) )
{
lua_getfield( L, -1, "scope" );
char *psz_scope = luaL_strdupornull( L, -1 );
if ( psz_scope && !strcmp( psz_scope, "local" ) )
e_scope = FETCHER_SCOPE_LOCAL;
free( psz_scope );
lua_pop( L, 1 );
}
lua_pop( L, 1 );
if ( p_context && p_context->pf_validator && !p_context->pf_validator( p_context, e_scope ) )
{
msg_Dbg( p_this, "skipping script (unmatched scope) %s", psz_filename );
goto error;
}
lua_getglobal( L, luafunction ); lua_getglobal( L, luafunction );
if( !lua_isfunction( L, lua_gettop( L ) ) ) if( !lua_isfunction( L, lua_gettop( L ) ) )
...@@ -131,16 +152,22 @@ error: ...@@ -131,16 +152,22 @@ error:
* Called through lua_scripts_batch_execute to call 'fetch_art' on the script * Called through lua_scripts_batch_execute to call 'fetch_art' on the script
* pointed by psz_filename. * pointed by psz_filename.
*****************************************************************************/ *****************************************************************************/
static int fetch_art( vlc_object_t *p_this, const char * psz_filename, static bool validate_scope( const luabatch_context_t *p_context, meta_fetcher_scope_t e_scope )
void * user_data )
{ {
input_item_t * p_item = user_data; if ( p_context->e_scope == FETCHER_SCOPE_ANY )
return true;
else
return ( p_context->e_scope == e_scope );
}
lua_State *L = init( p_this, p_item, psz_filename ); static int fetch_art( vlc_object_t *p_this, const char * psz_filename,
const luabatch_context_t *p_context )
{
lua_State *L = init( p_this, p_context->p_item, psz_filename );
if( !L ) if( !L )
return VLC_EGENERIC; return VLC_EGENERIC;
int i_ret = run(p_this, psz_filename, L, "fetch_art"); int i_ret = run(p_this, psz_filename, L, "fetch_art", p_context);
if(i_ret != VLC_SUCCESS) if(i_ret != VLC_SUCCESS)
{ {
lua_close( L ); lua_close( L );
...@@ -157,7 +184,7 @@ static int fetch_art( vlc_object_t *p_this, const char * psz_filename, ...@@ -157,7 +184,7 @@ static int fetch_art( vlc_object_t *p_this, const char * psz_filename,
if( psz_value && *psz_value != 0 ) if( psz_value && *psz_value != 0 )
{ {
lua_Dbg( p_this, "setting arturl: %s", psz_value ); lua_Dbg( p_this, "setting arturl: %s", psz_value );
input_item_SetArtURL ( p_item, psz_value ); input_item_SetArtURL ( p_context->p_item, psz_value );
lua_close( L ); lua_close( L );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -182,14 +209,17 @@ static int fetch_art( vlc_object_t *p_this, const char * psz_filename, ...@@ -182,14 +209,17 @@ static int fetch_art( vlc_object_t *p_this, const char * psz_filename,
* pointed by psz_filename. * pointed by psz_filename.
*****************************************************************************/ *****************************************************************************/
static int read_meta( vlc_object_t *p_this, const char * psz_filename, static int read_meta( vlc_object_t *p_this, const char * psz_filename,
void * user_data ) const luabatch_context_t *p_context )
{ {
input_item_t * p_item = user_data; /* FIXME: merge with finder */
lua_State *L = init( p_this, p_item, psz_filename ); demux_meta_t *p_demux_meta = (demux_meta_t *)p_this;
VLC_UNUSED( p_context );
lua_State *L = init( p_this, p_demux_meta->p_item, psz_filename );
if( !L ) if( !L )
return VLC_EGENERIC; return VLC_EGENERIC;
int i_ret = run(p_this, psz_filename, L, "read_meta"); int i_ret = run(p_this, psz_filename, L, "read_meta", NULL);
lua_close( L ); lua_close( L );
// Continue even if an error occurred: all "meta reader" are always run. // Continue even if an error occurred: all "meta reader" are always run.
...@@ -202,14 +232,13 @@ static int read_meta( vlc_object_t *p_this, const char * psz_filename, ...@@ -202,14 +232,13 @@ static int read_meta( vlc_object_t *p_this, const char * psz_filename,
* pointed by psz_filename. * pointed by psz_filename.
*****************************************************************************/ *****************************************************************************/
static int fetch_meta( vlc_object_t *p_this, const char * psz_filename, static int fetch_meta( vlc_object_t *p_this, const char * psz_filename,
void * user_data ) const luabatch_context_t *p_context )
{ {
input_item_t * p_item = user_data; lua_State *L = init( p_this, p_context->p_item, psz_filename );
lua_State *L = init( p_this, p_item, psz_filename );
if( !L ) if( !L )
return VLC_EGENERIC; return VLC_EGENERIC;
int ret = run(p_this, psz_filename, L, "fetch_meta"); int ret = run(p_this, psz_filename, L, "fetch_meta", p_context);
lua_close( L ); lua_close( L );
return ret; return ret;
...@@ -219,13 +248,10 @@ static int fetch_meta( vlc_object_t *p_this, const char * psz_filename, ...@@ -219,13 +248,10 @@ static int fetch_meta( vlc_object_t *p_this, const char * psz_filename,
* Read meta. * Read meta.
*****************************************************************************/ *****************************************************************************/
int ReadMeta( vlc_object_t *p_this ) int ReadMeta( demux_meta_t *p_this )
{ {
demux_meta_t *p_demux_meta = (demux_meta_t *)p_this; return vlclua_scripts_batch_execute( VLC_OBJECT(p_this), "meta"DIR_SEP"reader",
input_item_t *p_item = p_demux_meta->p_item; (void*) &read_meta, NULL );
return vlclua_scripts_batch_execute( p_this, "meta"DIR_SEP"reader",
&read_meta, p_item );
} }
...@@ -233,25 +259,23 @@ int ReadMeta( vlc_object_t *p_this ) ...@@ -233,25 +259,23 @@ int ReadMeta( vlc_object_t *p_this )
* Read meta. * Read meta.
*****************************************************************************/ *****************************************************************************/
int FetchMeta( vlc_object_t *p_this ) int FetchMeta( art_finder_t *p_finder )
{ {
demux_meta_t *p_demux_meta = (demux_meta_t *)p_this; luabatch_context_t context = { p_finder->p_item, p_finder->e_scope, validate_scope };
input_item_t *p_item = p_demux_meta->p_item;
return vlclua_scripts_batch_execute( p_this, "meta"DIR_SEP"fetcher", return vlclua_scripts_batch_execute( VLC_OBJECT(p_finder), "meta"DIR_SEP"fetcher",
&fetch_meta, p_item ); &fetch_meta, (void*)&context );
} }
/***************************************************************************** /*****************************************************************************
* Module entry point for art. * Module entry point for art.
*****************************************************************************/ *****************************************************************************/
int FindArt( vlc_object_t *p_this ) int FindArt( art_finder_t *p_finder )
{ {
art_finder_t *p_finder = (art_finder_t *)p_this; luabatch_context_t context = { p_finder->p_item, p_finder->e_scope, validate_scope };
input_item_t *p_item = p_finder->p_item;
return vlclua_scripts_batch_execute( p_this, "meta"DIR_SEP"art", return vlclua_scripts_batch_execute( VLC_OBJECT(p_finder), "meta"DIR_SEP"art",
&fetch_art, p_item ); &fetch_art, (void*)&context );
} }
...@@ -262,7 +262,7 @@ void vlclua_dir_list_free( char **ppsz_dir_list ) ...@@ -262,7 +262,7 @@ void vlclua_dir_list_free( char **ppsz_dir_list )
*****************************************************************************/ *****************************************************************************/
int vlclua_scripts_batch_execute( vlc_object_t *p_this, int vlclua_scripts_batch_execute( vlc_object_t *p_this,
const char * luadirname, const char * luadirname,
int (*func)(vlc_object_t *, const char *, void *), int (*func)(vlc_object_t *, const char *, const luabatch_context_t *),
void * user_data) void * user_data)
{ {
char **ppsz_dir_list = NULL; char **ppsz_dir_list = NULL;
......
...@@ -32,9 +32,11 @@ ...@@ -32,9 +32,11 @@
#include <vlc_input.h> #include <vlc_input.h>
#include <vlc_playlist.h> #include <vlc_playlist.h>
#include <vlc_meta.h> #include <vlc_meta.h>
#include <vlc_art_finder.h>
#include <vlc_url.h> #include <vlc_url.h>
#include <vlc_strings.h> #include <vlc_strings.h>
#include <vlc_stream.h> #include <vlc_stream.h>
#include <vlc_demux.h>
#define LUA_COMPAT_MODULE #define LUA_COMPAT_MODULE
#include <lua.h> /* Low level lua C API */ #include <lua.h> /* Low level lua C API */
...@@ -49,9 +51,9 @@ ...@@ -49,9 +51,9 @@
/***************************************************************************** /*****************************************************************************
* Module entry points * Module entry points
*****************************************************************************/ *****************************************************************************/
int ReadMeta( vlc_object_t * ); int ReadMeta( demux_meta_t * );
int FetchMeta( vlc_object_t * ); int FetchMeta( art_finder_t * );
int FindArt( vlc_object_t * ); int FindArt( art_finder_t * );
int Import_LuaPlaylist( vlc_object_t * ); int Import_LuaPlaylist( vlc_object_t * );
void Close_LuaPlaylist( vlc_object_t * ); void Close_LuaPlaylist( vlc_object_t * );
...@@ -126,8 +128,16 @@ int vlclua_push_ret( lua_State *, int i_error ); ...@@ -126,8 +128,16 @@ int vlclua_push_ret( lua_State *, int i_error );
* Will execute func on all scripts in luadirname, and stop if func returns * Will execute func on all scripts in luadirname, and stop if func returns
* success. * success.
*****************************************************************************/ *****************************************************************************/
typedef struct luabatch_context_t luabatch_context_t;
struct luabatch_context_t
{
input_item_t *p_item;
meta_fetcher_scope_t e_scope;
bool (*pf_validator)( const luabatch_context_t *, meta_fetcher_scope_t );
};
int vlclua_scripts_batch_execute( vlc_object_t *p_this, const char * luadirname, int vlclua_scripts_batch_execute( vlc_object_t *p_this, const char * luadirname,
int (*func)(vlc_object_t *, const char *, void *), int (*func)(vlc_object_t *, const char *, const luabatch_context_t *),
void * user_data ); void * user_data );
int vlclua_dir_list( const char *luadirname, char ***pppsz_dir_list ); int vlclua_dir_list( const char *luadirname, char ***pppsz_dir_list );
void vlclua_dir_list_free( char **ppsz_dir_list ); void vlclua_dir_list_free( char **ppsz_dir_list );
......
...@@ -53,6 +53,7 @@ struct playlist_fetcher_t ...@@ -53,6 +53,7 @@ struct playlist_fetcher_t
input_item_t **pp_waiting; input_item_t **pp_waiting;
DECL_ARRAY(playlist_album_t) albums; DECL_ARRAY(playlist_album_t) albums;
meta_fetcher_scope_t e_scope;
}; };
static void *Thread( void * ); static void *Thread( void * );
...@@ -73,6 +74,13 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t *parent ) ...@@ -73,6 +74,13 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t *parent )
p_fetcher->b_live = false; p_fetcher->b_live = false;
p_fetcher->i_waiting = 0; p_fetcher->i_waiting = 0;
p_fetcher->pp_waiting = NULL; p_fetcher->pp_waiting = NULL;
int i_policy = var_InheritInteger( parent, "album-art" );
if ( i_policy == ALBUM_ART_ALL )
p_fetcher->e_scope = FETCHER_SCOPE_ANY;
else
p_fetcher->e_scope = FETCHER_SCOPE_LOCAL;
ARRAY_INIT( p_fetcher->albums ); ARRAY_INIT( p_fetcher->albums );
return p_fetcher; return p_fetcher;
...@@ -224,6 +232,7 @@ static int FindArt( playlist_fetcher_t *p_fetcher, input_item_t *p_item ) ...@@ -224,6 +232,7 @@ static int FindArt( playlist_fetcher_t *p_fetcher, input_item_t *p_item )
module_t *p_module; module_t *p_module;
p_finder->p_item = p_item; p_finder->p_item = p_item;
p_finder->e_scope = p_fetcher->e_scope;
p_module = module_need( p_finder, "art finder", NULL, false ); p_module = module_need( p_finder, "art finder", NULL, false );
if( p_module ) if( p_module )
...@@ -332,18 +341,19 @@ error: ...@@ -332,18 +341,19 @@ error:
*/ */
static void FetchMeta( playlist_fetcher_t *p_fetcher, input_item_t *p_item ) static void FetchMeta( playlist_fetcher_t *p_fetcher, input_item_t *p_item )
{ {
demux_meta_t *p_demux_meta = vlc_custom_create(p_fetcher->object, art_finder_t *p_finder =
sizeof(*p_demux_meta), "demux meta" ); vlc_custom_create( p_fetcher->object, sizeof( *p_finder ), "art finder" );
if( !p_demux_meta ) if ( !p_finder )
return; return;
p_demux_meta->p_demux = NULL; p_finder->e_scope = p_fetcher->e_scope;
p_demux_meta->p_item = p_item; p_finder->p_item = p_item;
module_t *p_module = module_need( p_finder, "meta fetcher", NULL, false );
if( p_module )
module_unneed( p_finder, p_module );
module_t *p_meta_fetcher = module_need( p_demux_meta, "meta fetcher", NULL, false ); vlc_object_release( p_finder );
if( p_meta_fetcher )
module_unneed( p_demux_meta, p_meta_fetcher );
vlc_object_release( p_demux_meta );
} }
static void *Thread( void *p_data ) static void *Thread( void *p_data )
......
...@@ -171,10 +171,8 @@ static void Art( playlist_preparser_t *p_preparser, input_item_t *p_item ) ...@@ -171,10 +171,8 @@ static void Art( playlist_preparser_t *p_preparser, input_item_t *p_item )
const char *psz_arturl = vlc_meta_Get( p_item->p_meta, vlc_meta_ArtworkURL ); const char *psz_arturl = vlc_meta_Get( p_item->p_meta, vlc_meta_ArtworkURL );
const char *psz_name = vlc_meta_Get( p_item->p_meta, vlc_meta_Title ); const char *psz_name = vlc_meta_Get( p_item->p_meta, vlc_meta_Title );
if( p_preparser->i_art_policy == ALBUM_ART_ALL && if( !psz_arturl || ( strncmp( psz_arturl, "file://", 7 ) &&
( !psz_arturl || strncmp( psz_arturl, "attachment://", 13 ) ) )
( strncmp( psz_arturl, "file://", 7 ) &&
strncmp( psz_arturl, "attachment://", 13 ) ) ) )
{ {
msg_Dbg( obj, "meta ok for %s, need to fetch art", msg_Dbg( obj, "meta ok for %s, need to fetch art",
psz_name ? psz_name : "(null)" ); psz_name ? psz_name : "(null)" );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment