diff --git a/doc/icecast2_config_file.html b/doc/icecast2_config_file.html
index cf30426f..f98854aa 100644
--- a/doc/icecast2_config_file.html
+++ b/doc/icecast2_config_file.html
@@ -347,7 +347,14 @@ If you are relaying a Shoutcast stream, you need to specify this indicator to al
<dump-file>/tmp/dump-example1.ogg</dump-file>
<fallback-mount>/example2.ogg</fallback-mount>
<fallback-override>1</fallback-override>
- <no-yp>1</no-yp>
+ <public>1</public>
+ <stream-name>My audio stream</stream-name>
+ <stream-description>My audio description</stream-description>
+ <stream-url>http://some.place.com</stream-url>
+ <genre>classical</genre>
+ <bitrate>64</bitrate>
+ <type>application/ogg</type>
+ <subtype>vorbis</subtype>
<hidden>1</hidden>
<burst-size>65536</burst-size>
<mp3-metadata-interval>4096</mp3-metadata-interval>
@@ -358,7 +365,16 @@ If you are relaying a Shoutcast stream, you need to specify this indicator to al
</mount>
-
This section contains settings which apply only to a specific mountpoint. Within this section you can reserve a specific mountpoint and set a source username/password for that mountpoint (not yet implemented) as well as specify individual settings which will apply only to the supplied mountpoint.
+
This section contains the settings which apply only to a specific mountpoint and applies to
+an incoming stream whether it is a relay or a source client. The purpose of the mount definition
+is to state certain information that can override either global/default settings or settings
+provided from the incoming stream.
+
+A mount does not need to be stated for each incoming source although you may want to
+specific certain settings like the maximum number of listeners or a mountpoint specific
+username/password. As a general rule, only define what you need to but each mount definition
+needs at least the mount-name. Changes to most of these will apply across a configuration file
+re-read even on active streams, however some only apply when the stream starts or ends.
mount-name
@@ -397,11 +413,67 @@ This multi-level fallback allows clients to cascade several mountpoints.
When enabled, this allows a connecting source client or relay on this mountpoint to move
listening clients back from the fallback mount.
-no-yp
+no-yp (deprecated)
-Setting this option prevents this mountpoint from advertising on YP. The default is 0 so YP
-advertising occurs however you may want to prevent it here if you intend listeners to connect
-to a local relay instead
+
Setting this option prevents this mountpoint from advertising on YP. The default is 0
+ so YP advertising can occur however you may want to prevent it here if you intend listeners
+ to connect to a local relay instead. Deprecated option, replaced by <public>
+
+
+public
+
+
The default setting for this is -1 indicating that it is up to the source client or
+ relay to determine if this mountpoint should advertise. A setting of 0 will prevent any
+ advertising and a setting of 1 will force it to advertise. If you do force advertising
+ you may need to set other settings listed below as the YP server can refuse to advertise
+ if there is not enough information provided.
+
+
+stream-name
+
+
Setting this will add the specified name to the stats (and therefore YP) for this
+ mountpoint even if the source client/relay provide one.
+
+
+stream-description
+
+
Setting this will add the specified description to the stats (and therefore YP) for
+ this mountpoint even if the source client/relay provide one.
+
+
+stream-url
+
+
Setting this will add the specified URL to the stats (and therefore YP) for this
+ mountpoint even if the source client/relay provide one. The URL is generally for
+ directing people to a website.
+
+
+genre
+
+
Setting this will add the specified genre to the stats (and therefore YP) for this
+ mountpoint even if the source client/relay provide one. This can be anything be using
+ certain key words can help searches in the YP directories.
+
+
+bitrate
+
+
Setting this will add the specified bitrate to the stats (and therefore YP) for this
+ mountpoint even if the source client/relay provide one. This is stated in kbps.
+
+
+type
+
+
Setting this will add the specified mime type to the stats (and therefore YP) for
+ this mountpoint even if the source client/relay provide one. It is very unlikely that
+ this will be needed.
+
+
+subtype
+
+
Setting this will add the specified subtype to the stats (and therefore YP) for
+ this mountpoint. The subtype is really to help the YP server to identify the components
+ of the type. An example setting is vorbis/theora do indicate the codecs in an Ogg stream
+
burst-size
diff --git a/src/cfgfile.c b/src/cfgfile.c
index 487016c6..dbc2251b 100644
--- a/src/cfgfile.c
+++ b/src/cfgfile.c
@@ -191,6 +191,12 @@ void config_clear(ice_config_t *c)
xmlFree(mount->password);
xmlFree(mount->dumpfile);
xmlFree(mount->fallback_mount);
+ xmlFree(mount->stream_name);
+ xmlFree(mount->stream_description);
+ xmlFree(mount->stream_url);
+ xmlFree(mount->stream_genre);
+ xmlFree(mount->bitrate);
+ xmlFree(mount->type);
if (mount->cluster_password) {
xmlFree(mount->cluster_password);
}
@@ -529,6 +535,7 @@ static void _parse_mount(xmlDocPtr doc, xmlNodePtr node,
mount->max_listeners = -1;
mount->burst_size = -1;
mount->mp3_meta_interval = -1;
+ mount->yp_public = -1;
mount->next = NULL;
do {
@@ -577,7 +584,7 @@ static void _parse_mount(xmlDocPtr doc, xmlNodePtr node,
}
else if (strcmp(node->name, "no-yp") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
- mount->no_yp = atoi(tmp);
+ mount->yp_public = atoi(tmp) == 0 ? -1 : 0;
if(tmp) xmlFree(tmp);
}
else if (strcmp(node->name, "hidden") == 0) {
@@ -635,10 +642,36 @@ static void _parse_mount(xmlDocPtr doc, xmlNodePtr node,
} else if (strcmp(node->name, "cluster-password") == 0) {
mount->cluster_password = (char *)xmlNodeListGetString(
doc, node->xmlChildrenNode, 1);
+ } else if (strcmp(node->name, "stream-name") == 0) {
+ mount->stream_name = (char *)xmlNodeListGetString(
+ doc, node->xmlChildrenNode, 1);
+ } else if (strcmp(node->name, "stream-description") == 0) {
+ mount->stream_description = (char *)xmlNodeListGetString(
+ doc, node->xmlChildrenNode, 1);
+ } else if (strcmp(node->name, "stream-url") == 0) {
+ mount->stream_url = (char *)xmlNodeListGetString(
+ doc, node->xmlChildrenNode, 1);
+ } else if (strcmp(node->name, "genre") == 0) {
+ mount->stream_genre = (char *)xmlNodeListGetString(
+ doc, node->xmlChildrenNode, 1);
+ } else if (strcmp(node->name, "bitrate") == 0) {
+ mount->bitrate = (char *)xmlNodeListGetString(
+ doc, node->xmlChildrenNode, 1);
+ } else if (strcmp(node->name, "public") == 0) {
+ tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
+ mount->yp_public = atoi (tmp);
+ if(tmp) xmlFree(tmp);
+ } else if (strcmp(node->name, "type") == 0) {
+ mount->type = (char *)xmlNodeListGetString(
+ doc, node->xmlChildrenNode, 1);
+ } else if (strcmp(node->name, "subtype") == 0) {
+ mount->subtype = (char *)xmlNodeListGetString(
+ doc, node->xmlChildrenNode, 1);
}
} while ((node = node->next));
}
+
static void _parse_relay(xmlDocPtr doc, xmlNodePtr node,
ice_config_t *configuration)
{
diff --git a/src/cfgfile.h b/src/cfgfile.h
index 5f57a648..d1077321 100644
--- a/src/cfgfile.h
+++ b/src/cfgfile.h
@@ -57,7 +57,6 @@ typedef struct _mount_proxy {
int burst_size; /* amount to send to a new client if possible, -1 take
* from global setting */
unsigned int queue_size_limit;
- int no_yp; /* Do we prevent YP on this mount */
int hidden; /* Do we list this on the xsl pages */
unsigned int source_timeout; /* source timeout in seconds */
int mp3_meta_interval; /* outgoing per-stream metadata interval */
@@ -65,6 +64,16 @@ typedef struct _mount_proxy {
char *auth_type; /* Authentication type */
char *cluster_password;
config_options_t *auth_options; /* Options for this type */
+
+ char *stream_name;
+ char *stream_description;
+ char *stream_url;
+ char *stream_genre;
+ char *bitrate;
+ char *type;
+ char *subtype;
+ int yp_public;
+
struct _mount_proxy *next;
} mount_proxy;
diff --git a/src/connection.c b/src/connection.c
index c6d604d8..78ab9b4d 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -449,6 +449,7 @@ int connection_complete_source (source_t *source)
if (global.sources < config->source_limit)
{
char *contenttype;
+ mount_proxy *mountinfo;
format_type_t format_type;
/* setup format handler */
@@ -488,11 +489,6 @@ int connection_complete_source (source_t *source)
global.sources++;
global_unlock();
- /* set global settings first */
- source->queue_size_limit = config->queue_size_limit;
- source->timeout = config->source_timeout;
- source->burst_size = config->burst_size;
-
/* for relays, we don't yet have a client, however we do require one
* to retrieve the stream from. This is created here, quite late,
* because we can't use this client to return an error code/message,
@@ -515,7 +511,11 @@ int connection_complete_source (source_t *source)
}
}
- source_update_settings (config, source);
+ source->running = 1;
+ mountinfo = config_find_mount (config, source->mount);
+ if (mountinfo == NULL)
+ source_update_settings (config, source, mountinfo);
+ source_recheck_mounts ();
config_release_config();
source->shutdown_rwlock = &_source_shutdown_rwlock;
diff --git a/src/format_mp3.c b/src/format_mp3.c
index 2a5f33b7..b145560c 100644
--- a/src/format_mp3.c
+++ b/src/format_mp3.c
@@ -201,7 +201,7 @@ static void format_mp3_apply_settings (client_t *client, format_plugin_t *format
{
mp3_state *source_mp3 = format->_state;
- if (mount->mp3_meta_interval <= 0)
+ if (mount== NULL || mount->mp3_meta_interval <= 0)
{
char *metadata = httpp_getvar (client->parser, "icy-metaint");
source_mp3->interval = -1;
@@ -214,7 +214,7 @@ static void format_mp3_apply_settings (client_t *client, format_plugin_t *format
}
else
source_mp3->interval = mount->mp3_meta_interval;
- DEBUG2 ("mp3 interval %d, %d", mount->mp3_meta_interval, source_mp3->interval);
+ DEBUG1 ("mp3 interval %d", source_mp3->interval);
}
diff --git a/src/source.c b/src/source.c
index eb8a2245..f8615f38 100644
--- a/src/source.c
+++ b/src/source.c
@@ -240,8 +240,6 @@ void source_clear_source (source_t *source)
source->no_mount = 0;
source->shoutcast_compat = 0;
source->max_listeners = -1;
- source->yp_public = 0;
- source->yp_prevent = 0;
source->hidden = 0;
source->client_stats_update = 0;
util_dict_free (source->audio_info);
@@ -514,7 +512,6 @@ static void source_init (source_t *source)
ice_config_t *config = config_get_config();
char *listenurl, *str;
int listen_url_size;
- char *s;
/* 6 for max size of port */
listen_url_size = strlen("http://") + strlen(config->hostname) +
@@ -526,23 +523,6 @@ static void source_init (source_t *source)
config->hostname, config->port, source->mount);
config_release_config();
- do
- {
- str = "0";
- if (source->yp_prevent)
- break;
- if ((str = httpp_getvar(source->parser, "ice-public")))
- break;
- if ((str = httpp_getvar(source->parser, "icy-pub")))
- break;
- /* handle header from icecast v2 release */
- if ((str = httpp_getvar(source->parser, "icy-public")))
- break;
- str = "0";
- } while (0);
- source->yp_public = atoi (str);
- stats_event (source->mount, "public", str);
-
str = httpp_getvar(source->parser, "ice-audio-info");
source->audio_info = util_dict_new();
if (str)
@@ -601,23 +581,6 @@ static void source_init (source_t *source)
avl_tree_unlock(global.source_tree);
}
- slave_rebuild_mounts ();
- if (source->yp_public) {
- yp_add (source);
- }
- else {
- /* If we are a private server, see if ic*-name and description
- is provided, and if so, add them to the stats */
- if ((s = httpp_getvar(source->parser, "ice-name"))) {
- stats_event (source->mount, "server_name", s);
- }
- if ((s = httpp_getvar(source->parser, "icy-name"))) {
- stats_event (source->mount, "server_name", s);
- }
- if ((s = httpp_getvar(source->parser, "ice-description"))) {
- stats_event (source->mount, "server_description", s);
- }
- }
}
@@ -882,64 +845,202 @@ static void _parse_audio_info (source_t *source, const char *s)
/* Apply the mountinfo details to the source */
static void source_apply_mount (source_t *source, mount_proxy *mountinfo)
{
+ char *str;
+ int val;
+ http_parser_t *parser = NULL;
+
DEBUG1("Applying mount information for \"%s\"", source->mount);
- source->max_listeners = mountinfo->max_listeners;
- source->fallback_override = mountinfo->fallback_override;
- source->no_mount = mountinfo->no_mount;
- source->hidden = mountinfo->hidden;
- stats_event_hidden (source->mount, NULL, source->hidden);
+ if (mountinfo)
+ {
+ source->max_listeners = mountinfo->max_listeners;
+ source->fallback_override = mountinfo->fallback_override;
+ source->no_mount = mountinfo->no_mount;
+ source->hidden = mountinfo->hidden;
+ }
- if (mountinfo->fallback_mount)
+ /* if a setting is available in the mount details then use it, else
+ * check the parser details. */
+
+ if (source->client)
+ parser = source->client->parser;
+
+ /* public */
+ if (mountinfo && mountinfo->yp_public >= 0)
+ val = mountinfo->yp_public;
+ else
+ {
+ do {
+ str = httpp_getvar (parser, "ice-public");
+ if (str) break;
+ str = httpp_getvar (parser, "icy-pub");
+ if (str) break;
+ str = httpp_getvar (parser, "x-audiocast-public");
+ if (str) break;
+ /* handle header from icecast v2 release */
+ str = httpp_getvar (parser, "icy-public");
+ if (str) break;
+ str = "0";
+ } while (0);
+ val = atoi (str);
+ }
+ stats_event_args (source->mount, "public", "%d", val);
+ if (source->yp_public != val)
+ {
+ DEBUG1 ("YP changed to %d", val);
+ if (val)
+ yp_add (source->mount);
+ else
+ yp_remove (source->mount);
+ source->yp_public = val;
+ }
+
+ /* stream name */
+ if (mountinfo && mountinfo->stream_name)
+ str = mountinfo->stream_name;
+ else
+ {
+ do {
+ str = httpp_getvar (parser, "ice-name");
+ if (str) break;
+ str = httpp_getvar (parser, "icy-name");
+ if (str) break;
+ str = httpp_getvar (parser, "x-audiocast-name");
+ if (str) break;
+ str = "Unspecified name";
+ } while (0);
+ }
+ stats_event (source->mount, "server_name", str);
+
+ /* stream description */
+ if (mountinfo && mountinfo->stream_description)
+ str = mountinfo->stream_description;
+ else
+ {
+ do {
+ str = httpp_getvar (parser, "ice-description");
+ if (str) break;
+ str = httpp_getvar (parser, "icy-description");
+ if (str) break;
+ str = httpp_getvar (parser, "x-audiocast-description");
+ if (str) break;
+ str = "Unspecified description";
+ } while (0);
+ }
+ stats_event (source->mount, "server_description", str);
+
+ /* stream URL */
+ if (mountinfo && mountinfo->stream_url)
+ str = mountinfo->stream_url;
+ else
+ {
+ do {
+ str = httpp_getvar (parser, "ice-url");
+ if (str) break;
+ str = httpp_getvar (parser, "icy-url");
+ if (str) break;
+ str = httpp_getvar (parser, "x-audiocast-url");
+ if (str) break;
+ } while (0);
+ }
+ stats_event (source->mount, "server_url", str);
+
+ /* stream genre */
+ if (mountinfo && mountinfo->stream_genre)
+ str = mountinfo->stream_genre;
+ else
+ {
+ do {
+ str = httpp_getvar (parser, "ice-genre");
+ if (str) break;
+ str = httpp_getvar (parser, "icy-genre");
+ if (str) break;
+ str = httpp_getvar (parser, "x-audiocast-genre");
+ if (str) break;
+ str = "various";
+ } while (0);
+ }
+ stats_event (source->mount, "genre", str);
+
+ /* stream bitrate */
+ if (mountinfo && mountinfo->bitrate)
+ str = mountinfo->bitrate;
+ else
+ {
+ do {
+ str = httpp_getvar (parser, "ice-bitrate");
+ if (str) break;
+ str = httpp_getvar (parser, "icy-br");
+ if (str) break;
+ str = httpp_getvar (parser, "x-audiocast-bitrate");
+ } while (0);
+ }
+ stats_event (source->mount, "bitrate", str);
+
+ /* handle MIME-type */
+ if (mountinfo && mountinfo->type)
+ stats_event (source->mount, "server_type", mountinfo->type);
+ else
+ if (source->format)
+ stats_event (source->mount, "server_type", source->format->contenttype);
+
+ if (mountinfo && mountinfo->subtype)
+ stats_event (source->mount, "subtype", mountinfo->subtype);
+
+ if (mountinfo && mountinfo->fallback_mount)
+ {
+ char *mount = source->fallback_mount;
source->fallback_mount = strdup (mountinfo->fallback_mount);
+ free (mount);
+ }
+ else
+ source->fallback_mount = NULL;
- if (mountinfo->auth_type != NULL)
+ if (mountinfo && mountinfo->auth_type != NULL && source->authenticator == NULL)
{
source->authenticator = auth_get_authenticator(
mountinfo->auth_type, mountinfo->auth_options);
stats_event(source->mount, "authenticator", mountinfo->auth_type);
}
- if (mountinfo->dumpfile)
- {
- free (source->dumpfilename);
- source->dumpfilename = strdup (mountinfo->dumpfile);
- }
- if (mountinfo->queue_size_limit)
+ if (mountinfo && mountinfo->dumpfile)
+ {
+ char *filename = source->dumpfilename;
+ source->dumpfilename = strdup (mountinfo->dumpfile);
+ free (filename);
+ }
+ else
+ source->dumpfilename = NULL;
+
+ if (mountinfo && mountinfo->queue_size_limit)
source->queue_size_limit = mountinfo->queue_size_limit;
- if (mountinfo->source_timeout)
+ if (mountinfo && mountinfo->source_timeout)
source->timeout = mountinfo->source_timeout;
- if (mountinfo->burst_size >= 0)
+ if (mountinfo && mountinfo->burst_size >= 0)
source->burst_size = (unsigned int)mountinfo->burst_size;
- if (mountinfo->no_yp)
- source->yp_prevent = 1;
-
if (source->format && source->format->apply_settings)
source->format->apply_settings (source->client, source->format, mountinfo);
}
-void source_update_settings (ice_config_t *config, source_t *source)
+/* update the specified source with details from the config or mount.
+ * mountinfo can be NULL in which case default settings should be taken
+ */
+void source_update_settings (ice_config_t *config, source_t *source, mount_proxy *mountinfo)
{
- mount_proxy *mountinfo = config_find_mount (config, source->mount);
-
/* set global settings first */
source->queue_size_limit = config->queue_size_limit;
source->timeout = config->source_timeout;
source->burst_size = config->burst_size;
- source->dumpfilename = NULL;
- if (mountinfo)
- source_apply_mount (source, mountinfo);
+ source_apply_mount (source, mountinfo);
if (source->fallback_mount)
DEBUG1 ("fallback %s", source->fallback_mount);
if (source->dumpfilename)
DEBUG1 ("Dumping stream to %s", source->dumpfilename);
- if (source->yp_prevent)
- DEBUG0 ("preventing YP listings");
if (source->hidden)
{
stats_event_hidden (source->mount, NULL, 1);
@@ -1006,33 +1107,19 @@ void source_recheck_mounts (void)
while (mount)
{
- int update_stats = 0;
- int hidden;
source_t *source = source_find_mount (mount->mountname);
- hidden = mount->hidden;
if (source)
- {
- /* something is active, maybe a fallback */
- if (strcmp (source->mount, mount->mountname) == 0)
- {
- /* this is for inactive relays */
- if (source->running == 0)
- update_stats = 1;
- }
- else
- update_stats = 1;
- }
- else
- stats_event (mount->mountname, NULL, NULL);
- if (update_stats)
{
source = source_find_mount_raw (mount->mountname);
if (source)
- source_update_settings (config, source);
+ {
+ mount_proxy *mountinfo = config_find_mount (config, source->mount);
+ source_update_settings (config, source, mountinfo);
+ }
else
{
- stats_event_hidden (mount->mountname, NULL, hidden);
+ stats_event_hidden (mount->mountname, NULL, mount->hidden);
stats_event (mount->mountname, "listeners", "0");
if (mount->max_listeners < 0)
stats_event (mount->mountname, "max_listeners", "unlimited");
@@ -1040,6 +1127,8 @@ void source_recheck_mounts (void)
stats_event_args (mount->mountname, "max_listeners", "%d", mount->max_listeners);
}
}
+ else
+ stats_event (mount->mountname, NULL, NULL);
mount = mount->next;
}
diff --git a/src/source.h b/src/source.h
index ffd589a2..83b1fecb 100644
--- a/src/source.h
+++ b/src/source.h
@@ -78,7 +78,7 @@ typedef struct source_tag
source_t *source_reserve (const char *mount);
void *source_client_thread (void *arg);
-void source_update_settings (ice_config_t *config, source_t *source);
+void source_update_settings (ice_config_t *config, source_t *source, mount_proxy *mountinfo);
void source_clear_source (source_t *source);
source_t *source_find_mount(const char *mount);
source_t *source_find_mount_raw(const char *mount);
diff --git a/src/yp.c b/src/yp.c
index a1c0f768..f325c2ec 100644
--- a/src/yp.c
+++ b/src/yp.c
@@ -92,7 +92,7 @@ static time_t now;
static thread_type *yp_thread;
static void *yp_update_thread(void *arg);
-static void add_yp_info (ypdata_t *yp, char *stat_name, void *info, int type);
+static void add_yp_info (ypdata_t *yp, void *info, int type);
static unsigned do_yp_remove (ypdata_t *yp, char *s, unsigned len);
static unsigned do_yp_add (ypdata_t *yp, char *s, unsigned len);
static unsigned do_yp_touch (ypdata_t *yp, char *s, unsigned len);
@@ -334,12 +334,37 @@ static unsigned do_yp_add (ypdata_t *yp, char *s, unsigned len)
int ret;
char *value;
+ value = stats_get_value (yp->mount, "server_type");
+ add_yp_info (yp, value, YP_SERVER_TYPE);
+ free (value);
+
+ value = stats_get_value (yp->mount, "server_name");
+ add_yp_info (yp, value, YP_SERVER_NAME);
+ free (value);
+
+ value = stats_get_value (yp->mount, "server_url");
+ add_yp_info (yp, value, YP_SERVER_URL);
+ free (value);
+
+ value = stats_get_value (yp->mount, "genre");
+ add_yp_info (yp, value, YP_SERVER_GENRE);
+ free (value);
+
+ value = stats_get_value (yp->mount, "bitrate");
+ add_yp_info (yp, value, YP_BITRATE);
+ free (value);
+
+ value = stats_get_value (yp->mount, "server_description");
+ add_yp_info (yp, value, YP_SERVER_DESC);
+ free (value);
+
value = stats_get_value (yp->mount, "subtype");
- if (value)
- {
- add_yp_info (yp, "subtype", value, YP_SUBTYPE);
- free (value);
- }
+ add_yp_info (yp, value, YP_SUBTYPE);
+ free (value);
+
+ value = stats_get_value (yp->mount, "audio_info");
+ add_yp_info (yp, value, YP_AUDIO_INFO);
+ free (value);
ret = snprintf (s, len, "action=add&sn=%s&genre=%s&cpswd=%s&desc="
"%s&url=%s&listenurl=%s&type=%s&stype=%s&b=%s&%s\r\n",
@@ -382,7 +407,8 @@ static unsigned do_yp_touch (ypdata_t *yp, char *s, unsigned len)
if (song)
{
sprintf (song, "%s%s%s", artist, separator, title);
- add_yp_info(yp, "yp_currently_playing", song, YP_CURRENT_SONG);
+ add_yp_info(yp, song, YP_CURRENT_SONG);
+ stats_event (yp->mount, "yp_currently_playing", song);
free (song);
}
}
@@ -404,7 +430,7 @@ static unsigned do_yp_touch (ypdata_t *yp, char *s, unsigned len)
val = stats_get_value (yp->mount, "subtype");
if (val)
{
- add_yp_info (yp, "subtype", val, YP_SUBTYPE);
+ add_yp_info (yp, val, YP_SUBTYPE);
free (val);
}
@@ -472,13 +498,11 @@ static void yp_process_server (struct yp_server *server)
-static ypdata_t *create_yp_entry (source_t *source)
+static ypdata_t *create_yp_entry (const char *mount)
{
ypdata_t *yp;
char *s;
- if (source->running == 0 || source->yp_public == 0)
- return NULL;
yp = calloc (1, sizeof (ypdata_t));
do
{
@@ -490,7 +514,7 @@ static ypdata_t *create_yp_entry (source_t *source)
if (yp == NULL)
break;
- yp->mount = strdup (source->mount);
+ yp->mount = strdup (mount);
yp->server_name = strdup ("");
yp->server_desc = strdup ("");
yp->server_genre = strdup ("");
@@ -507,17 +531,17 @@ static ypdata_t *create_yp_entry (source_t *source)
if (url == NULL)
break;
config = config_get_config();
- ret = snprintf (url, len, "http://%s:%d%s", config->hostname, config->port, source->mount);
+ ret = snprintf (url, len, "http://%s:%d%s", config->hostname, config->port, mount);
if (ret >= (signed)len)
{
s = realloc (url, ++ret);
if (s) url = s;
- snprintf (url, ret, "http://%s:%d%s", config->hostname, config->port, source->mount);
+ snprintf (url, ret, "http://%s:%d%s", config->hostname, config->port, mount);
}
- mountproxy = config_find_mount (config, source->mount);
+ mountproxy = config_find_mount (config, mount);
if (mountproxy && mountproxy->cluster_password)
- add_yp_info (yp, "cluster_password", mountproxy->cluster_password, YP_CLUSTER_PASSWORD);
+ add_yp_info (yp, mountproxy->cluster_password, YP_CLUSTER_PASSWORD);
config_release_config();
yp->listen_url = util_url_escape (url);
@@ -525,39 +549,6 @@ static ypdata_t *create_yp_entry (source_t *source)
if (yp->listen_url == NULL)
break;
- /* ice-* is icecast, icy-* is shoutcast */
- add_yp_info (yp, "server_type", source->format->contenttype, YP_SERVER_TYPE);
- if ((s = httpp_getvar(source->parser, "ice-name"))) {
- add_yp_info (yp, "server_name", s, YP_SERVER_NAME);
- }
- if ((s = httpp_getvar(source->parser, "icy-name"))) {
- add_yp_info (yp, "server_name", s, YP_SERVER_NAME);
- }
- if ((s = httpp_getvar(source->parser, "ice-url"))) {
- add_yp_info(yp, "server_url", s, YP_SERVER_URL);
- }
- if ((s = httpp_getvar(source->parser, "icy-url"))) {
- add_yp_info(yp, "server_url", s, YP_SERVER_URL);
- }
- if ((s = httpp_getvar(source->parser, "ice-genre"))) {
- add_yp_info(yp, "genre", s, YP_SERVER_GENRE);
- }
- if ((s = httpp_getvar(source->parser, "icy-genre"))) {
- add_yp_info(yp, "genre", s, YP_SERVER_GENRE);
- }
- if ((s = httpp_getvar(source->parser, "ice-bitrate"))) {
- add_yp_info(yp, "bitrate", s, YP_BITRATE);
- }
- if ((s = httpp_getvar(source->parser, "icy-br"))) {
- add_yp_info(yp, "bitrate", s, YP_BITRATE);
- }
- if ((s = httpp_getvar(source->parser, "ice-description"))) {
- add_yp_info(yp, "server_description", s, YP_SERVER_DESC);
- }
- s = util_dict_urlencode (source->audio_info, '&');
- if (s)
- add_yp_info (yp, "audio_info", s, YP_AUDIO_INFO);
- free(s);
return yp;
} while (0);
@@ -606,7 +597,7 @@ static void check_servers ()
ypdata_t *yp;
source_t *source = node->key;
- if ((yp = create_yp_entry (source)) != NULL)
+ if ((yp = create_yp_entry (source->mount)) != NULL)
{
DEBUG1 ("Adding existing mount %s", source->mount);
yp->server = server;
@@ -764,7 +755,7 @@ static void yp_destroy_ypdata(ypdata_t *ypdata)
}
}
-static void add_yp_info (ypdata_t *yp, char *stat_name, void *info, int type)
+static void add_yp_info (ypdata_t *yp, void *info, int type)
{
char *escaped;
@@ -780,7 +771,6 @@ static void add_yp_info (ypdata_t *yp, char *stat_name, void *info, int type)
if (yp->server_name)
free (yp->server_name);
yp->server_name = escaped;
- stats_event (yp->mount, stat_name, (char *)info);
}
break;
case YP_SERVER_DESC:
@@ -790,7 +780,6 @@ static void add_yp_info (ypdata_t *yp, char *stat_name, void *info, int type)
if (yp->server_desc)
free (yp->server_desc);
yp->server_desc = escaped;
- stats_event(yp->mount, stat_name, (char *)info);
}
break;
case YP_SERVER_GENRE:
@@ -800,7 +789,6 @@ static void add_yp_info (ypdata_t *yp, char *stat_name, void *info, int type)
if (yp->server_genre)
free (yp->server_genre);
yp->server_genre = escaped;
- stats_event (yp->mount, stat_name, (char *)info);
}
break;
case YP_SERVER_URL:
@@ -810,7 +798,6 @@ static void add_yp_info (ypdata_t *yp, char *stat_name, void *info, int type)
if (yp->url)
free (yp->url);
yp->url = escaped;
- stats_event (yp->mount, stat_name, (char *)info);
}
break;
case YP_BITRATE:
@@ -820,13 +807,15 @@ static void add_yp_info (ypdata_t *yp, char *stat_name, void *info, int type)
if (yp->bitrate)
free (yp->bitrate);
yp->bitrate = escaped;
- stats_event (yp->mount, stat_name, (char *)info);
}
break;
case YP_AUDIO_INFO:
- if (yp->audio_info)
+ escaped = util_url_escape(info);
+ if (escaped)
+ {
free (yp->audio_info);
- yp->audio_info = strdup (info);
+ yp->audio_info = escaped;
+ }
break;
case YP_SERVER_TYPE:
escaped = util_url_escape(info);
@@ -844,7 +833,6 @@ static void add_yp_info (ypdata_t *yp, char *stat_name, void *info, int type)
if (yp->current_song)
free (yp->current_song);
yp->current_song = escaped;
- stats_event (yp->mount, "yp_currently_playing", (char *)info);
}
break;
case YP_CLUSTER_PASSWORD:
@@ -869,7 +857,7 @@ static void add_yp_info (ypdata_t *yp, char *stat_name, void *info, int type)
/* Add YP entries to active servers */
-void yp_add (source_t *source)
+void yp_add (const char *mount)
{
struct yp_server *server;
@@ -883,9 +871,9 @@ void yp_add (source_t *source)
{
ypdata_t *yp;
/* add new ypdata to each servers pending yp */
- if ((yp = create_yp_entry (source)) != NULL)
+ if ((yp = create_yp_entry (mount)) != NULL)
{
- DEBUG2 ("Adding %s to %s", source->mount, server->url);
+ DEBUG2 ("Adding %s to %s", mount, server->url);
yp->server = server;
yp->touch_interval = server->touch_interval;
yp->next = server->pending_mounts;
diff --git a/src/yp.h b/src/yp.h
index fc35f723..896b5bbf 100644
--- a/src/yp.h
+++ b/src/yp.h
@@ -25,12 +25,10 @@
#define YP_CLUSTER_PASSWORD 9
#define YP_SUBTYPE 10
-struct source_tag;
-
#define YP_ADD_ALL -1
#ifdef USE_YP
-void yp_add (struct source_tag *source);
+void yp_add (const char *mount);
void yp_remove (const char *mount);
void yp_touch (const char *mount);
void yp_recheck_config (ice_config_t *config);