summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Keevil <rkeevil+rockbox@gmail.com>2008-10-07 18:39:44 +0000
committerRobert Keevil <rkeevil+rockbox@gmail.com>2008-10-07 18:39:44 +0000
commit2c170356f38f5630b9fefdc5b1e7e57babb5cc40 (patch)
tree9ba565416427f76e6cf4754ef199ed02f804edf6
parent7eb194477a19a12d76bceb64108ffad2da784c9f (diff)
downloadrockbox-2c170356f38f5630b9fefdc5b1e7e57babb5cc40.tar.gz
rockbox-2c170356f38f5630b9fefdc5b1e7e57babb5cc40.zip
FS#9139 - support for ver 1.1 scrobbler log files. Upload any old files first - uploading software may need updating, see the LastFMLog wiki page
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18732 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/metadata/asf.c3
-rw-r--r--apps/metadata/metadata_common.c5
-rw-r--r--apps/metadata/mp4.c5
-rw-r--r--apps/scrobbler.c14
-rw-r--r--firmware/export/id3.h3
-rw-r--r--firmware/id3.c28
6 files changed, 52 insertions, 6 deletions
diff --git a/apps/metadata/asf.c b/apps/metadata/asf.c
index fa1308b560..255a0bcba4 100644
--- a/apps/metadata/asf.c
+++ b/apps/metadata/asf.c
@@ -465,6 +465,9 @@ static int asf_parse_header(int fd, struct mp3entry* id3,
465 id3buf = value; 465 id3buf = value;
466 id3buf_remaining = buf_len; 466 id3buf_remaining = buf_len;
467 } 467 }
468 } else if (!strcmp("MusicBrainz/Track Id", utf8buf)) {
469 id3->mb_track_id = id3buf;
470 asf_utf16LEdecode(fd, length, &id3buf, &id3buf_remaining);
468 } else { 471 } else {
469 lseek(fd, length, SEEK_CUR); 472 lseek(fd, length, SEEK_CUR);
470 } 473 }
diff --git a/apps/metadata/metadata_common.c b/apps/metadata/metadata_common.c
index 1fff030e57..e4df874cff 100644
--- a/apps/metadata/metadata_common.c
+++ b/apps/metadata/metadata_common.c
@@ -293,6 +293,11 @@ long parse_tag(const char* name, char* value, struct mp3entry* id3,
293 { 293 {
294 p = &(id3->grouping); 294 p = &(id3->grouping);
295 } 295 }
296 else if (strcasecmp(name, "musicbrainz_trackid") == 0
297 || strcasecmp(name, "http://musicbrainz.org") == 0 )
298 {
299 p = &(id3->mb_track_id);
300 }
296 else 301 else
297 { 302 {
298 len = parse_replaygain(name, value, id3, buf, buf_remaining); 303 len = parse_replaygain(name, value, id3, buf, buf_remaining);
diff --git a/apps/metadata/mp4.c b/apps/metadata/mp4.c
index 187459b7fb..493bc48da7 100644
--- a/apps/metadata/mp4.c
+++ b/apps/metadata/mp4.c
@@ -498,6 +498,11 @@ static bool read_mp4_tags(int fd, struct mp3entry* id3,
498 DEBUGF("AAC: lead_trim %d, tail_trim %d\n", 498 DEBUGF("AAC: lead_trim %d, tail_trim %d\n",
499 id3->lead_trim, id3->tail_trim); 499 id3->lead_trim, id3->tail_trim);
500 } 500 }
501 else if (strcasecmp(tag_name, "musicbrainz track id") == 0)
502 {
503 read_mp4_tag_string(fd, size, &buffer, &buffer_left,
504 &id3->mb_track_id);
505 }
501 else 506 else
502 { 507 {
503 char* any; 508 char* any;
diff --git a/apps/scrobbler.c b/apps/scrobbler.c
index 7af45a0c8f..3b35e0d66a 100644
--- a/apps/scrobbler.c
+++ b/apps/scrobbler.c
@@ -7,7 +7,7 @@
7 * \/ \/ \/ \/ \/ 7 * \/ \/ \/ \/ \/
8 * $Id$ 8 * $Id$
9 * 9 *
10 * Copyright (C) 2006 Robert Keevil 10 * Copyright (C) 2006-2008 Robert Keevil
11 * 11 *
12 * This program is free software; you can redistribute it and/or 12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License 13 * modify it under the terms of the GNU General Public License
@@ -42,7 +42,7 @@ http://www.audioscrobbler.net/wiki/Portable_Player_Logging
42 42
43#include "scrobbler.h" 43#include "scrobbler.h"
44 44
45#define SCROBBLER_VERSION "1.0" 45#define SCROBBLER_VERSION "1.1"
46 46
47#if CONFIG_RTC 47#if CONFIG_RTC
48#define SCROBBLER_FILE "/.scrobbler.log" 48#define SCROBBLER_FILE "/.scrobbler.log"
@@ -151,24 +151,26 @@ static void add_to_cache(unsigned long play_length)
151 { 151 {
152 ret = snprintf(scrobbler_cache+(SCROBBLER_CACHE_LEN*cache_pos), 152 ret = snprintf(scrobbler_cache+(SCROBBLER_CACHE_LEN*cache_pos),
153 SCROBBLER_CACHE_LEN, 153 SCROBBLER_CACHE_LEN,
154 "%s\t%s\t%s\t%d\t%d\t%c\t%ld\n", 154 "%s\t%s\t%s\t%d\t%d\t%c\t%ld\t%s\n",
155 scrobbler_entry.artist, 155 scrobbler_entry.artist,
156 scrobbler_entry.album?scrobbler_entry.album:"", 156 scrobbler_entry.album?scrobbler_entry.album:"",
157 scrobbler_entry.title, 157 scrobbler_entry.title,
158 scrobbler_entry.tracknum, 158 scrobbler_entry.tracknum,
159 (int)scrobbler_entry.length/1000, 159 (int)scrobbler_entry.length/1000,
160 rating, 160 rating,
161 (long)timestamp); 161 (long)timestamp,
162 scrobbler_entry.mb_track_id?scrobbler_entry.mb_track_id:"");
162 } else { 163 } else {
163 ret = snprintf(scrobbler_cache+(SCROBBLER_CACHE_LEN*cache_pos), 164 ret = snprintf(scrobbler_cache+(SCROBBLER_CACHE_LEN*cache_pos),
164 SCROBBLER_CACHE_LEN, 165 SCROBBLER_CACHE_LEN,
165 "%s\t%s\t%s\t\t%d\t%c\t%ld\n", 166 "%s\t%s\t%s\t\t%d\t%c\t%ld\t%s\n",
166 scrobbler_entry.artist, 167 scrobbler_entry.artist,
167 scrobbler_entry.album?scrobbler_entry.album:"", 168 scrobbler_entry.album?scrobbler_entry.album:"",
168 scrobbler_entry.title, 169 scrobbler_entry.title,
169 (int)scrobbler_entry.length/1000, 170 (int)scrobbler_entry.length/1000,
170 rating, 171 rating,
171 (long)timestamp); 172 (long)timestamp,
173 scrobbler_entry.mb_track_id?scrobbler_entry.mb_track_id:"");
172 } 174 }
173 175
174 if ( ret >= SCROBBLER_CACHE_LEN ) 176 if ( ret >= SCROBBLER_CACHE_LEN )
diff --git a/firmware/export/id3.h b/firmware/export/id3.h
index 3e4db0674f..da2faf1b12 100644
--- a/firmware/export/id3.h
+++ b/firmware/export/id3.h
@@ -223,6 +223,9 @@ struct mp3entry {
223 223
224 /* Cuesheet support */ 224 /* Cuesheet support */
225 int cuesheet_type; /* 0: none, 1: external, 2: embedded */ 225 int cuesheet_type; /* 0: none, 1: external, 2: embedded */
226
227 /* Musicbrainz Track ID */
228 char* mb_track_id;
226}; 229};
227 230
228enum { 231enum {
diff --git a/firmware/id3.c b/firmware/id3.c
index 3b7d165597..c1541e30df 100644
--- a/firmware/id3.c
+++ b/firmware/id3.c
@@ -486,6 +486,31 @@ static int parserva2( struct mp3entry* entry, char* tag, int bufferpos )
486} 486}
487#endif 487#endif
488 488
489static int parsembtid( struct mp3entry* entry, char* tag, int bufferpos )
490{
491 char* value = NULL;
492 int desc_len = strlen(tag);
493 /*DEBUGF("MBID len: %d\n", desc_len);*/
494 int value_len = 0;
495
496 if ((tag - entry->id3v2buf + desc_len + 2) < bufferpos)
497 {
498 value = tag + desc_len + 1;
499
500 if (strcasecmp(tag, "http://musicbrainz.org") == 0)
501 {
502 /* Musicbrainz track IDs are always 36 chars long plus null */
503 value_len = 37;
504
505 entry->mb_track_id = value;
506
507 /*DEBUGF("ENTRY: %s LEN: %d\n", entry->mb_track_id, strlen(entry->mb_track_id));*/
508 }
509 }
510
511 return tag - entry->id3v2buf + value_len;
512}
513
489static const struct tag_resolver taglist[] = { 514static const struct tag_resolver taglist[] = {
490 { "TPE1", 4, offsetof(struct mp3entry, artist), NULL, false }, 515 { "TPE1", 4, offsetof(struct mp3entry, artist), NULL, false },
491 { "TP1", 3, offsetof(struct mp3entry, artist), NULL, false }, 516 { "TP1", 3, offsetof(struct mp3entry, artist), NULL, false },
@@ -511,6 +536,7 @@ static const struct tag_resolver taglist[] = {
511 { "TXXX", 4, 0, &parseuser, false }, 536 { "TXXX", 4, 0, &parseuser, false },
512 { "RVA2", 4, 0, &parserva2, true }, 537 { "RVA2", 4, 0, &parserva2, true },
513#endif 538#endif
539 { "UFID", 4, 0, &parsembtid, false },
514}; 540};
515 541
516#define TAGLIST_SIZE ((int)(sizeof(taglist) / sizeof(taglist[0]))) 542#define TAGLIST_SIZE ((int)(sizeof(taglist) / sizeof(taglist[0])))
@@ -1261,6 +1287,8 @@ void adjust_mp3entry(struct mp3entry *entry, void *dest, const void *orig)
1261 if (entry->album_gain_string) 1287 if (entry->album_gain_string)
1262 entry->album_gain_string += offset; 1288 entry->album_gain_string += offset;
1263#endif 1289#endif
1290 if (entry->mb_track_id)
1291 entry->mb_track_id += offset;
1264} 1292}
1265 1293
1266void copy_mp3entry(struct mp3entry *dest, const struct mp3entry *orig) 1294void copy_mp3entry(struct mp3entry *dest, const struct mp3entry *orig)