core/playlists/generic: Add a playlist_generic_update() function
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
dddb098354
commit
019137e4ed
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue