/* * Copyright 2013 (c) Anna Schumaker. */ #include #include #include #include static std::set empty_set; static Index playlist_db("playlist.db", false); static Queue playlist_pq(Q_ENABLED | Q_REPEAT | Q_NO_SORT); 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.sort(SORT_ARTIST, true); playlist_pq.sort(SORT_YEAR, false); playlist_pq.sort(SORT_TRACK, false); 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(tagdb :: lookup(*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(tagdb :: lookup(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(tagdb :: lookup(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((unsigned)0); for (it = ids.begin(); it != ids.end(); it++) playlist_pq.add(tagdb :: lookup(*it)); cur_pq = name; } const std::set &playlist :: get_tracks(const std::string &name) { if ((name == "Banned") || (name == "Favorites")) { IndexEntry *it = playlist_db.find(name); if (it != NULL) return it->values; return empty_set; } throw -E_EXIST; } Queue *playlist :: get_pq() { return &playlist_pq; } #ifdef CONFIG_TEST void playlist :: clear() { } #endif /* CONFIG_TEST */