From b9593e9a8095767cc102ece7197497a0197c1a5d Mon Sep 17 00:00:00 2001 From: Eric Wollesen Date: Mon, 25 Aug 2008 18:06:34 -0600 Subject: [PATCH] Adds FLAC md5sum FLAC files will have their md5sum (which is not a normal vorbis comment) made available via metadata to MPD clients. --- configure.ac | 14 ++++++++++++++ src/song.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/song.h | 7 +++++++ src/tag.c | 27 +++++++++++++++++++++++++++ src/tag.h | 3 +++ 5 files changed, 94 insertions(+), 0 deletions(-) diff --git a/configure.ac b/configure.ac index 6067bc4..734e249 100644 --- a/configure.ac +++ b/configure.ac @@ -84,6 +84,7 @@ AC_ARG_ENABLE(mvp,[ --enable-mvp enable support for Hauppauge Media AC_ARG_ENABLE(oggvorbis,[ --disable-oggvorbis disable Ogg Vorbis support (default: enable)],[enable_oggvorbis=$enableval],enable_oggvorbis=yes) AC_ARG_ENABLE(oggflac,[ --disable-oggflac disable OggFLAC support (default: enable)],[enable_oggflac=$enableval],enable_oggflac=yes) AC_ARG_ENABLE(flac,[ --disable-flac disable flac support (default: enable)],[enable_flac=$enableval],[enable_flac=yes]) +AC_ARG_ENABLE(enable_md5sum,[ --enable-md5sum enable flac md5sum reporting support (default: disable)],[disable_md5sum=$enableval],[disable_md5sum=yes]) AC_ARG_ENABLE(mp3,[ --disable-mp3 disable mp3 support (default: enable)],[enable_mp3=$enableval],[enable_mp3=yes]) AC_ARG_ENABLE(aac,[ --disable-aac disable AAC support (default: enable)],[enable_aac=$enableval],[enable_aac=yes]) AC_ARG_ENABLE(audiofile,[ --disable-audiofile disable audiofile support, disables wave support (default: enable)],[enable_audiofile=$enableval],[enable_audiofile=yes]) @@ -557,6 +558,14 @@ if test x$enable_flac = xyes; then AM_PATH_LIBFLAC(MPD_LIBS="$MPD_LIBS $LIBFLAC_LIBS" MPD_CFLAGS="$MPD_CFLAGS $LIBFLAC_CFLAGS",enable_flac=no) fi +if test x$enable_md5sum = xyes; then + if test x$enable_flac = xno; then + AC_MSG_WARN([disabling md5sum support because it requires FLAC]) + enable_md5sum=no + else + AC_DEFINE(USE_MD5SUM,1,[Define for FLAC md5sum support]) + fi +fi if test x$enable_flac = xyes; then oldcflags="$CFLAGS" @@ -784,6 +793,11 @@ fi if test x$enable_flac = xyes; then echo " FLAC support ..................enabled" + if test x$enable_md5sum = xyes; then + echo " using md5sum ................yes" + else + echo " using md5sum ................no" + fi else echo " FLAC support ..................disabled" fi diff --git a/src/song.c b/src/song.c index a8ab428..2b57bbf 100644 --- a/src/song.c +++ b/src/song.c @@ -268,6 +268,12 @@ void readSongInfoIntoList(FILE * fp, SongList * list, Directory * parentDir) song->tag->time = atoi(&(buffer[strlen(SONG_TIME)])); } else if (0 == strncmp(SONG_MTIME, buffer, strlen(SONG_MTIME))) { song->mtime = atoi(&(buffer[strlen(SONG_MTIME)])); + } else if (0 == strncmp(SONG_MD5SUM, buffer, + strlen(SONG_MD5SUM))) { + if (parse_md5(&(buffer[strlen(SONG_MD5SUM)]), + song->tag->md5sum)) { + ERROR("error parsing FLAC md5sum"); + } } else FATAL("songinfo: unknown line in db: %s\n", buffer); @@ -283,6 +289,43 @@ void readSongInfoIntoList(FILE * fp, SongList * list, Directory * parentDir) } } +#ifdef USE_MD5SUM +/* stolen from flac-1.1.1, metaflac, options.c */ +int parse_md5(const char *src, unsigned char dest[16]) { + unsigned i, d; + int c; + + if(strlen(src) != 32) + return -1; + /* strtoul() accepts negative numbers which we do not want, so + we do it the hard way */ + for(i = 0; i < 16; i++) { + c = (int)(*src++); + if(isdigit(c)) + d = (unsigned)(c - '0'); + else if(c >= 'a' && c <= 'f') + d = (unsigned)(c - 'a') + 10u; + else if(c >= 'A' && c <= 'F') + d = (unsigned)(c - 'A') + 10u; + else + return -1; + d <<= 4; + c = (int)(*src++); + if(isdigit(c)) + d |= (unsigned)(c - '0'); + else if(c >= 'a' && c <= 'f') + d |= (unsigned)(c - 'a') + 10u; + else if(c >= 'A' && c <= 'F') + d |= (unsigned)(c - 'A') + 10u; + else + return -1; + dest[i] = (unsigned char)d; + } + return 0; +} +#endif + + int updateSongInfo(Song * song) { if (song->type == SONG_TYPE_FILE) { diff --git a/src/song.h b/src/song.h index 8e2de41..33c119a 100644 --- a/src/song.h +++ b/src/song.h @@ -32,6 +32,9 @@ #define SONG_FILE "file: " #define SONG_TIME "Time: " +#ifdef USE_MD5SUM +#define SONG_MD5SUM "md5sum: " +#endif typedef struct _Song { char *url; @@ -79,4 +82,8 @@ void printSongUrl(int fd, Song * song); */ char *get_song_url(char *path_max_tmp, Song * song); +#ifdef USE_MD5SUM +int parse_md5(const char *src, unsigned char dest[16]); +#endif + #endif diff --git a/src/tag.c b/src/tag.c index 5023a58..00e4888 100644 --- a/src/tag.c +++ b/src/tag.c @@ -122,6 +122,16 @@ void printMpdTag(int fd, MpdTag * tag) if (tag->time >= 0) fdprintf(fd, SONG_TIME "%i\n", tag->time); +#ifdef USE_MD5SUM + if (tag->md5sum) { + fdprintf(fd, SONG_MD5SUM); + for (i = 0; i < 16; i++) + fdprintf(fd, "%02x", + (unsigned char)tag->md5sum[i]); + fdprintf(fd, "\n"); + } +#endif + for (i = 0; i < tag->numOfItems; i++) { fdprintf(fd, "%s: %s\n", mpdTagItemKeys[tag->items[i].type], tag->items[i].value); @@ -580,6 +590,9 @@ MpdTag *newMpdTag(void) MpdTag *ret = xmalloc(sizeof(MpdTag)); ret->items = NULL; ret->time = -1; +#ifdef USE_MD5SUM + ret->md5sum[0] = '\0'; +#endif ret->numOfItems = 0; return ret; } @@ -635,6 +648,10 @@ static void clearMpdTag(MpdTag * tag) tag->numOfItems = 0; tag->time = -1; + +#ifdef USE_MD5SUM + tag->md5sum[0] = '\0'; +#endif } void freeMpdTag(MpdTag * tag) @@ -654,6 +671,11 @@ MpdTag *mpdTagDup(MpdTag * tag) ret = newMpdTag(); ret->time = tag->time; +#ifdef USE_MD5SUM + if (tag->md5sum) + memcpy(ret->md5sum, tag->md5sum, 16); +#endif + for (i = 0; i < tag->numOfItems; i++) { addItemToMpdTag(ret, tag->items[i].type, tag->items[i].value); } @@ -673,6 +695,11 @@ int mpdTagsAreEqual(MpdTag * tag1, MpdTag * tag2) if (tag1->time != tag2->time) return 0; +#if USE_MD5SUM + if (memcmp(tag1->md5sum, tag2->md5sum, 16) != 0) + return 0; +#endif + if (tag1->numOfItems != tag2->numOfItems) return 0; diff --git a/src/tag.h b/src/tag.h index 363ad98..e3e9f7f 100644 --- a/src/tag.h +++ b/src/tag.h @@ -50,6 +50,9 @@ typedef struct _MpdTagItem { typedef struct _MpdTag { int time; +#ifdef USE_MD5SUM + unsigned char md5sum[16]; +#endif MpdTagItem *items; mpd_uint8 numOfItems; } MpdTag; -- 1.5.4.3