171 lines
4.3 KiB
C
171 lines
4.3 KiB
C
/*
|
|
* Copyright 2013 (c) Anna Schumaker.
|
|
*/
|
|
#include <core/playlist.h>
|
|
#include <core/settings.h>
|
|
#include <core/string.h>
|
|
|
|
static const gchar *SETTINGS_CUR_TYPE = "core.playlist.cur.type";
|
|
static const gchar *SETTINGS_CUR_ID = "core.playlist.cur.id";
|
|
static const gchar *SETTINGS_PREV_TYPE = "core.playlist.prev.type";
|
|
static const gchar *SETTINGS_PREV_ID = "core.playlist.prev.id";
|
|
|
|
struct playlist_type *playlist_types[] = {
|
|
[PL_SYSTEM] = &pl_system,
|
|
[PL_ARTIST] = &pl_artist,
|
|
[PL_LIBRARY] = &pl_library,
|
|
[PL_USER] = &pl_user,
|
|
};
|
|
|
|
|
|
void playlist_init(struct queue_ops *ops)
|
|
{
|
|
pl_system_init(ops);
|
|
pl_artist_init(ops);
|
|
pl_user_init(ops);
|
|
pl_library_init(ops);
|
|
|
|
if (!settings_has(SETTINGS_CUR_TYPE) ||
|
|
!settings_has(SETTINGS_CUR_ID)) {
|
|
playlist_select(PL_SYSTEM, "Collection");
|
|
if (playlist_size(PL_SYSTEM, "Queued Tracks") > 0)
|
|
playlist_select(PL_SYSTEM, "Queued Tracks");
|
|
}
|
|
}
|
|
|
|
void playlist_deinit()
|
|
{
|
|
pl_system_deinit();
|
|
pl_artist_deinit();
|
|
pl_user_deinit();
|
|
pl_library_deinit();
|
|
}
|
|
|
|
void playlist_save()
|
|
{
|
|
unsigned int i;
|
|
for (i = 0; i < PL_MAX_TYPE; i++)
|
|
playlist_types[i]->pl_save();
|
|
}
|
|
|
|
bool playlist_select(enum playlist_type_t type, const gchar *name)
|
|
{
|
|
if (!playlist_types[type]->pl_can_select(name))
|
|
return false;
|
|
if ((settings_get(SETTINGS_CUR_TYPE) == type) &&
|
|
settings_get(SETTINGS_CUR_ID) == playlist_get_id(type, name))
|
|
return true;
|
|
|
|
settings_set(SETTINGS_PREV_TYPE, settings_get(SETTINGS_CUR_TYPE));
|
|
settings_set(SETTINGS_PREV_ID, settings_get(SETTINGS_CUR_ID));
|
|
settings_set(SETTINGS_CUR_TYPE, type);
|
|
settings_set(SETTINGS_CUR_ID, playlist_get_id(type, name));
|
|
return true;
|
|
}
|
|
|
|
bool playlist_new(enum playlist_type_t type, const gchar *name)
|
|
{
|
|
return playlist_types[type]->pl_new(name);
|
|
}
|
|
|
|
bool playlist_delete(enum playlist_type_t type, const gchar *name)
|
|
{
|
|
return playlist_types[type]->pl_delete(name);
|
|
}
|
|
|
|
bool playlist_add(enum playlist_type_t type, const gchar *name,
|
|
struct track *track)
|
|
{
|
|
bool ret;
|
|
|
|
if (!track)
|
|
return false;
|
|
|
|
ret = playlist_types[type]->pl_add_track(name, track);
|
|
if (type == PL_SYSTEM && string_match(name, "Queued Tracks"))
|
|
playlist_select(PL_SYSTEM, "Queued Tracks");
|
|
return ret;
|
|
}
|
|
|
|
bool playlist_remove(enum playlist_type_t type, const gchar *name,
|
|
struct track *track)
|
|
{
|
|
if (!track)
|
|
return false;
|
|
return playlist_types[type]->pl_remove_track(name, track);
|
|
}
|
|
|
|
void playlist_update(enum playlist_type_t type, const gchar *name)
|
|
{
|
|
playlist_types[type]->pl_update(name);
|
|
}
|
|
|
|
bool playlist_has(enum playlist_type_t type, const gchar *name,
|
|
struct track *track)
|
|
{
|
|
struct queue *queue = playlist_get_queue(type, name);
|
|
if (!track || !queue)
|
|
return false;
|
|
return queue_has(queue, track);
|
|
}
|
|
|
|
unsigned int playlist_size(enum playlist_type_t type, const gchar *name)
|
|
{
|
|
struct queue *queue = playlist_get_queue(type, name);
|
|
return queue ? queue_size(queue) : 0;
|
|
}
|
|
|
|
void playlist_set_random(enum playlist_type_t type, const gchar *name,
|
|
bool enabled)
|
|
{
|
|
playlist_types[type]->pl_set_flag(name, Q_RANDOM, enabled);
|
|
}
|
|
|
|
bool playlist_get_random(enum playlist_type_t type, const gchar *name)
|
|
{
|
|
struct queue *queue = playlist_get_queue(type, name);
|
|
return queue ? queue_has_flag(queue, Q_RANDOM) : false;
|
|
}
|
|
|
|
void playlist_sort(enum playlist_type_t type, const gchar *name,
|
|
enum compare_t sort, bool reset)
|
|
{
|
|
playlist_types[type]->pl_sort(name, sort, reset);
|
|
}
|
|
|
|
struct track *playlist_next(void)
|
|
{
|
|
enum playlist_type_t type = settings_get(SETTINGS_CUR_TYPE);
|
|
unsigned int id = settings_get(SETTINGS_CUR_ID);
|
|
gchar *name = playlist_get_name(type, id);
|
|
struct track *track = playlist_types[type]->pl_next(name);
|
|
|
|
if (playlist_size(type, name) == 0) {
|
|
settings_set(SETTINGS_CUR_ID, settings_get(SETTINGS_PREV_ID));
|
|
settings_set(SETTINGS_CUR_TYPE, settings_get(SETTINGS_PREV_TYPE));
|
|
}
|
|
|
|
g_free(name);
|
|
return track;
|
|
}
|
|
|
|
struct track *playlist_prev(void)
|
|
{
|
|
return playlist_types[PL_SYSTEM]->pl_next("History");
|
|
}
|
|
|
|
struct queue *playlist_get_queue(enum playlist_type_t type, const gchar *name)
|
|
{
|
|
return playlist_types[type]->pl_get_queue(name);
|
|
}
|
|
|
|
unsigned int playlist_get_id(enum playlist_type_t type, const gchar *name)
|
|
{
|
|
return playlist_types[type]->pl_get_id(name);
|
|
}
|
|
|
|
gchar *playlist_get_name(enum playlist_type_t type, unsigned int id)
|
|
{
|
|
return playlist_types[type]->pl_get_name(id);
|
|
}
|