int cmd_sort(int argc, char *argv[]) { const char *errmsg; if (argc != 2) { paint_error("usage: sort <sort-description>"); return 1; } /* setup global sort description */ if (mi_sort_set(argv[1], &errmsg) != 0) { paint_error("%s: bad sort description: %s", argv[0], errmsg); return 2; } /* do the actual sort */ qsort(viewing_playlist->files, viewing_playlist->nfiles, sizeof(meta_info*), mi_compare); if (!ui_is_init()) return 0; /* redraw */ paint_playlist(); /* if we sorted a playlist other than library, and user wants to save sorts */ if (viewing_playlist != mdb.library && sorts_need_saving) { viewing_playlist->needs_saving = true; paint_library(); } return 0; }
/* paint all windows */ void paint_all() { paint_borders(); paint_player(); paint_status_bar(); paint_library(); paint_playlist(); }
int cmd_new(int argc, char *argv[]) { playlist *p; char *name; char *filename; int i; if (argc > 2) { paint_error("usage: new [name]"); return 1; } /* defaults */ name = "untitled"; filename = NULL; /* was a name specified? */ if (argc == 2) { /* check for existing playlist with name */ for (i = 0; i < mdb.nplaylists; i++) { if (strcmp(mdb.playlists[i]->name, argv[1]) == 0) { paint_error("playlist \"%s\" already exists.", argv[1]); return 2; } } name = argv[1]; asprintf(&filename, "%s/%s.playlist", mdb.playlist_dir, name); if (filename == NULL) err(1, "cmd_new: asprintf(3) failed"); } /* create & setup playlist */ p = playlist_new(); p->needs_saving = true; p->filename = filename; if ((p->name = strdup(name)) == NULL) err(1, "cmd_new: strdup(3) failed"); /* add playlist to media library and update ui */ medialib_playlist_add(p); ui.library->nrows++; if (p->filename != NULL) playlist_save(p); /* redraw */ paint_library(); paint_message("playlist \"%s\" added", name); return 0; }
int cmd_filter(int argc, char *argv[]) { playlist *results; char *search_phrase; bool match; int i; if (argc == 1) { paint_error("usage: filter[!] token [token2 ...]"); return 1; } /* determine what kind of filter we're doing */ match = argv[0][strlen(argv[0]) - 1] != '!'; /* set the raw query */ search_phrase = argv2str(argc - 1, argv + 1); mi_query_setraw(search_phrase); free(search_phrase); /* clear existing global query & set new one */ mi_query_clear(); for (i = 1; i < argc; i++) mi_query_add_token(argv[i]); /* do actual filter */ results = playlist_filter(viewing_playlist, match); /* swap necessary bits of results with filter playlist */ swap(meta_info **, results->files, mdb.filter_results->files); swap(int, results->nfiles, mdb.filter_results->nfiles); swap(int, results->capacity, mdb.filter_results->capacity); playlist_free(results); /* redraw */ setup_viewing_playlist(mdb.filter_results); paint_library(); paint_playlist(); return 0; }
int cmd_write(int argc, char *argv[]) { playlist *dup; char *filename; bool forced; bool will_clobber; int i, clobber_index; if (argc > 2) { paint_error("usage: w[!] [name]"); return 1; } forced = (strcmp(argv[0], "w!") == 0); if (argc == 1) { /* "save" */ /* can't save library or filter results */ if (viewing_playlist == mdb.library || viewing_playlist == mdb.filter_results) { paint_error("use \"w name\" when saving psuedo-playlists like library/filter"); return 2; } /* can't save a new playlist that has no name */ if (viewing_playlist->filename == NULL) { paint_error("use \"w name\" for new playlists"); return 3; } /* do the save... */ playlist_save(viewing_playlist); viewing_playlist->needs_saving = false; paint_library(); paint_message("\"%s\" %d songs written", viewing_playlist->filename, viewing_playlist->nfiles); } else { /* "save as" */ /* build filename for playlist */ asprintf(&filename, "%s/%s.playlist", mdb.playlist_dir, argv[1]); if (filename == NULL) err(1, "cmd_write: asprintf(3) failed"); /* check to see if playlist with that name already exists */ will_clobber = false; clobber_index = -1; for (i = 0; i < mdb.nplaylists; i++) { if (mdb.playlists[i]->filename != NULL && strcmp(mdb.playlists[i]->filename, filename) == 0) { will_clobber = true; clobber_index = i; } } if (will_clobber && !forced) { paint_error("playlist with that name exists (use \"w!\" to overwrite)"); free(filename); return 4; } /* if reached here, we're going to do the save-as... */ /* duplicate playlist */ dup = playlist_dup(viewing_playlist, filename, argv[1]); if (will_clobber) medialib_playlist_remove(clobber_index); else ui.library->nrows++; /* * TODO If the original playlist was a new one, with no name (i.e. if * name == NULL) then we should remove that playlist from the medialib * and display here. */ /* do the save-as... */ playlist_save(dup); medialib_playlist_add(dup); dup->needs_saving = false; viewing_playlist->needs_saving = false; paint_library(); paint_message("\"%s\" %d songs written", filename, viewing_playlist->nfiles); } return 0; }