diff Plugins/Input/mpg123/id3_frame_content.c @ 61:fa848bd484d8 trunk

[svn] Move plugins to Plugins/
author nenolod
date Fri, 28 Oct 2005 22:58:11 -0700
parents
children 539a0fa7f030
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Input/mpg123/id3_frame_content.c	Fri Oct 28 22:58:11 2005 -0700
@@ -0,0 +1,138 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1999, 2002,  Espen Skoglund
+ *    Department of Computer Science, University of Tromsų
+ * 
+ * Filename:      id3_frame_content.c
+ * Description:   Code for handling ID3 content frames.
+ * Author:        Espen Skoglund <espensk@stud.cs.uit.no>
+ * Created at:    Mon Feb  8 17:13:46 1999
+ *                
+ * $Id: id3_frame_content.c,v 1.7 2004/07/20 21:47:22 descender Exp $
+ * 
+ * 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; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * 
+ ********************************************************************/
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include "xmms-id3.h"
+
+#include "mpg123.h"
+
+
+/*
+ * Function id3_get_content (frame)
+ *
+ *    Expand content type string of frame and return it.  Return NULL
+ *    upon error.
+ *
+ */
+char *
+id3_get_content(struct id3_frame *frame)
+{
+    char *text, *text_beg, *ptr;
+    char buffer[256];
+    int spc = sizeof(buffer) - 1;
+
+    /* Type check */
+    if (frame->fr_desc->fd_id != ID3_TCON)
+        return NULL;
+
+    /* Check if frame is compressed */
+    if (id3_decompress_frame(frame) == -1)
+        return NULL;
+
+    if (*(guint8 *) frame->fr_data == ID3_ENCODING_ISO_8859_1)
+        text_beg = text = g_strdup((char *) frame->fr_data + 1);
+    else
+        text_beg = text = id3_utf16_to_ascii((char *) frame->fr_data + 1);
+
+    /*
+     * If content is just plain text, return it.
+     */
+    if (text[0] != '(') {
+        return text;
+    }
+
+    /*
+     * Expand ID3v1 genre numbers.
+     */
+    ptr = buffer;
+    while (text[0] == '(' && text[1] != '(' && spc > 0) {
+        const char *genre;
+        int num = 0;
+
+        if (text[1] == 'R' && text[2] == 'X') {
+            text += 4;
+            genre = _(" (Remix)");
+            if (ptr == buffer)
+                genre++;
+
+        }
+        else if (text[1] == 'C' && text[2] == 'R') {
+            text += 4;
+            genre = _(" (Cover)");
+            if (ptr == buffer)
+                genre++;
+
+        }
+        else {
+            /* Get ID3v1 genre number */
+            text++;
+            while (*text != ')') {
+                num *= 10;
+                num += *text++ - '0';
+            }
+            text++;
+
+            /* Boundary check */
+            if (num >= sizeof(mpg123_id3_genres) / sizeof(char *))
+                continue;
+
+            genre = gettext(mpg123_id3_genres[num]);
+
+            if (ptr != buffer && spc-- > 0)
+                *ptr++ = '/';
+        }
+
+        /* Expand string into buffer */
+        while (*genre != '\0' && spc > 0) {
+            *ptr++ = *genre++;
+            spc--;
+        }
+    }
+
+    /*
+     * Add plaintext refinement.
+     */
+    if (*text == '(')
+        text++;
+    if (*text != '\0' && ptr != buffer && spc-- > 0)
+        *ptr++ = ' ';
+    while (*text != '\0' && spc > 0) {
+        *ptr++ = *text++;
+        spc--;
+    }
+    *ptr = '\0';
+
+    g_free(text_beg);
+
+    /*
+     * Return the expanded content string.
+     */
+    return g_strdup(buffer);
+}