diff src/streambrowser/shoutcast.c @ 2570:28498c0bde64

Initial commit for the streambrowser plugin
author Calin Crisan ccrisan@gmail.com
date Sat, 17 May 2008 02:50:10 +0300
parents
children 6d6a3eb67510
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/streambrowser/shoutcast.c	Sat May 17 02:50:10 2008 +0300
@@ -0,0 +1,101 @@
+
+#include <string.h>
+#include <glib.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+#include "streambrowser.h"
+#include "shoutcast.h"
+
+
+static streaminfo_t*		shoutcast_streaminfo_fetch(gchar *station_name, gchar *station_id);
+static category_t*		shoutcast_category_fetch(gchar *category_name);
+
+
+static streaminfo_t *shoutcast_streaminfo_fetch(gchar *station_name, gchar *station_id)
+{
+	gchar url[DEF_STRING_LEN];
+	g_snprintf(url, DEF_STRING_LEN, SHOUTCAST_STREAMINFO_URL, station_id);
+
+	streaminfo_t *streaminfo = streaminfo_new(station_name, url);
+
+	// todo: read the .pls file fetched from the above url
+	
+	return streaminfo;
+}
+
+static category_t *shoutcast_category_fetch(gchar *category_name)
+{
+	category_t *category = category_new(category_name);
+
+	gchar url[DEF_STRING_LEN];
+	g_snprintf(url, DEF_STRING_LEN, SHOUTCAST_CATEGORY_URL, category_name);
+
+	xmlDoc *doc = xmlReadFile(url, NULL, 0);
+	if (doc == NULL) {
+		error("    shoutcast: failed to read \"%s\" category file\n", category_name);
+		return NULL;
+	}
+	
+	debug("    shoutcast: category file fetched\n");
+
+	xmlNode *root_node = xmlDocGetRootElement(doc);
+	xmlNode *node;
+	
+	root_node = root_node->children;
+
+	for (node = root_node; node != NULL; node = node->next) {
+		if (node->type == XML_ELEMENT_NODE && !strcmp((char *) node->name, "station")) {
+			gchar *station_name = (gchar*) xmlGetProp(node, (xmlChar *) "name");
+			gchar *station_id = (gchar*) xmlGetProp(node, (xmlChar *) "id");
+
+			debug("        shoutcast: fetching stream info for name = \"%s\" and id = %s\n", station_name, station_id);
+
+			streaminfo_t *streaminfo = shoutcast_streaminfo_fetch(station_name, station_id);
+			streaminfo_add(category, streaminfo);
+	
+			// todo: debug - print info about streaminfon urls		
+			debug("        shoutcast: stream info added for name = \"%s\" and id = %s\n", station_name, station_id);
+		}
+	}
+	
+	return category;
+}
+
+
+streamdir_t* shoutcast_streamdir_fetch()
+{
+	streamdir_t *streamdir = streamdir_new("Shoutcast");
+	
+	debug("shoutcast: fetching streaming directory file\n");
+
+	// todo: replace dummy filename with SHOUTCAST_DIRECTORY_URL
+	xmlDoc *doc = xmlReadFile("shoutcast.xml", NULL, 0);
+	if (doc == NULL) {
+		error("shoutcast: failed to read stream directory file\n");
+		return NULL;
+	}
+	
+	debug("shoutcast: streaming directory file fetched\n");
+
+	xmlNode *root_node = xmlDocGetRootElement(doc);
+	xmlNode *node;
+	
+	root_node = root_node->children;
+
+	for (node = root_node; node != NULL; node = node->next) {
+		if (node->type == XML_ELEMENT_NODE) {
+			gchar *category_name = (gchar*) xmlGetProp(node, (xmlChar *) "name");
+			
+			debug("    shoutcast: fetching category \"%s\"\n", category_name);
+
+			category_t *category = shoutcast_category_fetch(category_name);
+			category_add(streamdir, category);
+			
+			debug("    shoutcast: added category \"%s\"\n", category_name);
+		}
+	}
+	
+	exit(0);
+}
+