Mercurial > audlegacy-plugins
diff src/streambrowser/xiph.c @ 2815:cc6f02424609
added initial support for xiph streaming directory; small bug fixes & code cleanups
| author | Calin Crisan ccrisan@gmail.com |
|---|---|
| date | Sun, 13 Jul 2008 04:00:04 +0300 |
| parents | |
| children | e883536cefe0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/streambrowser/xiph.c Sun Jul 13 04:00:04 2008 +0300 @@ -0,0 +1,148 @@ +/* + * Audacious Streambrowser Plugin + * + * Copyright (c) 2008 Calin Crisan <ccrisan@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses>. + */ + + +#include <string.h> +#include <glib.h> +#include <libxml/parser.h> +#include <libxml/tree.h> +#include <audacious/plugin.h> + +#include "streambrowser.h" +#include "xiph.h" + + +typedef struct { + gchar name[DEF_STRING_LEN]; + gchar url[DEF_STRING_LEN]; + gchar current_song[DEF_STRING_LEN]; + gchar genre[DEF_STRING_LEN]; +} xiph_entry_t; + + +static xiph_entry_t *xiph_entries = NULL; +static int xiph_entry_count = 0; +static gchar *categories[] = { + // todo: complete this list + "alternative", + "dance", + "techno", + "rock", + "pop" +}; + + +void refresh_streamdir(); + + + +gboolean xiph_category_fetch(category_t *category) +{ + int entryno; + + /* see what entries match this category */ + for (entryno = 0; entryno < xiph_entry_count; entryno++) { + + if (mystrcasestr(xiph_entries[entryno].genre, category->name)) { + streaminfo_t *streaminfo = streaminfo_new(xiph_entries[entryno].name, "", xiph_entries[entryno].url, xiph_entries[entryno].current_song); + streaminfo_add(category, streaminfo); + } + + } + + return TRUE; +} + + +streamdir_t* xiph_streamdir_fetch() +{ + streamdir_t *streamdir = streamdir_new(XIPH_NAME); + int categno; + + refresh_streamdir(); + + for (categno = 0; categno < sizeof(categories) / sizeof(gchar *); categno++) { + category_t *category = category_new(categories[categno]); + category_add(streamdir, category); + } + + return streamdir; +} + +void refresh_streamdir() +{ + /* free any previously fetched streamdir data */ + if (xiph_entries != NULL) + free(xiph_entries); + xiph_entry_count = 0; + + debug("xiph: fetching streaming directory file '%s'\n", XIPH_STREAMDIR_URL); + if (!fetch_remote_to_local_file(XIPH_STREAMDIR_URL, XIPH_TEMP_FILENAME)) { + failure("xiph: stream directory file '%s' could not be downloaded to '%s'\n", XIPH_STREAMDIR_URL, XIPH_TEMP_FILENAME); + return; + } + debug("xiph: stream directory file '%s' successfuly downloaded to '%s'\n", XIPH_STREAMDIR_URL, XIPH_TEMP_FILENAME); + + xmlDoc *doc = xmlReadFile(XIPH_TEMP_FILENAME, NULL, 0); + if (doc == NULL) { + failure("xiph: failed to read stream directory file\n"); + return; + } + + xmlNode *root_node = xmlDocGetRootElement(doc); + xmlNode *node, *child; + gchar *content; + + root_node = root_node->children; + + for (node = root_node; node != NULL; node = node->next) { + if (node->type == XML_ELEMENT_NODE) { + xiph_entries = realloc(xiph_entries, sizeof(xiph_entry_t) * (xiph_entry_count + 1)); + + for (child = node->children; child != NULL; child = child->next) { + if (strcmp((gchar *)child->name, "server_name") == 0) { + content = (gchar *) xmlNodeGetContent(child); + strcpy(xiph_entries[xiph_entry_count].name, content); + xmlFree(content); + } + else if (strcmp((gchar *)child->name, "listen_url") == 0) { + content = (gchar *) xmlNodeGetContent(child); + strcpy(xiph_entries[xiph_entry_count].url, content); + xmlFree(content); + } + else if (strcmp((gchar *)child->name, "current_song") == 0) { + content = (gchar *) xmlNodeGetContent(child); + strcpy(xiph_entries[xiph_entry_count].current_song, content); + xmlFree(content); + } + else if (strcmp((gchar *)child->name, "genre") == 0) { + content = (gchar *) xmlNodeGetContent(child); + strcpy(xiph_entries[xiph_entry_count].genre, content); + xmlFree(content); + } + } + + xiph_entry_count++; + } + } + + xmlFreeDoc(doc); + + debug("xiph: streaming directory successfuly loaded\n"); +} +
