From dbb635c9acf8764423c6c3b981ae55f9de9b7325 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Mon, 18 May 2020 09:39:46 +0200 Subject: [PATCH] Dump to playlist --- inc/lektor/commands.h | 1 + inc/lektor/database.h | 1 + src/commands.c | 9 +++++++++ src/database/queue.c | 21 ++++++++++++++++++++ src/main/lkt.c | 11 ----------- src/net/listen.c | 46 ++++++++++++++++++++++--------------------- 6 files changed, 56 insertions(+), 33 deletions(-) diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h index 617046af..dae78100 100644 --- a/inc/lektor/commands.h +++ b/inc/lektor/commands.h @@ -38,6 +38,7 @@ bool command_crop (volatile sqlite3 *db, bool command_move (volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr); bool command_shuffle(volatile sqlite3 *db, mpd_idle_flag *watch_mask_ptr); bool command_playid (volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr); +bool command_dump (volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr); bool command_queue_list(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]); diff --git a/inc/lektor/database.h b/inc/lektor/database.h index 080c507b..8f140317 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -62,6 +62,7 @@ bool database_queue_crop (volatile sqlite3 *db); bool database_queue_move (volatile sqlite3 *db, int from, int to); bool database_queue_shuffle(volatile sqlite3 *db); bool database_queue_seekid (volatile sqlite3 *db, int id, int *out_pos); +bool database_queue_dump (volatile sqlite3 *db, const char *plt_name); /* Control the playing state of the queue. */ bool database_queue_toggle_pause(volatile sqlite3 *db); diff --git a/src/commands.c b/src/commands.c index 7d155a86..f6cc4507 100644 --- a/src/commands.c +++ b/src/commands.c @@ -216,6 +216,15 @@ command_play(volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_A return __play_that_file(db, win, pos); } +bool +command_dump(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], + mpd_idle_flag *watch_mask_ptr) +{ + RETURN_UNLESS(args[0], "Invalid argument", false); + *watch_mask_ptr |= MPD_IDLE_PLAYLIST; + return database_queue_dump(db, args[0]); +} + bool command_playid(volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr) { diff --git a/src/database/queue.c b/src/database/queue.c index d59484b9..3cd69290 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -663,6 +663,27 @@ error: return ret; } +bool +database_queue_dump(volatile sqlite3 *db, const char *plt_name) +{ + static const char *SQL = + "WITH plt_id AS (SELECT playlist.id AS id FROM playlist" + " WHERE name COLLATE nocase = ?) " + "INSERT INTO kara_playlist (kara_id, playlist_id)" + " SELECT DISTINCT kara_id, plt_id.id" + " FROM queue, plt_id" + " ORDER BY RANDOM();"; + sqlite3_stmt *stmt = NULL; + SQLITE_PREPARE(db, stmt, SQL, error); + SQLITE_BIND_TEXT(db, stmt, 1, plt_name, error); + SQLITE_STEP_DONE(db, stmt, error); + sqlite3_finalize(stmt); + return true; +error: + sqlite3_finalize(stmt); + return false; +} + bool database_queue_seekid(volatile sqlite3 *db, int id, int *out_pos) { diff --git a/src/main/lkt.c b/src/main/lkt.c index 553996d3..85c1f984 100644 --- a/src/main/lkt.c +++ b/src/main/lkt.c @@ -275,17 +275,6 @@ populate__(struct lkt_cmd_args *args) rescan_or_update__(args, "__rescan"); } -noreturn void -queue_import__(struct lkt_cmd_args *args) -{ - if (args->argc != 1) - fail("Invalid argument"); - FILE *sock = lkt_connect(); - char buff[LKT_MESSAGE_MAX]; - write_socket(sock, "load %s\n", args->argv[0]); - exit_with_status(sock, buff); -} - noreturn void queue_replace__(struct lkt_cmd_args *args) { diff --git a/src/net/listen.c b/src/net/listen.c index 4fe673c2..43a21ca3 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -159,7 +159,7 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) case MPD_IDLE_NONE: /* Commands that requires authentification. */ if (STR_MATCH(cmd.name, "__adduser")) - err = ! command_user_add(srv, c, (sqlite3 *) srv->db, cmd.args); + err = ! command_user_add(srv, c, srv->db, cmd.args); else if (STR_MATCH(cmd.name, "__restart")) err = ! command_restart(srv, c); else if (STR_MATCH(cmd.name, "kill")) @@ -183,25 +183,25 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) err = 0; else if (STR_MATCH(cmd.name, "next")) - err = !command_next((sqlite3 *) srv->db, &srv->win, &srv->mpd_idle_events); + err = !command_next(srv->db, &srv->win, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "pause")) - err = !command_pause((sqlite3 *) srv->db, &srv->win, &srv->mpd_idle_events); + err = !command_pause(srv->db, &srv->win, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "previous")) - err = !command_previous((sqlite3 *) srv->db, &srv->win, &srv->mpd_idle_events); + err = !command_previous(srv->db, &srv->win, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "play")) - err = ! command_play((sqlite3 *) srv->db, &srv->win, cmd.args, &srv->mpd_idle_events); + err = ! command_play(srv->db, &srv->win, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "playid")) - err = ! command_playid((sqlite3 *) srv->db, &srv->win, cmd.args, &srv->mpd_idle_events); + err = ! command_playid(srv->db, &srv->win, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "stop")) - err = !command_stop((sqlite3 *) srv->db, &srv->win, &srv->mpd_idle_events); + err = !command_stop(srv->db, &srv->win, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "clear")) - err = !command_clear((sqlite3 *) srv->db, &srv->mpd_idle_events); + err = !command_clear(srv->db, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "crop")) - err = !command_crop((sqlite3 *) srv->db, &srv->mpd_idle_events); + err = !command_crop(srv->db, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "moveid")) - err = !command_move((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events); + err = !command_move(srv->db, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "shuffle")) - err = !command_shuffle((sqlite3 *) srv->db, &srv->mpd_idle_events); + err = !command_shuffle(srv->db, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "playlist") || STR_MATCH(cmd.name, "playlistinfo")) err = !command_queue_list(srv, c, cmd.args); @@ -223,29 +223,31 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) err = !command_help(srv, c); else if (STR_MATCH(cmd.name, "__insert")) - err = !command_add((sqlite3 *) srv->db, &srv->win, cmd.args, &srv->mpd_idle_events, 5); + err = !command_add(srv->db, &srv->win, cmd.args, &srv->mpd_idle_events, 5); else if (STR_MATCH(cmd.name, "searchadd") || STR_MATCH(cmd.name, "findadd") || STR_MATCH(cmd.name, "add")) - err = !command_add((sqlite3 *) srv->db, &srv->win, cmd.args, &srv->mpd_idle_events, 1); + err = !command_add(srv->db, &srv->win, cmd.args, &srv->mpd_idle_events, 1); else if (STR_MATCH(cmd.name, "addid")) - err = !command_addid((sqlite3 *) srv->db, &srv->win, cmd.args, &srv->mpd_idle_events); + err = !command_addid(srv->db, &srv->win, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "deleteid")) err = ! (cmd.args[0] != NULL && - command_delid((sqlite3 *) srv->db, &srv->win, cmd.args[0], &srv->mpd_idle_events)); + command_delid(srv->db, &srv->win, cmd.args[0], &srv->mpd_idle_events)); else if (STR_MATCH(cmd.name, "playlistclear")) - err = ! command_plt_clear((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events); + err = ! command_plt_clear(srv->db, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "rename")) - err = ! command_plt_rename((sqlite3 * ) srv->db, cmd.args, &srv->mpd_idle_events); + err = ! command_plt_rename(srv->db, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "playlistdelete")) - err = ! command_plt_remove((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events); + err = ! command_plt_remove(srv->db, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "playlistadd")) - err = ! command_plt_add((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events); + err = ! command_plt_add(srv->db, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "rm") && cmd.args[0] != NULL && cmd.args[1] == NULL) - err = ! command_plt_remove((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events); + err = ! command_plt_remove(srv->db, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "save")) - err = ! command_plt_export((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events); + err = ! command_plt_export(srv->db, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "__import")) - err = ! command_plt_import((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events); + err = ! command_plt_import(srv->db, cmd.args, &srv->mpd_idle_events); + else if (STR_MATCH(cmd.name, "__dump")) + err = ! command_dump(srv->db, cmd.args, &srv->mpd_idle_events); else if (STR_MATCH(cmd.name, "random")) err = !command_set_playback_option(srv, c, lkt_playback_option_random, cmd.args); -- GitLab