summaryrefslogtreecommitdiff
path: root/components/music/id3_frame_content.c
blob: aaa6b4456326865603f65476c3023a1931fae0e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*********************************************************************
 * 
 *    Copyright (C) 1999,  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$
 * 
 * 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 <stdio.h>
#include "mpg123.h"

#include "id3.h"


/*
 * Function id3_get_content (frame)
 *
 *    Expand content type string of frame and return it.  Return NULL
 *    upon error.
 *
 */
char *id3_get_content(id3_frame_t *frame)
{
    char *text, *ptr;
    char *buffer = frame->fr_owner->id3_buffer;
    int spc = sizeof( frame->fr_owner->id3_buffer ) - 1;

    /* Type check */
    if ( frame->fr_desc->fd_id != ID3_TCON )
	return NULL;

    /* Check if frame is compressed */
    if ( frame->fr_data_z && !frame->fr_data )
	if ( id3_decompress_frame( frame ) == -1 )
	    return NULL;
    
    text = (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 ) {
	char *genre;
	int num = 0;

	if ( text[1] == 'R' && text[2] == 'X' ) {
	    text += 4;
	    genre = ptr != buffer ? " (Remix)" : "(Remix)";

	} else if ( text[1] == 'C' && text[2] == 'R' ) {
	    text += 4;
	    genre = ptr != buffer ? " (Cover)" : "(Cover)";

	} else {
	    /* Get ID3v1 genre number */
	    text++;
	    while ( *text != ')' ) {
		num *= 10;
		num += *text++ - '0';
	    }
	    text++;

	    /* Boundary check */
	    if ( num >= (int)(sizeof(mpg123_id3_genres) / sizeof(char *)) )
		continue;

	    genre = (char *)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';


    /*
     * Return the expanded content string.
     */
    return buffer;
}