aboutsummaryrefslogtreecommitdiffstats
path: root/src/input_curl.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-01-03 23:29:45 +0100
committerMax Kellermann <max@duempel.org>2009-01-03 23:29:45 +0100
commit700bd44fdaaa0b3ebc6924180daae8f5105d0cd8 (patch)
tree88455844f452f7b49fac139d39a823e7e5b8ffa0 /src/input_curl.c
parent4be479d20c2f81fb0303106b7080af93b3c456c6 (diff)
downloadmpd-700bd44fdaaa0b3ebc6924180daae8f5105d0cd8.tar.gz
mpd-700bd44fdaaa0b3ebc6924180daae8f5105d0cd8.tar.xz
mpd-700bd44fdaaa0b3ebc6924180daae8f5105d0cd8.zip
input_stream: added tag() method
The tag() method reads a tag from the stream. This replaces the meta_name and meta_title attributes.
Diffstat (limited to '')
-rw-r--r--src/input_curl.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/input_curl.c b/src/input_curl.c
index eb2550c6d..93c12d98e 100644
--- a/src/input_curl.c
+++ b/src/input_curl.c
@@ -20,6 +20,7 @@
#include "input_stream.h"
#include "dlist.h"
#include "config.h"
+#include "tag.h"
#include <assert.h>
#include <sys/select.h>
@@ -73,6 +74,13 @@ struct input_curl {
/** error message provided by libcurl */
char error[CURL_ERROR_SIZE];
+
+ /** the stream name from the icy-name response header */
+ char *meta_name;
+
+ /** the tag object ready to be requested via
+ input_stream_tag() */
+ struct tag *tag;
};
/** libcurl should accept "ICY 200 OK" */
@@ -137,6 +145,9 @@ input_curl_free(struct input_stream *is)
{
struct input_curl *c = is->data;
+ if (c->tag != NULL)
+ tag_free(c->tag);
+
input_curl_easy_free(c);
if (c->multi != NULL)
@@ -146,6 +157,16 @@ input_curl_free(struct input_stream *is)
g_free(c);
}
+static struct tag *
+input_curl_tag(struct input_stream *is)
+{
+ struct input_curl *c = is->data;
+ struct tag *tag = c->tag;
+
+ c->tag = NULL;
+ return tag;
+}
+
static bool
input_curl_multi_info_read(struct input_stream *is)
{
@@ -367,6 +388,7 @@ static size_t
input_curl_headerfunction(void *ptr, size_t size, size_t nmemb, void *stream)
{
struct input_stream *is = stream;
+ struct input_curl *c = is->data;
const char *header = ptr, *end, *value;
char name[64];
@@ -410,8 +432,14 @@ input_curl_headerfunction(void *ptr, size_t size, size_t nmemb, void *stream)
} else if (strcasecmp(name, "icy-name") == 0 ||
strcasecmp(name, "ice-name") == 0 ||
strcasecmp(name, "x-audiocast-name") == 0) {
- g_free(is->meta_name);
- is->meta_name = g_strndup(value, end - value);
+ g_free(c->meta_name);
+ c->meta_name = g_strndup(value, end - value);
+
+ if (c->tag != NULL)
+ tag_free(c->tag);
+
+ c->tag = tag_new();
+ tag_add_item(c->tag, TAG_ITEM_NAME, c->meta_name);
}
return size;
@@ -691,6 +719,8 @@ input_curl_open(struct input_stream *is, const char *url)
return false;
}
+ c->tag = NULL;
+
ret = input_curl_easy_init(is);
if (!ret) {
input_curl_free(is);
@@ -709,6 +739,7 @@ input_curl_open(struct input_stream *is, const char *url)
const struct input_plugin input_plugin_curl = {
.open = input_curl_open,
.close = input_curl_close,
+ .tag = input_curl_tag,
.buffer = input_curl_buffer,
.read = input_curl_read,
.eof = input_curl_eof,