From: Clément Stenac Date: Sun, 24 Sep 2006 17:11:25 +0000 (+0000) Subject: * Split download function in find/download X-Git-Tag: 0.9.0-test0~10137 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=bd3484b93bb6ebf0ece8a8db8acf29f52d007660;p=vlc * Split download function in find/download * Put meta related functions in src/input/meta.c * Merge vlc_meta_engine.h and vlc_meta.h Album art stuff is still broken, but I need to go now :) --- diff --git a/include/vlc_input.h b/include/vlc_input.h index ad5993802c..bf67e6e9f1 100644 --- a/include/vlc_input.h +++ b/include/vlc_input.h @@ -467,14 +467,16 @@ VLC_EXPORT( input_thread_t *, __input_CreateThread, ( vlc_object_t *, input_item 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" */ diff --git a/include/vlc_meta.h b/include/vlc_meta.h index 5a6a88dd32..7f97fcbebe 100644 --- a/include/vlc_meta.h +++ b/include/vlc_meta.h @@ -191,4 +191,38 @@ struct meta_export_t 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 diff --git a/include/vlc_meta_engine.h b/include/vlc_meta_engine.h deleted file mode 100644 index f7211e3263..0000000000 --- a/include/vlc_meta_engine.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************** - * vlc_meta_engine.h: meta engine module. - ***************************************************************************** - * Copyright (C) 2006 the VideoLAN team - * $Id$ - * - * Authors: Antoine Cellerier - * - * 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 diff --git a/include/vlc_symbols.h b/include/vlc_symbols.h index 601b3d8ad8..a228d85d1c 100644 --- a/include/vlc_symbols.h +++ b/include/vlc_symbols.h @@ -538,11 +538,12 @@ struct module_symbols_t 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 @@ -1012,11 +1013,11 @@ struct module_symbols_t # 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. @@ -1489,11 +1490,11 @@ struct module_symbols_t ((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; \ @@ -1546,6 +1547,7 @@ struct module_symbols_t (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 */ diff --git a/src/Makefile.am b/src/Makefile.am index b047a3c222..22eced99ec 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -275,6 +275,7 @@ SOURCES_libvlc_common = \ input/demux.c \ input/es_out.c \ input/input.c \ + input/meta.c \ input/input_internal.h \ input/stream.c \ input/mem_stream.c \ diff --git a/src/input/input.c b/src/input/input.c index b7da2ed8a9..e0c9e4c401 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -39,7 +39,6 @@ #include "vlc_playlist.h" #include "vlc_interface.h" #include "vlc_interaction.h" -#include "vlc_meta_engine.h" #include "charset.h" @@ -349,47 +348,6 @@ int __input_Preparse( vlc_object_t *p_parent, input_item_t *p_item ) 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 * @@ -2529,96 +2487,3 @@ vlc_bool_t input_AddSubtitles( input_thread_t *p_input, char *psz_subtitle, 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; -} diff --git a/src/input/meta.c b/src/input/meta.c new file mode 100644 index 0000000000..33cca2e7b4 --- /dev/null +++ b/src/input/meta.c @@ -0,0 +1,183 @@ +/***************************************************************************** + * meta.c : Metadata handling + ***************************************************************************** + * Copyright (C) 1998-2004 the VideoLAN team + * $Id$ + * + * Authors: Antoine Cellerier + * Clément Stenac +#include +#include +#include "vlc_playlist.h" +#include "charset.h" + +#ifdef HAVE_SYS_STAT_H +# include +#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; +} diff --git a/src/misc/objects.c b/src/misc/objects.c index cca0fbe4c1..e25ac1bb6f 100644 --- a/src/misc/objects.c +++ b/src/misc/objects.c @@ -56,7 +56,7 @@ #include "vlc_tls.h" #include "vlc_xml.h" #include "vlc_osd.h" -#include "vlc_meta_engine.h" +#include "vlc_meta.h" /***************************************************************************** * Local prototypes diff --git a/src/playlist/engine.c b/src/playlist/engine.c index efbec7399a..b360bfe5b4 100644 --- a/src/playlist/engine.c +++ b/src/playlist/engine.c @@ -532,7 +532,7 @@ void playlist_SecondaryPreparseLoop( playlist_preparse_t *p_obj ) 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 );