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