From d25ca041474732f9e4e030a1795e9686783b7ecd Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 16 Jun 2020 17:41:07 +0200
Subject: [PATCH] Implement client side listplaylist and listplaylists

---
 src/commands.c |  3 ++-
 src/main/lkt.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/commands.c b/src/commands.c
index 383e0a98..41338656 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -437,7 +437,8 @@ bool
 lkt_callback_send_list_plts(struct lkt_state *srv, size_t c, const char *plt_name)
 {
     struct lkt_message *out = lkt_message_new();
-    out->data_len = safe_snprintf(out->data, LKT_MESSAGE_MAX, "%s\n", plt_name);
+    /* If the playlist is named OK or ACK... */
+    out->data_len = safe_snprintf(out->data, LKT_MESSAGE_MAX, "name: %s\n", plt_name);
     lkt_state_send(srv, c, out);
     return true;
 }
diff --git a/src/main/lkt.c b/src/main/lkt.c
index 8a1f5c37..d82a024b 100644
--- a/src/main/lkt.c
+++ b/src/main/lkt.c
@@ -819,6 +819,50 @@ stickers_delete__(struct lkt_cmd_args *args)
 
 /* Search functions. */
 
+noreturn void
+__continuation_calls(const char *cmd)
+{
+    char buff[LKT_MESSAGE_MAX];
+    int continuation = 0;
+    FILE *sock = NULL;
+redo:
+    sock = lkt_connect();
+
+    write_socket(sock, "%d %s\n", continuation, cmd);
+    for (;;) {
+        memset(buff, 0, LKT_MESSAGE_MAX * sizeof(char));
+        read_socket(sock, buff, LKT_MESSAGE_MAX - 1);
+
+        if (STR_NMATCH(buff, "continue:", strlen("continue:"))) {
+            continuation = atoi(lkt_skip_key(buff));
+            fclose(sock);
+            goto redo;
+        }
+
+        if (STR_NMATCH(buff, "OK", 2))
+            exit(EXIT_SUCCESS);
+        else if (STR_NMATCH(buff, "ACK", 3))
+            exit(EXIT_FAILURE);
+
+        fprintf(stdout, "%s", buff);
+    }
+}
+
+noreturn void
+list_plt__(struct lkt_cmd_args *args)
+{
+    fail_if(args->argc != 1, "Invalid argument number");
+    __continuation_calls("listplaylist");
+}
+
+noreturn void
+list_plt_content__(struct lkt_cmd_args *args)
+{
+    fail_if(args->argc != 0, "Invalid argument number");
+    __continuation_calls("listplaylists");
+    exit(EXIT_FAILURE);
+}
+
 noreturn void
 search_with_cmd__(struct lkt_cmd_args *args, const char *cmd)
 {
@@ -886,7 +930,7 @@ search_plt__(struct lkt_cmd_args *args)
 redo:
     sock = lkt_connect();
 
-    write_socket(sock, "%d listplaylist %s %s://", continuation,
+    write_socket(sock, "%d listplaylistinfo %s %s://", continuation,
                  args->argv[0], args->argv[1]);
     for (i = 2; i < args->argc - 1; ++i)
         write_socket(sock, "%s ", args->argv[i]);
-- 
GitLab