For our source clients, I use mpd, ices, ezstream, vlc media player, and oddcast.  They all have very unique advantages and disadvantages, which is why we use so many.  It would be great to build one *super* icecast source client that could do what all of those other ones do (but not really feasible I suppose).  Among these clients, Oddcast doesn't send out album metadata, but it is the one we use for streaming a live input.  For streaming ogg vorbis, oddcast inserts the metadata directly into the vorbis header.  But another way to set metadata would be to send an admin command to icecast to update the metadata (i believe this is what libshout does).  However, icecast allows you to only set the Trackname or the Artist and Trackname.  If needed, it would be very easy to update icecast to accept an album value as well.  I believe then you could use libshout with no modifications to update the album metadata.
<br><br><br><br><div><span class="gmail_quote">On 3/26/07, <b class="gmail_sendername">Matthias Behnisch</b> &lt;<a href="mailto:mat@4freax.net">mat@4freax.net</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi Aaron<br><br>thats interesting, I made a similar change to icecast some time ago<br>myself. It writes ALL metadata to the log, not only ARTIST and TRACK. We<br>wanted to include more information into the playlist of our radio but
<br>unfortunately we discovered that oddcast doesn&#39;t send more than ARTIST<br>and TRACK... so I am looking for something that sends really everything.<br>What do you use as your stream source?<br><br>If you or someone else has interest I included a patch against
<br>icecast-2.3.1. yeah, I know its kind of a dirty.<br><br>Matthias<br><br>Aaron Gutierrez schrieb:<br>&gt; Hi, i just joined the list.&nbsp;&nbsp;I was wondering if anyone would be<br>&gt; interested in a change to icecast that logs album info as well as ARTST
<br>&gt; and TRACK.&nbsp;&nbsp;I have made the changes to the source code and it&#39;s working<br>&gt; fine.&nbsp;&nbsp; If there is any interest, I could look into making it an<br>&gt; addition to the code.<br>&gt;<br>&gt; Let me know.<br>&gt;
<br>&gt;<br>&gt; thanks,<br>&gt;<br>&gt;<br>&gt;<br>&gt; --<br>&gt; Aaron<br>&gt;<br>&gt;<br>&gt; ------------------------------------------------------------------------<br>&gt;<br>&gt; _______________________________________________
<br>&gt; Icecast-dev mailing list<br>&gt; <a href="mailto:Icecast-dev@xiph.org">Icecast-dev@xiph.org</a><br>&gt; <a href="http://lists.xiph.org/mailman/listinfo/icecast-dev">http://lists.xiph.org/mailman/listinfo/icecast-dev
</a><br><br>diff -aur icecast-2.3.1/src/format_ogg.c icecast-2.3.1-modified/src/format_ogg.c<br>--- icecast-2.3.1/src/format_ogg.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2005-08-19 04:01:58.000000000 +0200<br>+++ icecast-2.3.1-modified/src/format_ogg.c&nbsp;&nbsp;&nbsp;&nbsp; 2007-03-26 23:24:
51.000000000 +0200<br>@@ -184,12 +184,17 @@<br> void format_ogg_free_plugin (format_plugin_t *plugin)<br> {<br>&nbsp;&nbsp;&nbsp;&nbsp; ogg_state_t *state = plugin-&gt;_state;<br>+&nbsp;&nbsp;&nbsp;&nbsp;int i;<br><br>&nbsp;&nbsp;&nbsp;&nbsp; /* free memory associated with this plugin instance */
<br>&nbsp;&nbsp;&nbsp;&nbsp; free_ogg_codecs (state);<br>&nbsp;&nbsp;&nbsp;&nbsp; free (state-&gt;artist);<br>&nbsp;&nbsp;&nbsp;&nbsp; free (state-&gt;title);<br><br>+&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; state-&gt;metadata_count; ++i)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(state-&gt;metadata[i]);<br>+&nbsp;&nbsp;&nbsp;&nbsp;free(state-&gt;metadata);
<br>+<br>&nbsp;&nbsp;&nbsp;&nbsp; ogg_sync_clear (&amp;state-&gt;oy);<br>&nbsp;&nbsp;&nbsp;&nbsp; free (state);<br><br>@@ -268,6 +273,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; unsigned int len = 1; /* space for the nul byte at least */<br>&nbsp;&nbsp;&nbsp;&nbsp; ogg_codec_t *codec;<br>&nbsp;&nbsp;&nbsp;&nbsp; char codec_names [100] = &quot;&quot;;
<br>+&nbsp;&nbsp;&nbsp;&nbsp;int i;<br><br>&nbsp;&nbsp;&nbsp;&nbsp; if (ogg_info-&gt;artist)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>@@ -293,6 +299,17 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snprintf (metadata, len, &quot;%s&quot;, title);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;if (ogg_info-&gt;metadata_count &gt; 0) {
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len += ogg_info-&gt;metadata_len;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(metadata) metadata = realloc(metadata,len);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else metadata = calloc(1,len);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; ogg_info-&gt;metadata_count; ++i) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(metadata,&quot;|&quot;);
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(metadata,ogg_info-&gt;metadata[i]);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>+&nbsp;&nbsp;&nbsp;&nbsp;}<br>+<br>&nbsp;&nbsp;&nbsp;&nbsp; if (metadata)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logging_playlist (source-&gt;mount, metadata, source-&gt;listeners);<br><br>diff -aur icecast-2.3.1
/src/format_ogg.h icecast-2.3.1-modified/src/format_ogg.h<br>--- icecast-2.3.1/src/format_ogg.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2005-08-19 04:01:58.000000000 +0200<br>+++ icecast-2.3.1-modified/src/format_ogg.h&nbsp;&nbsp;&nbsp;&nbsp; 2007-03-26 23:15:51.000000000 +0200
<br>@@ -41,6 +41,11 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; long bitrate;<br>&nbsp;&nbsp;&nbsp;&nbsp; struct ogg_codec_tag *current;<br>&nbsp;&nbsp;&nbsp;&nbsp; struct ogg_codec_tag *codec_sync;<br>+<br>+&nbsp;&nbsp;char **metadata;<br>+&nbsp;&nbsp;int metadata_count;<br>+&nbsp;&nbsp;int metadata_len;<br>+<br> } ogg_state_t;
<br><br><br>diff -aur icecast-2.3.1/src/format_vorbis.c icecast-2.3.1-modified/src/format_vorbis.c<br>--- icecast-2.3.1/src/format_vorbis.c&nbsp;&nbsp; 2005-11-30 19:16:17.000000000 +0100<br>+++ icecast-2.3.1-modified/src/format_vorbis.c&nbsp;&nbsp;2007-03-26 23:27:
23.000000000 +0200<br>@@ -511,6 +511,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; vorbis_codec_t *source_vorbis = codec-&gt;specific;<br>&nbsp;&nbsp;&nbsp;&nbsp; char *comment;<br><br>+&nbsp;&nbsp;&nbsp;&nbsp;int i;<br>+<br>&nbsp;&nbsp;&nbsp;&nbsp; if (ogg_stream_pagein (&amp;codec-&gt;os, page) &lt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ogg_info-&gt;error = 1;<br>@@ -565,6 +567,21 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format_ogg_attach_header (ogg_info, page);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; codec-&gt;process_page = process_vorbis_passthru_page;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;//free previous comment fields
<br>+&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; ogg_info-&gt;metadata_count; ++i)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(ogg_info-&gt;metadata[i]);<br>+&nbsp;&nbsp;&nbsp;&nbsp;free(ogg_info-&gt;metadata);<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;ogg_info-&gt;metadata = calloc(source_vorbis-&gt;vc.comments,sizeof(char*));
<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;//copy all comment fields<br>+&nbsp;&nbsp;&nbsp;&nbsp;ogg_info-&gt;metadata_count = source_vorbis-&gt;vc.comments;<br>+&nbsp;&nbsp;&nbsp;&nbsp;ogg_info-&gt;metadata_len = source_vorbis-&gt;vc.comments;&nbsp;&nbsp;//space for tag separators<br>+&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; source_vorbis-&gt;
vc.comments; ++i) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ogg_info-&gt;metadata[i] = strdup(source_vorbis-&gt;vc.user_comments[i]);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ogg_info-&gt;metadata_len += source_vorbis-&gt;vc.comment_lengths[i];<br>+&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp; free (ogg_info-&gt;title);
<br>&nbsp;&nbsp;&nbsp;&nbsp; comment = vorbis_comment_query (&amp;source_vorbis-&gt;vc, &quot;TITLE&quot;, 0);<br>@@ -573,6 +590,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ogg_info-&gt;title = NULL;<br><br>+<br>&nbsp;&nbsp;&nbsp;&nbsp; free (ogg_info-&gt;artist);<br>&nbsp;&nbsp;&nbsp;&nbsp; comment = vorbis_comment_query (&amp;source_vorbis-&gt;vc, &quot;ARTIST&quot;, 0);
<br>&nbsp;&nbsp;&nbsp;&nbsp; if (comment)<br><br></blockquote></div><br><br clear="all"><br>-- <br>Aaron