core/playlists/system: Move the most played playlist into system.c
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
5ab2e63734
commit
9d3cc2e5ab
|
@ -111,6 +111,7 @@ static bool __validate_library(void *data)
|
|||
return true;
|
||||
queue_remove_all(&c_queue, track);
|
||||
playlist_remove(PL_UNPLAYED, track);
|
||||
playlist_remove(PL_MOST_PLAYED, track);
|
||||
track_remove(track);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ static struct file sys_file = FILE_INIT("playlist.db", 0, 0);
|
|||
static struct queue sys_playlists[SYS_PL_NUM_PLAYLISTS];
|
||||
static bool __sys_pl_remove(enum sys_playlist_t, struct track *);
|
||||
|
||||
|
||||
static enum sys_playlist_t __sys_pl_convert(const gchar *name)
|
||||
{
|
||||
if (string_match(name, "Favorites"))
|
||||
|
@ -17,6 +18,8 @@ static enum sys_playlist_t __sys_pl_convert(const gchar *name)
|
|||
return SYS_PL_HIDDEN;
|
||||
else if (string_match(name, "Unplayed"))
|
||||
return SYS_PL_UNPLAYED;
|
||||
else if (string_match(name, "Most Played"))
|
||||
return SYS_PL_MOST_PLAYED;
|
||||
return SYS_PL_NUM_PLAYLISTS;
|
||||
}
|
||||
|
||||
|
@ -56,17 +59,21 @@ static bool __sys_pl_load()
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool __sys_pl_can_add(enum sys_playlist_t plist, struct track *track)
|
||||
static bool __sys_pl_can_add(enum sys_playlist_t plist, struct track *track,
|
||||
unsigned int average)
|
||||
{
|
||||
if (track->tr_count == 0)
|
||||
return plist == SYS_PL_UNPLAYED;
|
||||
else if (track->tr_count > average)
|
||||
return plist == SYS_PL_MOST_PLAYED;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool __sys_pl_add(enum sys_playlist_t plist, struct track *track)
|
||||
static bool __sys_pl_add(enum sys_playlist_t plist, struct track *track,
|
||||
unsigned int average)
|
||||
{
|
||||
if (plist != SYS_PL_FAVORITES && plist != SYS_PL_HIDDEN) {
|
||||
if (!__sys_pl_can_add(plist, track))
|
||||
if (!__sys_pl_can_add(plist, track, average))
|
||||
return false;
|
||||
if (queue_has(&sys_playlists[SYS_PL_HIDDEN], track))
|
||||
return false;
|
||||
|
@ -78,9 +85,13 @@ static bool __sys_pl_add(enum sys_playlist_t plist, struct track *track)
|
|||
|
||||
switch (plist) {
|
||||
case SYS_PL_HIDDEN:
|
||||
__sys_pl_remove(SYS_PL_UNPLAYED, track);
|
||||
__sys_pl_remove(SYS_PL_UNPLAYED, track);
|
||||
__sys_pl_remove(SYS_PL_MOST_PLAYED, track);
|
||||
case SYS_PL_FAVORITES:
|
||||
__sys_pl_save();
|
||||
break;
|
||||
case SYS_PL_MOST_PLAYED:
|
||||
__sys_pl_remove(SYS_PL_UNPLAYED, track);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -94,7 +105,8 @@ static bool __sys_pl_remove(enum sys_playlist_t plist, struct track *track)
|
|||
|
||||
switch (plist) {
|
||||
case SYS_PL_HIDDEN:
|
||||
__sys_pl_add(SYS_PL_UNPLAYED, track);
|
||||
__sys_pl_add(SYS_PL_UNPLAYED, track, track_db_average_plays());
|
||||
__sys_pl_add(SYS_PL_MOST_PLAYED, track, track_db_average_plays());
|
||||
case SYS_PL_FAVORITES:
|
||||
__sys_pl_save();
|
||||
default:
|
||||
|
@ -105,13 +117,14 @@ static bool __sys_pl_remove(enum sys_playlist_t plist, struct track *track)
|
|||
|
||||
static bool __sys_pl_update(enum sys_playlist_t plist)
|
||||
{
|
||||
unsigned int average = track_db_average_plays();
|
||||
struct db_entry *dbe, *next;
|
||||
|
||||
db_for_each(dbe, next, track_db_get()) {
|
||||
if (TRACK(dbe)->tr_count == 0)
|
||||
__sys_pl_add(SYS_PL_UNPLAYED, TRACK(dbe));
|
||||
if (__sys_pl_can_add(plist, TRACK(dbe), average))
|
||||
__sys_pl_add(plist, TRACK(dbe), average);
|
||||
else
|
||||
__sys_pl_remove(SYS_PL_UNPLAYED, TRACK(dbe));
|
||||
__sys_pl_remove(plist, TRACK(dbe));
|
||||
}
|
||||
|
||||
queue_unset_flag(&sys_playlists[plist], Q_ADD_FRONT);
|
||||
|
@ -132,7 +145,7 @@ static bool pl_system_add_track(const gchar *name, struct track *track)
|
|||
enum sys_playlist_t plist = __sys_pl_convert(name);
|
||||
if (plist == SYS_PL_NUM_PLAYLISTS)
|
||||
return false;
|
||||
return __sys_pl_add(plist, track);
|
||||
return __sys_pl_add(plist, track, track_db_average_plays());
|
||||
}
|
||||
|
||||
static bool pl_system_remove_track(const gchar *name, struct track *track)
|
||||
|
@ -175,6 +188,7 @@ void pl_system_init(struct queue_ops *ops)
|
|||
|
||||
idle_schedule(IDLE_SYNC, __sys_pl_load, NULL);
|
||||
pl_system_update("Unplayed");
|
||||
pl_system_update("Most Played");
|
||||
}
|
||||
|
||||
void pl_system_deinit()
|
||||
|
|
|
@ -10,6 +10,7 @@ enum sys_playlist_t {
|
|||
SYS_PL_FAVORITES, /* Songs that the user likes. */
|
||||
SYS_PL_HIDDEN, /* Songs that the user has hidden. */
|
||||
SYS_PL_UNPLAYED, /* Songs that have not been played yet. */
|
||||
SYS_PL_MOST_PLAYED, /* Songs with an above average play count. */
|
||||
SYS_PL_NUM_PLAYLISTS, /* Number of system playlists. */
|
||||
};
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@ static void test_init()
|
|||
struct library *library;
|
||||
GSList *list;
|
||||
|
||||
idle_init();
|
||||
filter_init();
|
||||
tags_init();
|
||||
playlist_init(NULL);
|
||||
|
@ -27,7 +28,7 @@ static void test_init()
|
|||
test_not_equal((void *)q, NULL);
|
||||
test_equal(queue_has_flag(q, Q_ENABLED), (bool)true);
|
||||
test_equal(queue_has_flag(q, Q_REPEAT), (bool)true);
|
||||
test_equal(queue_has_flag(q, Q_NO_SORT), (bool)true);
|
||||
test_equal(queue_has_flag(q, Q_NO_SORT), (bool)false);
|
||||
test_equal(queue_size(q), 0);
|
||||
|
||||
list = q->q_sort;
|
||||
|
@ -127,9 +128,10 @@ static void test_dynamic()
|
|||
average += TRACK(dbe)->tr_count;
|
||||
}
|
||||
average /= track_db_get()->db_size;
|
||||
playlist_update(PL_UNPLAYED);
|
||||
|
||||
/* Only one unplayed track (tr_track == 1) */
|
||||
playlist_update(PL_UNPLAYED);
|
||||
while (idle_run_task()) {}
|
||||
q = playlist_get_queue(PL_UNPLAYED);
|
||||
test_equal(playlist_add(PL_UNPLAYED, track_get(1)), (bool)false);
|
||||
test_equal(playlist_remove(PL_UNPLAYED, queue_at(q, 0)), (bool)true);
|
||||
|
@ -152,17 +154,19 @@ static void test_dynamic()
|
|||
} test_loop_passed();
|
||||
|
||||
/* Six tracks have tr_count > average */
|
||||
playlist_update(PL_MOST_PLAYED);
|
||||
while (idle_run_task()) {}
|
||||
q = playlist_get_queue(PL_MOST_PLAYED);
|
||||
playlist_select(PL_MOST_PLAYED);
|
||||
test_equal(playlist_add(PL_MOST_PLAYED, track_get(0)), (bool)false);
|
||||
test_equal(queue_size(q), 6);
|
||||
for (i = 0; i < queue_size(q); i++) {
|
||||
/*for (i = 0; i < queue_size(q); i++) {
|
||||
track = queue_at(q, i);
|
||||
test_loop_equal(track->tr_track, i + 8, i);
|
||||
test_loop_equal(track->tr_count, i + 7, i);
|
||||
test_loop_equal(playlist_remove(PL_MOST_PLAYED, track),
|
||||
(bool)false, i);
|
||||
} test_loop_passed();
|
||||
} test_loop_passed();*/
|
||||
}
|
||||
|
||||
static void test_deinit()
|
||||
|
|
|
@ -132,6 +132,44 @@ static void test_unplayed()
|
|||
__test_playlist_reinit(queue, 1, false, true);
|
||||
__test_playlist_update("Unplayed", queue, 1, false, true);
|
||||
__test_playlist_unhide_track("Unplayed", queue, 2, true, true);
|
||||
}
|
||||
|
||||
static void test_most_played()
|
||||
{
|
||||
struct queue *most = pl_system.pl_get_queue("Most Played");
|
||||
|
||||
/* Set average = (4 / 2) = 2 */
|
||||
track_played(track_get(0));
|
||||
track_played(track_get(1));
|
||||
track_played(track_get(1));
|
||||
track_played(track_get(1));
|
||||
|
||||
pl_system_deinit();
|
||||
pl_system_init(NULL);
|
||||
|
||||
test_not_equal((void *)most, NULL);
|
||||
test_equal(queue_has_flag(most, Q_ADD_FRONT), (bool)true);
|
||||
|
||||
__test_playlist_reinit(most, 1, false, true);
|
||||
|
||||
test_equal(pl_system.pl_remove_track("Most Played", track_get(0)), (bool)false);
|
||||
test_equal(pl_system.pl_remove_track("Most Played", track_get(1)), (bool)true);
|
||||
test_equal(pl_system.pl_remove_track("Most Played", track_get(1)), (bool)false);
|
||||
__test_playlist_state(most, 0, false, false);
|
||||
|
||||
test_equal(pl_system.pl_add_track("Most Played", track_get(0)), (bool)false);
|
||||
test_equal(pl_system.pl_add_track("Most Played", track_get(1)), (bool)true);
|
||||
test_equal(pl_system.pl_add_track("Most Played", track_get(1)), (bool)false);
|
||||
__test_playlist_state(most, 1, false, true);
|
||||
|
||||
track_get(0)->tr_count = 3;
|
||||
track_get(1)->tr_count = 1;
|
||||
__test_playlist_update("Most Played", most, 1, true, false);
|
||||
|
||||
__test_playlist_hide_track("Most Played", most, 0, false, false);
|
||||
__test_playlist_reinit(most, 0, false, false);
|
||||
__test_playlist_update("Most Played", most, 0, false, false);
|
||||
__test_playlist_unhide_track("Most Played", most, 1, true, false);
|
||||
|
||||
pl_system_deinit();
|
||||
}
|
||||
|
@ -141,4 +179,5 @@ DECLARE_UNIT_TESTS(
|
|||
UNIT_TEST("Favorites Playlist", test_favorites),
|
||||
UNIT_TEST("Hidden Playlist", test_hidden),
|
||||
UNIT_TEST("Unplayed Tracks Playlist", test_unplayed),
|
||||
UNIT_TEST("Most Played Tracks Playlist", test_most_played),
|
||||
);
|
||||
|
|
Loading…
Reference in New Issue