/** * 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 clear() { while (size() > 0) del((unsigned)0); } void fill(IndexEntry *ent) { std::set::iterator it; clear(); for (it = ent->begin(); it != ent->end(); it++) add(tags :: get_track(*it)); } unsigned int find_average_count() { Track *track; unsigned int total = 0, count = 0; for (unsigned int i = 0; i < tags :: track_size(); i++) { track = tags :: get_track(i); if (track != NULL) { total += track->count(); count++; } } return total / count; } void dynamic_add(const std::string &name, Track *track, unsigned int avg) { if ((name == "Unplayed") && (track->count() == 0)) add(track); if ((name == "Most Played") && (track->count() > avg)) add(track); if ((name == "Least Played") && (track->count() < avg)) add(track); } void dynamic_fill(const std::string &name) { Track *track; unsigned int avg = 0; if ((name == "Most Played") || (name == "Least Played")) avg = find_average_count(); clear(); for (unsigned int i = 0; i < tags :: track_size(); i++) { track = tags :: get_track(i); if (track != NULL) dynamic_add(name, track, avg); } } }; 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"); if (!ent) return; for (it = ent->begin(); it != ent->end(); it++) library :: get_queue()->del(tags :: get_track(*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; return ent->has(track->index()); } void playlist :: add(Track *track, const std::string &name) { if (!( (name == "Banned") || (name == "Favorites") )) return; if (!has(track, name)) { playlist_db.insert(name, track->index()); 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->index()); 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 = playlist_db.find(name); if (ent != NULL) playlist_q.fill(ent); else playlist_q.dynamic_fill(name); cur_plist = name; } IndexEntry *playlist :: get_tracks(const std::string &name) { return playlist_db.find(name); } Queue *playlist :: get_queue() { return &playlist_q; }