merge changes from metadata-rewrite branch
git-svn-id: https://svn.musicpd.org/mpd/trunk@2589 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
@@ -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;
|
||||
ret = copyVorbisCommentBlockToMpdTag(block, ret);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
if(ret) *vorbisCommentFound = 1;
|
||||
}
|
||||
else if(block->type == FLAC__METADATA_TYPE_STREAMINFO) {
|
||||
if(!ret) ret = newMpdTag();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user