diff options
author | Warren Dukes <warren.dukes@gmail.com> | 2004-11-10 01:09:03 +0000 |
---|---|---|
committer | Warren Dukes <warren.dukes@gmail.com> | 2004-11-10 01:09:03 +0000 |
commit | 92a75471505391edd2f8f9af23188b4f7b17bbcb (patch) | |
tree | 7cf738d5c40637942fe09c6a2edd98e34314ad5b /src/tag.c | |
parent | 598db0d296a8c16e181b488040a324f9ae20cc33 (diff) | |
download | mpd-92a75471505391edd2f8f9af23188b4f7b17bbcb.tar.gz mpd-92a75471505391edd2f8f9af23188b4f7b17bbcb.tar.xz mpd-92a75471505391edd2f8f9af23188b4f7b17bbcb.zip |
begining of metadata rewrite:
now we support genre and date metadata, along with multiple metadata entries
for each type
git-svn-id: https://svn.musicpd.org/mpd/branches/r2562-metadata-handling-rewrite@2567 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to '')
-rw-r--r-- | src/tag.c | 141 |
1 files changed, 103 insertions, 38 deletions
@@ -40,7 +40,7 @@ #include <FLAC/metadata.h> #endif -char * mpdTagItemsKeys[TAG_NUM_OF_ITEM_TYPES] = +char * mpdTagItemKeys[TAG_NUM_OF_ITEM_TYPES] = { "Artist", "Album", @@ -52,14 +52,14 @@ char * mpdTagItemsKeys[TAG_NUM_OF_ITEM_TYPES] = }; void printMpdTag(FILE * fp, MpdTag * tag) { - MpdTagItem * item; - - for(item = tag->tagItems; item && item->type!=TAG_ITEM_END; item++) { - myfprintf(fp, "%s: %s\n", mpdTagItemKeys[item->type], - item->value); - } + int i; if(tag->time>=0) myfprintf(fp,"Time: %i\n",tag->time); + + for(i = 0; i < tag->numOfItems; i++) { + myfprintf(fp, "%s: %s\n", mpdTagItemKeys[tag->items[i].type], + tag->items[i].value); + } } #define fixUtf8(str) { \ @@ -73,12 +73,11 @@ void printMpdTag(FILE * fp, MpdTag * tag) { } void validateUtf8Tag(MpdTag * tag) { - MpdTagItem * item = tag->tagItems; + int i; - while(item && item->type != TAG_ITEM_END) { - fixUtf8(item->value); - stripReturnChar(item->value); - item++; + for(i = 0; i < tag->numOfItems; i++) { + fixUtf8(tag->items[i].value); + stripReturnChar(tag->items[i].value); } } @@ -93,14 +92,13 @@ MpdTag * getID3Info(struct id3_tag * tag, char * id, int type, MpdTag * mpdTag) int i; frame = id3_tag_findframe(tag, id, 0); - if(!frame) return NULL; + if(!frame) return mpdTag; field = &frame->fields[1]; nstrings = id3_field_getnstrings(field); - if(nstrings<1) return NULL; for(i = 0; i < nstrings; i++) { - ucs4 = id3_field_getstrings(field,0); + ucs4 = id3_field_getstrings(field, i); assert(ucs4); if(type == TAG_ITEM_GENRE) { @@ -110,8 +108,10 @@ MpdTag * getID3Info(struct id3_tag * tag, char * id, int type, MpdTag * mpdTag) utf8 = id3_ucs4_utf8duplicate(ucs4); if(!utf8) continue; - if( NULL == mpdTag ) mpdTag == newMpdTag(); - addItemToMpdTag(mpdTag, type, utf8); + if(strlen(utf8)) { + if( NULL == mpdTag ) mpdTag = newMpdTag(); + addItemToMpdTag(mpdTag, type, utf8); + } free(utf8); } @@ -163,20 +163,55 @@ MpdTag * id3Dup(char * file) { MpdTag * newMpdTag() { MpdTag * ret = malloc(sizeof(MpdTag)); - ret->tagItems = NULL; + ret->items = NULL; ret->time = -1; + ret->numOfItems = 0; return ret; } +static void deleteItem(MpdTag * tag, int index) { + tag->numOfItems--; + + if(tag->numOfItems-index > 0) { + memmove(tag->items+index, tag->items+index+1, + tag->numOfItems-index); + } + + if(tag->numOfItems > 0) { + tag->items = realloc(tag->items, + tag->numOfItems*sizeof(MpdTagItem)); + } + else { + free(tag->items); + tag->items = NULL; + } +} + +void clearItemsFromMpdTag(MpdTag * tag, int type) { + int i = 0; + + for(i = 0; i < tag->numOfItems; i++) { + if(tag->items[i].type == type) { + deleteItem(tag, i); + /* decrement since when just deleted this node */ + i--; + } + } +} + void clearMpdTag(MpdTag * tag) { - MpdTagItem * item; + int i; - for(item = tag->tagItems; item && item->type != TAG_ITEM_END; item++) { - free(item->value); + for(i = 0; i < tag->numOfItems; i++) { + free(tag->items[i].value); } - if(tag->tagItems) free(tag->tagItems); - tag->tagItems = NULL; + if(tag->items) free(tag->items); + tag->items = NULL; + + tag->numOfItems = 0; + + tag->time = -1; } void freeMpdTag(MpdTag * tag) { @@ -186,40 +221,70 @@ void freeMpdTag(MpdTag * tag) { MpdTag * mpdTagDup(MpdTag * tag) { MpdTag * ret = NULL; - MpdTagItem * item; + int i; if(!tag) return NULL; ret = newMpdTag(); ret->time = tag->time; - for(item = tag->tagItems; item && item->type != TAG_ITEM_END; item++) { - addItemToMpdTag(ret, item->type, item->value); + for(i = 0; i < tag->numOfItems; i++) { + addItemToMpdTag(ret, tag->items[i].type, tag->items[i].value); } return ret; } int mpdTagsAreEqual(MpdTag * tag1, MpdTag * tag2) { - MpdTagItem * item1; - MpdTagItem * item2; + int i; if(tag1 == NULL && tag2 == NULL) return 1; else if(!tag1 || !tag2) return 0; if(tag1->time != tag2->time) return 0; - for(item1 = tag1->tagItems, item2 = tag2->tagItems; - item1 && item1->type != TAG_ITEM_END; - item1++, item2++) - { - if(!item2) return 0; - if(item1->type != item2->type) return 0; - if(0 == strcmp(item1->value, item2->value)) return 0; - } + if(tag1->numOfItems != tag2->numOfItems) return 0; - if(item2 && !item1) return 0; - if(item2->type != item1->type) return 0; + for(i = 0; i < tag1->numOfItems; i++) { + if(tag1->items[i].type != tag2->items[i].type) return 0; + if(strcmp(tag1->items[i].value, tag2->items[i].value)) { + return 0; + } + } return 1; } + +inline static void appendToTagItems(MpdTag * tag, int type, char * value, + int len) +{ + int i = tag->numOfItems; + + tag->numOfItems++; + tag->items = realloc(tag->items, tag->numOfItems*sizeof(MpdTagItem)); + + tag->items[i].type = type; + tag->items[i].value = malloc(len+1); + strncpy(tag->items[i].value, value, len); + tag->items[i].value[len] = '\0'; +} + +void addItemToMpdTagWithLen(MpdTag * tag, int itemType, char * value, int len) { + appendToTagItems(tag, itemType, value, len); +} + +char * getNextItemFromMpdTag(MpdTag * tag, int itemType, int * last) { + int i = 0; + + if(last && *last >=0) i = *last+1; + + for(i = 0; i < tag->numOfItems; i++) { + if(itemType == tag->items[i].type) { + if(last) *last = i; + return tag->items[i].value; + } + i++; + } + + return NULL; +} |