1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2024-12-04 14:46:30 -05:00

Merge branch 'update-icy-metadata' into devel

This commit is contained in:
Philipp Schafft 2022-02-25 23:40:31 +00:00
commit abfd3c51a3
3 changed files with 63 additions and 22 deletions

View File

@ -1164,6 +1164,10 @@ static void command_metadata(client_t *client,
if (same_ip && plugin && plugin->set_tag) { if (same_ip && plugin && plugin->set_tag) {
if (song) { if (song) {
if (artist || title) {
ICECAST_LOG_WARN("Metadata request mountpoint %H contains \"song\" but also \"artist\" and/or \"title\"", source->mount);
}
plugin->set_tag (plugin, "song", song, charset); plugin->set_tag (plugin, "song", song, charset);
ICECAST_LOG_INFO("Metadata on mountpoint %H changed to \"%H\"", source->mount, song); ICECAST_LOG_INFO("Metadata on mountpoint %H changed to \"%H\"", source->mount, song);
} else { } else {

View File

@ -24,6 +24,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h>
#include <string.h> #include <string.h>
#ifdef HAVE_STRINGS_H #ifdef HAVE_STRINGS_H
# include <strings.h> # include <strings.h>
@ -137,11 +138,16 @@ static void mp3_set_tag (format_plugin_t *plugin, const char *tag, const char *i
return; return;
} }
if (in_value) if (in_value) {
{ if (!charset)
value = util_conv_string (in_value, charset, plugin->charset); charset = plugin->charset;
value = util_conv_string (in_value, charset, "UTF-8");
if (value == NULL) if (value == NULL)
value = strdup (in_value); value = strdup(in_value);
} else {
thread_mutex_unlock(&source_mp3->url_lock);
return;
} }
if (strcmp(tag, "title") == 0 || strcmp(tag, "song") == 0) { if (strcmp(tag, "title") == 0 || strcmp(tag, "song") == 0) {
@ -159,7 +165,7 @@ static void mp3_set_tag (format_plugin_t *plugin, const char *tag, const char *i
} }
static void filter_shoutcast_metadata (source_t *source, char *metadata, unsigned int meta_len) static void filter_shoutcast_metadata (source_t *source, char *metadata, unsigned int meta_len, bool update_vc)
{ {
if (metadata) if (metadata)
{ {
@ -181,7 +187,8 @@ static void filter_shoutcast_metadata (source_t *source, char *metadata, unsigne
logging_playlist (source->mount, p, source->listeners); logging_playlist (source->mount, p, source->listeners);
stats_event_conv (source->mount, "title", p, source->format->charset); stats_event_conv (source->mount, "title", p, source->format->charset);
stats_event_conv (source->mount, "display-title", p, source->format->charset); stats_event_conv (source->mount, "display-title", p, source->format->charset);
format_set_vorbiscomment(source->format, MP3_METADATA_TITLE, p); if (update_vc)
format_set_vorbiscomment(source->format, MP3_METADATA_TITLE, p);
yp_touch (source->mount); yp_touch (source->mount);
free (p); free (p);
playlist_push_track(source->history, &source->format->vc); playlist_push_track(source->history, &source->format->vc);
@ -218,8 +225,10 @@ static void format_mp3_apply_settings (client_t *client, format_plugin_t *format
} }
} }
if (format->charset == NULL) if (format->charset == NULL) {
format->charset = strdup ("ISO8859-1"); ICECAST_LOG_INFO("No charset given for mount %#H with source client %zu, assuming ISO8859-1", mount ? mount->mountname : NULL, client->con->id);
format->charset = strdup("ISO8859-1");
}
ICECAST_LOG_DEBUG("sending metadata interval %d", source_mp3->interval); ICECAST_LOG_DEBUG("sending metadata interval %d", source_mp3->interval);
ICECAST_LOG_DEBUG("charset %s", format->charset); ICECAST_LOG_DEBUG("charset %s", format->charset);
@ -233,38 +242,56 @@ static void mp3_set_title(source_t *source)
{ {
const char streamtitle[] = "StreamTitle='"; const char streamtitle[] = "StreamTitle='";
const char streamurl[] = "StreamUrl='"; const char streamurl[] = "StreamUrl='";
const char *url_artist = vorbis_comment_query(&source->format->vc, MP3_METADATA_ARTIST, 0); const char *in_url_artist = vorbis_comment_query(&source->format->vc, MP3_METADATA_ARTIST, 0);
const char *url_title = vorbis_comment_query(&source->format->vc, MP3_METADATA_TITLE, 0); const char *in_url_title = vorbis_comment_query(&source->format->vc, MP3_METADATA_TITLE, 0);
const char *url = vorbis_comment_query(&source->format->vc, MP3_METADATA_URL, 0); const char *in_url = vorbis_comment_query(&source->format->vc, MP3_METADATA_URL, 0);
char *url_artist = NULL;
char *url_title = NULL;
char *url = NULL;
size_t size; size_t size;
unsigned char len_byte; unsigned char len_byte;
refbuf_t *p; refbuf_t *p;
unsigned int len = sizeof(streamtitle) + 2; /* the StreamTitle, quotes, ; and null */ unsigned int len = sizeof(streamtitle) + 2; /* the StreamTitle, quotes, ; and null */
mp3_state *source_mp3 = source->format->_state; mp3_state *source_mp3 = source->format->_state;
const char *charset = source->format->charset;
/* make sure the url data does not disappear from under us */ /* make sure the url data does not disappear from under us */
thread_mutex_lock (&source_mp3->url_lock); thread_mutex_lock (&source_mp3->url_lock);
/* work out message length */ /* work out message length */
if (url_artist) if (in_url_artist) {
len += strlen (url_artist); url_artist = util_conv_string(in_url_artist, "UTF-8", charset);
if (url_title) if (url_artist)
len += strlen (url_title); len += strlen(url_artist);
}
if (in_url_title) {
url_title = util_conv_string(in_url_title, "UTF-8", charset);
if (url_title)
len += strlen(url_title);
}
if (url_artist && url_title) if (url_artist && url_title)
len += 3; len += 3;
if (source_mp3->inline_url)
{ if (source_mp3->inline_url) {
char *end = strstr (source_mp3->inline_url, "';"); char *end = strstr (source_mp3->inline_url, "';");
if (end) if (end)
len += end - source_mp3->inline_url+2; len += end - source_mp3->inline_url+2;
} else if (in_url) {
url = util_conv_string(in_url, "UTF-8", charset);
if (url)
len += strlen(url) + strlen(streamurl) + 2;
} }
else if (url)
len += strlen (url) + strlen (streamurl) + 2;
#define MAX_META_LEN 255*16 #define MAX_META_LEN 255*16
if (len > MAX_META_LEN) if (len > MAX_META_LEN)
{ {
thread_mutex_unlock (&source_mp3->url_lock); thread_mutex_unlock (&source_mp3->url_lock);
ICECAST_LOG_WARN("Metadata too long at %d chars", len); ICECAST_LOG_WARN("Metadata too long at %d chars", len);
free(url_artist);
free(url_title);
free(url);
return; return;
} }
/* work out the metadata len byte */ /* work out the metadata len byte */
@ -304,12 +331,16 @@ static void mp3_set_title(source_t *source)
snprintf (p->data+r, size-r, "StreamUrl='%s';", url); snprintf (p->data+r, size-r, "StreamUrl='%s';", url);
} }
ICECAST_LOG_DEBUG("shoutcast metadata block setup with %s", p->data+1); ICECAST_LOG_DEBUG("shoutcast metadata block setup with %s", p->data+1);
filter_shoutcast_metadata (source, p->data, size); filter_shoutcast_metadata (source, p->data, size, false);
refbuf_release (source_mp3->metadata); refbuf_release (source_mp3->metadata);
source_mp3->metadata = p; source_mp3->metadata = p;
} }
thread_mutex_unlock (&source_mp3->url_lock); thread_mutex_unlock (&source_mp3->url_lock);
free(url_artist);
free(url_title);
free(url);
} }
@ -626,7 +657,7 @@ static refbuf_t *mp3_get_filter_meta(source_t *source)
if (strncmp (meta->data+1, "StreamTitle=", 12) == 0) if (strncmp (meta->data+1, "StreamTitle=", 12) == 0)
{ {
filter_shoutcast_metadata (source, source_mp3->build_metadata, filter_shoutcast_metadata (source, source_mp3->build_metadata,
source_mp3->build_metadata_len); source_mp3->build_metadata_len, true);
refbuf_release (source_mp3->metadata); refbuf_release (source_mp3->metadata);
source_mp3->metadata = meta; source_mp3->metadata = meta;
source_mp3->inline_url = strstr (meta->data+1, "StreamUrl='"); source_mp3->inline_url = strstr (meta->data+1, "StreamUrl='");

View File

@ -1458,6 +1458,12 @@ char *util_conv_string (const char *string, const char *in_charset, const char *
if (string == NULL || in_charset == NULL || out_charset == NULL) if (string == NULL || in_charset == NULL || out_charset == NULL)
return NULL; return NULL;
if (strcmp(in_charset, out_charset) == 0) {
ret = strdup(string);
if (ret)
return ret;
}
in = xmlFindCharEncodingHandler (in_charset); in = xmlFindCharEncodingHandler (in_charset);
out = xmlFindCharEncodingHandler (out_charset); out = xmlFindCharEncodingHandler (out_charset);
@ -1467,7 +1473,7 @@ char *util_conv_string (const char *string, const char *in_charset, const char *
xmlBufferPtr utf8 = xmlBufferCreate (); xmlBufferPtr utf8 = xmlBufferCreate ();
xmlBufferPtr conv = xmlBufferCreate (); xmlBufferPtr conv = xmlBufferCreate ();
ICECAST_LOG_INFO("converting metadata from %s to %s", in_charset, out_charset); ICECAST_LOG_INFO("converting metadata from %#H to %#H", in_charset, out_charset);
xmlBufferCCat (orig, string); xmlBufferCCat (orig, string);
if (xmlCharEncInFunc (in, utf8, orig) > 0) if (xmlCharEncInFunc (in, utf8, orig) > 0)
{ {