/* * Copyright 2013 (c) Anna Schumaker. */ #include #include static struct queue playlist_q; static enum playlist_t playlist_cur; static const gchar *playlist_names[5] = { "Favorites", "Hidden", "Unplayed", "Most Played", "Least Played" }; static void __playlist_fill_dynamic(enum playlist_t plist) { unsigned int count = 0, average = 0; struct db_entry *track, *next; if (plist == PL_MOST_PLAYED || plist == PL_LEAST_PLAYED) average = track_db_average_plays(); db_for_each(track, next, track_db_get()) { count = TRACK(track)->tr_count; if (plist == PL_UNPLAYED && count == 0) queue_add(&playlist_q, TRACK(track)); else if (plist == PL_MOST_PLAYED && count > average) queue_add(&playlist_q, TRACK(track)); else if (plist == PL_LEAST_PLAYED && count <= average && count > 0) queue_add(&playlist_q, TRACK(track)); } } void playlist_init(struct queue_ops *ops) { queue_init(&playlist_q, Q_ENABLED | Q_REPEAT, ops); queue_sort(&playlist_q, COMPARE_ARTIST, true); queue_sort(&playlist_q, COMPARE_YEAR, false); queue_sort(&playlist_q, COMPARE_TRACK, false); queue_set_flag(&playlist_q, Q_NO_SORT); pl_system_init(ops); } void playlist_deinit() { queue_deinit(&playlist_q); pl_system_deinit(); } bool playlist_add(enum playlist_t plist, struct track *track) { if (!track) return false; return pl_system.pl_add_track(playlist_names[plist], track); } bool playlist_remove(enum playlist_t plist, struct track *track) { if (!track) return false; return pl_system.pl_remove_track(playlist_names[plist], track); } bool playlist_has(enum playlist_t plist, struct track *track) { struct queue *queue = pl_system.pl_get_queue(playlist_names[plist]); if (!track || !queue) return false; return queue_has(queue, track); } void playlist_select(enum playlist_t plist) { playlist_cur = plist; if (playlist_get_queue(plist) != &playlist_q) return; queue_clear(&playlist_q); queue_set_flag(&playlist_q, Q_ADD_FRONT); __playlist_fill_dynamic(plist); queue_unset_flag(&playlist_q, Q_ADD_FRONT); queue_resort(&playlist_q); } struct queue *playlist_get_queue(enum playlist_t plist) { struct queue *ret = pl_system.pl_get_queue(playlist_names[plist]); return ret ? ret : &playlist_q; }