Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
318ef763
Commit
318ef763
authored
Aug 22, 2007
by
Pierre d'Herbemont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
modules/misc/meta_engine: Remove luameta now that it is merged in the lua module.
parent
8164218c
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
0 additions
and
667 deletions
+0
-667
modules/meta_engine/Modules.am
modules/meta_engine/Modules.am
+0
-1
modules/meta_engine/luameta.c
modules/meta_engine/luameta.c
+0
-666
No files found.
modules/meta_engine/Modules.am
View file @
318ef763
SOURCES_folder = folder.c
SOURCES_id3tag = id3tag.c id3genres.h $(NULL)
SOURCES_luameta = luameta.c
SOURCES_musicbrainz = musicbrainz.c
SOURCES_taglib = taglib.cpp
modules/meta_engine/luameta.c
deleted
100644 → 0
View file @
8164218c
/*****************************************************************************
* luameta.c: Get meta/artwork using lua scripts
*****************************************************************************
* Copyright (C) 2006 the VideoLAN team
* $Id$
*
* Authors: Antoine Cellerier <dionoea at videolan tod org>
* Pierre d'Herbemont <pdherbemont # videolan.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.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <vlc/vlc.h>
#include <vlc_input.h>
#include <vlc_playlist.h>
#include <vlc_meta.h>
#include <vlc_url.h>
#include <vlc_strings.h>
#include <vlc_stream.h>
#include <vlc_charset.h>
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#include <lua.h>
/* Low level lua C API */
#include <lauxlib.h>
/* Higher level C API */
#include <lualib.h>
/* Lua libs */
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
FindArt
(
vlc_object_t
*
);
static
int
FindMeta
(
vlc_object_t
*
p_this
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin
();
set_shortname
(
N_
(
"Lua Meta"
)
);
set_description
(
_
(
"Fetch Artwork using lua scripts"
)
);
set_capability
(
"meta fetcher"
,
10
);
set_callbacks
(
FindMeta
,
NULL
);
add_submodule
();
set_capability
(
"art finder"
,
10
);
set_callbacks
(
FindArt
,
NULL
);
vlc_module_end
();
/*****************************************************************************
* Lua function bridge
*****************************************************************************/
static
vlc_object_t
*
vlclua_get_this
(
lua_State
*
p_state
)
{
vlc_object_t
*
p_this
;
lua_getglobal
(
p_state
,
"vlc"
);
lua_getfield
(
p_state
,
lua_gettop
(
p_state
),
"private"
);
p_this
=
(
vlc_object_t
*
)
lua_topointer
(
p_state
,
lua_gettop
(
p_state
)
);
lua_pop
(
p_state
,
2
);
return
p_this
;
}
static
int
vlclua_stream_new
(
lua_State
*
p_state
)
{
vlc_object_t
*
p_this
=
vlclua_get_this
(
p_state
);
int
i
=
lua_gettop
(
p_state
);
stream_t
*
p_stream
;
const
char
*
psz_url
;
if
(
!
i
)
return
0
;
psz_url
=
lua_tostring
(
p_state
,
1
);
lua_pop
(
p_state
,
i
);
p_stream
=
stream_UrlNew
(
p_this
,
psz_url
);
lua_pushlightuserdata
(
p_state
,
p_stream
);
return
1
;
}
static
int
vlclua_stream_read
(
lua_State
*
p_state
)
{
int
i
=
lua_gettop
(
p_state
);
stream_t
*
p_stream
;
int
n
;
byte_t
*
p_read
;
int
i_read
;
if
(
!
i
)
return
0
;
p_stream
=
(
stream_t
*
)
lua_topointer
(
p_state
,
1
);
n
=
lua_tonumber
(
p_state
,
2
);
lua_pop
(
p_state
,
i
);
p_read
=
malloc
(
n
);
if
(
!
p_read
)
return
0
;
i_read
=
stream_Read
(
p_stream
,
p_read
,
n
);
lua_pushlstring
(
p_state
,
(
const
char
*
)
p_read
,
i_read
);
free
(
p_read
);
return
1
;
}
static
int
vlclua_stream_readline
(
lua_State
*
p_state
)
{
int
i
=
lua_gettop
(
p_state
);
stream_t
*
p_stream
;
if
(
!
i
)
return
0
;
p_stream
=
(
stream_t
*
)
lua_topointer
(
p_state
,
1
);
lua_pop
(
p_state
,
i
);
char
*
psz_line
=
stream_ReadLine
(
p_stream
);
if
(
psz_line
)
{
lua_pushstring
(
p_state
,
psz_line
);
free
(
psz_line
);
}
else
{
lua_pushnil
(
p_state
);
}
return
1
;
}
static
int
vlclua_stream_delete
(
lua_State
*
p_state
)
{
int
i
=
lua_gettop
(
p_state
);
stream_t
*
p_stream
;
if
(
!
i
)
return
0
;
p_stream
=
(
stream_t
*
)
lua_topointer
(
p_state
,
1
);
lua_pop
(
p_state
,
i
);
stream_Delete
(
p_stream
);
return
1
;
}
static
int
vlclua_decode_uri
(
lua_State
*
p_state
)
{
int
i
=
lua_gettop
(
p_state
);
if
(
!
i
)
return
0
;
const
char
*
psz_cstring
=
lua_tostring
(
p_state
,
1
);
if
(
!
psz_cstring
)
return
0
;
char
*
psz_string
=
strdup
(
psz_cstring
);
lua_pop
(
p_state
,
i
);
decode_URI
(
psz_string
);
lua_pushstring
(
p_state
,
psz_string
);
free
(
psz_string
);
return
1
;
}
static
int
vlclua_resolve_xml_special_chars
(
lua_State
*
p_state
)
{
int
i
=
lua_gettop
(
p_state
);
if
(
!
i
)
return
0
;
const
char
*
psz_cstring
=
lua_tostring
(
p_state
,
1
);
if
(
!
psz_cstring
)
return
0
;
char
*
psz_string
=
strdup
(
psz_cstring
);
lua_pop
(
p_state
,
i
);
resolve_xml_special_chars
(
psz_string
);
lua_pushstring
(
p_state
,
psz_string
);
free
(
psz_string
);
return
1
;
}
static
int
vlclua_msg_dbg
(
lua_State
*
p_state
)
{
vlc_object_t
*
p_this
=
vlclua_get_this
(
p_state
);
int
i
=
lua_gettop
(
p_state
);
if
(
!
i
)
return
0
;
const
char
*
psz_cstring
=
lua_tostring
(
p_state
,
1
);
if
(
!
psz_cstring
)
return
0
;
msg_Dbg
(
p_this
,
"%s"
,
psz_cstring
);
return
0
;
}
static
int
vlclua_msg_warn
(
lua_State
*
p_state
)
{
vlc_object_t
*
p_this
=
vlclua_get_this
(
p_state
);
int
i
=
lua_gettop
(
p_state
);
if
(
!
i
)
return
0
;
const
char
*
psz_cstring
=
lua_tostring
(
p_state
,
1
);
if
(
!
psz_cstring
)
return
0
;
msg_Warn
(
p_this
,
"%s"
,
psz_cstring
);
return
0
;
}
static
int
vlclua_msg_err
(
lua_State
*
p_state
)
{
vlc_object_t
*
p_this
=
vlclua_get_this
(
p_state
);
int
i
=
lua_gettop
(
p_state
);
if
(
!
i
)
return
0
;
const
char
*
psz_cstring
=
lua_tostring
(
p_state
,
1
);
if
(
!
psz_cstring
)
return
0
;
msg_Err
(
p_this
,
"%s"
,
psz_cstring
);
return
0
;
}
static
int
vlclua_msg_info
(
lua_State
*
p_state
)
{
vlc_object_t
*
p_this
=
vlclua_get_this
(
p_state
);
int
i
=
lua_gettop
(
p_state
);
if
(
!
i
)
return
0
;
const
char
*
psz_cstring
=
lua_tostring
(
p_state
,
1
);
if
(
!
psz_cstring
)
return
0
;
msg_Info
(
p_this
,
"%s"
,
psz_cstring
);
return
0
;
}
/* Functions to register */
static
luaL_Reg
p_reg
[]
=
{
{
"stream_new"
,
vlclua_stream_new
},
{
"stream_read"
,
vlclua_stream_read
},
{
"stream_readline"
,
vlclua_stream_readline
},
{
"stream_delete"
,
vlclua_stream_delete
},
{
"decode_uri"
,
vlclua_decode_uri
},
{
"resolve_xml_special_chars"
,
vlclua_resolve_xml_special_chars
},
{
"msg_dbg"
,
vlclua_msg_dbg
},
{
"msg_warn"
,
vlclua_msg_warn
},
{
"msg_err"
,
vlclua_msg_err
},
{
"msg_info"
,
vlclua_msg_info
},
{
NULL
,
NULL
}
};
/*****************************************************************************
*
*****************************************************************************/
static
int
file_select
(
const
char
*
file
)
{
int
i
=
strlen
(
file
);
return
i
>
4
&&
!
strcmp
(
file
+
i
-
4
,
".lua"
);
}
static
int
file_compare
(
const
char
**
a
,
const
char
**
b
)
{
return
strcmp
(
*
a
,
*
b
);
}
/*****************************************************************************
* Init lua
*****************************************************************************/
static
lua_State
*
vlclua_meta_init
(
vlc_object_t
*
p_this
,
input_item_t
*
p_item
)
{
lua_State
*
p_state
=
luaL_newstate
();
if
(
!
p_state
)
{
msg_Err
(
p_this
,
"Could not create new Lua State"
);
return
NULL
;
}
char
*
psz_meta
;
/* Load Lua libraries */
luaL_openlibs
(
p_state
);
/* XXX: Don't open all the libs? */
luaL_register
(
p_state
,
"vlc"
,
p_reg
);
lua_pushlightuserdata
(
p_state
,
p_this
);
lua_setfield
(
p_state
,
lua_gettop
(
p_state
)
-
1
,
"private"
);
psz_meta
=
input_item_GetName
(
p_item
);
lua_pushstring
(
p_state
,
psz_meta
);
lua_setfield
(
p_state
,
lua_gettop
(
p_state
)
-
1
,
"name"
);
free
(
psz_meta
);
psz_meta
=
input_item_GetArtist
(
p_item
);
lua_pushstring
(
p_state
,
psz_meta
);
lua_setfield
(
p_state
,
lua_gettop
(
p_state
)
-
1
,
"artist"
);
free
(
psz_meta
);
psz_meta
=
input_item_GetTitle
(
p_item
)
;
lua_pushstring
(
p_state
,
psz_meta
);
lua_setfield
(
p_state
,
lua_gettop
(
p_state
)
-
1
,
"title"
);
free
(
psz_meta
);
psz_meta
=
input_item_GetAlbum
(
p_item
);
lua_pushstring
(
p_state
,
psz_meta
);
lua_setfield
(
p_state
,
lua_gettop
(
p_state
)
-
1
,
"album"
);
free
(
psz_meta
);
psz_meta
=
input_item_GetArtURL
(
p_item
);
lua_pushstring
(
p_state
,
psz_meta
);
lua_setfield
(
p_state
,
lua_gettop
(
p_state
)
-
1
,
"arturl"
);
free
(
psz_meta
);
/* XXX: all should be passed ( could use macro ) */
return
p_state
;
}
/*****************************************************************************
* Will execute func on all scripts in luadirname, and stop if func returns
* success.
*****************************************************************************/
static
int
vlclua_scripts_batch_execute
(
vlc_object_t
*
p_this
,
const
char
*
luadirname
,
int
(
*
func
)(
vlc_object_t
*
,
const
char
*
,
lua_State
*
,
void
*
),
lua_State
*
p_state
,
void
*
user_data
)
{
int
i_ret
=
VLC_EGENERIC
;
DIR
*
dir
=
NULL
;
char
**
ppsz_filelist
=
NULL
;
char
**
ppsz_fileend
=
NULL
;
char
**
ppsz_file
;
char
*
ppsz_dir_list
[]
=
{
NULL
,
NULL
,
NULL
,
NULL
};
char
**
ppsz_dir
;
if
(
asprintf
(
&
ppsz_dir_list
[
0
],
"%s"
DIR_SEP
CONFIG_DIR
DIR_SEP
"%s"
,
p_this
->
p_libvlc
->
psz_homedir
,
luadirname
)
<
0
)
return
VLC_ENOMEM
;
# if defined(__APPLE__) || defined(SYS_BEOS) || defined(WIN32)
{
const
char
*
psz_vlcpath
=
config_GetDataDir
();
if
(
asprintf
(
&
ppsz_dir_list
[
1
],
"%s"
DIR_SEP
"%s"
,
psz_vlcpath
,
luadirname
)
<
0
)
return
VLC_ENOMEM
;
if
(
asprintf
(
&
ppsz_dir_list
[
2
],
"%s"
DIR_SEP
"share"
DIR_SEP
"%s"
,
psz_vlcpath
,
luadirname
)
<
0
)
return
VLC_ENOMEM
;
}
# else
{
# ifdef HAVE_SYS_STAT_H
struct
stat
stat_info
;
if
(
(
utf8_stat
(
"share/luaplaylist"
,
&
stat_info
)
==
-
1
)
||
!
S_ISDIR
(
stat_info
.
st_mode
)
)
{
if
(
asprintf
(
&
ppsz_dir_list
[
1
],
DATA_PATH
DIR_SEP
"%s"
,
luadirname
)
<
0
)
return
VLC_ENOMEM
;
}
else
# endif
{
if
(
asprintf
(
&
ppsz_dir_list
[
1
],
"share"
DIR_SEP
"%s"
,
luadirname
)
<
0
)
return
VLC_ENOMEM
;
}
}
# endif
for
(
ppsz_dir
=
ppsz_dir_list
;
*
ppsz_dir
;
ppsz_dir
++
)
{
int
i_files
;
if
(
ppsz_filelist
)
{
for
(
ppsz_file
=
ppsz_filelist
;
ppsz_file
<
ppsz_fileend
;
ppsz_file
++
)
free
(
*
ppsz_file
);
free
(
ppsz_filelist
);
ppsz_filelist
=
NULL
;
}
if
(
dir
)
{
closedir
(
dir
);
}
msg_Dbg
(
p_this
,
"Trying Lua scripts in %s"
,
*
ppsz_dir
);
dir
=
utf8_opendir
(
*
ppsz_dir
);
if
(
!
dir
)
continue
;
i_files
=
utf8_loaddir
(
dir
,
&
ppsz_filelist
,
file_select
,
file_compare
);
if
(
i_files
<
1
)
continue
;
ppsz_fileend
=
ppsz_filelist
+
i_files
;
for
(
ppsz_file
=
ppsz_filelist
;
ppsz_file
<
ppsz_fileend
;
ppsz_file
++
)
{
char
*
psz_filename
;
asprintf
(
&
psz_filename
,
"%s"
DIR_SEP
"%s"
,
*
ppsz_dir
,
*
ppsz_file
);
msg_Dbg
(
p_this
,
"Trying Lua playlist script %s"
,
psz_filename
);
i_ret
=
func
(
p_this
,
psz_filename
,
p_state
,
user_data
);
free
(
psz_filename
);
if
(
i_ret
==
VLC_SUCCESS
)
break
;
}
if
(
i_ret
==
VLC_SUCCESS
)
break
;
}
if
(
ppsz_filelist
)
{
for
(
ppsz_file
=
ppsz_filelist
;
ppsz_file
<
ppsz_fileend
;
ppsz_file
++
)
free
(
*
ppsz_file
);
free
(
ppsz_filelist
);
}
for
(
ppsz_dir
=
ppsz_dir_list
;
*
ppsz_dir
;
ppsz_dir
++
)
free
(
*
ppsz_dir
);
if
(
dir
)
closedir
(
dir
);
return
i_ret
;
}
/*****************************************************************************
* Meta data setters utility.
*****************************************************************************/
static
inline
void
read_meta_data
(
vlc_object_t
*
p_this
,
lua_State
*
p_state
,
int
o
,
int
t
,
input_item_t
*
p_input
)
{
const
char
*
psz_value
;
#define TRY_META( a, b ) \
lua_getfield( p_state, o, a ); \
if( lua_isstring( p_state, t ) ) \
{ \
psz_value = lua_tostring( p_state, t ); \
msg_Dbg( p_this, #b ": %s", psz_value ); \
input_item_Set ## b ( p_input, psz_value ); \
} \
lua_pop( p_state, 1 );
/* pop a */
TRY_META
(
"title"
,
Title
);
TRY_META
(
"artist"
,
Artist
);
TRY_META
(
"genre"
,
Genre
);
TRY_META
(
"copyright"
,
Copyright
);
TRY_META
(
"album"
,
Album
);
TRY_META
(
"tracknum"
,
TrackNum
);
TRY_META
(
"description"
,
Description
);
TRY_META
(
"rating"
,
Rating
);
TRY_META
(
"date"
,
Date
);
TRY_META
(
"setting"
,
Setting
);
TRY_META
(
"url"
,
URL
);
TRY_META
(
"language"
,
Language
);
TRY_META
(
"nowplaying"
,
NowPlaying
);
TRY_META
(
"publisher"
,
Publisher
);
TRY_META
(
"encodedby"
,
EncodedBy
);
TRY_META
(
"arturl"
,
ArtURL
);
TRY_META
(
"trackid"
,
TrackID
);
}
static
inline
void
read_custom_meta_data
(
vlc_object_t
*
p_this
,
lua_State
*
p_state
,
int
o
,
int
t
,
input_item_t
*
p_input
)
{
lua_getfield
(
p_state
,
o
,
"meta"
);
if
(
lua_istable
(
p_state
,
t
)
)
{
lua_pushnil
(
p_state
);
while
(
lua_next
(
p_state
,
t
)
)
{
if
(
!
lua_isstring
(
p_state
,
t
+
1
)
)
{
msg_Warn
(
p_this
,
"Custom meta data category name must be "
"a string"
);
}
else
if
(
!
lua_istable
(
p_state
,
t
+
2
)
)
{
msg_Warn
(
p_this
,
"Custom meta data category contents "
"must be a table"
);
}
else
{
const
char
*
psz_meta_category
=
lua_tostring
(
p_state
,
t
+
1
);
msg_Dbg
(
p_this
,
"Found custom meta data category: %s"
,
psz_meta_category
);
lua_pushnil
(
p_state
);
while
(
lua_next
(
p_state
,
t
+
2
)
)
{
if
(
!
lua_isstring
(
p_state
,
t
+
3
)
)
{
msg_Warn
(
p_this
,
"Custom meta category item name "
"must be a string."
);
}
else
if
(
!
lua_isstring
(
p_state
,
t
+
4
)
)
{
msg_Warn
(
p_this
,
"Custom meta category item value "
"must be a string."
);
}
else
{
const
char
*
psz_meta_name
=
lua_tostring
(
p_state
,
t
+
3
);
const
char
*
psz_meta_value
=
lua_tostring
(
p_state
,
t
+
4
);
msg_Dbg
(
p_this
,
"Custom meta %s, %s: %s"
,
psz_meta_category
,
psz_meta_name
,
psz_meta_value
);
input_ItemAddInfo
(
p_input
,
psz_meta_category
,
psz_meta_name
,
psz_meta_value
);
}
lua_pop
(
p_state
,
1
);
/* pop item */
}
}
lua_pop
(
p_state
,
1
);
/* pop category */
}
}
lua_pop
(
p_state
,
1
);
/* pop "meta" */
}
/*****************************************************************************
* 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
,
lua_State
*
p_state
,
void
*
user_data
)
{
int
i_ret
=
VLC_EGENERIC
;
input_item_t
*
p_input
=
user_data
;
int
s
;
/* Ugly hack to delete previous versions of the fetchart()
* functions. */
lua_pushnil
(
p_state
);
lua_setglobal
(
p_state
,
"fetch_art"
);
/* Load and run the script(s) */
if
(
luaL_dofile
(
p_state
,
psz_filename
)
)
{
msg_Warn
(
p_this
,
"Error loading script %s: %s"
,
psz_filename
,
lua_tostring
(
p_state
,
lua_gettop
(
p_state
)
)
);
lua_pop
(
p_state
,
1
);
return
VLC_EGENERIC
;
}
lua_getglobal
(
p_state
,
"fetch_art"
);
if
(
!
lua_isfunction
(
p_state
,
lua_gettop
(
p_state
)
)
)
{
msg_Warn
(
p_this
,
"Error while runing script %s, "
"function fetch_art() not found"
,
psz_filename
);
lua_pop
(
p_state
,
1
);
return
VLC_EGENERIC
;
}
if
(
lua_pcall
(
p_state
,
0
,
1
,
0
)
)
{
msg_Warn
(
p_this
,
"Error while runing script %s, "
"function fetch_art(): %s"
,
psz_filename
,
lua_tostring
(
p_state
,
lua_gettop
(
p_state
)
)
);
lua_pop
(
p_state
,
1
);
return
VLC_EGENERIC
;
}
if
((
s
=
lua_gettop
(
p_state
)))
{
const
char
*
psz_value
;
if
(
lua_isstring
(
p_state
,
s
)
)
{
psz_value
=
lua_tostring
(
p_state
,
s
);
if
(
psz_value
&&
*
psz_value
!=
0
)
{
msg_Dbg
(
p_this
,
"setting arturl: %s"
,
psz_value
);
input_item_SetArtURL
(
p_input
,
psz_value
);
i_ret
=
VLC_SUCCESS
;
}
}
else
{
msg_Err
(
p_this
,
"Lua playlist script %s: "
"didn't return a string"
,
psz_filename
);
}
}
else
{
msg_Err
(
p_this
,
"Script went completely foobar"
);
}
return
i_ret
;
}
/*****************************************************************************
* 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
,
lua_State
*
p_state
,
void
*
user_data
)
{
input_item_t
*
p_input
=
user_data
;
int
t
;
/* Ugly hack to delete previous versions of the fetchmeta()
* functions. */
lua_pushnil
(
p_state
);
lua_setglobal
(
p_state
,
"fetch_meta"
);
/* Load and run the script(s) */
if
(
luaL_dofile
(
p_state
,
psz_filename
)
)
{
msg_Warn
(
p_this
,
"Error loading script %s: %s"
,
psz_filename
,
lua_tostring
(
p_state
,
lua_gettop
(
p_state
)
)
);
lua_pop
(
p_state
,
1
);
return
VLC_EGENERIC
;
}
lua_getglobal
(
p_state
,
"fetch_meta"
);
if
(
!
lua_isfunction
(
p_state
,
lua_gettop
(
p_state
)
)
)
{
msg_Warn
(
p_this
,
"Error while runing script %s, "
"function fetch_meta() not found"
,
psz_filename
);
lua_pop
(
p_state
,
1
);
return
VLC_EGENERIC
;
}
if
(
lua_pcall
(
p_state
,
0
,
1
,
0
)
)
{
msg_Warn
(
p_this
,
"Error while runing script %s, "
"function fetch_meta(): %s"
,
psz_filename
,
lua_tostring
(
p_state
,
lua_gettop
(
p_state
)
)
);
lua_pop
(
p_state
,
1
);
return
VLC_EGENERIC
;
}
if
((
t
=
lua_gettop
(
p_state
)))
{
if
(
lua_istable
(
p_state
,
t
)
)
{
read_meta_data
(
p_this
,
p_state
,
t
,
t
+
1
,
p_input
);
read_custom_meta_data
(
p_this
,
p_state
,
t
,
t
+
1
,
p_input
);
}
else
{
msg_Err
(
p_this
,
"Lua playlist script %s: "
"didn't return a table"
,
psz_filename
);
}
}
else
{
msg_Err
(
p_this
,
"Script went completely foobar"
);
}
/* We tell the batch thing to continue, hence all script
* will get the change to add its meta. This behaviour could
* be changed. */
return
VLC_EGENERIC
;
}
/*****************************************************************************
* Module entry point for meta.
*****************************************************************************/
static
int
FindMeta
(
vlc_object_t
*
p_this
)
{
meta_engine_t
*
p_me
=
(
meta_engine_t
*
)
p_this
;
input_item_t
*
p_item
=
p_me
->
p_item
;
lua_State
*
p_state
=
vlclua_meta_init
(
p_this
,
p_item
);
int
i_ret
=
vlclua_scripts_batch_execute
(
p_this
,
"luameta"
,
&
fetch_meta
,
p_state
,
p_item
);
lua_close
(
p_state
);
return
i_ret
;
}
/*****************************************************************************
* Module entry point for art.
*****************************************************************************/
static
int
FindArt
(
vlc_object_t
*
p_this
)
{
playlist_t
*
p_playlist
=
(
playlist_t
*
)
p_this
;
input_item_t
*
p_item
=
(
input_item_t
*
)(
p_playlist
->
p_private
);
lua_State
*
p_state
=
vlclua_meta_init
(
p_this
,
p_item
);
int
i_ret
=
vlclua_scripts_batch_execute
(
p_this
,
"luameta"
,
&
fetch_art
,
p_state
,
p_item
);
lua_close
(
p_state
);
return
i_ret
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment