1 /*
2  *  Copyright (C) 2003 Colin Walters <walters@verbum.org>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  The Rhythmbox authors hereby grant permission for non-GPL compatible
10  *  GStreamer plugins to be used and distributed together with GStreamer
11  *  and Rhythmbox. This permission is above and beyond the permissions granted
12  *  by the GPL license by which Rhythmbox is covered. If you modify this code
13  *  you may extend this exception to your version of the code, but you are not
14  *  obligated to do so. If you do not wish to do so, delete this exception
15  *  statement from your version.
16  *
17  *  This program is distributed in the hope that it will be useful,
18  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  *  GNU General Public License for more details.
21  *
22  *  You should have received a copy of the GNU General Public License
23  *  along with this program; if not, write to the Free Software
24  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
25  *
26  */
27 
28 #include <config.h>
29 
30 #include "rb-metadata.h"
31 #include "rb-debug.h"
32 
33 /**
34  * RBMetaDataField:
35  * @RB_METADATA_FIELD_TITLE: Title of the recording
36  * @RB_METADATA_FIELD_ARTIST: Person(s) responsible for the recording
37  * @RB_METADATA_FIELD_ALBUM: Album containing the recording
38  * @RB_METADATA_FIELD_DATE: Release date of the album
39  * @RB_METADATA_FIELD_GENRE: Genre of the recording
40  * @RB_METADATA_FIELD_COMMENT: Free form comment on the recording
41  * @RB_METADATA_FIELD_TRACK_NUMBER: Track number inside a collection
42  * @RB_METADATA_FIELD_MAX_TRACK_NUMBER: Count of tracks inside the collection
43  * @RB_METADATA_FIELD_DISC_NUMBER: Disc number inside a collection
44  * @RB_METADATA_FIELD_MAX_DISC_NUMBER: Count of discs inside the collection
45  * @RB_METADATA_FIELD_DESCRIPTION: Short text describing the recording
46  * @RB_METADATA_FIELD_VERSION: Version of the recording
47  * @RB_METADATA_FIELD_ISRC: International Standard Recording Code
48  * @RB_METADATA_FIELD_ORGANIZATION: Organization responsible for the recording
49  * @RB_METADATA_FIELD_COPYRIGHT: Copyright notice on the recording
50  * @RB_METADATA_FIELD_CONTACT: Contact information
51  * @RB_METADATA_FIELD_LICENSE: License of the recording
52  * @RB_METADATA_FIELD_PERFORMER: Person(s) performing in the recording
53  * @RB_METADATA_FIELD_DURATION: Duration of the recording
54  * @RB_METADATA_FIELD_CODEC: Codec used to store the recording
55  * @RB_METADATA_FIELD_BITRATE: Exact or average encoding bitrate in bits/s
56  * @RB_METADATA_FIELD_TRACK_GAIN: Track gain in dB for replaygain
57  * @RB_METADATA_FIELD_TRACK_PEAK: Track peak volume level
58  * @RB_METADATA_FIELD_ALBUM_GAIN: Album gain in dB for replaygain
59  * @RB_METADATA_FIELD_ALBUM_PEAK: Album peak volume level
60  * @RB_METADATA_FIELD_BPM: Beats Per Minute
61  * @RB_METADATA_FIELD_LANGUAGE_CODE: Language code (ISO-639-1)
62  * @RB_METADATA_FIELD_MUSICBRAINZ_TRACKID: MusicBrainz track ID
63  * @RB_METADATA_FIELD_MUSICBRAINZ_ARTISTID: MusicBrainz artist ID
64  * @RB_METADATA_FIELD_MUSICBRAINZ_ALBUMID: MusicBrainz album ID
65  * @RB_METADATA_FIELD_MUSICBRAINZ_ALBUMARTISTID: MusicBrainz album artist ID
66  * @RB_METADATA_FIELD_ARTIST_SORTNAME: Person(s) responsible for the recording, as used for sorting
67  * @RB_METADATA_FIELD_ALBUM_SORTNAME: Album containing the recording, as used for sorting
68  * @RB_METADATA_FIELD_ALBUM_ARTIST: The artist of the entire album
69  * @RB_METADATA_FIELD_ALBUM_ARTIST_SORTNAME: The artist of the entire album, as it should be sorted
70  * @RB_METADATA_FIELD_COMPOSER: The composer of the recording
71  * @RB_METADATA_FIELD_COMPOSER_SORTNAME: The composer of the recording, as it should be sorted
72  * @RB_METADATA_FIELD_LAST:  invalid field
73  *
74  * Metadata fields that can be read from and written to files.
75  */
76 
77 /**
78  * rb_metadata_get_field_type:
79  * @field: a #RBMetaDataField
80  *
81  * Returns the #GType of the value for a metadata field.
82  *
83  * Return value: value type
84  */
85 GType
rb_metadata_get_field_type(RBMetaDataField field)86 rb_metadata_get_field_type (RBMetaDataField field)
87 {
88 	switch (field) {
89 	case RB_METADATA_FIELD_TITLE:
90 	case RB_METADATA_FIELD_ARTIST:
91 	case RB_METADATA_FIELD_ALBUM:
92 	case RB_METADATA_FIELD_GENRE:
93 	case RB_METADATA_FIELD_COMMENT:
94 	case RB_METADATA_FIELD_DESCRIPTION:
95 	case RB_METADATA_FIELD_VERSION:
96 	case RB_METADATA_FIELD_ISRC:
97 	case RB_METADATA_FIELD_ORGANIZATION:
98 	case RB_METADATA_FIELD_COPYRIGHT:
99 	case RB_METADATA_FIELD_CONTACT:
100 	case RB_METADATA_FIELD_LICENSE:
101 	case RB_METADATA_FIELD_PERFORMER:
102 	case RB_METADATA_FIELD_CODEC:
103 	case RB_METADATA_FIELD_LANGUAGE_CODE:
104 	case RB_METADATA_FIELD_MUSICBRAINZ_TRACKID:
105 	case RB_METADATA_FIELD_MUSICBRAINZ_ARTISTID:
106 	case RB_METADATA_FIELD_MUSICBRAINZ_ALBUMID:
107 	case RB_METADATA_FIELD_MUSICBRAINZ_ALBUMARTISTID:
108 	case RB_METADATA_FIELD_ARTIST_SORTNAME:
109 	case RB_METADATA_FIELD_ALBUM_SORTNAME:
110 	case RB_METADATA_FIELD_ALBUM_ARTIST:
111 	case RB_METADATA_FIELD_ALBUM_ARTIST_SORTNAME:
112 	case RB_METADATA_FIELD_COMPOSER:
113 	case RB_METADATA_FIELD_COMPOSER_SORTNAME:
114 		return G_TYPE_STRING;
115 
116 	case RB_METADATA_FIELD_DATE:
117 	case RB_METADATA_FIELD_TRACK_NUMBER:
118 	case RB_METADATA_FIELD_MAX_TRACK_NUMBER:
119 	case RB_METADATA_FIELD_DISC_NUMBER:
120 	case RB_METADATA_FIELD_MAX_DISC_NUMBER:
121 	case RB_METADATA_FIELD_DURATION:
122 	case RB_METADATA_FIELD_BITRATE:
123 		return G_TYPE_ULONG;
124 
125 	case RB_METADATA_FIELD_TRACK_GAIN:
126 	case RB_METADATA_FIELD_TRACK_PEAK:
127 	case RB_METADATA_FIELD_ALBUM_GAIN:
128 	case RB_METADATA_FIELD_ALBUM_PEAK:
129 	case RB_METADATA_FIELD_BPM:
130 		return G_TYPE_DOUBLE;
131 
132 	default:
133 		g_assert_not_reached ();
134 	}
135 }
136 
137 /**
138  * rb_metadata_get_field_name:
139  * @field: a #RBMetaDataField
140  *
141  * Returns the name of a metadata field.
142  *
143  * Return value: field name
144  */
145 const char *
rb_metadata_get_field_name(RBMetaDataField field)146 rb_metadata_get_field_name (RBMetaDataField field)
147 {
148 	GEnumClass *klass;
149 
150 	klass = g_type_class_ref (RB_TYPE_METADATA_FIELD);
151 	g_assert (field >= 0 && field < klass->n_values);
152 	return klass->values[field].value_nick;
153 }
154 
155 GQuark
rb_metadata_error_quark(void)156 rb_metadata_error_quark (void)
157 {
158 	static GQuark quark = 0;
159 	if (!quark)
160 		quark = g_quark_from_static_string ("rb_metadata_error");
161 
162 	return quark;
163 }
164 
165 
166 #define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
167 
168 
169 GType
rb_metadata_field_get_type(void)170 rb_metadata_field_get_type (void)
171 {
172 	static GType etype = 0;
173 
174 	if (etype == 0) {
175 		static const GEnumValue values[] =
176 		{
177 			/* Note: field names are the GStreamer tag names.
178 			 * We could have just used the GST_TAG_X defines, but that
179 			 * would suck if we ever got a non-GStreamer metadata backend.
180 			 */
181 			ENUM_ENTRY (RB_METADATA_FIELD_TITLE, "title"),
182 			ENUM_ENTRY (RB_METADATA_FIELD_ARTIST, "artist"),
183 			ENUM_ENTRY (RB_METADATA_FIELD_ALBUM, "album"),
184 			ENUM_ENTRY (RB_METADATA_FIELD_DATE, "date"),
185 			ENUM_ENTRY (RB_METADATA_FIELD_GENRE, "genre"),
186 			ENUM_ENTRY (RB_METADATA_FIELD_COMMENT, "comment"),
187 			ENUM_ENTRY (RB_METADATA_FIELD_TRACK_NUMBER, "track-number"),
188 			ENUM_ENTRY (RB_METADATA_FIELD_MAX_TRACK_NUMBER, "track-count"),
189 			ENUM_ENTRY (RB_METADATA_FIELD_DISC_NUMBER, "album-disc-number"),
190 			ENUM_ENTRY (RB_METADATA_FIELD_MAX_DISC_NUMBER, "album-disc-count"),
191 			ENUM_ENTRY (RB_METADATA_FIELD_DESCRIPTION, "description"),
192 			ENUM_ENTRY (RB_METADATA_FIELD_VERSION, "version"),
193 			ENUM_ENTRY (RB_METADATA_FIELD_ISRC, "isrc"),
194 			ENUM_ENTRY (RB_METADATA_FIELD_ORGANIZATION, "organization"),
195 			ENUM_ENTRY (RB_METADATA_FIELD_COPYRIGHT, "copyright"),
196 			ENUM_ENTRY (RB_METADATA_FIELD_CONTACT, "contact"),
197 			ENUM_ENTRY (RB_METADATA_FIELD_LICENSE, "license"),
198 			ENUM_ENTRY (RB_METADATA_FIELD_PERFORMER, "performer"),
199 			ENUM_ENTRY (RB_METADATA_FIELD_DURATION, "duration"),
200 			ENUM_ENTRY (RB_METADATA_FIELD_CODEC, "codec"),
201 			ENUM_ENTRY (RB_METADATA_FIELD_BITRATE, "bitrate"),
202 			ENUM_ENTRY (RB_METADATA_FIELD_TRACK_GAIN, "replaygain-track-gain"),
203 			ENUM_ENTRY (RB_METADATA_FIELD_TRACK_PEAK, "replaygain-track-peak"),
204 			ENUM_ENTRY (RB_METADATA_FIELD_ALBUM_GAIN, "replaygain-album-gain"),
205 			ENUM_ENTRY (RB_METADATA_FIELD_ALBUM_PEAK, "replaygain-album-peak"),
206 			ENUM_ENTRY (RB_METADATA_FIELD_BPM, "beats-per-minute"),
207 			ENUM_ENTRY (RB_METADATA_FIELD_LANGUAGE_CODE, "language-code"),
208 			ENUM_ENTRY (RB_METADATA_FIELD_MUSICBRAINZ_TRACKID, "musicbrainz-trackid"),
209 			ENUM_ENTRY (RB_METADATA_FIELD_MUSICBRAINZ_ARTISTID, "musicbrainz-artistid"),
210 			ENUM_ENTRY (RB_METADATA_FIELD_MUSICBRAINZ_ALBUMID, "musicbrainz-albumid"),
211 			ENUM_ENTRY (RB_METADATA_FIELD_MUSICBRAINZ_ALBUMARTISTID, "musicbrainz-albumartistid"),
212 			ENUM_ENTRY (RB_METADATA_FIELD_ARTIST_SORTNAME, "musicbrainz-sortname"),
213 			ENUM_ENTRY (RB_METADATA_FIELD_ALBUM_SORTNAME, "album-sortname"),
214 			ENUM_ENTRY (RB_METADATA_FIELD_ALBUM_ARTIST, "album-artist"),
215 			ENUM_ENTRY (RB_METADATA_FIELD_ALBUM_ARTIST_SORTNAME, "album-artist-sortname"),
216 			ENUM_ENTRY (RB_METADATA_FIELD_COMPOSER, "composer"),
217 			ENUM_ENTRY (RB_METADATA_FIELD_COMPOSER_SORTNAME, "composer-sortname"),
218 			{ 0, 0, 0 }
219 		};
220 		etype = g_enum_register_static ("RBMetadataFieldType", values);
221 	}
222 
223 	return etype;
224 }
225 
226 GType
rb_metadata_error_get_type(void)227 rb_metadata_error_get_type (void)
228 {
229 	static GType etype = 0;
230 
231 	if (etype == 0) {
232 		static const GEnumValue values[] =
233 		{
234 			ENUM_ENTRY(RB_METADATA_ERROR_IO, "io-error"),
235 			ENUM_ENTRY(RB_METADATA_ERROR_MISSING_PLUGIN, "missing-plugins"),
236 			ENUM_ENTRY(RB_METADATA_ERROR_UNRECOGNIZED, "identify-failed"),
237 			ENUM_ENTRY(RB_METADATA_ERROR_UNSUPPORTED, "unsupported-filetype"),
238 			ENUM_ENTRY(RB_METADATA_ERROR_GENERAL, "general-error"),
239 			ENUM_ENTRY(RB_METADATA_ERROR_INTERNAL, "internal-error"),
240 			ENUM_ENTRY(RB_METADATA_ERROR_EMPTY_FILE, "empty-file"),
241 			{ 0, 0, 0 }
242 		};
243 		etype = g_enum_register_static ("RBMetadataErrorType", values);
244 	}
245 
246 	return etype;
247 }
248