/* Set a field (by pointer) to the requested id3 value */ static void set_field(char** out, ID3Tag *tag, ID3_FieldID id, ID3_FrameID fid) { ID3Frame *frame = NULL; ID3Field *field = NULL; size_t size; char *set; frame = ID3Tag_FindFrameWithID(tag, fid); if (frame == NULL) goto end; field = ID3Frame_GetField(frame, id); if (field == NULL) goto end; size = ID3Field_Size(field); size += 1; set = malloc(size); if (!set) goto end; ID3Field_GetASCII(field, set, size); *out = g_strescape(set, NULL); free(set); end: if (!frame || !field) *out = NULL; return; }
int libapetag_convertID3v2toAPE (const ID3Frame * frame, char **item_, size_t * item_len, char **value_, size_t * value_len, unsigned long *flags) { ID3Field *text; ID3Field *desc; ID3Field *url; // ID3Field *bin; // will be implemented some day char *item = NULL; char *value = NULL; ID3_FrameID frameid = ID3Frame_GetID (frame); unsigned int i; *flags = ITEM_TEXT; for (i = 0; i < sizeof (convert) / sizeof (struct id3vtwo2ape); i++) if (frameid == convert[i].frame) break; if (convert[i].field_type == ID3FN_TEXT) { switch (convert[i].special) { case APETAG_TYPE_COMMENT: /* Comments and unsynced lyrics */ if ((text = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { ALOCATE(text, value, *value_len); ID3Field_GetASCII(text, value, *value_len); } ALOCATE_ITEM(item, convert[i].APEName, *item_len); strncpy(item, convert[i].APEName, *item_len); item[*item_len]='\0'; //break; if ((text = ID3Frame_GetField (frame, ID3FN_DESCRIPTION)) != NULL) { char *value_ds=NULL; int value_len2; if (ID3Field_Size(text) != 0) { ALOCATE(text, value_ds, value_len2); ID3Field_GetASCII(text, value_ds, value_len2); if ( strcmp(value_ds, STR_V1_COMMENT_DESC) == 0 ) { value_len2 = 0; value[0]='\0'; } else { item = (char *) realloc( item, (*item_len) + value_len2 + 3); item[(*item_len)++]='-'; item[(*item_len)]='\0'; strncpy(item + (*item_len),value_ds ,(value_len2 + 1)); (*item_len)+=value_len2; } free(value_ds); } } break; case APETAG_TYPE_USER: /* User texts */ if ((text = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { ALOCATE(text, value, *value_len); ID3Field_GetASCII(text, value, *value_len); } if ((desc = ID3Frame_GetField(frame, ID3FN_DESCRIPTION)) != NULL) { ALOCATE(desc, item, *item_len); ID3Field_GetASCII(desc, item, *item_len); } break; case APETAG_TYPE_GENRE: /* genre */ if ((text = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { char *p; int j; ALOCATE(text, value, *value_len); ID3Field_GetASCII(text, value, *value_len); ALOCATE_ITEM(item, convert[i].APEName, *item_len); strncpy(item, convert[i].APEName, *item_len); value[*value_len]='\0'; p = value; if (*p == '(') { p++; while (*p && (*p >= '0' && *p <= '9')) p++; if (*p && *p == ')') { p++; } else { p = value; } *value_len -= (p-value); // corect lenght of frame if (*p != '\0') { // copy in place for (j = 0; *p != '\0'; j++) { value[j] = *p; p++; } value[j] = '\0'; } } } break; default: /* normal text tags */ if ((text = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { ALOCATE(text, value, *value_len); ID3Field_GetASCII(text, value, *value_len); ALOCATE_ITEM(item, convert[i].APEName, *item_len); strncpy(item, convert[i].APEName, *item_len); } break; } /* <- switch( convert[i].special ) */ item[*item_len]='\0'; value[*value_len]='\0'; } else if (convert[i].field_type == ID3FN_URL) { *flags = ITEM_URL; /* TODO: set ape_tag_URL in flag */ /* user url */ if (convert[i].special == APETAG_TYPE_USER) { if ((url = ID3Frame_GetField(frame, ID3FN_URL)) != NULL) { ALOCATE(url, value, *value_len); ID3Field_GetASCII(url, value, *value_len); } if ((desc = ID3Frame_GetField(frame, ID3FN_DESCRIPTION)) != NULL) { ALOCATE(desc, item, *item_len); ID3Field_GetASCII(desc, item, *item_len); } /* normal url */ } else { if ((url = ID3Frame_GetField (frame, ID3FN_URL)) != NULL) { ALOCATE(url, value, *value_len); ID3Field_GetASCII(url, value, *value_len); ALOCATE_ITEM(item, convert[i].APEName, *item_len); strncpy(item, convert[i].APEName, *item_len); } } item[*item_len]='\0'; value[*value_len]='\0'; } else { //convert[i].field_type item = NULL; value = NULL; PRINT_D (">id3v2_read>other\n"); } *item_ = item; *value_ = value; if (!(value==NULL || (*value_len)==0) && value[(*value_len)-1]=='\0') (*value_len)--; return 0; }