void playlist_select_by_patterns (int playlist, const Tuple * patterns) { const int fields[] = {FIELD_TITLE, FIELD_ALBUM, FIELD_ARTIST, FIELD_FILE_NAME}; int entries = playlist_entry_count (playlist); int field, entry; playlist_select_all (playlist, TRUE); for (field = 0; field < G_N_ELEMENTS (fields); field ++) { char * pattern = tuple_get_str (patterns, fields[field], NULL); regex_t regex; if (! pattern || ! pattern[0] || regcomp (& regex, pattern, REG_ICASE)) { str_unref (pattern); continue; } for (entry = 0; entry < entries; entry ++) { if (! playlist_entry_get_selected (playlist, entry)) continue; Tuple * tuple = playlist_entry_get_tuple (playlist, entry, FALSE); char * string = tuple ? tuple_get_str (tuple, fields[field], NULL) : NULL; if (! string || regexec (& regex, string, 0, NULL, 0)) playlist_entry_set_selected (playlist, entry, FALSE); str_unref (string); if (tuple) tuple_unref (tuple); } regfree (& regex); str_unref (pattern); } }
void drct_pl_delete_selected (int list) { int pos = playlist_get_position (list); if (get_bool (NULL, "advance_on_delete") && ! get_bool (NULL, "no_playlist_advance") && playback_get_playing () && list == playlist_get_playing () && pos >= 0 && playlist_entry_get_selected (list, pos)) { playlist_entry_set_selected (list, pos, FALSE); playlist_delete_selected (list); pos = playlist_get_position (list); /* it may have moved */ if (playlist_next_song (list, get_bool (NULL, "repeat")) && playlist_get_position (list) != pos) playback_play (0, FALSE); playlist_entry_delete (list, pos, 1); } else playlist_delete_selected (list); }