summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2022-04-02 08:00:31 -0400
committerWilliam Wilgus <wilgus.william@gmail.com>2022-04-02 08:05:37 -0400
commitbf3e67204c6ceb26acba33df529d3d986e736d6c (patch)
tree8adafd9ddec3a3ce62039ef361bd598da244c3aa
parent43abe2d820d6725a9e8a248233539a6ffdc2d712 (diff)
downloadrockbox-bootloader_fiiom3k_v3.tar.gz
rockbox-bootloader_fiiom3k_v3.zip
lastfm_scrobbler check for back to back repeat entriesbootloader_shanlingq1_v2bootloader_fiiom3k_v3
if you skip a track after the halfway point the scrobbler may double post with slightly different timestamps but the same track info take a crc of the non-unique part and check against the previously written track Change-Id: I676342c4cd76f632131d9cb6d9f7d2f59df357e6
-rw-r--r--apps/plugins/lastfm_scrobbler.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/apps/plugins/lastfm_scrobbler.c b/apps/plugins/lastfm_scrobbler.c
index 7f424d8aca..4d4940945d 100644
--- a/apps/plugins/lastfm_scrobbler.c
+++ b/apps/plugins/lastfm_scrobbler.c
@@ -27,6 +27,10 @@ http://www.audioscrobbler.net/wiki/Portable_Player_Logging
27 27
28#include "plugin.h" 28#include "plugin.h"
29 29
30#ifndef UNTAGGED
31 #define UNTAGGED "<UNTAGGED>"
32#endif
33
30#ifdef ROCKBOX_HAS_LOGF 34#ifdef ROCKBOX_HAS_LOGF
31#define logf rb->logf 35#define logf rb->logf
32#else 36#else
@@ -324,6 +328,9 @@ static inline char* str_chk_valid(char *s, char *alt)
324 328
325static void scrobbler_add_to_cache(const struct mp3entry *id) 329static void scrobbler_add_to_cache(const struct mp3entry *id)
326{ 330{
331 static uint32_t last_crc = 0;
332 int trk_info_len = 0;
333
327 if ( gCache.pos >= SCROBBLER_MAX_CACHE ) 334 if ( gCache.pos >= SCROBBLER_MAX_CACHE )
328 scrobbler_write_cache(); 335 scrobbler_write_cache();
329 336
@@ -344,13 +351,14 @@ static void scrobbler_add_to_cache(const struct mp3entry *id)
344 351
345 int ret = rb->snprintf(&scrobbler_buf[(SCROBBLER_CACHE_LEN*gCache.pos)], 352 int ret = rb->snprintf(&scrobbler_buf[(SCROBBLER_CACHE_LEN*gCache.pos)],
346 SCROBBLER_CACHE_LEN, 353 SCROBBLER_CACHE_LEN,
347 "%s\t%s\t%s\t%s\t%d\t%c\t%ld\t%s\n", 354 "%s\t%s\t%s\t%s\t%d\t%c%n\t%ld\t%s\n",
348 str_chk_valid(artist, UNTAGGED), 355 str_chk_valid(artist, UNTAGGED),
349 str_chk_valid(id->album, ""), 356 str_chk_valid(id->album, ""),
350 str_chk_valid(id->title, ""), 357 str_chk_valid(id->title, ""),
351 tracknum, 358 tracknum,
352 (int)(id->length / 1000), 359 (int)(id->length / 1000),
353 rating, 360 rating,
361 &trk_info_len,
354 get_timestamp(), 362 get_timestamp(),
355 str_chk_valid(id->mb_track_id, "")); 363 str_chk_valid(id->mb_track_id, ""));
356 364
@@ -361,11 +369,19 @@ static void scrobbler_add_to_cache(const struct mp3entry *id)
361 } 369 }
362 else 370 else
363 { 371 {
364 logf("Added %s", scrobbler_buf); 372 uint32_t crc = rb->crc_32(&scrobbler_buf[(SCROBBLER_CACHE_LEN*gCache.pos)],
365 gCache.pos++; 373 trk_info_len, 0xFFFFFFFF);
374 if (crc != last_crc)
375 {
376 last_crc = crc;
377 logf("Added %s", scrobbler_buf);
378 gCache.pos++;
366#if USING_STORAGE_CALLBACK 379#if USING_STORAGE_CALLBACK
367 rb->register_storage_idle_func(scrobbler_flush_callback); 380 rb->register_storage_idle_func(scrobbler_flush_callback);
368#endif 381#endif
382 }
383 else
384 logf("SCROBBLER: skipping repeat entry: %s", id->path);
369 } 385 }
370 386
371} 387}