* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <vlc/vlc.h>
#include <vlc_playlist.h>
+#include <vlc_events.h>
#include "playlist_internal.h"
-#include "modules/configuration.h"
+#include "config/configuration.h"
#include <vlc_charset.h>
#include <sys/types.h>
return VLC_SUCCESS;
}
+/*****************************************************************************
+ * A subitem has been added to the Media Library (Event Callback)
+ *****************************************************************************/
+static void input_item_subitem_added( const vlc_event_t * p_event,
+ void * user_data )
+{
+ playlist_t *p_playlist = user_data;
+ input_item_t *p_item = p_event->u.input_item_subitem_added.p_new_child;
+
+ playlist_AddInput( p_playlist, p_item, PLAYLIST_APPEND, PLAYLIST_END,
+ VLC_FALSE, VLC_FALSE );
+}
+
int playlist_MLLoad( playlist_t *p_playlist )
{
const char *psz_datadir = p_playlist->p_libvlc->psz_datadir;
return VLC_EGENERIC;
}
- if( asprintf( &psz_uri, "%s" DIR_SEP "ml.xsp", psz_datadir ) == -1 )
+ if( asprintf( &psz_uri, "%s" DIR_SEP "ml.xspf", psz_datadir ) == -1 )
{
psz_uri = NULL;
goto error;
}
free( psz_uri );
- if( asprintf( &psz_uri, "file/xspf-open://%s" DIR_SEP "ml.xsp",
+ if( asprintf( &psz_uri, "file/xspf-open://%s" DIR_SEP "ml.xspf",
psz_datadir ) == -1 )
{
psz_uri = NULL;
}
const char *const psz_option = "meta-file";
+ /* that option has to be cleaned in input_item_subitem_added() */
p_input = input_ItemNewExt( p_playlist, psz_uri,
_("Media Library"), 1, &psz_option, -1 );
if( p_input == NULL )
goto error;
- /* FIXME [21574] pdherbemont do we need *install_input_item_observer ? */
- playlist_AddInput( p_playlist, p_input, PLAYLIST_APPEND, 0, VLC_FALSE,
- VLC_FALSE );
+ p_playlist->p_ml_onelevel->p_input =
+ p_playlist->p_ml_category->p_input = p_input;
+
+ vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemAdded,
+ input_item_subitem_added, p_playlist );
p_playlist->b_doing_ml = VLC_TRUE;
stats_TimerStart( p_playlist, "ML Load", STATS_TIMER_ML_LOAD );
stats_TimerStop( p_playlist,STATS_TIMER_ML_LOAD );
p_playlist->b_doing_ml = VLC_FALSE;
+ vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded,
+ input_item_subitem_added, p_playlist );
+
free( psz_uri );
return VLC_SUCCESS;
}
char psz_dirname[ strlen( psz_datadir )
- + sizeof( DIR_SEP "ml.xsl")];
+ + sizeof( DIR_SEP "ml.xspf")];
sprintf( psz_dirname, "%s", psz_datadir );
if( config_CreateDir( (vlc_object_t *)p_playlist, psz_dirname ) )
{
return VLC_EGENERIC;
}
- strcat( psz_dirname, DIR_SEP "ml.xsp" );
+ strcat( psz_dirname, DIR_SEP "ml.xspf" );
stats_TimerStart( p_playlist, "ML Dump", STATS_TIMER_ML_DUMP );
playlist_Export( p_playlist, psz_dirname, p_playlist->p_ml_category,
"export-xspf" );
+ vlc_gc_decref( p_playlist->p_ml_category->p_input );
stats_TimerStop( p_playlist, STATS_TIMER_ML_DUMP );
return VLC_SUCCESS;