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