summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-05-07 16:52:14 -0400
committerAndrew Opalach <andrew@akon.city> 2025-05-07 16:55:39 -0400
commit8f9ddafb128eabe346b48adebdeb1f34da05b005 (patch)
treea50ff8be72277bdfe942c32317805128f424040f /src/server
parentefbe4b52a22ea3c4458401a7acbce89a5bf29299 (diff)
downloadcamu-8f9ddafb128eabe346b48adebdeb1f34da05b005.tar.gz
camu-8f9ddafb128eabe346b48adebdeb1f34da05b005.tar.bz2
camu-8f9ddafb128eabe346b48adebdeb1f34da05b005.zip
Make server resource a fat entity
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/server')
-rw-r--r--src/server/common.h14
-rw-r--r--src/server/resource.h42
-rw-r--r--src/server/server.c146
3 files changed, 73 insertions, 129 deletions
diff --git a/src/server/common.h b/src/server/common.h
index 9cb9501..5b27768 100644
--- a/src/server/common.h
+++ b/src/server/common.h
@@ -39,20 +39,6 @@ enum {
CAMU_LIST_END
};
-enum {
- CAMU_RESOURCE_FILE = 0,
-#ifdef NAUNET_HAS_CURL
- CAMU_RESOURCE_HTTP,
-#endif
-#ifdef CACHE_HAVE_CDIO
- CAMU_RESOURCE_CDIO,
-#endif
-#ifdef CAMU_HAVE_PORTAL
- CAMU_RESOURCE_PORTAL,
- CAMU_RESOURCE_SIMPLE_SEARCH
-#endif
-};
-
static inline bool camu_is_url(str *s, u32 i)
{
return al_str_cmp(s, &al_str_c("https://"), i, 8) == 0
diff --git a/src/server/resource.h b/src/server/resource.h
index 3158479..cdbb42e 100644
--- a/src/server/resource.h
+++ b/src/server/resource.h
@@ -1,7 +1,21 @@
#pragma once
#include "../liana/server.h"
-#include "../liana/process.h"
+#include "../portal/src/post.h"
+
+enum {
+ CAMU_RESOURCE_FILE = 0,
+#ifdef NAUNET_HAS_CURL
+ CAMU_RESOURCE_HTTP,
+#endif
+#ifdef CACHE_HAVE_CDIO
+ CAMU_RESOURCE_CDIO,
+#endif
+#ifdef CAMU_HAVE_PORTAL
+ CAMU_RESOURCE_PORTAL,
+ CAMU_RESOURCE_SIMPLE_SEARCH
+#endif
+};
struct camu_resource {
u8 type;
@@ -10,28 +24,8 @@ struct camu_resource {
struct lia_node *node;
u64 duration;
u32 ref;
- array(struct lia_list_entry *) pending;
- struct lia_visual_data visual_data;
- struct camu_server *server;
-};
-
-struct camu_resource_file {
- struct camu_resource r;
- str path;
-};
-
-struct camu_resource_http {
- struct camu_resource r;
- str url;
-};
-
-struct camu_resource_portal {
- struct camu_resource r;
- struct camu_post *post;
+ str uri;
u32 index;
-};
-
-struct camu_resource_cdio {
- struct camu_resource r;
- u32 track;
+ struct camu_post *post;
+ array(struct lia_list_entry *) pending;
};
diff --git a/src/server/server.c b/src/server/server.c
index 0275147..6f8da78 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -12,7 +12,6 @@
#ifdef CAMU_HAVE_PORTAL
#include "../portal/src/packet_ext.h"
#endif
-#include "../codec/packet_ext.h"
#include "server.h"
#include "common.h"
@@ -79,7 +78,7 @@ static void write_list_entry(struct lia_list_entry *entry, struct nn_packet *pac
nn_packet_write_u64(packet, entry->start);
nn_packet_write_u64(packet, entry->paused_at);
nn_packet_write_u64(packet, entry->offset);
- nn_packet_write_wstr(packet, &entry->name);
+ nn_packet_write_str(packet, &entry->brief);
}
static void write_initial_user_state(struct camu_server *server, struct camu_user *user, struct nn_packet *packet)
@@ -236,20 +235,6 @@ static void process_pending(struct camu_resource *resource)
al_array_free(pending);
}
-static void send_clients_visual_data(struct camu_server *server, u32 node_id, struct lia_visual_data *visual_data)
-{
- struct camu_server_client *client;
- al_array_foreach(server->clients, i, client) {
- struct nn_packet *packet = nn_rpc_get_packet(client->conn->rpc, CAMU_CLIENT_VISUAL_DATA);
- nn_packet_write_u32(packet, node_id);
- nn_packet_write_audio_format(packet, &visual_data->fmt);
- nn_packet_write_u32(packet, visual_data->size);
- NNWT_PACKET_WRITE_DATA(packet, visual_data->samples, visual_data->size);
- nn_packet_write_u32(packet, visual_data->count);
- nn_rpc_connection_command(client->conn, packet, NULL, NULL);
- }
-}
-
static void node_callback(void *userdata, u8 op, void *opaque)
{
struct camu_resource *resource = (struct camu_resource *)userdata;
@@ -260,10 +245,6 @@ static void node_callback(void *userdata, u8 op, void *opaque)
resource->duration = duration;
break;
}
- case LIANA_NODE_VISUAL_DATA: {
- resource->visual_data = *(struct lia_visual_data *)opaque;
- break;
- }
case LIANA_NODE_ERRORED:
resource->load = LIANA_ENTRY_ERRORED;
break;
@@ -359,20 +340,17 @@ static bool prepare_server_resource(struct camu_server *server, struct camu_reso
{
struct cch_entry *entry = NULL;
switch (resource->type) {
- case CAMU_RESOURCE_FILE: {
- struct camu_resource_file *file = (struct camu_resource_file *)resource;
- entry = cch_handler_file_create(&file->path, &al_str_c("codec"));
+ case CAMU_RESOURCE_FILE:
+ entry = cch_handler_file_create(&resource->uri, &al_str_c("codec"));
if (!entry) {
resource->load = LIANA_ENTRY_ERRORED;
return false;
}
resource->load = LIANA_ENTRY_PREPARED;
break;
- }
#ifdef NAUNET_HAS_CURL
- case CAMU_RESOURCE_HTTP: {
- struct camu_resource_http *http = (struct camu_resource_http *)resource;
- entry = cch_handler_http_create(&http->url, server->loop);
+ case CAMU_RESOURCE_HTTP:
+ entry = cch_handler_http_create(&resource->uri, server->loop);
if (!entry) {
resource->load = LIANA_ENTRY_ERRORED;
return false;
@@ -380,34 +358,29 @@ static bool prepare_server_resource(struct camu_server *server, struct camu_reso
entry->handler->maybe_spawn_worker(entry->handler, 0);
resource->load = LIANA_ENTRY_PREPARED;
break;
- }
#endif
#ifdef CAMU_HAVE_PORTAL
- case CAMU_RESOURCE_PORTAL: {
- struct camu_resource_portal *portal = (struct camu_resource_portal *)resource;
- entry = entry_from_post(server, portal->post, portal->index);
+ case CAMU_RESOURCE_PORTAL:
+ entry = entry_from_post(server, resource->post, resource->index);
if (!entry) {
resource->load = LIANA_ENTRY_ERRORED;
return false;
}
resource->load = LIANA_ENTRY_PREPARED;
break;
- }
#endif
#ifdef CACHE_HAVE_CDIO
- case CAMU_RESOURCE_CDIO: {
- struct camu_resource_cdio *cdio = (struct camu_resource_cdio *)resource;
+ case CAMU_RESOURCE_CDIO:
entry = cch_handler_cdio_create();
if (!entry) {
resource->load = LIANA_ENTRY_ERRORED;
return false;
}
- cdio->track = MIN(cdio->track, entry->chapters.count);
- entry->chapter = &al_array_at(entry->chapters, cdio->track);
+ resource->index = MIN(resource->index, entry->chapters.count);
+ entry->chapter = &al_array_at(entry->chapters, resource->index);
entry->handler->maybe_spawn_worker(entry->handler, entry->chapter->start);
resource->load = LIANA_ENTRY_PREPARED;
break;
- }
#endif
}
@@ -479,7 +452,7 @@ static void list_callback(void *userdata, u8 op, struct lia_list_entry *entry, v
case LIANA_META_REMOVED_ENTRY:
break;
case LIANA_META_CURRENT_CHANGED:
- log_info("Now playing: %ls.", entry->name.data);
+ log_info("Now playing: %.*s.", al_str_x(&entry->brief));
send_clients_current_changed(server, list, entry);
break;
case LIANA_META_ORDER_CHANGED:
@@ -492,7 +465,7 @@ static void list_callback(void *userdata, u8 op, struct lia_list_entry *entry, v
send_clients_entry_seeked(server, list, entry);
break;
case LIANA_META_ENTRY_ERRORED:
- log_error("Failed to load: %ls.", entry->name.data);
+ log_error("Failed to load: %.*s.", al_str_x(&entry->brief));
break;
}
break;
@@ -594,9 +567,7 @@ static bool client_command_callback(void *userdata, struct nn_rpc_connection *co
case CAMU_CLIENT_REQUEST_VISUAL_DATA: {
u32 node_id = nn_packet_read_u32(packet);
struct camu_resource *resource = get_resource_by_node_id(server, node_id);
- if (resource) {
- send_clients_visual_data(resource->server, resource->node->id, &resource->visual_data);
- }
+ (void)resource;
break;
}
}
@@ -611,20 +582,19 @@ out:
static void simple_search_portal_callback(void *userdata0, void *userdata1, struct camu_portal_result *result)
{
struct camu_server *server = (struct camu_server *)userdata0;
- struct camu_resource_portal *portal = (struct camu_resource_portal *)userdata1;
- struct camu_resource *resource = (struct camu_resource *)portal;
+ struct camu_resource *resource = (struct camu_resource *)userdata1;
switch (result->op) {
case CAMU_CLIENT_CREATE_SEARCH:
if (result->id == -1) {
break;
}
- camu_portal_get_page(&server->bridge, result->id, 0, simple_search_portal_callback, portal);
+ camu_portal_get_page(&server->bridge, result->id, 0, simple_search_portal_callback, resource);
return;
case CAMU_CLIENT_GET_PAGE:
if (result->id == -1 || !result->page || !result->page->list.count) {
break;
}
- portal->post = camu_post_cache_get(&server->cache, &al_array_at(result->page->list, 0));
+ resource->post = camu_post_cache_get(&server->cache, &al_array_at(result->page->list, 0));
resource->type = CAMU_RESOURCE_PORTAL;
prepare_server_resource(server, resource);
process_pending(resource);
@@ -636,31 +606,41 @@ static void simple_search_portal_callback(void *userdata0, void *userdata1, stru
}
#endif
+static u8 parse_resource_type(str *line)
+{
+#if defined CAMU_HAVE_PORTAL
+ if (al_str_at(line, 0) == ';' || camu_is_url(line, 0)) {
+ return CAMU_RESOURCE_SIMPLE_SEARCH;
+#elif defined NAUNET_HAS_CURL
+ if (camu_is_url(line, 0)) {
+ return CAMU_RESOURCE_HTTP;
+#else
+ if (0) {
+#endif
+#if CACHE_HAVE_CDIO
+ } else if (al_str_cmp(line, &al_str_c("cdda://"), 0, 7) == 0) {
+ return CAMU_RESOURCE_CDIO;
+#endif
+ } else {
+ return CAMU_RESOURCE_FILE;
+ }
+}
+
static void handle_add_command(struct camu_server *server, struct lia_list *list, struct nn_packet *packet)
{
- u8 op = nn_packet_read_u8(packet);
- struct camu_resource *resource = NULL;
- wstr name;
- switch (op) {
+ struct camu_resource *resource = al_alloc_object(struct camu_resource);
+ str line;
+ nn_packet_read_str(packet, &line);
+ switch (parse_resource_type(&line)) {
case CAMU_RESOURCE_FILE: {
- str path;
- nn_packet_read_str(packet, &path);
- struct camu_resource_file *file = al_alloc_object(struct camu_resource_file);
- al_str_clone(&file->path, &path);
- al_wstr_from_str(&name, &path);
- resource = (struct camu_resource *)file;
+ al_str_clone(&resource->uri, &line);
resource->type = CAMU_RESOURCE_FILE;
resource->load = LIANA_ENTRY_UNLOADED;
break;
}
#ifdef NAUNET_HAS_CURL
case CAMU_RESOURCE_HTTP: {
- str url;
- nn_packet_read_str(packet, &url);
- struct camu_resource_http *http = al_alloc_object(struct camu_resource_http);
- al_str_clone(&http->url, &url);
- al_wstr_from_str(&name, &url);
- resource = (struct camu_resource *)http;
+ al_str_clone(&resource->uri, &line);
resource->type = CAMU_RESOURCE_HTTP;
resource->load = LIANA_ENTRY_UNLOADED;
break;
@@ -668,20 +648,15 @@ static void handle_add_command(struct camu_server *server, struct lia_list *list
#endif
#ifdef CACHE_HAVE_CDIO
case CAMU_RESOURCE_CDIO: {
- str url;
- nn_packet_read_str(packet, &url);
u32 track = 0;
- if (url.length > 7) {
+ if (line.length > 7) {
bool error;
- s64 index = al_str_to_long(&al_str_substr(&url, 7, url.length), 10, &error);
+ s64 index = al_str_to_long(&al_str_substr(&line, 7, line.length), 10, &error);
if (!error && index > 0) {
track = (u32)index - 1;
}
}
- struct camu_resource_cdio *cdio = al_alloc_object(struct camu_resource_cdio);
- cdio->track = track;
- al_wstr_from_cstr(&name, "cdio");
- resource = (struct camu_resource *)cdio;
+ resource->index = track;
resource->type = CAMU_RESOURCE_CDIO;
resource->load = LIANA_ENTRY_UNLOADED;
break;
@@ -689,37 +664,30 @@ static void handle_add_command(struct camu_server *server, struct lia_list *list
#endif
#ifdef CAMU_HAVE_PORTAL
case CAMU_RESOURCE_SIMPLE_SEARCH: {
- str search;
- nn_packet_read_str(packet, &search);
- struct camu_resource_portal *portal = al_alloc_object(struct camu_resource_portal);
- portal->post = NULL;
- al_wstr_from_str(&name, &search);
- resource = (struct camu_resource *)portal;
+ resource->post = NULL;
resource->type = CAMU_RESOURCE_SIMPLE_SEARCH;
resource->load = LIANA_ENTRY_PREPARING;
str query;
- if (al_str_at(&search, 0) == ';') { // search.
- al_str_clone(&query, &al_str_substr(&search, 1, search.length));
+ if (al_str_at(&line, 0) == ';') { // search.
+ al_str_clone(&query, &al_str_substr(&line, 1, line.length));
} else {
al_str_from(&query, "link:");
- al_str_cat(&query, &search);
+ al_str_cat(&query, &line);
}
- camu_portal_create_search(&server->bridge, &al_str_c("youtube"), &query,
- simple_search_portal_callback, portal);
+ camu_portal_create_search(&server->bridge, &al_str_c("youtube"),
+ &query, simple_search_portal_callback, resource);
al_str_free(&query);
break;
}
#endif
}
al_assert(resource);
- resource->server = server;
al_array_push(server->data.resources, resource);
resource->entry = NULL;
resource->node = NULL;
resource->duration = LIANA_TIMESTAMP_INVALID;
al_array_init(resource->pending);
- lia_list_add(list, resource, resource->duration, &name);
- al_wstr_free(&name);
+ lia_list_add(list, resource, resource->duration, &line);
}
static bool list_action_callback(void *userdata, struct nn_rpc_connection *conn,
@@ -953,13 +921,12 @@ void camu_server_free(struct camu_server *server)
al_array_free(resource->pending);
switch (resource->type) {
case CAMU_RESOURCE_FILE: {
- struct camu_resource_file *file = (struct camu_resource_file *)resource;
- al_str_free(&file->path);
- al_free(file);
+ al_str_free(&resource->uri);
break;
}
#ifdef NAUNET_HAS_CURL
case CAMU_RESOURCE_HTTP:
+ al_str_free(&resource->uri);
break;
#endif
#ifdef CACHE_HAVE_CDIO
@@ -968,17 +935,14 @@ void camu_server_free(struct camu_server *server)
#endif
#ifdef CAMU_HAVE_PORTAL
case CAMU_RESOURCE_PORTAL: {
- struct camu_resource_portal *portal = (struct camu_resource_portal *)resource;
- al_free(portal);
break;
}
case CAMU_RESOURCE_SIMPLE_SEARCH: {
- struct camu_resource_portal *portal = (struct camu_resource_portal *)resource;
- al_free(portal);
break;
}
#endif
}
+ al_free(resource);
}
al_array_free(server->data.resources);