Commit 41af9ab2 authored by François Cartegnie's avatar François Cartegnie 🤞

update meta request API to allow overriding

parent bdc3ad38
...@@ -291,8 +291,18 @@ VLC_API void input_item_Release(input_item_t *); ...@@ -291,8 +291,18 @@ VLC_API void input_item_Release(input_item_t *);
#define vlc_gc_incref(i) input_item_Hold(i) #define vlc_gc_incref(i) input_item_Hold(i)
#define vlc_gc_decref(i) input_item_Release(i) #define vlc_gc_decref(i) input_item_Release(i)
VLC_API int libvlc_MetaRequest(libvlc_int_t *, input_item_t *); typedef enum input_item_meta_request_option_t
VLC_API int libvlc_ArtRequest(libvlc_int_t *, input_item_t *); {
META_REQUEST_OPTION_NONE = 0,
META_REQUEST_OPTION_LOCAL = 1 << 0,
META_REQUEST_OPTION_NETWORK = 1 << 1,
META_REQUEST_OPTION_ANY = 1 << 2
} input_item_meta_request_option_t;
VLC_API int libvlc_MetaRequest(libvlc_int_t *, input_item_t *,
input_item_meta_request_option_t );
VLC_API int libvlc_ArtRequest(libvlc_int_t *, input_item_t *,
input_item_meta_request_option_t );
/****************** /******************
* Input stats * Input stats
......
...@@ -633,8 +633,8 @@ static int media_parse(libvlc_media_t *media) ...@@ -633,8 +633,8 @@ static int media_parse(libvlc_media_t *media)
input_item_t *item = media->p_input_item; input_item_t *item = media->p_input_item;
/* TODO: Fetch art on need basis. But how not to break compatibility? */ /* TODO: Fetch art on need basis. But how not to break compatibility? */
libvlc_ArtRequest(libvlc, item); libvlc_ArtRequest(libvlc, item, META_REQUEST_OPTION_NONE);
return libvlc_MetaRequest(libvlc, item); return libvlc_MetaRequest(libvlc, item, META_REQUEST_OPTION_NONE);
} }
/************************************************************************** /**************************************************************************
......
...@@ -913,7 +913,7 @@ ...@@ -913,7 +913,7 @@
if (p_item) { if (p_item) {
if (p_item->i_children == -1) if (p_item->i_children == -1)
libvlc_MetaRequest(p_intf->p_libvlc, p_item->p_input); libvlc_MetaRequest(p_intf->p_libvlc, p_item->p_input, META_REQUEST_OPTION_NONE);
else else
msg_Dbg(p_intf, "preparsing nodes not implemented"); msg_Dbg(p_intf, "preparsing nodes not implemented");
} }
...@@ -938,7 +938,7 @@ ...@@ -938,7 +938,7 @@
p_item = [[o_outline_view itemAtRow: indexes[i]] pointerValue]; p_item = [[o_outline_view itemAtRow: indexes[i]] pointerValue];
if (p_item && p_item->i_children == -1) if (p_item && p_item->i_children == -1)
libvlc_ArtRequest(p_intf->p_libvlc, p_item->p_input); libvlc_ArtRequest(p_intf->p_libvlc, p_item->p_input, META_REQUEST_OPTION_NONE);
} }
[self playlistUpdated]; [self playlistUpdated];
} }
......
...@@ -212,7 +212,7 @@ static VLCInfo *_o_sharedInstance = nil; ...@@ -212,7 +212,7 @@ static VLCInfo *_o_sharedInstance = nil;
[o_image_well setImage: [NSImage imageNamed: @"noart.png"]]; [o_image_well setImage: [NSImage imageNamed: @"noart.png"]];
} else { } else {
if (!input_item_IsPreparsed(p_item)) if (!input_item_IsPreparsed(p_item))
libvlc_MetaRequest(VLCIntf->p_libvlc, p_item); libvlc_MetaRequest(VLCIntf->p_libvlc, p_item, META_REQUEST_OPTION_NONE);
/* fill uri info */ /* fill uri info */
char * psz_url = decode_URI(input_item_GetURI(p_item)); char * psz_url = decode_URI(input_item_GetURI(p_item));
...@@ -365,7 +365,7 @@ error: ...@@ -365,7 +365,7 @@ error:
- (IBAction)downloadCoverArt:(id)sender - (IBAction)downloadCoverArt:(id)sender
{ {
playlist_t * p_playlist = pl_Get(VLCIntf); playlist_t * p_playlist = pl_Get(VLCIntf);
if (p_item) libvlc_ArtRequest(VLCIntf->p_libvlc, p_item); if (p_item) libvlc_ArtRequest(VLCIntf->p_libvlc, p_item, META_REQUEST_OPTION_NONE);
} }
- (input_item_t *)item - (input_item_t *)item
......
...@@ -654,7 +654,7 @@ void InputManager::requestArtUpdate( input_item_t *p_item ) ...@@ -654,7 +654,7 @@ void InputManager::requestArtUpdate( input_item_t *p_item )
if ( status & ( ITEM_ART_NOTFOUND|ITEM_ART_FETCHED ) ) if ( status & ( ITEM_ART_NOTFOUND|ITEM_ART_FETCHED ) )
return; return;
} }
libvlc_ArtRequest( p_intf->p_libvlc, p_item ); libvlc_ArtRequest( p_intf->p_libvlc, p_item, META_REQUEST_OPTION_NONE );
/* No input will signal the cover art to update, /* No input will signal the cover art to update,
* let's do it ourself */ * let's do it ourself */
if ( b_current_item ) if ( b_current_item )
......
...@@ -619,14 +619,15 @@ static void GetFilenames( libvlc_int_t *p_vlc, unsigned n, ...@@ -619,14 +619,15 @@ static void GetFilenames( libvlc_int_t *p_vlc, unsigned n,
* Requests extraction of the meta data for an input item (a.k.a. preparsing). * Requests extraction of the meta data for an input item (a.k.a. preparsing).
* The actual extraction is asynchronous. * The actual extraction is asynchronous.
*/ */
int libvlc_MetaRequest(libvlc_int_t *libvlc, input_item_t *item) int libvlc_MetaRequest(libvlc_int_t *libvlc, input_item_t *item,
input_item_meta_request_option_t i_options)
{ {
libvlc_priv_t *priv = libvlc_priv(libvlc); libvlc_priv_t *priv = libvlc_priv(libvlc);
if (unlikely(priv->parser == NULL)) if (unlikely(priv->parser == NULL))
return VLC_ENOMEM; return VLC_ENOMEM;
playlist_preparser_Push(priv->parser, item); playlist_preparser_Push(priv->parser, item, i_options);
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -634,13 +635,14 @@ int libvlc_MetaRequest(libvlc_int_t *libvlc, input_item_t *item) ...@@ -634,13 +635,14 @@ int libvlc_MetaRequest(libvlc_int_t *libvlc, input_item_t *item)
* Requests retrieving/downloading art for an input item. * Requests retrieving/downloading art for an input item.
* The retrieval is performed asynchronously. * The retrieval is performed asynchronously.
*/ */
int libvlc_ArtRequest(libvlc_int_t *libvlc, input_item_t *item) int libvlc_ArtRequest(libvlc_int_t *libvlc, input_item_t *item,
input_item_meta_request_option_t i_options)
{ {
libvlc_priv_t *priv = libvlc_priv(libvlc); libvlc_priv_t *priv = libvlc_priv(libvlc);
if (unlikely(priv->parser == NULL)) if (unlikely(priv->parser == NULL))
return VLC_ENOMEM; return VLC_ENOMEM;
playlist_preparser_fetcher_Push(priv->parser, item); playlist_preparser_fetcher_Push(priv->parser, item, i_options);
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -43,15 +43,19 @@ ...@@ -43,15 +43,19 @@
/***************************************************************************** /*****************************************************************************
* Structures/definitions * Structures/definitions
*****************************************************************************/ *****************************************************************************/
typedef struct playlist_fetcher_entry_t
{
input_item_t *p_item;
input_item_meta_request_option_t i_options;
} playlist_fetcher_entry_t;
struct playlist_fetcher_t struct playlist_fetcher_t
{ {
vlc_object_t *object; vlc_object_t *object;
vlc_mutex_t lock; vlc_mutex_t lock;
vlc_cond_t wait; vlc_cond_t wait;
bool b_live; bool b_live;
int i_waiting; DECL_ARRAY(playlist_fetcher_entry_t) waiting;
input_item_t **pp_waiting;
DECL_ARRAY(playlist_album_t) albums; DECL_ARRAY(playlist_album_t) albums;
meta_fetcher_scope_t e_scope; meta_fetcher_scope_t e_scope;
}; };
...@@ -72,8 +76,6 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t *parent ) ...@@ -72,8 +76,6 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t *parent )
vlc_mutex_init( &p_fetcher->lock ); vlc_mutex_init( &p_fetcher->lock );
vlc_cond_init( &p_fetcher->wait ); vlc_cond_init( &p_fetcher->wait );
p_fetcher->b_live = false; p_fetcher->b_live = false;
p_fetcher->i_waiting = 0;
p_fetcher->pp_waiting = NULL;
bool b_access = var_InheritBool( parent, "metadata-network-access" ); bool b_access = var_InheritBool( parent, "metadata-network-access" );
if ( !b_access ) if ( !b_access )
...@@ -82,18 +84,19 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t *parent ) ...@@ -82,18 +84,19 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t *parent )
p_fetcher->e_scope = ( b_access ) ? FETCHER_SCOPE_ANY : FETCHER_SCOPE_LOCAL; p_fetcher->e_scope = ( b_access ) ? FETCHER_SCOPE_ANY : FETCHER_SCOPE_LOCAL;
ARRAY_INIT( p_fetcher->albums ); ARRAY_INIT( p_fetcher->albums );
ARRAY_INIT( p_fetcher->waiting );
return p_fetcher; return p_fetcher;
} }
void playlist_fetcher_Push( playlist_fetcher_t *p_fetcher, void playlist_fetcher_Push( playlist_fetcher_t *p_fetcher, input_item_t *p_item,
input_item_t *p_item ) input_item_meta_request_option_t i_options )
{ {
vlc_gc_incref( p_item ); vlc_gc_incref( p_item );
playlist_fetcher_entry_t entry = { p_item, i_options };
vlc_mutex_lock( &p_fetcher->lock ); vlc_mutex_lock( &p_fetcher->lock );
INSERT_ELEM( p_fetcher->pp_waiting, p_fetcher->i_waiting, ARRAY_APPEND( p_fetcher->waiting, entry );
p_fetcher->i_waiting, p_item );
if( !p_fetcher->b_live ) if( !p_fetcher->b_live )
{ {
if( vlc_clone_detach( NULL, Thread, p_fetcher, if( vlc_clone_detach( NULL, Thread, p_fetcher,
...@@ -110,11 +113,9 @@ void playlist_fetcher_Delete( playlist_fetcher_t *p_fetcher ) ...@@ -110,11 +113,9 @@ void playlist_fetcher_Delete( playlist_fetcher_t *p_fetcher )
{ {
vlc_mutex_lock( &p_fetcher->lock ); vlc_mutex_lock( &p_fetcher->lock );
/* Remove any left-over item, the fetcher will exit */ /* Remove any left-over item, the fetcher will exit */
while( p_fetcher->i_waiting > 0 ) for (int i=0;i<p_fetcher->waiting.i_size; i++)
{ vlc_gc_decref( p_fetcher->waiting.p_elems[i].p_item );
vlc_gc_decref( p_fetcher->pp_waiting[0] ); ARRAY_RESET( p_fetcher->waiting );
REMOVE_ELEM( p_fetcher->pp_waiting, p_fetcher->i_waiting, 0 );
}
while( p_fetcher->b_live ) while( p_fetcher->b_live )
vlc_cond_wait( &p_fetcher->wait, &p_fetcher->lock ); vlc_cond_wait( &p_fetcher->wait, &p_fetcher->lock );
...@@ -122,6 +123,7 @@ void playlist_fetcher_Delete( playlist_fetcher_t *p_fetcher ) ...@@ -122,6 +123,7 @@ void playlist_fetcher_Delete( playlist_fetcher_t *p_fetcher )
vlc_cond_destroy( &p_fetcher->wait ); vlc_cond_destroy( &p_fetcher->wait );
vlc_mutex_destroy( &p_fetcher->lock ); vlc_mutex_destroy( &p_fetcher->lock );
free( p_fetcher ); free( p_fetcher );
} }
...@@ -364,12 +366,14 @@ static void *Thread( void *p_data ) ...@@ -364,12 +366,14 @@ static void *Thread( void *p_data )
for( ;; ) for( ;; )
{ {
input_item_t *p_item = NULL; input_item_t *p_item = NULL;
input_item_meta_request_option_t i_options;
vlc_mutex_lock( &p_fetcher->lock ); vlc_mutex_lock( &p_fetcher->lock );
if( p_fetcher->i_waiting != 0 ) if( p_fetcher->waiting.i_size != 0 )
{ {
p_item = p_fetcher->pp_waiting[0]; p_item = p_fetcher->waiting.p_elems[0].p_item;
REMOVE_ELEM( p_fetcher->pp_waiting, p_fetcher->i_waiting, 0 ); i_options = p_fetcher->waiting.p_elems[0].i_options;
ARRAY_REMOVE( p_fetcher->waiting, 0 );
} }
else else
{ {
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#ifndef _PLAYLIST_FETCHER_H #ifndef _PLAYLIST_FETCHER_H
#define _PLAYLIST_FETCHER_H 1 #define _PLAYLIST_FETCHER_H 1
#include <vlc_input_item.h>
/** /**
* Fetcher opaque structure. * Fetcher opaque structure.
* *
...@@ -44,7 +46,8 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t * ); ...@@ -44,7 +46,8 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t * );
* The input item is retained until the art fetching is done or until the * The input item is retained until the art fetching is done or until the
* fetcher object is destroyed. * fetcher object is destroyed.
*/ */
void playlist_fetcher_Push( playlist_fetcher_t *, input_item_t * ); void playlist_fetcher_Push( playlist_fetcher_t *, input_item_t *,
input_item_meta_request_option_t );
/** /**
* This function destroys the fetcher object and thread. * This function destroys the fetcher object and thread.
......
...@@ -769,7 +769,7 @@ static void GoAndPreparse( playlist_t *p_playlist, int i_mode, ...@@ -769,7 +769,7 @@ static void GoAndPreparse( playlist_t *p_playlist, int i_mode,
char *psz_album = input_item_GetAlbum( p_item->p_input ); char *psz_album = input_item_GetAlbum( p_item->p_input );
if( sys->p_preparser != NULL && !input_item_IsPreparsed( p_item->p_input ) if( sys->p_preparser != NULL && !input_item_IsPreparsed( p_item->p_input )
&& (EMPTY_STR(psz_artist) || EMPTY_STR(psz_album)) ) && (EMPTY_STR(psz_artist) || EMPTY_STR(psz_album)) )
playlist_preparser_Push( sys->p_preparser, p_item->p_input ); playlist_preparser_Push( sys->p_preparser, p_item->p_input, 0 );
free( psz_artist ); free( psz_artist );
free( psz_album ); free( psz_album );
} }
......
...@@ -71,9 +71,11 @@ playlist_preparser_t *playlist_preparser_New( vlc_object_t *parent ) ...@@ -71,9 +71,11 @@ playlist_preparser_t *playlist_preparser_New( vlc_object_t *parent )
return p_preparser; return p_preparser;
} }
void playlist_preparser_Push( playlist_preparser_t *p_preparser, input_item_t *p_item ) void playlist_preparser_Push( playlist_preparser_t *p_preparser, input_item_t *p_item,
input_item_meta_request_option_t i_options )
{ {
vlc_gc_incref( p_item ); vlc_gc_incref( p_item );
VLC_UNUSED( i_options );
vlc_mutex_lock( &p_preparser->lock ); vlc_mutex_lock( &p_preparser->lock );
INSERT_ELEM( p_preparser->pp_waiting, p_preparser->i_waiting, INSERT_ELEM( p_preparser->pp_waiting, p_preparser->i_waiting,
...@@ -90,10 +92,10 @@ void playlist_preparser_Push( playlist_preparser_t *p_preparser, input_item_t *p ...@@ -90,10 +92,10 @@ void playlist_preparser_Push( playlist_preparser_t *p_preparser, input_item_t *p
} }
void playlist_preparser_fetcher_Push( playlist_preparser_t *p_preparser, void playlist_preparser_fetcher_Push( playlist_preparser_t *p_preparser,
input_item_t *p_item ) input_item_t *p_item, input_item_meta_request_option_t i_options )
{ {
if( p_preparser->p_fetcher != NULL ) if( p_preparser->p_fetcher != NULL )
playlist_fetcher_Push( p_preparser->p_fetcher, p_item ); playlist_fetcher_Push( p_preparser->p_fetcher, p_item, i_options );
} }
void playlist_preparser_Delete( playlist_preparser_t *p_preparser ) void playlist_preparser_Delete( playlist_preparser_t *p_preparser )
...@@ -185,7 +187,7 @@ static void Art( playlist_preparser_t *p_preparser, input_item_t *p_item ) ...@@ -185,7 +187,7 @@ static void Art( playlist_preparser_t *p_preparser, input_item_t *p_item )
vlc_mutex_unlock( &p_item->lock ); vlc_mutex_unlock( &p_item->lock );
if( b_fetch && p_fetcher ) if( b_fetch && p_fetcher )
playlist_fetcher_Push( p_fetcher, p_item ); playlist_fetcher_Push( p_fetcher, p_item, 0 );
} }
/** /**
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#ifndef _PLAYLIST_PREPARSER_H #ifndef _PLAYLIST_PREPARSER_H
#define _PLAYLIST_PREPARSER_H 1 #define _PLAYLIST_PREPARSER_H 1
#include <vlc_input_item.h>
/** /**
* Preparser opaque structure. * Preparser opaque structure.
* *
...@@ -45,9 +46,11 @@ playlist_preparser_t *playlist_preparser_New( vlc_object_t * ); ...@@ -45,9 +46,11 @@ playlist_preparser_t *playlist_preparser_New( vlc_object_t * );
* The input item is retained until the preparsing is done or until the * The input item is retained until the preparsing is done or until the
* preparser object is deleted. * preparser object is deleted.
*/ */
void playlist_preparser_Push( playlist_preparser_t *, input_item_t * ); void playlist_preparser_Push( playlist_preparser_t *, input_item_t *,
input_item_meta_request_option_t );
void playlist_preparser_fetcher_Push( playlist_preparser_t *, input_item_t * ); void playlist_preparser_fetcher_Push( playlist_preparser_t *, input_item_t *,
input_item_meta_request_option_t );
/** /**
* This function destroys the preparser object and thread. * This function destroys the preparser object and thread.
......
...@@ -233,7 +233,7 @@ static int PlayItem( playlist_t *p_playlist, playlist_item_t *p_item ) ...@@ -233,7 +233,7 @@ static int PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
if( !b_has_art || strncmp( psz_arturl, "attachment://", 13 ) ) if( !b_has_art || strncmp( psz_arturl, "attachment://", 13 ) )
{ {
PL_DEBUG( "requesting art for %s", psz_name ); PL_DEBUG( "requesting art for %s", psz_name );
libvlc_ArtRequest( p_playlist->p_libvlc, p_input ); libvlc_ArtRequest( p_playlist->p_libvlc, p_input, META_REQUEST_OPTION_NONE );
} }
free( psz_arturl ); free( psz_arturl );
free( psz_name ); free( psz_name );
......
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