From 303c11197f3cfddc0c8aebadae85874886c4838d Mon Sep 17 00:00:00 2001 From: oddsock Date: Thu, 26 Jun 2003 13:32:04 +0000 Subject: [PATCH] - moved add_yp_info into yp.c - most of the yp processing now moved into the yp add/touch thread - use ice/icy-public rather than ice/icy-private to coorespond to libshout and general convention - memory leak fixed with audio-info svn path=/trunk/icecast/; revision=5009 --- src/source.c | 234 +++++++++------------------------------------------ src/source.h | 1 + 2 files changed, 40 insertions(+), 195 deletions(-) diff --git a/src/source.c b/src/source.c index 3337d425..1d20df33 100644 --- a/src/source.c +++ b/src/source.c @@ -38,26 +38,10 @@ #undef CATMODULE #define CATMODULE "source" -#define YP_SERVER_NAME 1 -#define YP_SERVER_DESC 2 -#define YP_SERVER_GENRE 3 -#define YP_SERVER_URL 4 -#define YP_BITRATE 5 -#define YP_AUDIO_INFO 6 -#define YP_SERVER_TYPE 7 -#define YP_CURRENT_SONG 8 -#define YP_URL_TIMEOUT 9 -#define YP_TOUCH_INTERVAL 10 -#define YP_LAST_TOUCH 11 - /* avl tree helper */ static int _compare_clients(void *compare_arg, void *a, void *b); static int _free_client(void *key); static int _parse_audio_info(source_t *source, char *s); -#ifdef USE_YP -static void _add_yp_info(source_t *source, char *stat_name, - void *info, int type); -#endif source_t *source_create(client_t *client, connection_t *con, http_parser_t *parser, const char *mount, format_type_t type, @@ -82,6 +66,7 @@ source_t *source_create(client_t *client, connection_t *con, src->dumpfilename = NULL; src->dumpfile = NULL; src->audio_info = util_dict_new(); + src->yp_public = 0; if(mountinfo != NULL) { src->fallback_mount = mountinfo->fallback_mount; @@ -205,10 +190,10 @@ void *source_main(void *arg) #ifdef USE_YP char *s; long current_time; - char current_song[256]; int i; - int suppress_yp = 0; char *ai; + int listen_url_size; + char tyme[128]; #endif long queue_limit; @@ -274,41 +259,61 @@ void *source_main(void *arg) stats_event(source->mount, "listeners", "0"); stats_event(source->mount, "type", source->format->format_description); #ifdef USE_YP + /* ice-* is icecast, icy-* is shoutcast */ + if ((s = httpp_getvar(source->parser, "ice-url"))) { + add_yp_info(source, "server_url", s, YP_SERVER_URL); + } if ((s = httpp_getvar(source->parser, "ice-name"))) { - _add_yp_info(source, "server_name", s, YP_SERVER_NAME); + add_yp_info(source, "server_name", s, YP_SERVER_NAME); + } + if ((s = httpp_getvar(source->parser, "icy-name"))) { + add_yp_info(source, "server_name", s, YP_SERVER_NAME); } if ((s = httpp_getvar(source->parser, "ice-url"))) { - _add_yp_info(source, "server_url", s, YP_SERVER_URL); + add_yp_info(source, "server_url", s, YP_SERVER_URL); + } + if ((s = httpp_getvar(source->parser, "icy-url"))) { + add_yp_info(source, "server_url", s, YP_SERVER_URL); } if ((s = httpp_getvar(source->parser, "ice-genre"))) { - _add_yp_info(source, "genre", s, YP_SERVER_GENRE); + add_yp_info(source, "genre", s, YP_SERVER_GENRE); + } + if ((s = httpp_getvar(source->parser, "icy-genre"))) { + add_yp_info(source, "genre", s, YP_SERVER_GENRE); } if ((s = httpp_getvar(source->parser, "ice-bitrate"))) { - _add_yp_info(source, "bitrate", s, YP_BITRATE); + add_yp_info(source, "bitrate", s, YP_BITRATE); + } + if ((s = httpp_getvar(source->parser, "icy-br"))) { + add_yp_info(source, "bitrate", s, YP_BITRATE); } if ((s = httpp_getvar(source->parser, "ice-description"))) { - _add_yp_info(source, "server_description", s, YP_SERVER_DESC); + add_yp_info(source, "server_description", s, YP_SERVER_DESC); } - if ((s = httpp_getvar(source->parser, "ice-private"))) { + if ((s = httpp_getvar(source->parser, "ice-public"))) { stats_event(source->mount, "public", s); - suppress_yp = atoi(s); + source->yp_public = atoi(s); + } + if ((s = httpp_getvar(source->parser, "icy-pub"))) { + stats_event(source->mount, "public", s); + source->yp_public = atoi(s); } if ((s = httpp_getvar(source->parser, "ice-audio-info"))) { + stats_event(source->mount, "audio_info", s); if (_parse_audio_info(source, s)) { ai = util_dict_urlencode(source->audio_info, '&'); - _add_yp_info(source, "audio_info", + add_yp_info(source, "audio_info", ai, YP_AUDIO_INFO); + if (ai) { + free(ai); + } } } for (i=0;inum_yp_directories;i++) { - _add_yp_info(source, "server_type", + add_yp_info(source, "server_type", source->format->format_description, YP_SERVER_TYPE); - } - - for (i=0;inum_yp_directories;i++) { - int listen_url_size; if (source->ypdata[i]->listen_url) { free(source->ypdata[i]->listen_url); } @@ -321,23 +326,18 @@ void *source_main(void *arg) hostname, port, source->mount); } - if(!suppress_yp) { - yp_add(source, YP_ADD_ALL); + if(source->yp_public) { current_time = time(NULL); - _add_yp_info(source, "last_touch", (void *)current_time, - YP_LAST_TOUCH); - for (i=0;inum_yp_directories;i++) { /* Give the source 5 seconds to update the metadata before we do our first touch */ - source->ypdata[i]->yp_last_touch = current_time - - source->ypdata[i]->yp_touch_interval + 5; /* Don't permit touch intervals of less than 30 seconds */ if (source->ypdata[i]->yp_touch_interval <= 30) { source->ypdata[i]->yp_touch_interval = 30; } + source->ypdata[i]->yp_last_touch = 0; } } #endif @@ -345,39 +345,6 @@ void *source_main(void *arg) DEBUG0("Source creation complete"); while (global.running == ICE_RUNNING && source->running) { -#ifdef USE_YP - if(!suppress_yp) { - current_time = time(NULL); - for (i=0;inum_yp_directories;i++) { - if (current_time > (source->ypdata[i]->yp_last_touch + - source->ypdata[i]->yp_touch_interval)) { - current_song[0] = 0; - if ((s = stats_get_value(source->mount, "artist"))) { - strncat(current_song, s, - sizeof(current_song) - 1); - if (strlen(current_song) + 4 < - sizeof(current_song)) - { - strncat(current_song, " - ", 3); - } - } - if ((s = stats_get_value(source->mount, "title"))) { - if (strlen(current_song) + strlen(s) - < sizeof(current_song) -1) - { - strncat(current_song, - s, - sizeof(current_song) - 1 - - strlen(current_song)); - } - } - _add_yp_info(source, "current_song", current_song, YP_CURRENT_SONG); - thread_create("YP Touch Thread", yp_touch_thread, - (void *)source, THREAD_DETACHED); - } - } - } -#endif ret = source->format->get_buffer(source->format, NULL, 0, &refbuf); if(ret < 0) { WARN0("Bad data from source"); @@ -593,7 +560,7 @@ done: INFO1("Source \"%s\" exiting", source->mount); #ifdef USE_YP - if(!suppress_yp) { + if(source->yp_public) { yp_remove(source); } #endif @@ -731,126 +698,3 @@ static int _parse_audio_info(source_t *source, char *s) } return 1; } - -#ifdef USE_YP -static void _add_yp_info(source_t *source, char *stat_name, - void *info, int type) -{ - char *escaped; - int i; - if (!info) { - return; - } - for (i=0;inum_yp_directories;i++) { - switch (type) { - case YP_SERVER_NAME: - escaped = util_url_escape(info); - if (escaped) { - if (source->ypdata[i]->server_name) { - free(source->ypdata[i]->server_name); - } - source->ypdata[i]->server_name = - malloc(strlen((char *)escaped) +1); - strcpy(source->ypdata[i]->server_name, (char *)escaped); - stats_event(source->mount, stat_name, (char *)info); - free(escaped); - } - break; - case YP_SERVER_DESC: - escaped = util_url_escape(info); - if (escaped) { - if (source->ypdata[i]->server_desc) { - free(source->ypdata[i]->server_desc); - } - source->ypdata[i]->server_desc = - malloc(strlen((char *)escaped) +1); - strcpy(source->ypdata[i]->server_desc, (char *)escaped); - stats_event(source->mount, stat_name, (char *)info); - free(escaped); - } - break; - case YP_SERVER_GENRE: - escaped = util_url_escape(info); - if (escaped) { - if (source->ypdata[i]->server_genre) { - free(source->ypdata[i]->server_genre); - } - source->ypdata[i]->server_genre = - malloc(strlen((char *)escaped) +1); - strcpy(source->ypdata[i]->server_genre, (char *)escaped); - stats_event(source->mount, stat_name, (char *)info); - free(escaped); - } - break; - case YP_SERVER_URL: - escaped = util_url_escape(info); - if (escaped) { - if (source->ypdata[i]->server_url) { - free(source->ypdata[i]->server_url); - } - source->ypdata[i]->server_url = - malloc(strlen((char *)escaped) +1); - strcpy(source->ypdata[i]->server_url, (char *)escaped); - stats_event(source->mount, stat_name, (char *)info); - free(escaped); - } - break; - case YP_BITRATE: - escaped = util_url_escape(info); - if (escaped) { - if (source->ypdata[i]->bitrate) { - free(source->ypdata[i]->bitrate); - } - source->ypdata[i]->bitrate = - malloc(strlen((char *)escaped) +1); - strcpy(source->ypdata[i]->bitrate, (char *)escaped); - stats_event(source->mount, stat_name, (char *)info); - free(escaped); - } - break; - case YP_AUDIO_INFO: - if (source->ypdata[i]->audio_info) { - free(source->ypdata[i]->audio_info); - } - source->ypdata[i]->audio_info = - malloc(strlen((char *)info) +1); - strcpy(source->ypdata[i]->audio_info, (char *)info); - break; - case YP_SERVER_TYPE: - escaped = util_url_escape(info); - if (escaped) { - if (source->ypdata[i]->server_type) { - free(source->ypdata[i]->server_type); - } - source->ypdata[i]->server_type = - malloc(strlen((char *)escaped) +1); - strcpy(source->ypdata[i]->server_type, (char *)escaped); - free(escaped); - } - break; - case YP_CURRENT_SONG: - escaped = util_url_escape(info); - if (escaped) { - if (source->ypdata[i]->current_song) { - free(source->ypdata[i]->current_song); - } - source->ypdata[i]->current_song = - malloc(strlen((char *)escaped) +1); - strcpy(source->ypdata[i]->current_song, (char *)escaped); - stats_event(source->mount, "yp_currently_playing", (char *)info); - free(escaped); - } - break; - case YP_URL_TIMEOUT: - source->ypdata[i]->yp_url_timeout = (int)info; - break; - case YP_LAST_TOUCH: - source->ypdata[i]->yp_last_touch = (int)info; - break; - case YP_TOUCH_INTERVAL: - source->ypdata[i]->yp_touch_interval = (int)info; - break; - } - } -} -#endif diff --git a/src/source.h b/src/source.h index 8dd15f0d..40f5558a 100644 --- a/src/source.h +++ b/src/source.h @@ -38,6 +38,7 @@ typedef struct source_tag int num_yp_directories; long listeners; long max_listeners; + int yp_public; int send_return; } source_t;