/* * Copyright 2013 (c) Anna Schumaker. */ #include #include #include #include static std::set 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 ids; std::set::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 ids = get_tracks(name); std::set::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 &playlist :: get_tracks(const std::string &name) { if ((name == "Banned") || (name == "Favorites")) { Database::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 */