# HG changeset patch # User yaz # Date 1170227642 28800 # Node ID 2d20bc58a290c492d969ead90b0b3e0084dca157 # Parent 5e2b137a24fe5233487f01d305259497fde4cdd8 [svn] tweak xspf plugin to conform xspf specification version 1. - arrange the order of elements to pass several validators. - specify character set and encoding as UTF-8. - now urls beginning with file:// can be used. - prepend file:// onto local file entry to save (tentative). diff -r 5e2b137a24fe -r 2d20bc58a290 ChangeLog --- a/ChangeLog Tue Jan 30 13:41:14 2007 -0800 +++ b/ChangeLog Tue Jan 30 23:14:02 2007 -0800 @@ -1,3 +1,12 @@ +2007-01-30 21:41:14 +0000 Michael Farber <01mf02@gmail.com> + revision [1254] + - Cleaned up AAC plugin a bit more, but still couldn't fix the bug + + + trunk/src/aac/src/libmp4.c | 300 ++++++++++++++++++++++----------------------- + 1 file changed, 148 insertions(+), 152 deletions(-) + + 2007-01-30 20:55:38 +0000 Michael Farber <01mf02@gmail.com> revision [1252] - Fixed crash at opening AAC files diff -r 5e2b137a24fe -r 2d20bc58a290 src/xspf/xspf.c --- a/src/xspf/xspf.c Tue Jan 30 13:41:14 2007 -0800 +++ b/src/xspf/xspf.c Tue Jan 30 23:14:02 2007 -0800 @@ -64,39 +64,46 @@ for(nptr = track->children; nptr != NULL; nptr = nptr->next){ if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "location")){ GError *err = NULL; - gchar *tmp = NULL; + gchar *tmp = NULL, *tmp2 = NULL; xmlChar *str = xmlNodeGetContent(nptr); tmp = g_locale_from_utf8(str, -1, NULL, NULL, &err); //for backward compatibility - if(err != NULL) - location = xspf_url_decode(str); - else - location = xspf_url_decode(tmp); - + if(err != NULL) { + tmp2 = xspf_url_decode(str); + } + else { + tmp2= xspf_url_decode(tmp); + } + if(strstr(tmp2, "file://")){ + location = g_strdup(tmp2+7); + } + else { + location = g_strdup(tmp2); + } xmlFree(str); - g_free(tmp); g_free(err); + g_free(tmp); g_free(err); g_free(tmp2); + } + else if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "title")){ + tuple->track_name = (gchar *)xmlNodeGetContent(nptr); } else if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "creator")){ tuple->performer = (gchar *)xmlNodeGetContent(nptr); } + else if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "annotation")){ + tuple->comment = (gchar *)xmlNodeGetContent(nptr); + continue; + } else if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "album")){ tuple->album_name = (gchar *)xmlNodeGetContent(nptr); } - else if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "title")){ - tuple->track_name = (gchar *)xmlNodeGetContent(nptr); - } - else if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "duration")){ - xmlChar *str = xmlNodeGetContent(nptr); - tuple->length = atol(str); - xmlFree(str); - } else if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "trackNum")){ xmlChar *str = xmlNodeGetContent(nptr); tuple->track_number = atol(str); xmlFree(str); } - else if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "annotation")){ - tuple->comment = (gchar *)xmlNodeGetContent(nptr); - continue; + else if(nptr->type == XML_ELEMENT_NODE && !xmlStrcmp(nptr->name, "duration")){ + xmlChar *str = xmlNodeGetContent(nptr); + tuple->length = atol(str); + xmlFree(str); } // @@ -224,6 +231,9 @@ doc = xmlNewDoc("1.0"); + doc->charset = XML_CHAR_ENCODING_UTF8; + doc->encoding = xmlStrdup("UTF-8"); + rootnode = xmlNewNode(NULL, XSPF_ROOT_NODE_NAME); xmlSetProp(rootnode, "xmlns", XSPF_XMLNS); xmlSetProp(rootnode, "version", "1"); @@ -249,12 +259,15 @@ /* url encode file name. exclude streaming for now. */ if (strncasecmp("http://", entry->filename, 7) && - strncasecmp("https://", entry->filename, 8)) { - filename = (gchar *)xspf_url_encode(entry->filename); + strncasecmp("https://", entry->filename, 8)) { /* the rest */ + gchar *tmp = (gchar *)xspf_url_encode(entry->filename); + filename = g_strdup_printf("file://%s", tmp); + g_free(tmp); } - else { + else { /* streaming */ filename = strdup(entry->filename); } + if(!g_utf8_validate(filename, -1, NULL)) continue; @@ -265,6 +278,14 @@ /* do we have a tuple? */ if (entry->tuple != NULL) { + if (entry->tuple->track_name != NULL && + g_utf8_validate(entry->tuple->track_name, -1, NULL)) + { + tmp = xmlNewNode(NULL, "title"); + xmlAddChild(tmp, xmlNewText(entry->tuple->track_name)); + xmlAddChild(track, tmp); + } + if (entry->tuple->performer != NULL && g_utf8_validate(entry->tuple->performer, -1, NULL)) { @@ -273,6 +294,14 @@ xmlAddChild(track, tmp); } + if (entry->tuple->comment != NULL && + g_utf8_validate(entry->tuple->comment, -1, NULL)) + { + tmp = xmlNewNode(NULL, "annotation"); + xmlAddChild(tmp, xmlNewText(entry->tuple->comment)); + xmlAddChild(track, tmp); + } + if (entry->tuple->album_name != NULL && g_utf8_validate(entry->tuple->album_name, -1, NULL)) { @@ -281,25 +310,6 @@ xmlAddChild(track, tmp); } - if (entry->tuple->track_name != NULL && - g_utf8_validate(entry->tuple->track_name, -1, NULL)) - { - tmp = xmlNewNode(NULL, "title"); - xmlAddChild(tmp, xmlNewText(entry->tuple->track_name)); - xmlAddChild(track, tmp); - } - - if (entry->tuple->length > 0) - { - gchar *str; - str = g_malloc(TMP_BUF_LEN); - tmp = xmlNewNode(NULL, "duration"); - sprintf(str, "%d", entry->tuple->length); - xmlAddChild(tmp, xmlNewText(str)); - g_free(str); - xmlAddChild(track, tmp); - } - if (entry->tuple->track_number != 0) { gchar *str; @@ -311,11 +321,14 @@ xmlAddChild(track, tmp); } - if (entry->tuple->comment != NULL && - g_utf8_validate(entry->tuple->comment, -1, NULL)) + if (entry->tuple->length > 0) { - tmp = xmlNewNode(NULL, "annotation"); - xmlAddChild(tmp, xmlNewText(entry->tuple->comment)); + gchar *str; + str = g_malloc(TMP_BUF_LEN); + tmp = xmlNewNode(NULL, "duration"); + sprintf(str, "%d", entry->tuple->length); + xmlAddChild(tmp, xmlNewText(str)); + g_free(str); xmlAddChild(track, tmp); }