ocarina/core/playlist.c

96 lines
2.3 KiB
C

/*
* Copyright 2013 (c) Anna Schumaker.
*/
#include <core/playlist.h>
#include <core/playlists/system.h>
static struct queue playlist_q;
static enum playlist_t playlist_cur;
static const gchar *playlist_names[5] =
{ "Favorites", "Hidden", "Unplayed", "Most Played", "Least Played" };
static void __playlist_fill_dynamic(enum playlist_t plist)
{
unsigned int count = 0, average = 0;
struct db_entry *track, *next;
if (plist == PL_MOST_PLAYED || plist == PL_LEAST_PLAYED)
average = track_db_average_plays();
db_for_each(track, next, track_db_get()) {
count = TRACK(track)->tr_count;
if (plist == PL_UNPLAYED && count == 0)
queue_add(&playlist_q, TRACK(track));
else if (plist == PL_MOST_PLAYED && count > average)
queue_add(&playlist_q, TRACK(track));
else if (plist == PL_LEAST_PLAYED && count <= average && count > 0)
queue_add(&playlist_q, TRACK(track));
}
}
void playlist_init(struct queue_ops *ops)
{
queue_init(&playlist_q, Q_ENABLED | Q_REPEAT, ops);
queue_sort(&playlist_q, COMPARE_ARTIST, true);
queue_sort(&playlist_q, COMPARE_YEAR, false);
queue_sort(&playlist_q, COMPARE_TRACK, false);
queue_set_flag(&playlist_q, Q_NO_SORT);
pl_system_init(ops);
}
void playlist_deinit()
{
queue_deinit(&playlist_q);
pl_system_deinit();
}
bool playlist_add(enum playlist_t plist, struct track *track)
{
if (!track)
return false;
return pl_system.pl_add_track(playlist_names[plist], track);
}
bool playlist_remove(enum playlist_t plist, struct track *track)
{
if (!track)
return false;
return pl_system.pl_remove_track(playlist_names[plist], track);
}
void playlist_update(enum playlist_t plist)
{
pl_system.pl_update(playlist_names[plist]);
}
bool playlist_has(enum playlist_t plist, struct track *track)
{
struct queue *queue = pl_system.pl_get_queue(playlist_names[plist]);
if (!track || !queue)
return false;
return queue_has(queue, track);
}
void playlist_select(enum playlist_t plist)
{
playlist_cur = plist;
if (playlist_get_queue(plist) != &playlist_q)
return;
queue_clear(&playlist_q);
queue_set_flag(&playlist_q, Q_ADD_FRONT);
__playlist_fill_dynamic(plist);
queue_unset_flag(&playlist_q, Q_ADD_FRONT);
queue_resort(&playlist_q);
}
struct queue *playlist_get_queue(enum playlist_t plist)
{
struct queue *ret = pl_system.pl_get_queue(playlist_names[plist]);
return ret ? ret : &playlist_q;
}