VLC_EXPORT( input_thread_t *, __input_CreateThread2, ( vlc_object_t *, input_item_t *, char * ) );
#define input_Preparse(a,b) __input_Preparse(VLC_OBJECT(a),b)
VLC_EXPORT( int, __input_Preparse, ( vlc_object_t *, input_item_t * ) );
-#define input_SecondaryPreparse(a,b) __input_SecondaryPreparse(VLC_OBJECT(a),b)
-VLC_EXPORT( int, __input_SecondaryPreparse, ( vlc_object_t *, input_item_t * ) );
#define input_Read(a,b,c) __input_Read(VLC_OBJECT(a),b, c)
VLC_EXPORT( int, __input_Read, ( vlc_object_t *, input_item_t *, vlc_bool_t ) );
VLC_EXPORT( void, input_StopThread, ( input_thread_t * ) );
VLC_EXPORT( void, input_DestroyThread, ( input_thread_t * ) );
+
+#define input_MetaFetch(a,b) __input_MetaFetch(VLC_OBJECT(a),b)
+VLC_EXPORT( int, __input_MetaFetch, ( vlc_object_t *, input_item_t * ) );
+
enum input_query_e
{
/* input variable "position" */
const char *psz_file;
};
+#define VLC_META_ENGINE_TITLE 0x00000001
+#define VLC_META_ENGINE_AUTHOR 0x00000002
+#define VLC_META_ENGINE_ARTIST 0x00000004
+#define VLC_META_ENGINE_GENRE 0x00000008
+#define VLC_META_ENGINE_COPYRIGHT 0x00000010
+#define VLC_META_ENGINE_COLLECTION 0x00000020
+#define VLC_META_ENGINE_SEQ_NUM 0x00000040
+#define VLC_META_ENGINE_DESCRIPTION 0x00000080
+#define VLC_META_ENGINE_RATING 0x00000100
+#define VLC_META_ENGINE_DATE 0x00000200
+#define VLC_META_ENGINE_URL 0x00000400
+#define VLC_META_ENGINE_LANGUAGE 0x00000800
+
+#define VLC_META_ENGINE_ART_URL 0x00001000
+
+#define VLC_META_ENGINE_MB_ARTIST_ID 0x00002000
+#define VLC_META_ENGINE_MB_RELEASE_ID 0x00004000
+#define VLC_META_ENGINE_MB_TRACK_ID 0x00008000
+#define VLC_META_ENGINE_MB_TRM_ID 0x00010000
+
+typedef struct meta_engine_sys_t meta_engine_sys_t;
+
+struct meta_engine_t
+{
+ VLC_COMMON_MEMBERS
+
+ module_t *p_module;
+
+ uint32_t i_mandatory; /**< Stuff which we really need to get */
+ uint32_t i_optional; /**< Stuff which we'd like to have */
+
+ input_item_t *p_item;
+};
+
#endif
+++ /dev/null
-/*****************************************************************************
- * vlc_meta_engine.h: meta engine module.
- *****************************************************************************
- * Copyright (C) 2006 the VideoLAN team
- * $Id$
- *
- * Authors: Antoine Cellerier <dionoea A videolan D 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.
- *****************************************************************************/
-
-#ifndef _VLC_META_ENGINE_H
-#define _VLC_META_ENGINE_H
-
-#include "vlc_meta.h"
-
-#define VLC_META_ENGINE_TITLE 0x00000001
-#define VLC_META_ENGINE_AUTHOR 0x00000002
-#define VLC_META_ENGINE_ARTIST 0x00000004
-#define VLC_META_ENGINE_GENRE 0x00000008
-#define VLC_META_ENGINE_COPYRIGHT 0x00000010
-#define VLC_META_ENGINE_COLLECTION 0x00000020
-#define VLC_META_ENGINE_SEQ_NUM 0x00000040
-#define VLC_META_ENGINE_DESCRIPTION 0x00000080
-#define VLC_META_ENGINE_RATING 0x00000100
-#define VLC_META_ENGINE_DATE 0x00000200
-#define VLC_META_ENGINE_URL 0x00000400
-#define VLC_META_ENGINE_LANGUAGE 0x00000800
-
-#define VLC_META_ENGINE_ART_URL 0x00001000
-
-#define VLC_META_ENGINE_MB_ARTIST_ID 0x00002000
-#define VLC_META_ENGINE_MB_RELEASE_ID 0x00004000
-#define VLC_META_ENGINE_MB_TRACK_ID 0x00008000
-#define VLC_META_ENGINE_MB_TRM_ID 0x00010000
-
-typedef struct meta_engine_sys_t meta_engine_sys_t;
-
-struct meta_engine_t
-{
- VLC_COMMON_MEMBERS
-
- module_t *p_module;
-
- uint32_t i_mandatory; /**< Stuff which we really need to get */
- uint32_t i_optional; /**< Stuff which we'd like to have */
-
- input_item_t *p_item;
-};
-
-#endif
void (*aout_EnableFilter_inner) (vlc_object_t *, const char *, vlc_bool_t);
void (*playlist_NodesPairCreate_inner) (playlist_t *, char *, playlist_item_t **, playlist_item_t **, vlc_bool_t);
char * (*aout_VisualChange_inner) (vlc_object_t *, int);
- int (*__input_SecondaryPreparse_inner) (vlc_object_t *, input_item_t *);
+ void *__input_SecondaryPreparse_deprecated;
void (*input_ItemAddOption_inner) (input_item_t *, const char *);
char * (*input_ItemGetInfo_inner) (input_item_t *p_i, const char *psz_cat,const char *psz_name);
int (*input_ItemAddInfo_inner) (input_item_t *p_i, const char *psz_cat, const char *psz_name, const char *psz_format, ...);
void (*input_ItemAddOptionNoDup_inner) (input_item_t *, const char *);
+ int (*__input_MetaFetch_inner) (vlc_object_t *, input_item_t *);
};
# if defined (__PLUGIN__)
# define aout_FiltersCreatePipeline (p_symbols)->aout_FiltersCreatePipeline_inner
# define aout_EnableFilter (p_symbols)->aout_EnableFilter_inner
# define playlist_NodesPairCreate (p_symbols)->playlist_NodesPairCreate_inner
# define aout_VisualChange (p_symbols)->aout_VisualChange_inner
-# define __input_SecondaryPreparse (p_symbols)->__input_SecondaryPreparse_inner
# define input_ItemAddOption (p_symbols)->input_ItemAddOption_inner
# define input_ItemGetInfo (p_symbols)->input_ItemGetInfo_inner
# define input_ItemAddInfo (p_symbols)->input_ItemAddInfo_inner
# define input_ItemAddOptionNoDup (p_symbols)->input_ItemAddOptionNoDup_inner
+# define __input_MetaFetch (p_symbols)->__input_MetaFetch_inner
# elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__)
/******************************************************************
* STORE_SYMBOLS: store VLC APIs into p_symbols for plugin access.
((p_symbols)->aout_EnableFilter_inner) = aout_EnableFilter; \
((p_symbols)->playlist_NodesPairCreate_inner) = playlist_NodesPairCreate; \
((p_symbols)->aout_VisualChange_inner) = aout_VisualChange; \
- ((p_symbols)->__input_SecondaryPreparse_inner) = __input_SecondaryPreparse; \
((p_symbols)->input_ItemAddOption_inner) = input_ItemAddOption; \
((p_symbols)->input_ItemGetInfo_inner) = input_ItemGetInfo; \
((p_symbols)->input_ItemAddInfo_inner) = input_ItemAddInfo; \
((p_symbols)->input_ItemAddOptionNoDup_inner) = input_ItemAddOptionNoDup; \
+ ((p_symbols)->__input_MetaFetch_inner) = __input_MetaFetch; \
(p_symbols)->net_ConvertIPv4_deprecated = NULL; \
(p_symbols)->vlc_input_item_GetInfo_deprecated = NULL; \
(p_symbols)->vlc_input_item_AddInfo_deprecated = NULL; \
(p_symbols)->__intf_IntfProgressUpdate_deprecated = NULL; \
(p_symbols)->__intf_IntfProgress_deprecated = NULL; \
(p_symbols)->streaming_ChainToPsz_deprecated = NULL; \
+ (p_symbols)->__input_SecondaryPreparse_deprecated = NULL; \
# endif /* __PLUGIN__ */
#endif /* __VLC_SYMBOLS_H */
input/demux.c \
input/es_out.c \
input/input.c \
+ input/meta.c \
input/input_internal.h \
input/stream.c \
input/mem_stream.c \
#include "vlc_playlist.h"
#include "vlc_interface.h"
#include "vlc_interaction.h"
-#include "vlc_meta_engine.h"
#include "charset.h"
return VLC_SUCCESS;
}
-int __input_SecondaryPreparse( vlc_object_t *p_parent, input_item_t *p_item )
-{
- struct meta_engine_t *p_me;
-
- /* FIXME: don't launch any module if we already have all the needed
- * info. Easiest way to do this would be to add a dummy module.
- * I'll do that later */
-
- p_me = vlc_object_create( p_parent, VLC_OBJECT_META_ENGINE );
- p_me->i_flags |= OBJECT_FLAGS_NOINTERACT;
- p_me->i_mandatory = VLC_META_ENGINE_TITLE
- | VLC_META_ENGINE_ARTIST;
- p_me->i_optional = 0;
-/*
- if( var_CreateGetInteger( p_parent, "album-art" ) != ALBUM_ART_NEVER )
- {
- p_me->i_mandatory |= VLC_META_ENGINE_ART_URL;
- }
- else
- {
- p_me->i_optional |= VLC_META_ENGINE_ART_URL;
- }
-*/
- p_me->p_item = p_item;
- p_me->p_module = module_Need( p_me, "meta fetcher", 0, VLC_FALSE );
- vlc_object_attach( p_me, p_parent );
- if( !p_me->p_module )
- {
- msg_Err( p_parent, "no suitable meta engine module" );
- vlc_object_detach( p_me );
- vlc_object_destroy( p_me );
- return VLC_EGENERIC;
- }
-
- module_Unneed( p_me, p_me->p_module );
-
- vlc_object_destroy( p_me );
-
- return VLC_SUCCESS;
-}
-
/**
* Request a running input thread to stop and die
*
return VLC_TRUE;
}
-
-#ifndef MAX_PATH
-# define MAX_PATH 250
-#endif
-int input_DownloadAndCacheArt( vlc_object_t *p_parent, input_item_t *p_item )
-{
- char *psz_artist;
- char *psz_album;
- char *psz_type;
- char *psz_filename;
- int i_status = VLC_EGENERIC;
- int i_ret;
- struct stat a;
-
- if( !p_item->p_meta
- || !p_item->p_meta->psz_arturl
- || !*p_item->p_meta->psz_arturl )
- {
- return VLC_EGENERIC;
- }
- if( !strncmp( p_item->p_meta->psz_arturl, "file", 4 ) )
- {
- return VLC_SUCCESS;
- }
-
- psz_artist = p_item->p_meta->psz_artist;
- psz_album = p_item->p_meta->psz_album;
- psz_type = strrchr( p_item->p_meta->psz_arturl, '.' );
- psz_filename = (char *)malloc( MAX_PATH );
-
-
- snprintf( psz_filename, MAX_PATH,
- "file://%s" DIR_SEP CONFIG_DIR DIR_SEP "art"
- DIR_SEP "%s" DIR_SEP "%s" DIR_SEP "art%s",
- p_parent->p_libvlc->psz_homedir,
- psz_artist, psz_album, psz_type );
- msg_Dbg( p_parent, "Saving album art to %s", psz_filename );
-
- /* Check if file exists */
- i_ret = utf8_stat( psz_filename+7, &a );
- if( i_ret == 0 )
- {
- msg_Dbg( p_parent, "Album art %s already exists", psz_filename );
- }
- else
- {
- //if( i_ret == -1 && errno == ENOTDIR )
- {
- /* GRUIKKKKKKKKKK (make sure that all the directories exist) */
- char *psz_dir = malloc( MAX_PATH );
- snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP CONFIG_DIR,
- p_parent->p_libvlc->psz_homedir );
- utf8_mkdir( psz_dir );
- snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP CONFIG_DIR DIR_SEP "art",
- p_parent->p_libvlc->psz_homedir );
- utf8_mkdir( psz_dir );
- snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP CONFIG_DIR DIR_SEP
- "art" DIR_SEP "%s",
- p_parent->p_libvlc->psz_homedir, psz_artist );
- utf8_mkdir( psz_dir );
- snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP CONFIG_DIR DIR_SEP
- "art" DIR_SEP "%s" DIR_SEP "%s",
- p_parent->p_libvlc->psz_homedir,
- psz_artist, psz_album );
- utf8_mkdir( psz_dir );
- free( psz_dir );
- }
-
- stream_t *p_stream = stream_UrlNew( p_parent,
- p_item->p_meta->psz_arturl );
-
- if( p_stream )
- {
- void *p_buffer = malloc( 1<<16 );
- long int l_read;
- FILE *p_file = utf8_fopen( psz_filename+7, "w" );
- while( ( l_read = stream_Read( p_stream, p_buffer, 1<<16 ) ) )
- {
- fwrite( p_buffer, l_read, 1, p_file );
- }
- free( p_buffer );
- fclose( p_file );
- stream_Delete( p_stream );
- msg_Dbg( p_parent, "Album art saved to %s\n", psz_filename );
- free( p_item->p_meta->psz_arturl );
- p_item->p_meta->psz_arturl = strdup( psz_filename );
- i_status = VLC_SUCCESS;
- }
- }
- free( psz_filename );
-
- return i_status;
-}
--- /dev/null
+/*****************************************************************************
+ * meta.c : Metadata handling
+ *****************************************************************************
+ * Copyright (C) 1998-2004 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Antoine Cellerier <dionoea@videolan.org>
+ * Clément Stenac <zorglub@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.
+ *****************************************************************************/
+
+#include <vlc/vlc.h>
+#include <vlc/input.h>
+#include <vlc_meta.h>
+#include "vlc_playlist.h"
+#include "charset.h"
+
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+int __input_MetaFetch( vlc_object_t *p_parent, input_item_t *p_item )
+{
+ struct meta_engine_t *p_me;
+
+ /* FIXME: don't launch any module if we already have all the needed
+ * info. Easiest way to do this would be to add a dummy module.
+ * I'll do that later */
+
+ p_me = vlc_object_create( p_parent, VLC_OBJECT_META_ENGINE );
+ p_me->i_flags |= OBJECT_FLAGS_NOINTERACT;
+ p_me->i_mandatory = VLC_META_ENGINE_TITLE
+ | VLC_META_ENGINE_ARTIST;
+ p_me->i_optional = 0;
+/*
+ if( var_CreateGetInteger( p_parent, "album-art" ) != ALBUM_ART_NEVER )
+ {
+ p_me->i_mandatory |= VLC_META_ENGINE_ART_URL;
+ }
+ else
+ {
+ p_me->i_optional |= VLC_META_ENGINE_ART_URL;
+ }
+*/
+ p_me->p_item = p_item;
+ p_me->p_module = module_Need( p_me, "meta fetcher", 0, VLC_FALSE );
+ vlc_object_attach( p_me, p_parent );
+ if( !p_me->p_module )
+ {
+ msg_Err( p_parent, "no suitable meta engine module" );
+ vlc_object_detach( p_me );
+ vlc_object_destroy( p_me );
+ return VLC_EGENERIC;
+ }
+
+ module_Unneed( p_me, p_me->p_module );
+
+ vlc_object_destroy( p_me );
+
+ return VLC_SUCCESS;
+}
+
+#ifndef MAX_PATH
+# define MAX_PATH 250
+#endif
+int input_FindArt( vlc_object_t *p_parent, input_item_t *p_item )
+{
+ char *psz_artist;
+ char *psz_album;
+ char *psz_type;
+ char psz_filename[MAX_PATH];
+ int i_ret;
+ struct stat a;
+
+ if( !p_item->p_meta ) return VLC_EGENERIC;
+
+ psz_artist = p_item->p_meta->psz_artist;
+ psz_album = p_item->p_meta->psz_album;
+
+ //FIXME !!!!!
+ psz_type = strdup( "jpg" );
+
+ snprintf( psz_filename, MAX_PATH,
+ "file://%s" DIR_SEP CONFIG_DIR DIR_SEP "art"
+ DIR_SEP "%s" DIR_SEP "%s" DIR_SEP "art%s",
+ p_parent->p_libvlc->psz_homedir,
+ psz_artist, psz_album, psz_type );
+
+ /* Check if file exists */
+ i_ret = utf8_stat( psz_filename+7, &a );
+ if( i_ret == 0 )
+ {
+ msg_Dbg( p_parent, "album art %s already exists in cache"
+ , psz_filename );
+ return VLC_SUCCESS;
+ }
+ else
+ {
+ /* Use a art finder module to find the URL */
+ return VLC_EGENERIC;
+ }
+}
+
+/**
+ * Download the art using the URL or an art downloaded
+ * This function should be called only if data is not already in cache
+ */
+int input_DownloadAndCacheArt( vlc_object_t *p_parent, input_item_t *p_item )
+{
+ int i_status = VLC_EGENERIC;
+ int i_ret;
+ struct stat a;
+ stream_t *p_stream;
+ char psz_filename[MAX_PATH], psz_dir[MAX_PATH];
+ char *psz_artist;
+ char *psz_album;
+ char *psz_type;
+ psz_artist = p_item->p_meta->psz_artist;
+ psz_album = p_item->p_meta->psz_album;
+
+ /* You dummy ! How am I supposed to download NULL ? */
+ if( !p_item->p_meta || !p_item->p_meta->psz_arturl
+ || !*p_item->p_meta->psz_arturl )
+ return VLC_EGENERIC;
+
+ /* Todo: get a helper to do this */
+ snprintf( psz_filename, MAX_PATH,
+ "file://%s" DIR_SEP CONFIG_DIR DIR_SEP "art"
+ DIR_SEP "%s" DIR_SEP "%s" DIR_SEP "art%s",
+ p_parent->p_libvlc->psz_homedir,
+ psz_artist, psz_album, psz_type );
+
+ snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP CONFIG_DIR,
+ p_parent->p_libvlc->psz_homedir );
+ utf8_mkdir( psz_dir );
+ snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP CONFIG_DIR DIR_SEP "art",
+ p_parent->p_libvlc->psz_homedir );
+ utf8_mkdir( psz_dir );
+ snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP CONFIG_DIR DIR_SEP
+ "art" DIR_SEP "%s",
+ p_parent->p_libvlc->psz_homedir, psz_artist );
+ utf8_mkdir( psz_dir );
+ snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP CONFIG_DIR DIR_SEP
+ "art" DIR_SEP "%s" DIR_SEP "%s",
+ p_parent->p_libvlc->psz_homedir,
+ psz_artist, psz_album );
+ utf8_mkdir( psz_dir );
+
+ /* Todo: check for stuff that needs a downloader module */
+ p_stream = stream_UrlNew( p_parent, p_item->p_meta->psz_arturl );
+
+ if( p_stream )
+ {
+ void *p_buffer = malloc( 1<<16 );
+ long int l_read;
+ FILE *p_file = utf8_fopen( psz_filename+7, "w" );
+ while( ( l_read = stream_Read( p_stream, p_buffer, 1<<16 ) ) )
+ {
+ fwrite( p_buffer, l_read, 1, p_file );
+ }
+ free( p_buffer );
+ fclose( p_file );
+ stream_Delete( p_stream );
+ msg_Dbg( p_parent, "Album art saved to %s\n", psz_filename );
+ free( p_item->p_meta->psz_arturl );
+ p_item->p_meta->psz_arturl = strdup( psz_filename );
+ i_status = VLC_SUCCESS;
+ }
+ return i_status;
+}
#include "vlc_tls.h"
#include "vlc_xml.h"
#include "vlc_osd.h"
-#include "vlc_meta_engine.h"
+#include "vlc_meta.h"
/*****************************************************************************
* Local prototypes
vlc_mutex_unlock( &p_obj->object_lock );
if( p_current )
{
- input_SecondaryPreparse( p_playlist, p_current );
+ input_MetaFetch( p_playlist, p_current );
p_current->p_meta->i_status |= ITEM_META_FETCHED;
var_SetInteger( p_playlist, "item-change", p_current->i_id );
vlc_gc_decref( p_current );