diff options
-rw-r--r-- | lib/rbcodec/metadata/flac.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/rbcodec/metadata/flac.c b/lib/rbcodec/metadata/flac.c index a8be4c6de4..df25bb9b4d 100644 --- a/lib/rbcodec/metadata/flac.c +++ b/lib/rbcodec/metadata/flac.c @@ -113,6 +113,56 @@ bool get_flac_metadata(int fd, struct mp3entry* id3) return rc; } } +#ifdef HAVE_ALBUMART + else if (type == 6) /* 6 is the PICTURE block */ + { + if(!id3->has_embedded_albumart) /* only use the first PICTURE */ + { + unsigned int buf_size = MIN(sizeof(id3->path), i); + int picframe_pos = 4; /* skip picture type */ + int mime_length, description_length; + + id3->albumart.pos = lseek(fd, 0, SEEK_CUR); + + int bytes_read = read(fd, buf, buf_size); + i -= bytes_read; + + mime_length = get_long_be(&buf[picframe_pos]); + + char *mime = buf + picframe_pos + 4; + picframe_pos += 4 + mime_length; + + id3->albumart.type = AA_TYPE_UNKNOWN; + if (memcmp(mime, "image/", 6) == 0) + { + mime += 6; + if (strcmp(mime, "jpeg") == 0 || strcmp(mime, "jpg") == 0){ + id3->albumart.type = AA_TYPE_JPG; + }else if (strcmp(mime, "png") == 0) + id3->albumart.type = AA_TYPE_PNG; + } + + description_length = get_long_be(&buf[picframe_pos]); + + /* 16 = skip picture width,height,color-depth,color-used */ + picframe_pos += 4 + description_length + 16; + + /* if we support the format and image length is in the buffer */ + if(id3->albumart.type != AA_TYPE_UNKNOWN + && (picframe_pos + 4) - buf_size > 0) + { + id3->has_embedded_albumart = true; + id3->albumart.size = get_long_be(&buf[picframe_pos]); + id3->albumart.pos += picframe_pos + 4; + } + } + + if (lseek(fd, i, SEEK_CUR) < 0) + { + return rc; + } + } +#endif else if (!last_metadata) { /* Skip to next metadata block */ |