core/playlists/generic: Add a playlist_generic_update() function

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2016-06-10 11:01:03 -04:00 committed by Anna Schumaker
parent dddb098354
commit 019137e4ed
4 changed files with 82 additions and 35 deletions

View File

@ -1,6 +1,7 @@
/*
* Copyright 2016 (c) Anna Schumaker.
*/
#include <core/idle.h>
#include <core/playlists/type.h>
@ -43,6 +44,41 @@ bool playlist_generic_remove_track(struct playlist *playlist, struct track *trac
return queue_remove_all(&playlist->pl_queue, track);
}
struct pl_update_data {
struct playlist *pud_playlist;
bool (*pud_func)(struct playlist *, struct track *);
};
static bool __playlist_generic_update(void *data)
{
struct pl_update_data *pud = data;
struct db_entry *dbe, *next;
db_for_each(dbe, next, track_db_get()) {
if (!pud->pud_func(pud->pud_playlist, TRACK(dbe)))
playlist_generic_remove_track(pud->pud_playlist, TRACK(dbe));
}
queue_unset_flag(&pud->pud_playlist->pl_queue, Q_ADD_FRONT);
g_free(pud);
return true;
}
void playlist_generic_update(struct playlist *playlist,
bool (*func)(struct playlist *, struct track *))
{
struct pl_update_data *data;
if (!func)
return;
data = g_malloc(sizeof(struct pl_update_data));
data->pud_playlist = playlist;
data->pud_func = func;
idle_schedule(IDLE_SYNC, __playlist_generic_update, data);
}
void playlist_generic_set_flag(struct playlist *playlist,
enum queue_flags flag, bool enabled)
{

View File

@ -86,6 +86,14 @@ static bool sys_pl_collection_add(struct playlist *playlist, struct track *track
return sys_pl_generic_add(playlist, track);
}
static bool sys_pl_collection_update(struct playlist *playlist,
struct track *track)
{
if (track->tr_library->li_enabled != true)
return false;
return sys_pl_generic_add(playlist, track) || true;
}
static void sys_pl_collection_set_flag(struct playlist *playlist,
enum queue_flags flag, bool enabled)
{
@ -130,6 +138,14 @@ static bool sys_pl_unplayed_add(struct playlist *playlist, struct track *track)
return sys_pl_generic_add(playlist, track);
}
static bool sys_pl_unplayed_update(struct playlist *playlist,
struct track *track)
{
if (track->tr_count > 0)
return false;
return sys_pl_generic_add(playlist, track) || true;
}
/*
* Most played tracks playlist operations.
@ -142,6 +158,15 @@ static bool sys_pl_most_played_add(struct playlist *playlist, struct track *trac
return sys_pl_generic_add(playlist, track);
}
static bool sys_pl_most_played_update(struct playlist *playlist,
struct track *track)
{
unsigned int average = track_db_average_plays();
if (track->tr_count <= average)
return false;
return sys_pl_generic_add(playlist, track) || true;
}
/*
* Least played tracks playlist operations.
@ -154,6 +179,15 @@ static bool sys_pl_least_played_add(struct playlist *playlist, struct track *tra
return sys_pl_generic_add(playlist, track);
}
static bool sys_pl_least_played_update(struct playlist *playlist,
struct track *track)
{
unsigned int average = track_db_average_plays();
if (!track->tr_count || track->tr_count > average)
return false;
return sys_pl_generic_add(playlist, track) || true;
}
static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = {
[SYS_PL_FAVORITES] = {
@ -177,6 +211,7 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = {
.spl_init = sys_pl_generic_init,
.spl_add = sys_pl_collection_add,
.spl_remove = playlist_generic_remove_track,
.spl_update = sys_pl_collection_update,
.spl_set_flag = sys_pl_collection_set_flag,
.spl_sort = sys_pl_collection_sort,
},
@ -193,6 +228,7 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = {
.spl_init = sys_pl_generic_init,
.spl_add = sys_pl_unplayed_add,
.spl_remove = playlist_generic_remove_track,
.spl_update = sys_pl_unplayed_update,
.spl_set_flag = playlist_generic_set_flag,
.spl_sort = playlist_generic_sort,
},
@ -201,6 +237,7 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = {
.spl_init = sys_pl_generic_init,
.spl_add = sys_pl_most_played_add,
.spl_remove = playlist_generic_remove_track,
.spl_update = sys_pl_most_played_update,
.spl_set_flag = playlist_generic_set_flag,
.spl_sort = playlist_generic_sort,
},
@ -209,6 +246,7 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = {
.spl_init = sys_pl_generic_init,
.spl_add = sys_pl_least_played_add,
.spl_remove = playlist_generic_remove_track,
.spl_update = sys_pl_least_played_update,
.spl_set_flag = playlist_generic_set_flag,
.spl_sort = playlist_generic_sort,
},
@ -309,36 +347,6 @@ static bool __sys_pl_load()
return true;
}
static bool __sys_pl_can_add(enum sys_playlist_t plist, struct track *track,
unsigned int average)
{
if (plist == SYS_PL_COLLECTION)
return track->tr_library->li_enabled;
else if (track->tr_count == 0)
return plist == SYS_PL_UNPLAYED;
else if (track->tr_count <= average)
return plist == SYS_PL_LEAST_PLAYED;
/* track->tr_count > average */
return plist == SYS_PL_MOST_PLAYED;
}
static bool __sys_pl_update(enum sys_playlist_t plist)
{
struct sys_playlist *sys_pl = &sys_playlists[plist];
unsigned int average = track_db_average_plays();
struct db_entry *dbe, *next;
db_for_each(dbe, next, track_db_get()) {
if (__sys_pl_can_add(plist, TRACK(dbe), average))
sys_pl->spl_add(&sys_pl->spl_playlist, TRACK(dbe));
else
sys_pl->spl_remove(&sys_pl->spl_playlist, TRACK(dbe));
}
queue_unset_flag(__sys_pl_queue(plist), Q_ADD_FRONT);
return true;
}
static struct queue *pl_system_get_queue(const gchar *name)
{
@ -365,11 +373,9 @@ static bool pl_system_remove_track(const gchar *name, struct track *track)
static void pl_system_update(const gchar *name)
{
enum sys_playlist_t plist = __sys_pl_convert(name);
if (plist != SYS_PL_FAVORITES && plist != SYS_PL_HIDDEN &&
plist != SYS_PL_HISTORY)
idle_schedule(IDLE_SYNC, IDLE_FUNC(__sys_pl_update),
GUINT_TO_POINTER(plist));
struct sys_playlist *sys_pl = __sys_pl_lookup(name);
if (sys_pl)
playlist_generic_update(&sys_pl->spl_playlist, sys_pl->spl_update);
}
static void pl_system_set_flag(const gchar *name, enum queue_flags flag,

View File

@ -23,6 +23,7 @@ struct sys_playlist {
void (*spl_init)(struct playlist *, unsigned int, struct queue_ops *);
bool (*spl_add)(struct playlist *, struct track *);
bool (*spl_remove)(struct playlist *, struct track *);
bool (*spl_update)(struct playlist *, struct track *);
void (*spl_set_flag)(struct playlist *, enum queue_flags, bool);
void (*spl_sort)(struct playlist *, enum compare_t, bool);
};

View File

@ -70,6 +70,10 @@ bool playlist_generic_add_track(struct playlist *, struct track *);
/* Generic playlist remove track operation. */
bool playlist_generic_remove_track(struct playlist *, struct track *);
/* Generic playlist update operation. */
void playlist_generic_update(struct playlist *,
bool (*)(struct playlist *, struct track *));
/* Generic playlist set_flag operation. */
void playlist_generic_set_flag(struct playlist *, enum queue_flags, bool);