static int vlclua_playlist_search( lua_State *L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); const char *psz_string = luaL_optstring( L, 1, "" ); PL_LOCK; playlist_LiveSearchUpdate( p_playlist, p_playlist->p_root, psz_string, true ); PL_UNLOCK; push_playlist_item( L, p_playlist->p_root ); return 1; }
static void push_playlist_item( lua_State *L, playlist_item_t *p_item ) { input_item_t *p_input = p_item->p_input; int i_flags = 0; i_flags = p_item->i_flags; lua_newtable( L ); lua_pushinteger( L, p_item->i_id ); lua_setfield( L, -2, "id" ); lua_newtable( L ); #define CHECK_AND_SET_FLAG( name, label ) \ if( i_flags & PLAYLIST_ ## name ## _FLAG ) \ { \ lua_pushboolean( L, 1 ); \ lua_setfield( L, -2, #label ); \ } CHECK_AND_SET_FLAG( SAVE, save ) CHECK_AND_SET_FLAG( SKIP, skip ) CHECK_AND_SET_FLAG( DBL, disabled ) CHECK_AND_SET_FLAG( RO, ro ) CHECK_AND_SET_FLAG( REMOVE, remove ) CHECK_AND_SET_FLAG( EXPANDED, expanded ) #undef CHECK_AND_SET_FLAG lua_setfield( L, -2, "flags" ); if( p_input ) { char *psz_name = input_item_GetTitleFbName( p_input ); lua_pushstring( L, psz_name ); free( psz_name ); lua_setfield( L, -2, "name" ); lua_pushstring( L, p_input->psz_uri ); lua_setfield( L, -2, "path" ); if( p_input->i_duration < 0 ) lua_pushnumber( L, -1 ); else lua_pushnumber( L, ((double)p_input->i_duration)*1e-6 ); lua_setfield( L, -2, "duration" ); lua_pushinteger( L, p_input->i_nb_played ); lua_setfield( L, -2, "nb_played" ); luaopen_input_item( L, p_input ); /* TODO: add (optional) info categories, meta, options, es */ } if( p_item->i_children >= 0 ) { int i; lua_createtable( L, p_item->i_children, 0 ); for( i = 0; i < p_item->i_children; i++ ) { push_playlist_item( L, p_item->pp_children[i] ); lua_rawseti( L, -2, i+1 ); } lua_setfield( L, -2, "children" ); } }
static int vlclua_playlist_get( lua_State *L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); PL_LOCK; playlist_item_t *p_item = NULL; if( lua_isnumber( L, 1 ) ) { int i_id = lua_tointeger( L, 1 ); p_item = playlist_ItemGetById( p_playlist, i_id ); if( !p_item ) { PL_UNLOCK; return 0; /* Should we return an error instead? */ } } else if( lua_isstring( L, 1 ) ) { const char *psz_what = lua_tostring( L, 1 ); if( !strcasecmp( psz_what, "normal" ) || !strcasecmp( psz_what, "playlist" ) ) p_item = p_playlist->p_playing; else if( !strcasecmp( psz_what, "ml" ) || !strcasecmp( psz_what, "media library" ) ) p_item = p_playlist->p_media_library; else if( !strcasecmp( psz_what, "root" ) ) p_item = p_playlist->p_root; else { /* currently, psz_what must be SD module's longname! */ p_item = playlist_ChildSearchName( p_playlist->p_root, psz_what ); if( !p_item ) { PL_UNLOCK; return 0; /* Should we return an error instead? */ } } } else { p_item = p_playlist->p_root; } push_playlist_item( L, p_item ); PL_UNLOCK; return 1; }