Index: apps/screens.c =================================================================== --- apps/screens.c (revision 17907) +++ apps/screens.c (working copy) @@ -713,6 +713,7 @@ LANG_ID3_PLAYLIST, LANG_ID3_BITRATE, LANG_ID3_FREQUENCY, + LANG_ID3_MBTID, #if CONFIG_CODEC == SWCODEC LANG_ID3_TRACK_GAIN, LANG_ID3_ALBUM_GAIN, @@ -801,16 +802,19 @@ snprintf(buffer, buffer_len, "%ld Hz", id3->frequency); info=buffer; break; + case 14:/*LANG_ID3_MBTID*/ + info=id3->mb_track_id; + break; #if CONFIG_CODEC == SWCODEC - case 14:/*LANG_ID3_TRACK_GAIN*/ + case 15:/*LANG_ID3_TRACK_GAIN*/ info=id3->track_gain_string; break; - case 15:/*LANG_ID3_ALBUM_GAIN*/ + case 16:/*LANG_ID3_ALBUM_GAIN*/ info=id3->album_gain_string; break; - case 16:/*LANG_ID3_PATH*/ + case 17:/*LANG_ID3_PATH*/ #else - case 14:/*LANG_ID3_PATH*/ + case 15:/*LANG_ID3_PATH*/ #endif info=id3->path; break; Index: apps/metadata/mp4.c =================================================================== --- apps/metadata/mp4.c (revision 17907) +++ apps/metadata/mp4.c (working copy) @@ -498,6 +498,11 @@ DEBUGF("AAC: lead_trim %d, tail_trim %d\n", id3->lead_trim, id3->tail_trim); } + else if (strcasecmp(tag_name, "MusicBrainz Track Id") == 0) + { + read_mp4_tag_string(fd, size, &buffer, &buffer_left, + &id3->mb_track_id); + } else { char* any; Index: apps/metadata/asf.c =================================================================== --- apps/metadata/asf.c (revision 17907) +++ apps/metadata/asf.c (working copy) @@ -465,6 +465,9 @@ id3buf = value; id3buf_remaining = buf_len; } + } else if (!strcmp("MusicBrainz/Track Id", utf8buf)) { + id3->mb_track_id = id3buf; + asf_utf16LEdecode(fd, length, &id3buf, &id3buf_remaining); } else { lseek(fd, length, SEEK_CUR); } Index: apps/metadata/metadata_common.c =================================================================== --- apps/metadata/metadata_common.c (revision 17907) +++ apps/metadata/metadata_common.c (working copy) @@ -293,6 +293,11 @@ { p = &(id3->grouping); } + else if (strcasecmp(name, "Musicbrainz_trackid") == 0 + || strcasecmp(name, "http://musicbrainz.org") == 0 ) + { + p = &(id3->mb_track_id); + } else { len = parse_replaygain(name, value, id3, buf, buf_remaining); Index: apps/lang/english.lang =================================================================== --- apps/lang/english.lang (revision 17907) +++ apps/lang/english.lang (working copy) @@ -11806,3 +11806,17 @@ *: "Fast" + + id: LANG_ID3_MBTID + desc: in tag viewer + user: + + *: "[MB Track ID]" + + + *: "[MB Track ID]" + + + *: "" + + Index: apps/scrobbler.c =================================================================== --- apps/scrobbler.c (revision 17907) +++ apps/scrobbler.c (working copy) @@ -42,7 +42,7 @@ #include "scrobbler.h" -#define SCROBBLER_VERSION "1.0" +#define SCROBBLER_VERSION "1.1" #if CONFIG_RTC #define SCROBBLER_FILE "/.scrobbler.log" @@ -151,24 +151,26 @@ { ret = snprintf(scrobbler_cache+(SCROBBLER_CACHE_LEN*cache_pos), SCROBBLER_CACHE_LEN, - "%s\t%s\t%s\t%d\t%d\t%c\t%ld\n", + "%s\t%s\t%s\t%d\t%d\t%c\t%ld\t%s\n", scrobbler_entry.artist, scrobbler_entry.album?scrobbler_entry.album:"", scrobbler_entry.title, scrobbler_entry.tracknum, (int)scrobbler_entry.length/1000, rating, - (long)timestamp); + (long)timestamp, + scrobbler_entry.mb_track_id); } else { ret = snprintf(scrobbler_cache+(SCROBBLER_CACHE_LEN*cache_pos), SCROBBLER_CACHE_LEN, - "%s\t%s\t%s\t\t%d\t%c\t%ld\n", + "%s\t%s\t%s\t\t%d\t%c\t%ld\t%s\n", scrobbler_entry.artist, scrobbler_entry.album?scrobbler_entry.album:"", scrobbler_entry.title, (int)scrobbler_entry.length/1000, rating, - (long)timestamp); + (long)timestamp, + scrobbler_entry.mb_track_id); } if ( ret >= SCROBBLER_CACHE_LEN ) Index: firmware/export/id3.h =================================================================== --- firmware/export/id3.h (revision 17907) +++ firmware/export/id3.h (working copy) @@ -222,6 +222,9 @@ /* Cuesheet support */ int cuesheet_type; /* 0: none, 1: external, 2: embedded */ + + /* Musicbrainz Track ID */ + char* mb_track_id; }; enum { Index: firmware/id3.c =================================================================== --- firmware/id3.c (revision 17907) +++ firmware/id3.c (working copy) @@ -483,6 +483,34 @@ } #endif +static int parsembtid( struct mp3entry* entry, char* tag, int bufferpos ) +{ + + char* value = NULL; + int desc_len = strlen(tag); + /*DEBUGF("MBID len: %d\n", desc_len);*/ + int value_len = 0; + + if ((tag - entry->id3v2buf + desc_len + 2) < bufferpos) + { + value = tag + desc_len + 1; + + if (strcasecmp(tag, "http://musicbrainz.org") == 0) + { + /* Musicbrainz track IDs are always 36 chars long */ + value_len = 36; + + entry->mb_track_id = value; + + /*DEBUGF("ENTRY: %s LEN: %d\n", entry->mb_track_id, strlen(entry->mb_track_id));*/ + + value_len++; + } + } + + return tag - entry->id3v2buf + value_len; +} + static const struct tag_resolver taglist[] = { { "TPE1", 4, offsetof(struct mp3entry, artist), NULL, false }, { "TP1", 3, offsetof(struct mp3entry, artist), NULL, false }, @@ -508,6 +536,7 @@ { "TXXX", 4, 0, &parseuser, false }, { "RVA2", 4, 0, &parserva2, true }, #endif + { "UFID", 4, 0, &parsembtid, false }, }; #define TAGLIST_SIZE ((int)(sizeof(taglist) / sizeof(taglist[0]))) @@ -1263,6 +1292,8 @@ if (entry->album_gain_string) entry->album_gain_string += offset; #endif + if (entry->mb_track_id) + entry->mb_track_id += offset; } void copy_mp3entry(struct mp3entry *dest, const struct mp3entry *orig)