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

finder/fetcher: always use scripts doing local access

parent 8301e1ea
......@@ -21,10 +21,18 @@
#ifndef VLC_ART_FINDER_H
#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
{
VLC_COMMON_MEMBERS
input_item_t *p_item;
meta_fetcher_scope_t e_scope;
} art_finder_t;
#endif
......@@ -126,9 +126,9 @@ static const luaL_Reg p_reg_parse[] =
* the script pointed by 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;
p_demux->p_sys->psz_filename = strdup(psz_filename);
......
......@@ -67,7 +67,7 @@ static const char caps[][20] = {
static int ScanExtensions( extensions_manager_t *p_this );
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 GetMenuEntries( extensions_manager_t *p_mgr, extension_t *p_ext,
char ***pppsz_titles, uint16_t **ppi_ids );
......@@ -275,7 +275,7 @@ static int vlclua_extension_require( lua_State *L )
* @param dummy: unused
**/
int ScanLuaCallback( vlc_object_t *p_this, const char *psz_filename,
void *dummy )
const struct luabatch_context_t *dummy )
{
VLC_UNUSED(dummy);
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
* Run a lua entry point function
*****************************************************************************/
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()
* functions. */
......@@ -104,6 +105,26 @@ static int run( vlc_object_t *p_this, const char * psz_filename,
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 );
if( !lua_isfunction( L, lua_gettop( L ) ) )
......@@ -131,16 +152,22 @@ error:
* Called through lua_scripts_batch_execute to call 'fetch_art' on the script
* pointed by psz_filename.
*****************************************************************************/
static int fetch_art( vlc_object_t *p_this, const char * psz_filename,
void * user_data )
static bool validate_scope( const luabatch_context_t *p_context, meta_fetcher_scope_t e_scope )
{
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 )
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)
{
lua_close( L );
......@@ -157,7 +184,7 @@ 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_item, psz_value );
input_item_SetArtURL ( p_context->p_item, psz_value );
lua_close( L );
return VLC_SUCCESS;
}
......@@ -182,14 +209,17 @@ 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,
void * user_data )
const luabatch_context_t *p_context )
{
input_item_t * p_item = user_data;
lua_State *L = init( p_this, p_item, psz_filename );
/* FIXME: merge with finder */
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 )
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 );
// 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,
* pointed by 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_item, psz_filename );
lua_State *L = init( p_this, p_context->p_item, psz_filename );
if( !L )
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 );
return ret;
......@@ -219,13 +248,10 @@ static int fetch_meta( vlc_object_t *p_this, const char * psz_filename,
* 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;
input_item_t *p_item = p_demux_meta->p_item;
return vlclua_scripts_batch_execute( p_this, "meta"DIR_SEP"reader",
&read_meta, p_item );
return vlclua_scripts_batch_execute( VLC_OBJECT(p_this), "meta"DIR_SEP"reader",
(void*) &read_meta, NULL );
}
......@@ -233,25 +259,23 @@ int ReadMeta( vlc_object_t *p_this )
* 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;
input_item_t *p_item = p_demux_meta->p_item;
luabatch_context_t context = { p_finder->p_item, p_finder->e_scope, validate_scope };
return vlclua_scripts_batch_execute( p_this, "meta"DIR_SEP"fetcher",
&fetch_meta, p_item );
return vlclua_scripts_batch_execute( VLC_OBJECT(p_finder), "meta"DIR_SEP"fetcher",
&fetch_meta, (void*)&context );
}
/*****************************************************************************
* 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;
input_item_t *p_item = p_finder->p_item;
luabatch_context_t context = { p_finder->p_item, p_finder->e_scope, validate_scope };
return vlclua_scripts_batch_execute( p_this, "meta"DIR_SEP"art",
&fetch_art, p_item );
return vlclua_scripts_batch_execute( VLC_OBJECT(p_finder), "meta"DIR_SEP"art",
&fetch_art, (void*)&context );
}
......@@ -262,7 +262,7 @@ void vlclua_dir_list_free( char **ppsz_dir_list )
*****************************************************************************/
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)
{
char **ppsz_dir_list = NULL;
......
......@@ -32,9 +32,11 @@
#include <vlc_input.h>
#include <vlc_playlist.h>
#include <vlc_meta.h>
#include <vlc_art_finder.h>
#include <vlc_url.h>
#include <vlc_strings.h>
#include <vlc_stream.h>
#include <vlc_demux.h>
#define LUA_COMPAT_MODULE
#include <lua.h> /* Low level lua C API */
......@@ -49,9 +51,9 @@
/*****************************************************************************
* Module entry points
*****************************************************************************/
int ReadMeta( vlc_object_t * );
int FetchMeta( vlc_object_t * );
int FindArt( vlc_object_t * );
int ReadMeta( demux_meta_t * );
int FetchMeta( art_finder_t * );
int FindArt( art_finder_t * );
int Import_LuaPlaylist( vlc_object_t * );
void Close_LuaPlaylist( vlc_object_t * );
......@@ -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
* 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 (*func)(vlc_object_t *, const char *, void *),
int (*func)(vlc_object_t *, const char *, const luabatch_context_t *),
void * user_data );
int vlclua_dir_list( const char *luadirname, char ***pppsz_dir_list );
void vlclua_dir_list_free( char **ppsz_dir_list );
......
......@@ -53,6 +53,7 @@ struct playlist_fetcher_t
input_item_t **pp_waiting;
DECL_ARRAY(playlist_album_t) albums;
meta_fetcher_scope_t e_scope;
};
static void *Thread( void * );
......@@ -73,6 +74,13 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t *parent )
p_fetcher->b_live = false;
p_fetcher->i_waiting = 0;
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 );
return p_fetcher;
......@@ -224,6 +232,7 @@ static int FindArt( playlist_fetcher_t *p_fetcher, input_item_t *p_item )
module_t *p_module;
p_finder->p_item = p_item;
p_finder->e_scope = p_fetcher->e_scope;
p_module = module_need( p_finder, "art finder", NULL, false );
if( p_module )
......@@ -332,18 +341,19 @@ error:
*/
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,
sizeof(*p_demux_meta), "demux meta" );
if( !p_demux_meta )
art_finder_t *p_finder =
vlc_custom_create( p_fetcher->object, sizeof( *p_finder ), "art finder" );
if ( !p_finder )
return;
p_demux_meta->p_demux = NULL;
p_demux_meta->p_item = p_item;
p_finder->e_scope = p_fetcher->e_scope;
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 );
if( p_meta_fetcher )
module_unneed( p_demux_meta, p_meta_fetcher );
vlc_object_release( p_demux_meta );
vlc_object_release( p_finder );
}
static void *Thread( void *p_data )
......
......@@ -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_name = vlc_meta_Get( p_item->p_meta, vlc_meta_Title );
if( p_preparser->i_art_policy == ALBUM_ART_ALL &&
( !psz_arturl ||
( strncmp( psz_arturl, "file://", 7 ) &&
strncmp( psz_arturl, "attachment://", 13 ) ) ) )
if( !psz_arturl || ( strncmp( psz_arturl, "file://", 7 ) &&
strncmp( psz_arturl, "attachment://", 13 ) ) )
{
msg_Dbg( obj, "meta ok for %s, need to fetch art",
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