From c5d27d8eaa17302b64decc502f70ab00f9a77e74 Mon Sep 17 00:00:00 2001 From: Warren Dukes Date: Wed, 10 Nov 2004 21:58:27 +0000 Subject: merge changes from metadata-rewrite branch git-svn-id: https://svn.musicpd.org/mpd/trunk@2589 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/inputPlugins/flac_plugin.c | 122 ++++++++++++++++++++++------------------- src/inputPlugins/mod_plugin.c | 4 +- src/inputPlugins/mp3_plugin.c | 20 ++++--- src/inputPlugins/mp4_plugin.c | 42 ++++++++++---- src/inputPlugins/ogg_plugin.c | 28 +++++----- 5 files changed, 127 insertions(+), 89 deletions(-) (limited to 'src/inputPlugins') diff --git a/src/inputPlugins/flac_plugin.c b/src/inputPlugins/flac_plugin.c index d038f1418..bc706ff64 100644 --- a/src/inputPlugins/flac_plugin.c +++ b/src/inputPlugins/flac_plugin.c @@ -450,12 +450,73 @@ FLAC__StreamDecoderWriteStatus flacWrite(const FLAC__SeekableStreamDecoder *dec, return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } +static int commentMatchesAddToTag( + char * str, + FLAC__StreamMetadata_VorbisComment_Entry * entry, + int itemType, + MpdTag ** tag) +{ + int slen = strlen(str); + int vlen = entry->length - slen; + + if( vlen <= 0 ) return 0; + + if( 0 == strncasecmp(str, entry->entry, slen) ) { + if(*tag == NULL) *tag = newMpdTag(); + addItemToMpdTagWithLen(*tag, itemType, + entry->entry+slen, vlen); + return 1; + } + + return 0; +} + + +static MpdTag * copyVorbisCommentBlockToMpdTag(FLAC__StreamMetadata * block, + MpdTag * tag) +{ + int i; + + for(i = 0; i < block->data.vorbis_comment.num_comments; i++) { + if(commentMatchesAddToTag( + "artist=", + block->data.vorbis_comment.comments+i, + TAG_ITEM_ARTIST, + &tag)); + else if(commentMatchesAddToTag( + "title=", + block->data.vorbis_comment.comments+i, + TAG_ITEM_TITLE, + &tag)); + else if(commentMatchesAddToTag( + "album=", + block->data.vorbis_comment.comments+i, + TAG_ITEM_ALBUM, + &tag)); + else if(commentMatchesAddToTag( + "tracknumber=", + block->data.vorbis_comment.comments+i, + TAG_ITEM_TRACK, + &tag)); + else if(commentMatchesAddToTag( + "genre=", + block->data.vorbis_comment.comments+i, + TAG_ITEM_GENRE, + &tag)); + else if(commentMatchesAddToTag( + "date=", + block->data.vorbis_comment.comments+i, + TAG_ITEM_DATE, + &tag)); + } + + return tag; +} + MpdTag * flacMetadataDup(char * file, int * vorbisCommentFound) { MpdTag * ret = NULL; FLAC__Metadata_SimpleIterator * it; FLAC__StreamMetadata * block = NULL; - int offset; - int len, pos; *vorbisCommentFound = 0; @@ -469,60 +530,9 @@ MpdTag * flacMetadataDup(char * file, int * vorbisCommentFound) { block = FLAC__metadata_simple_iterator_get_block(it); if(!block) break; if(block->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - char * dup; - - offset = FLAC__metadata_object_vorbiscomment_find_entry_from(block,0,"artist"); - if(offset>=0) { - *vorbisCommentFound = 1; - if(!ret) ret = newMpdTag(); - pos = strlen("artist="); - len = block->data.vorbis_comment.comments[offset].length-pos; - if(len>0) { - dup = malloc(len+1); - memcpy(dup,&(block->data.vorbis_comment.comments[offset].entry[pos]),len); - dup[len] = '\0'; - ret->artist = dup; - } - } - offset = FLAC__metadata_object_vorbiscomment_find_entry_from(block,0,"album"); - if(offset>=0) { - *vorbisCommentFound = 1; - if(!ret) ret = newMpdTag(); - pos = strlen("album="); - len = block->data.vorbis_comment.comments[offset].length-pos; - if(len>0) { - dup = malloc(len+1); - memcpy(dup,&(block->data.vorbis_comment.comments[offset].entry[pos]),len); - dup[len] = '\0'; - ret->album = dup; - } - } - offset = FLAC__metadata_object_vorbiscomment_find_entry_from(block,0,"title"); - if(offset>=0) { - *vorbisCommentFound = 1; - if(!ret) ret = newMpdTag(); - pos = strlen("title="); - len = block->data.vorbis_comment.comments[offset].length-pos; - if(len>0) { - dup = malloc(len+1); - memcpy(dup,&(block->data.vorbis_comment.comments[offset].entry[pos]),len); - dup[len] = '\0'; - ret->title = dup; - } - } - offset = FLAC__metadata_object_vorbiscomment_find_entry_from(block,0,"tracknumber"); - if(offset>=0) { - *vorbisCommentFound = 1; - if(!ret) ret = newMpdTag(); - pos = strlen("tracknumber="); - len = block->data.vorbis_comment.comments[offset].length-pos; - if(len>0) { - dup = malloc(len+1); - memcpy(dup,&(block->data.vorbis_comment.comments[offset].entry[pos]),len); - dup[len] = '\0'; - ret->track = dup; - } - } + ret = copyVorbisCommentBlockToMpdTag(block, ret); + + if(ret) *vorbisCommentFound = 1; } else if(block->type == FLAC__METADATA_TYPE_STREAMINFO) { if(!ret) ret = newMpdTag(); diff --git a/src/inputPlugins/mod_plugin.c b/src/inputPlugins/mod_plugin.c index 0ea7dffad..f9b23b595 100644 --- a/src/inputPlugins/mod_plugin.c +++ b/src/inputPlugins/mod_plugin.c @@ -212,6 +212,7 @@ int mod_decode(OutputBuffer * cb, DecoderControl * dc, char * path) { MpdTag * modTagDup(char * file) { MpdTag * ret = NULL; MODULE * moduleHandle; + char * title; if(mod_initMikMod() < 0) return NULL; @@ -222,7 +223,8 @@ MpdTag * modTagDup(char * file) { ret = newMpdTag(); ret->time = 0; - ret->title = strdup(Player_LoadTitle(file)); + title = strdup(Player_LoadTitle(file)); + if(title) mpdItemToMpdTag(ret, TAG_ITEM_TITLE, title); fail: MikMod_Exit(); diff --git a/src/inputPlugins/mp3_plugin.c b/src/inputPlugins/mp3_plugin.c index ab204ffa9..cdb2a74c0 100644 --- a/src/inputPlugins/mp3_plugin.c +++ b/src/inputPlugins/mp3_plugin.c @@ -549,9 +549,12 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) { if(data->inStream->metaTitle) { MpdTag * tag = newMpdTag(); if(data->inStream->metaName) { - tag->name = strdup(data->inStream->metaName); + addItemToMpdTag(tag, + TAG_ITEM_NAME, + data->inStream->metaName); } - tag->title = strdup(data->inStream->metaTitle); + addItemToMpdTag(tag, TAG_ITEM_TITLE, + data->inStream->metaTitle); free(data->inStream->metaTitle); data->inStream->metaTitle = NULL; copyMpdTagToOutputBuffer(cb, tag); @@ -676,19 +679,21 @@ int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) { if(inStream->metaTitle) { if(tag) freeMpdTag(tag); tag = newMpdTag(); - tag->title = strdup(inStream->metaTitle); + addItemToMpdTag(tag, TAG_ITEM_TITLE, inStream->metaTitle); free(inStream->metaTitle); inStream->metaTitle = NULL; if(inStream->metaName) { - tag->name = strdup(inStream->metaName); + addItemToMpdTag(tag, TAG_ITEM_NAME, + inStream->metaName); } copyMpdTagToOutputBuffer(cb, tag); freeMpdTag(tag); } else if(tag) { if(inStream->metaName) { - if(tag->name) free(tag->name); - tag->name = strdup(inStream->metaName); + clearItemsFromMpdTag(tag, TAG_ITEM_NAME); + addItemToMpdTag(tag, TAG_ITEM_NAME, + inStream->metaName); } copyMpdTagToOutputBuffer(cb, tag); freeMpdTag(tag); @@ -696,7 +701,8 @@ int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) { else if(inStream->metaName) { tag = newMpdTag(); if(inStream->metaName) { - tag->name = strdup(inStream->metaName); + addItemToMpdTag(tag, TAG_ITEM_NAME, + inStream->metaName); } copyMpdTagToOutputBuffer(cb, tag); freeMpdTag(tag); diff --git a/src/inputPlugins/mp4_plugin.c b/src/inputPlugins/mp4_plugin.c index 66d5600b4..a66f7d43d 100644 --- a/src/inputPlugins/mp4_plugin.c +++ b/src/inputPlugins/mp4_plugin.c @@ -322,6 +322,7 @@ MpdTag * mp4DataDup(char * file, int * mp4MetadataFound) { int32_t track; int32_t time; int32_t scale; + int i; *mp4MetadataFound = 0; @@ -359,20 +360,39 @@ MpdTag * mp4DataDup(char * file, int * mp4MetadataFound) { } ret->time = ((float)time)/scale+0.5; - if(!mp4ff_meta_get_artist(mp4fh,&ret->artist)) { - *mp4MetadataFound = 1; - } + for(i = 0; i < mp4ff_meta_get_num_items(mp4fh); i++) { + char * item; + char * value; - if(!mp4ff_meta_get_album(mp4fh,&ret->album)) { - *mp4MetadataFound = 1; - } + mp4ff_meta_get_by_index(mp4fh, i, &item, &value); - if(!mp4ff_meta_get_title(mp4fh,&ret->title)) { - *mp4MetadataFound = 1; - } + if(0 == strcasecmp("artist", item)) { + addItemToMpdTag(ret, TAG_ITEM_ARTIST, value); + *mp4MetadataFound = 1; + } + else if(0 == strcasecmp("title", item)) { + addItemToMpdTag(ret, TAG_ITEM_TITLE, value); + *mp4MetadataFound = 1; + } + else if(0 == strcasecmp("album", item)) { + addItemToMpdTag(ret, TAG_ITEM_ALBUM, value); + *mp4MetadataFound = 1; + } + else if(0 == strcasecmp("track", item)) { + addItemToMpdTag(ret, TAG_ITEM_TRACK, value); + *mp4MetadataFound = 1; + } + else if(0 == strcasecmp("genre", item)) { + addItemToMpdTag(ret, TAG_ITEM_GENRE, value); + *mp4MetadataFound = 1; + } + else if(0 == strcasecmp("date", item)) { + addItemToMpdTag(ret, TAG_ITEM_DATE, value); + *mp4MetadataFound = 1; + } - if(!mp4ff_meta_get_track(mp4fh,&ret->track)) { - *mp4MetadataFound = 1; + free(item); + free(value); } mp4ff_close(mp4fh); diff --git a/src/inputPlugins/ogg_plugin.c b/src/inputPlugins/ogg_plugin.c index d6add6d3a..b681a27e0 100644 --- a/src/inputPlugins/ogg_plugin.c +++ b/src/inputPlugins/ogg_plugin.c @@ -162,27 +162,27 @@ MpdTag * oggCommentsParse(char ** comments) { while(*comments) { if((temp = ogg_parseComment(*comments,"artist"))) { if(!ret) ret = newMpdTag(); - if(!ret->artist) { - ret->artist = strdup(temp); - } + addItemToMpdTag(ret, TAG_ITEM_ARTIST, temp); } else if((temp = ogg_parseComment(*comments,"title"))) { if(!ret) ret = newMpdTag(); - if(!ret->title) { - ret->title = strdup(temp); - } + addItemToMpdTag(ret, TAG_ITEM_TITLE, temp); } else if((temp = ogg_parseComment(*comments,"album"))) { if(!ret) ret = newMpdTag(); - if(!ret->album) { - ret->album = strdup(temp); - } + addItemToMpdTag(ret, TAG_ITEM_ALBUM, temp); } else if((temp = ogg_parseComment(*comments,"tracknumber"))) { if(!ret) ret = newMpdTag(); - if(!ret->track) { - ret->track = strdup(temp); - } + addItemToMpdTag(ret, TAG_ITEM_TRACK, temp); + } + else if((temp = ogg_parseComment(*comments,"genre"))) { + if(!ret) ret = newMpdTag(); + addItemToMpdTag(ret, TAG_ITEM_GENRE, temp); + } + else if((temp = ogg_parseComment(*comments,"date"))) { + if(!ret) ret = newMpdTag(); + addItemToMpdTag(ret, TAG_ITEM_DATE, temp); } comments++; @@ -208,8 +208,8 @@ void putOggCommentsIntoOutputBuffer(OutputBuffer * cb, char * streamName, if(tag->title) printf("Title: %s\n", tag->title);*/ if(streamName) { - if(tag->name) free(tag->name); - tag->name = strdup(streamName); + clearItemsFromMpdTag(tag, TAG_ITEM_NAME); + addItemToMpdTag(tag, TAG_ITEM_NAME, streamName); } copyMpdTagToOutputBuffer(cb, tag); -- cgit v1.2.3