/* * Copyright 2013 (c) Anna Schumaker. */ #include #include class PlaylistQueue : public Queue { public: PlaylistQueue() : Queue(Q_ENABLED | Q_REPEAT) { sort(SORT_ARTIST, true); sort(SORT_YEAR, false); sort(SORT_TRACK, false); set_flag(Q_NO_SORT); } void fill(IndexEntry *ent) { std::set::iterator it; while (size() > 0) del((unsigned)0); for (it = ent->values.begin(); it != ent->values.end(); it++) add(tagdb :: lookup(*it)); } }; static Index playlist_db("playlist.db", true); static PlaylistQueue playlist_q; static std::string cur_plist; void playlist :: init() { std::set::iterator it; playlist_db.load(); IndexEntry *ent = get_tracks("Banned"); for (it = ent->values.begin(); it != ent->values.end(); it++) library :: get_queue()->del(tagdb :: lookup(*it)); } bool playlist :: has(Track *track, const std::string &name) { std::set::iterator it; IndexEntry *ent = playlist_db.find(name); if (ent == NULL) return false; it = ent->values.find(track->id); return it != ent->values.end(); } void playlist :: add(Track *track, const std::string &name) { if (!( (name == "Banned") || (name == "Favorites") )) return; if (!has(track, name)) { playlist_db.insert(name, track->id); if (cur_plist == name) playlist_q.add(track); if (name == "Banned") library :: get_queue()->del(track); } } void playlist :: del(Track *track, const std::string &name) { playlist_db.remove(name, track->id); if (cur_plist == name) playlist_q.del(track); if (name == "Banned") library :: get_queue()->add(track); } void playlist :: select(const std::string &name) { IndexEntry *ent; if (cur_plist == name) return; ent = playlist_db.find(name); if (ent == NULL) return; playlist_q.fill(ent); cur_plist = name; } IndexEntry *playlist :: get_tracks(const std::string &name) { return playlist_db.find(name); } Queue *playlist :: get_queue() { return &playlist_q; }