diff -r -u mpg123-0.59r/httpget.c mpg123-0.59r-drg/httpget.c
--- mpg123-0.59r/httpget.c	1999-05-28 13:10:44.000000000 +0200
+++ mpg123-0.59r-drg/httpget.c	2003-12-08 18:37:12.000000000 +0100
@@ -177,6 +177,8 @@
 char *proxyurl = NULL;
 unsigned long proxyip = 0;
 unsigned int proxyport;
+int icy_meta = 0;
+int icy_count = 0;
 
 #define ACCEPT_HEAD "Accept: audio/mpeg, audio/x-mpegurl, */*\r\n"
 
@@ -243,7 +245,7 @@
 			strcat (request, sptr);
 		}
 		sprintf (request + strlen(request),
-			" HTTP/1.0\r\nUser-Agent: %s/%s\r\n",
+			" HTTP/1.0\r\nUser-Agent: %s/%s\r\nIcy-MetaData:1\r\n",
 			prgName, prgVersion);
 		if (host) {
 			sprintf(request + strlen(request),
@@ -300,6 +302,14 @@
 			readstring (request, linelength-1, myfile);
 			if (!strncmp(request, "Location:", 9))
 				strncpy (purl, request+10, 1023);
+			if (!strncmp(request, "icy-name:", 9))
+				fprintf(stderr, "\nShoutcast/Icecast Name: %s", request+10);
+			if (!strncmp(request, "icy-genre:", 10))
+				fprintf(stderr, "Shoutcast/Icecast Genre: %s", request+10); 
+			if (!strncmp(request, "icy-url:", 8))
+				fprintf(stderr, "Shoutcast/Icecast URL: %s", request+8); 
+			if (!strncmp(request, "icy-metaint:", 12))
+				icy_meta = atoi(request+12);
 		} while (request[0] != '\r' && request[0] != '\n');
 	} while (relocate && purl[0] && numrelocs++ < 5);
 	if (relocate) {
diff -r -u mpg123-0.59r/mpg123.h mpg123-0.59r-drg/mpg123.h
--- mpg123-0.59r/mpg123.h	1999-05-28 16:51:58.000000000 +0200
+++ mpg123-0.59r-drg/mpg123.h	2003-12-07 22:03:33.000000000 +0100
@@ -189,6 +189,8 @@
 
 /* ------ Declarations from "httpget.c" ------ */
 
+extern int icy_meta;
+extern int icy_count;
 extern char *proxyurl;
 extern unsigned long proxyip;
 extern int http_open (char *url);
diff -r -u mpg123-0.59r/readers.c mpg123-0.59r-drg/readers.c
--- mpg123-0.59r/readers.c	1999-03-04 12:03:49.000000000 +0100
+++ mpg123-0.59r-drg/readers.c	2003-12-08 18:41:04.000000000 +0100
@@ -15,15 +15,71 @@
 #endif
 #endif
 
-static int get_fileinfo(struct reader *,char *buf);
 
 
+static int get_fileinfo(struct reader *,char *buf);
+
 /*******************************************************************
  * stream based operation
  */
 static int fullread(int fd,unsigned char *buf,int count)
 {
-  int ret,cnt=0;
+  int ret,cnt=0,mcnt=0,tmp=0;
+
+  if(icy_meta > 0 && icy_count+count > icy_meta) {
+    char length_byte;
+    unsigned char *metabuf;
+    int meta_len = 0;
+
+    while(cnt < icy_meta-icy_count) {
+      ret = read(fd, buf+cnt, icy_meta-icy_count-cnt);
+      if(ret < 0)
+        return ret;
+      if(ret == 0)
+        break;
+      cnt += ret;
+    }
+
+    ret = read(fd, &length_byte, 1);
+
+    if(length_byte > 0) {
+      char *p, *s;
+      meta_len = length_byte*16;
+  
+      if((metabuf = (char*)calloc(meta_len+1, sizeof(char))) == NULL) {
+        fprintf(stderr, "No memory! :(\n");
+        exit(1);
+      }
+      
+      memset(metabuf, 0, meta_len);
+      
+      while(mcnt < meta_len) {
+        ret = read(fd, metabuf+mcnt, meta_len-mcnt);
+        if(ret < 0)
+          return ret;
+        if(ret == 0)
+          break;
+        mcnt += ret;
+      }
+
+      if((p = strstr(metabuf, "StreamTitle="))) {
+        s = strchr(p, ';');
+        if(*(s-1) == '\'')
+          *(s-1)='\0';
+        else
+          *s='\0';
+        if(p[12] == '\'') 
+          p+=13;
+        else
+          p+=12;
+        fprintf(stderr, "Current Song: %s\n", p);
+      }
+      free(metabuf);
+    }
+    
+    icy_count=0;
+
+  }
 
   while(cnt < count) {
     ret = read(fd,buf+cnt,count-cnt);
@@ -32,8 +88,12 @@
     if(ret == 0)
       break;
     cnt += ret;
+    tmp += ret;
   } 
 
+  if(icy_meta > 0)
+    icy_count+=tmp;
+
   return cnt;
 }
 

