aboutsummaryrefslogtreecommitdiffstats
path: root/src/tag.c
diff options
context:
space:
mode:
authorWarren Dukes <warren.dukes@gmail.com>2004-11-10 01:09:03 +0000
committerWarren Dukes <warren.dukes@gmail.com>2004-11-10 01:09:03 +0000
commit92a75471505391edd2f8f9af23188b4f7b17bbcb (patch)
tree7cf738d5c40637942fe09c6a2edd98e34314ad5b /src/tag.c
parent598db0d296a8c16e181b488040a324f9ae20cc33 (diff)
downloadmpd-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.c141
1 files changed, 103 insertions, 38 deletions
diff --git a/src/tag.c b/src/tag.c
index 8b365f85f..7a8dcada4 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -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;
+}