summaryrefslogtreecommitdiff
path: root/src/fruits
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-11-08 14:53:40 -0500
committerAndrew Opalach <andrew@akon.city> 2024-11-08 14:53:40 -0500
commit5e3641e5e692c3f2f644a4bb809c88727cb8bee9 (patch)
treefbac2007fdcebda13406350fdcef977910427078 /src/fruits
parentf56abfafcd4fa722b807278b138f805112cd953e (diff)
downloadcamu-5e3641e5e692c3f2f644a4bb809c88727cb8bee9.tar.gz
camu-5e3641e5e692c3f2f644a4bb809c88727cb8bee9.tar.bz2
camu-5e3641e5e692c3f2f644a4bb809c88727cb8bee9.zip
Command queue for portal and list, work on server
Most of the server stuff can undoubtedly be simplified. I'm still working that out. Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/fruits')
-rw-r--r--src/fruits/cmc/cli.h4
-rw-r--r--src/fruits/cmc/cmc.c98
-rw-r--r--src/fruits/cmc/cmc.h15
-rw-r--r--src/fruits/cmc/cmc.py17
-rw-r--r--src/fruits/cmc/meson.build19
-rw-r--r--src/fruits/cmsrv/cmsrv.c46
-rw-r--r--src/fruits/cmsrv/ui.c14
-rw-r--r--src/fruits/cmv/cmv.c25
8 files changed, 157 insertions, 81 deletions
diff --git a/src/fruits/cmc/cli.h b/src/fruits/cmc/cli.h
new file mode 100644
index 0000000..4373054
--- /dev/null
+++ b/src/fruits/cmc/cli.h
@@ -0,0 +1,4 @@
+#pragma once
+
+struct cmc_cli {
+};
diff --git a/src/fruits/cmc/cmc.c b/src/fruits/cmc/cmc.c
new file mode 100644
index 0000000..ad7c75e
--- /dev/null
+++ b/src/fruits/cmc/cmc.c
@@ -0,0 +1,98 @@
+#include <aki/common.h>
+#include <aki/event_loop.h>
+
+#include "../../libclient/client.h"
+#include "../../server/common.c"
+#include "../../portal/src/packet_ext.h"
+#include "../../portal/src/post_cache.h"
+
+#include "cmc.h"
+
+struct cmc {
+ struct aki_event_loop loop;
+ struct camu_client client;
+ struct camu_post_cache cache;
+ array(struct cmc_search *) searches;
+};
+
+static struct cmc_search *get_search_by_id(struct cmc *c, s32 id)
+{
+ struct cmc_search *search;
+ al_array_foreach(c->searches, i, search) {
+ if (search->id == id) return search;
+ }
+ return NULL;
+}
+
+static void client_callback(void *userdata, u8 op, void *opaque)
+{
+ struct cmc *c = (struct cmc *)userdata;
+ switch (op) {
+ case CAMU_CLIENT_LOGIN: {
+ camu_client_create_search(&c->client, al_str_c("youtube"), al_str_c(""));
+ break;
+ }
+ case CAMU_CLIENT_SEARCH_CREATED: {
+ struct cmc_search *search = al_alloc_object(struct cmc_search);
+ search->id = *(s32 *)opaque;
+ al_array_init(search->pages);
+ al_array_push(c->searches, search);
+ camu_client_get_page(&c->client, search->id, 0);
+ break;
+ }
+ case CAMU_CLIENT_PAGE_RESULTS: {
+ struct aki_packet *packet = (struct aki_packet *)opaque;
+ s32 id = aki_packet_read_s32(packet);
+ struct cmc_search *search = get_search_by_id(c, id);
+ if (!search) return;
+ struct cmc_search_page *page = al_alloc_object(struct cmc_search_page);
+ page->num = aki_packet_read_u32(packet);
+ u32 posts = aki_packet_read_u32(packet);
+ for (u32 i = 0; i < posts; i++) {
+ struct camu_post post;
+ aki_packet_read_post(packet, &post);
+ camu_post_cache_push(&c->cache, &post);
+ }
+ u32 ids = aki_packet_read_u32(packet);
+ for (u32 i = 0; i < ids; i++) {
+ str unique_id;
+ aki_packet_read_str(packet, &unique_id);
+ str s;
+ al_str_clone(&s, &unique_id);
+ al_array_push(page->list, s);
+ }
+ al_array_push(search->pages, page);
+ camu_client_add(&c->client, al_str_c("default"), &al_array_at(page->list, 0), 0);
+ break;
+ }
+ }
+}
+
+static struct cmc c = { 0 };
+
+#ifndef _WIN32
+s32 main(s32 argc, char *argv[])
+#else
+s32 wmain(s32 argc, wchar_t **argv)
+#endif
+{
+ (void)argc;
+ (void)argv;
+ if (!aki_common_init()) return EXIT_FAILURE;
+
+ aki_event_loop_init(&c.loop);
+
+ camu_post_cache_init(&c.cache);
+
+ al_array_init(c.searches);
+
+ c.client.callback = client_callback;
+ c.client.userdata = &c;
+ if (!camu_client_login(&c.client, &c.loop, CAMU_LOCAL_TYPE, CAMU_LOCAL_ADDR, CAMU_PORT, al_str_c("andrew"))) {
+ return EXIT_FAILURE;
+ }
+
+ aki_event_loop_run(&c.loop);
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/fruits/cmc/cmc.h b/src/fruits/cmc/cmc.h
new file mode 100644
index 0000000..a9c8544
--- /dev/null
+++ b/src/fruits/cmc/cmc.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <al/types.h>
+#include <al/array.h>
+#include <al/str.h>
+
+struct cmc_search_page {
+ u32 num;
+ array(str) list;
+};
+
+struct cmc_search {
+ s32 id;
+ array(struct cmc_search_page *) pages;
+};
diff --git a/src/fruits/cmc/cmc.py b/src/fruits/cmc/cmc.py
deleted file mode 100644
index 5c0a5b6..0000000
--- a/src/fruits/cmc/cmc.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import cffi
-import locale
-from notcurses import notcurses
-
-ffi = cffi.FFI()
-
-print(ffi.string(notcurses.lib.notcurses_version()))
-
-class CMC:
- def __init__(self):
- pass
-
-c = CMC()
-
-locale.setlocale(locale.LC_ALL, "")
-nc = notcurses.Notcurses()
-nc.render()
diff --git a/src/fruits/cmc/meson.build b/src/fruits/cmc/meson.build
new file mode 100644
index 0000000..4cbe553
--- /dev/null
+++ b/src/fruits/cmc/meson.build
@@ -0,0 +1,19 @@
+cmc_src = ['cmc.c']
+cmc_deps = [libclient]
+cmc_args = []
+
+if get_option('portal').enabled()
+ cmc_deps += [portal]
+endif
+
+use_tui = true
+if use_tui
+ #cmc_src += ['ui.c']
+ cmc_deps += [dependency('notcurses')]
+endif
+
+if is_windows and meson.is_cross_build()
+ cmc_args += ['-static', '-static-libgcc', '-static-libstdc++', '-municode', '-mwindows']
+endif
+
+executable('cmc', cmc_src, dependencies: cmc_deps, link_args: cmc_args)
diff --git a/src/fruits/cmsrv/cmsrv.c b/src/fruits/cmsrv/cmsrv.c
index 08f67dd..c6f4546 100644
--- a/src/fruits/cmsrv/cmsrv.c
+++ b/src/fruits/cmsrv/cmsrv.c
@@ -8,13 +8,9 @@
#include <aki/timer.h>
#include "../../server/server.h"
-#include "../../server/list.h"
#include "../../server/common.h"
#include "../../cache/handlers/cdio.h"
#include "../../codec/ffmpeg/common.h"
-#ifdef CAMU_LOCAL_SOCKET
-#include "../../server/local_compat.h"
-#endif
#include "ui.h"
@@ -26,7 +22,6 @@ struct cmsrv {
struct {
struct aki_socket sock;
struct aki_line_processor cli;
- struct camu_local_compat compat;
} local;
#endif
struct cmsrv_ui ui;
@@ -38,23 +33,24 @@ struct cmsrv {
static u8 server_line_callback(void *userdata, str *line)
{
struct cmsrv *s = (struct cmsrv *)userdata;
- struct camu_list *list = al_array_at(s->server.lists, 0);
+ struct lia_list *list = al_array_at(s->server.lists, 0);
if (al_str_eq(line, al_str_c(";PAUSE"))) {
- lia_list_toggle_pause(&list->impl, LIANA_SEQUENCE_ANY, -1.0);
+ lia_list_toggle_pause(list, LIANA_SEQUENCE_ANY, -1.0);
} else if (al_str_eq(line, al_str_c(";NEXT"))) {
- lia_list_skip(&list->impl, LIANA_SEQUENCE_ANY, 1);
+ lia_list_skip(list, LIANA_SEQUENCE_ANY, 1);
} else if (al_str_eq(line, al_str_c(";PREV"))) {
- lia_list_skip(&list->impl, LIANA_SEQUENCE_ANY, -1);
+ lia_list_skip(list, LIANA_SEQUENCE_ANY, -1);
} else if (al_str_eq(line, al_str_c(";SHUFFLE"))) {
- lia_list_shuffle(&list->impl);
+ lia_list_shuffle(list);
} else if (al_str_eq(line, al_str_c(";SORT"))) {
- lia_list_sort(&list->impl);
+ lia_list_sort(list);
} else if (al_str_eq(line, al_str_c(";REVERSE"))) {
- lia_list_reverse(&list->impl);
+ lia_list_reverse(list);
} else if (al_str_eq(line, al_str_c(";CLEAR"))) {
- lia_list_clear(&list->impl);
+ lia_list_clear(list);
} else {
struct aki_packet *packet = aki_packet_create();
+ aki_packet_write_u8(packet, CAMU_RESOURCE_FILE);
aki_packet_write_str(packet, line);
camu_server_local_add(&s->server, packet);
}
@@ -62,27 +58,6 @@ static u8 server_line_callback(void *userdata, str *line)
}
#endif
-static void meta_callback(void *userdata, u8 op, struct lia_list_entry *entry)
-{
- struct cmsrv *s = (struct cmsrv *)userdata;
- (void)s;
- switch (op) {
- case LIANA_META_PLAYING: {
- struct camu_server_resource *resource = (struct camu_server_resource *)entry->opaque;
-#ifdef CAMU_HAVE_PORTAL
- if (resource->post) {
- al_log_info("server", "now playing: %.*ls.", AL_WSTR_PRINTF(&resource->post->title));
- } else {
-#endif
- al_log_info("server", "now playing: %.*s.", AL_STR_PRINTF(&resource->unique_id));
-#ifdef CAMU_HAVE_PORTAL
- }
-#endif
- break;
- }
- }
-}
-
static void render_timer_callback(void *userdata, struct aki_timer *timer)
{
struct cmsrv *s = (struct cmsrv *)userdata;
@@ -161,9 +136,6 @@ s32 wmain(s32 argc, wchar_t **argv)
if (!camu_server_init(&s.server, CAMU_LOCAL_TYPE, &s.loop)) return EXIT_FAILURE;
camu_server_listen(&s.server, CAMU_LOCAL_ADDR, CAMU_PORT);
- struct camu_list *list = al_array_at(s.server.lists, 0);
- list->impl.callback = meta_callback;
- list->impl.userdata = &s;
#ifdef CAMU_LOCAL_SOCKET
s.local.sock.type = AKI_SOCKET_UNIX;
diff --git a/src/fruits/cmsrv/ui.c b/src/fruits/cmsrv/ui.c
index 48f50ca..c5cceef 100644
--- a/src/fruits/cmsrv/ui.c
+++ b/src/fruits/cmsrv/ui.c
@@ -1,7 +1,5 @@
#include <al/lib.h>
-#include "../../server/list.h"
-
#include "ui.h"
#define LOG_RATIO 1.3
@@ -112,22 +110,20 @@ static void render_lists(struct cmsrv_ui *ui)
u32 current_line = 0;
s32 entries_per_list = 10;
- struct camu_list *list;
+ struct lia_list *list;
al_array_foreach(ui->server->lists, i, list) {
if (current_line++ >= max_height) break;
char *c_str = al_str_to_c_str(&list->name);
ncplane_putnstr_yx(p, i, 0, max_width, c_str);
al_free(c_str);
- struct lia_list *impl = &list->impl;
- s32 current = (s32)impl->current;
- s32 index = AL_MAX(current - (entries_per_list / 2), 0);
- s32 size = (s32)impl->entries.size;
+ s32 index = AL_MAX(list->current - (entries_per_list / 2), 0);
+ s32 size = (s32)list->entries.size;
s32 end = AL_MIN(index + entries_per_list, size);
for (s32 j = index; j < end; j++) {
- struct lia_list_entry *entry = al_array_at(impl->entries, j);
+ struct lia_list_entry *entry = al_array_at(list->entries, j);
c_str = al_str_to_c_str(&entry->name);
u32 y = i + (j - index) + 1;
- if (j == current) {
+ if (j == list->current) {
ncplane_putchar_yx(p, y, 1, '>');
ncplane_putnstr_yx(p, y, 3, max_width - 3, c_str);
} else {
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c
index 8eaa8b7..eb96623 100644
--- a/src/fruits/cmv/cmv.c
+++ b/src/fruits/cmv/cmv.c
@@ -7,7 +7,6 @@
#include "../../codec/ffmpeg/common.h"
#ifndef CAMU_SINK_ONLY
#include "../../server/server.h"
-#include "../../server/list.h"
#else
#include "../../server/common.c"
#endif
@@ -21,19 +20,6 @@ struct cmv {
};
#ifndef CAMU_SINK_ONLY
-static void meta_callback(void *userdata, u8 op, struct lia_list_entry *entry)
-{
- struct cmv *c = (struct cmv *)userdata;
- (void)c;
- switch (op) {
- case LIANA_META_PLAYING: {
- struct camu_server_resource *resource = (struct camu_server_resource *)entry->opaque;
- al_log_info("server", "now playing: %.*s.", AL_STR_PRINTF(&resource->unique_id));
- break;
- }
- }
-}
-
static void exit_callback(void *userdata, struct camu_desktop *desktop)
{
struct cmv *c = (struct cmv *)userdata;
@@ -87,9 +73,6 @@ s32 wmain(s32 argc, wchar_t **argv)
type = AKI_SOCKET_UNIX; addr = CAMU_UNIX_LOCAL;
if (!camu_server_init(&c.server, type, &c.loop)) failure();
if (!camu_server_listen(&c.server, addr, CAMU_PORT)) failure();
- struct camu_list *list = al_array_at(c.server.lists, 0);
- list->impl.callback = meta_callback;
- list->impl.userdata = &c;
} else {
type = CAMU_LOCAL_TYPE;
addr = CAMU_LOCAL_ADDR;
@@ -108,7 +91,13 @@ s32 wmain(s32 argc, wchar_t **argv)
al_wstr_to_str(al_wstr_cr(argv[i]), &arg);
#endif
struct aki_packet *packet = aki_packet_create();
- aki_packet_write_str(packet, &arg);
+ if (al_str_at(&arg, 0) == ';') {
+ aki_packet_write_u8(packet, CAMU_RESOURCE_PORTAL);
+ aki_packet_write_str(packet, al_str_substr(&arg, 1, arg.len));
+ } else {
+ aki_packet_write_u8(packet, CAMU_RESOURCE_FILE);
+ aki_packet_write_str(packet, &arg);
+ }
camu_server_local_add(&c.server, packet);
}
}