diff options
Diffstat (limited to 'src/fruits')
| -rw-r--r-- | src/fruits/cmc/cli.h | 4 | ||||
| -rw-r--r-- | src/fruits/cmc/cmc.c | 98 | ||||
| -rw-r--r-- | src/fruits/cmc/cmc.h | 15 | ||||
| -rw-r--r-- | src/fruits/cmc/cmc.py | 17 | ||||
| -rw-r--r-- | src/fruits/cmc/meson.build | 19 | ||||
| -rw-r--r-- | src/fruits/cmsrv/cmsrv.c | 46 | ||||
| -rw-r--r-- | src/fruits/cmsrv/ui.c | 14 | ||||
| -rw-r--r-- | src/fruits/cmv/cmv.c | 25 |
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); } } |