X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=include%2Fvlc_meta.h;h=28bd4acfcea3fef70f7c8b1ec68a276841f0498d;hb=16c039d47d6fd536867c9f543cceca565e7c12c0;hp=372992110dd9a7e4edeb94ba2469394353eef112;hpb=7f779f6a64eadd10b2e2b98bcf85fdd38c0cdfa5;p=vlc diff --git a/include/vlc_meta.h b/include/vlc_meta.h index 372992110d..28bd4acfce 100644 --- a/include/vlc_meta.h +++ b/include/vlc_meta.h @@ -21,6 +21,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#if !defined( __LIBVLC__ ) + #error You are not libvlc or one of its plugins. You cannot include this file +#endif + #ifndef _VLC_META_H #define _VLC_META_H 1 @@ -51,6 +55,7 @@ #define ITEM_META_FETCHED 0x02 #define ITEM_ARTURL_FETCHED 0x04 #define ITEM_ART_FETCHED 0x08 +#define ITEM_ART_NOTFOUND 0x10 struct vlc_meta_t { @@ -70,35 +75,38 @@ struct vlc_meta_t char *psz_publisher; char *psz_encodedby; char *psz_arturl; + char *psz_trackid; + + int i_extra; + char **ppsz_extra_name; + char **ppsz_extra_value; int i_status; -#if 0 - /* track meta information */ - int i_track; - vlc_meta_t **track; -#endif + }; -#define vlc_meta_Set( meta,var,val ) { \ +#define vlc_meta_Set( meta,var,val ) do { \ + const char *str = val; \ if( meta->psz_##var ) free( meta->psz_##var ); \ - meta->psz_##var = strdup( val ); } - -#define vlc_meta_SetTitle( meta, b ) vlc_meta_Set( meta, title, b ); -#define vlc_meta_SetArtist( meta, b ) vlc_meta_Set( meta, artist, b ); -#define vlc_meta_SetGenre( meta, b ) vlc_meta_Set( meta, genre, b ); -#define vlc_meta_SetCopyright( meta, b ) vlc_meta_Set( meta, copyright, b ); -#define vlc_meta_SetAlbum( meta, b ) vlc_meta_Set( meta, album, b ); -#define vlc_meta_SetTracknum( meta, b ) vlc_meta_Set( meta, tracknum, b ); -#define vlc_meta_SetDescription( meta, b ) vlc_meta_Set( meta, description, b ); -#define vlc_meta_SetRating( meta, b ) vlc_meta_Set( meta, rating, b ); -#define vlc_meta_SetDate( meta, b ) vlc_meta_Set( meta, date, b ); -#define vlc_meta_SetSetting( meta, b ) vlc_meta_Set( meta, setting, b ); -#define vlc_meta_SetURL( meta, b ) vlc_meta_Set( meta, url, b ); -#define vlc_meta_SetLanguage( meta, b ) vlc_meta_Set( meta, language, b ); -#define vlc_meta_SetNowPlaying( meta, b ) vlc_meta_Set( meta, nowplaying, b ); -#define vlc_meta_SetPublisher( meta, b ) vlc_meta_Set( meta, publisher, b ); -#define vlc_meta_SetEncodedBy( meta, b ) vlc_meta_Set( meta, encodedby, b ); -#define vlc_meta_SetArtURL( meta, b ) vlc_meta_Set( meta, arturl, b ); + meta->psz_##var = str ? strdup( str ) : NULL; } while(0) + +#define vlc_meta_SetTitle( meta, b ) vlc_meta_Set( meta, title, b ) +#define vlc_meta_SetArtist( meta, b ) vlc_meta_Set( meta, artist, b ) +#define vlc_meta_SetGenre( meta, b ) vlc_meta_Set( meta, genre, b ) +#define vlc_meta_SetCopyright( meta, b ) vlc_meta_Set( meta, copyright, b ) +#define vlc_meta_SetAlbum( meta, b ) vlc_meta_Set( meta, album, b ) +#define vlc_meta_SetTracknum( meta, b ) vlc_meta_Set( meta, tracknum, b ) +#define vlc_meta_SetDescription( meta, b ) vlc_meta_Set( meta, description, b ) +#define vlc_meta_SetRating( meta, b ) vlc_meta_Set( meta, rating, b ) +#define vlc_meta_SetDate( meta, b ) vlc_meta_Set( meta, date, b ) +#define vlc_meta_SetSetting( meta, b ) vlc_meta_Set( meta, setting, b ) +#define vlc_meta_SetURL( meta, b ) vlc_meta_Set( meta, url, b ) +#define vlc_meta_SetLanguage( meta, b ) vlc_meta_Set( meta, language, b ) +#define vlc_meta_SetNowPlaying( meta, b ) vlc_meta_Set( meta, nowplaying, b ) +#define vlc_meta_SetPublisher( meta, b ) vlc_meta_Set( meta, publisher, b ) +#define vlc_meta_SetEncodedBy( meta, b ) vlc_meta_Set( meta, encodedby, b ) +#define vlc_meta_SetArtURL( meta, b ) vlc_meta_Set( meta, arturl, b ) +#define vlc_meta_SetTrackID( meta, b ) vlc_meta_Set( meta, trackid, b ) static inline vlc_meta_t *vlc_meta_New( void ) { @@ -120,12 +128,20 @@ static inline vlc_meta_t *vlc_meta_New( void ) m->psz_publisher = NULL; m->psz_encodedby = NULL; m->psz_arturl = NULL; + m->psz_trackid = NULL; + + m->i_extra = 0; + m->ppsz_extra_name = NULL; + m->ppsz_extra_value = NULL; + m->i_status = 0; return m; } static inline void vlc_meta_Delete( vlc_meta_t *m ) { + int i; + free( m->psz_title ); free( m->psz_artist ); free( m->psz_genre ); @@ -141,13 +157,28 @@ static inline void vlc_meta_Delete( vlc_meta_t *m ) free( m->psz_nowplaying ); free( m->psz_publisher ); free( m->psz_encodedby ); + free( m->psz_trackid ); free( m->psz_arturl ); + for( i = 0; i < m->i_extra; i++ ) + { + free( m->ppsz_extra_name[i] ); + free( m->ppsz_extra_value[i] ); + } + free( m->ppsz_extra_name ); + free( m->ppsz_extra_value ); free( m ); } +static inline void vlc_meta_AddExtra( vlc_meta_t *m, const char *psz_name, const char *psz_value ) +{ + int i_extra = m->i_extra; + TAB_APPEND_CPP( char, m->i_extra, m->ppsz_extra_name, strdup(psz_name) ); + TAB_APPEND_CPP( char, i_extra, m->ppsz_extra_value, strdup(psz_value) ); +} -static inline void vlc_meta_Merge( vlc_meta_t *dst, vlc_meta_t *src ) +static inline void vlc_meta_Merge( vlc_meta_t *dst, const vlc_meta_t *src ) { + int i; if( !dst || !src ) return; #define COPY_FIELD( a ) \ if( src->psz_ ## a ) { \ @@ -169,15 +200,32 @@ static inline void vlc_meta_Merge( vlc_meta_t *dst, vlc_meta_t *src ) COPY_FIELD( nowplaying ); COPY_FIELD( publisher ); COPY_FIELD( encodedby ); + COPY_FIELD( trackid ); COPY_FIELD( arturl ); +#undef COPY_FIELD + + for( i = 0; i < src->i_extra; i++ ) + { + int j; + for( j = 0; j < dst->i_extra; j++ ) + { + if( !strcmp( dst->ppsz_extra_name[j], src->ppsz_extra_name[i] ) ) + { + free( dst->ppsz_extra_value[j] ); + dst->ppsz_extra_value[j] = strdup( src->ppsz_extra_value[i] ); + break; + } + } + if( j >= dst->i_extra ) + vlc_meta_AddExtra( dst, src->ppsz_extra_name[i], src->ppsz_extra_value[i] ); + } } - /** \todo Track meta */ enum { - ALBUM_ART_NEVER, ALBUM_ART_WHEN_ASKED, ALBUM_ART_WHEN_PLAYED, - ALBUM_ART_ALL }; + ALBUM_ART_ALL +}; struct meta_export_t {