ocarina/lib/playlist.cpp

106 lines
2.3 KiB
C++

/*
* Copyright 2013 (c) Anna Schumaker.
*/
#include <callback.h>
#include <error.h>
#include <index.h>
#include <playlist.h>
static std::set<unsigned int> empty_set;
static Index playlist_db("playlist.db", false);
static Playqueue playlist_pq(PQ_ENABLED);
static std::string cur_pq;
static void import_ban_track(unsigned int track_id)
{
playlist :: add("Banned", track_id);
}
void playlist :: init()
{
std::set<unsigned int> ids;
std::set<unsigned int>::iterator it;
playlist_pq.add_sort(SORT_ARTIST);
playlist_pq.add_sort(SORT_YEAR);
playlist_pq.add_sort(SORT_TRACK);
playlist_pq.set_flag(PQ_REPEAT);
playlist_pq.set_flag(PQ_NEVER_SORT);
get_callbacks()->on_library_import_ban = import_ban_track;
playlist_db.load();
ids = get_tracks("Banned");
for (it = ids.begin(); it != ids.end(); it++)
get_callbacks()->on_playlist_ban(*it);
if (cur_pq == "")
return;
ids = get_tracks(cur_pq);
for (it = ids.begin(); it != ids.end(); it++)
playlist_pq.add(*it);
}
void playlist :: add(const std::string &name, unsigned int track_id)
{
if ((name == "Banned") || (name == "Favorites")) {
playlist_db.insert(name, track_id);
playlist_db.save();
if (name == cur_pq)
playlist_pq.add(track_id);
if (name == "Banned")
get_callbacks()->on_playlist_ban(track_id);
} else
throw -E_EXIST;
}
void playlist :: del(const std::string &name, unsigned int track_id)
{
if ((name == "Banned") || (name == "Favorites")) {
playlist_db.remove(name, track_id);
playlist_db.save();
if (name == cur_pq)
playlist_pq.del_track(track_id);
if (name == "Banned")
get_callbacks()->on_playlist_unban(track_id);
} else
throw -E_EXIST;
}
void playlist :: select(const std::string &name)
{
std::set<unsigned int> ids = get_tracks(name);
std::set<unsigned int>::iterator it;
while (playlist_pq.size() > 0)
playlist_pq.del(0);
for (it = ids.begin(); it != ids.end(); it++)
playlist_pq.add(*it);
cur_pq = name;
}
const std::set<unsigned int> &playlist :: get_tracks(const std::string &name)
{
if ((name == "Banned") || (name == "Favorites")) {
Database<IndexEntry>::iterator it = playlist_db.find(name);
if (it != playlist_db.end())
return it->values;
return empty_set;
}
throw -E_EXIST;
}
Playqueue *playlist :: get_pq()
{
return &playlist_pq;
}
#ifdef CONFIG_TEST
void playlist :: clear()
{
}
#endif /* CONFIG_TEST */