~ubuntu-branches/ubuntu/hardy/gnome-commander/hardy

« back to all changes in this revision

Viewing changes to src/tags/gnome-cmd-tags-id3.cc

  • Committer: Bazaar Package Importer
  • Author(s): Michael Vogt
  • Date: 2007-06-11 09:37:03 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20070611093703-zfmi3bh086344wuq
Tags: 1.2.4-1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
    GNOME Commander - A GNOME based file manager
 
3
    Copyright (C) 2001-2006 Marcus Bjurman
 
4
 
 
5
    This program is free software; you can redistribute it and/or modify
 
6
    it under the terms of the GNU General Public License as published by
 
7
    the Free Software Foundation; either version 2 of the License, or
 
8
    (at your option) any later version.
 
9
 
 
10
    This program is distributed in the hope that it will be useful,
 
11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
    GNU General Public License for more details.
 
14
 
 
15
    You should have received a copy of the GNU General Public License
 
16
    along with this program; if not, write to the Free Software
 
17
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 
18
*/
 
19
 
 
20
/* Code for ID3 and Ogg Vorbis data processing comes from EasyTAG and is adjusted to GNOME Commander needs.
 
21
 
 
22
    id3tag.c - 2001/02/16
 
23
 
 
24
    EasyTAG - Tag editor for MP3 and Ogg Vorbis files
 
25
    Copyright (C) 2001-2003  Jerome Couderc <easytag@gmail.com> */
 
26
 
 
27
 
 
28
#include <config.h>
 
29
 
 
30
#include <stdio.h>
 
31
 
 
32
#include "gnome-cmd-includes.h"
 
33
#include "gnome-cmd-tags-id3.h"
 
34
#include "id3lib/id3_bugfix.h"
 
35
#include "id3lib/genres.h"
 
36
 
 
37
#ifdef HAVE_ID3
 
38
#include <id3.h>
 
39
#endif
 
40
 
 
41
using namespace std;
 
42
 
 
43
 
 
44
static char empty_string[] = "";
 
45
 
 
46
#ifndef HAVE_ID3
 
47
static char no_support_for_id3lib_tags_string[] = N_("<ID3 tags not supported>");
 
48
#endif
 
49
 
 
50
 
 
51
 
 
52
#ifdef HAVE_ID3
 
53
typedef
 
54
struct
 
55
{
 
56
    ID3_FrameID id3;
 
57
    GnomeCmdTag gcmd;
 
58
} TAG;
 
59
 
 
60
 
 
61
static int id3_tagcmp(const void *t1, const void *t2)
 
62
{
 
63
    return (int)(((TAG *) t1)->id3) - (int)(((TAG *) t2)->id3);
 
64
}
 
65
 
 
66
 
 
67
const ID3_FrameID ID3FID_GENRE = (ID3_FrameID) (ID3FID_LASTFRAMEID+1);
 
68
const gint ID3FID_NUM_FRAMES   =               (ID3FID_GENRE+1);
 
69
 
 
70
 
 
71
static GnomeCmdTag *get_gcmd_tag(const ID3_FrameID id3_tag)
 
72
{
 
73
    static TAG tag[] = {{ID3FID_NOFRAME, TAG_NONE},
 
74
                        {ID3FID_AUDIOCRYPTO, TAG_ID3_AUDIOCRYPTO},
 
75
                        {ID3FID_PICTURE, TAG_ID3_PICTURE},
 
76
                        {ID3FID_AUDIOSEEKPOINT, TAG_ID3_AUDIOSEEKPOINT},
 
77
                        {ID3FID_COMMENT, TAG_ID3_COMMENT},
 
78
                        {ID3FID_COMMERCIAL, TAG_ID3_COMMERCIAL},
 
79
                        {ID3FID_CRYPTOREG, TAG_ID3_CRYPTOREG},
 
80
                        {ID3FID_EQUALIZATION2, TAG_ID3_EQUALIZATION2},
 
81
                        {ID3FID_EQUALIZATION, TAG_ID3_EQUALIZATION},
 
82
                        {ID3FID_EVENTTIMING, TAG_ID3_EVENTTIMING},
 
83
                        {ID3FID_GENERALOBJECT, TAG_ID3_GENERALOBJECT},
 
84
                        {ID3FID_GROUPINGREG, TAG_ID3_GROUPINGREG},
 
85
                        {ID3FID_INVOLVEDPEOPLE, TAG_ID3_INVOLVEDPEOPLE},
 
86
                        {ID3FID_LINKEDINFO, TAG_ID3_LINKEDINFO},
 
87
                        {ID3FID_CDID, TAG_ID3_CDID},
 
88
                        {ID3FID_MPEGLOOKUP, TAG_ID3_MPEGLOOKUP},
 
89
                        {ID3FID_OWNERSHIP, TAG_ID3_OWNERSHIP},
 
90
                        {ID3FID_PRIVATE, TAG_ID3_PRIVATE},
 
91
                        {ID3FID_PLAYCOUNTER, TAG_ID3_PLAYCOUNTER},
 
92
                        {ID3FID_POPULARIMETER, TAG_ID3_POPULARIMETER},
 
93
                        {ID3FID_POSITIONSYNC, TAG_ID3_POSITIONSYNC},
 
94
                        {ID3FID_BUFFERSIZE, TAG_ID3_BUFFERSIZE},
 
95
                        {ID3FID_VOLUMEADJ2, TAG_ID3_VOLUMEADJ2},
 
96
                        {ID3FID_VOLUMEADJ, TAG_ID3_VOLUMEADJ},
 
97
                        {ID3FID_REVERB, TAG_ID3_REVERB},
 
98
                        {ID3FID_SIGNATURE, TAG_ID3_SIGNATURE},
 
99
                        {ID3FID_SYNCEDLYRICS, TAG_ID3_SYNCEDLYRICS},
 
100
                        {ID3FID_SYNCEDTEMPO, TAG_ID3_SYNCEDTEMPO},
 
101
                        {ID3FID_ALBUM, TAG_ID3_ALBUM},
 
102
                        {ID3FID_BPM, TAG_ID3_BPM},
 
103
                        {ID3FID_COMPOSER, TAG_ID3_COMPOSER},
 
104
                        {ID3FID_CONTENTTYPE, TAG_ID3_CONTENTTYPE},
 
105
                        {ID3FID_COPYRIGHT, TAG_ID3_COPYRIGHT},
 
106
                        {ID3FID_DATE, TAG_ID3_DATE},
 
107
                        {ID3FID_ENCODINGTIME, TAG_ID3_ENCODINGTIME},
 
108
                        {ID3FID_PLAYLISTDELAY, TAG_ID3_PLAYLISTDELAY},
 
109
                        {ID3FID_ORIGRELEASETIME, TAG_ID3_ORIGRELEASETIME},
 
110
                        {ID3FID_RECORDINGTIME, TAG_ID3_RECORDINGTIME},
 
111
                        {ID3FID_RELEASETIME, TAG_ID3_RELEASETIME},
 
112
                        {ID3FID_TAGGINGTIME, TAG_ID3_TAGGINGTIME},
 
113
                        {ID3FID_INVOLVEDPEOPLE2, TAG_ID3_INVOLVEDPEOPLE2},
 
114
                        {ID3FID_ENCODEDBY, TAG_ID3_ENCODEDBY},
 
115
                        {ID3FID_LYRICIST, TAG_ID3_LYRICIST},
 
116
                        {ID3FID_FILETYPE, TAG_ID3_FILETYPE},
 
117
                        {ID3FID_TIME, TAG_ID3_TIME},
 
118
                        {ID3FID_CONTENTGROUP, TAG_ID3_CONTENTGROUP},
 
119
                        {ID3FID_TITLE, TAG_ID3_TITLE},
 
120
                        {ID3FID_SUBTITLE, TAG_ID3_SUBTITLE},
 
121
                        {ID3FID_INITIALKEY, TAG_ID3_INITIALKEY},
 
122
                        {ID3FID_LANGUAGE, TAG_ID3_LANGUAGE},
 
123
                        {ID3FID_SONGLEN, TAG_ID3_SONGLEN},
 
124
                        {ID3FID_MUSICIANCREDITLIST, TAG_ID3_MUSICIANCREDITLIST},
 
125
                        {ID3FID_MEDIATYPE, TAG_ID3_MEDIATYPE},
 
126
                        {ID3FID_MOOD, TAG_ID3_MOOD},
 
127
                        {ID3FID_ORIGALBUM, TAG_ID3_ORIGALBUM},
 
128
                        {ID3FID_ORIGFILENAME, TAG_ID3_ORIGFILENAME},
 
129
                        {ID3FID_ORIGLYRICIST, TAG_ID3_ORIGLYRICIST},
 
130
                        {ID3FID_ORIGARTIST, TAG_ID3_ORIGARTIST},
 
131
                        {ID3FID_ORIGYEAR, TAG_ID3_ORIGYEAR},
 
132
                        {ID3FID_FILEOWNER, TAG_ID3_FILEOWNER},
 
133
                        {ID3FID_LEADARTIST, TAG_ID3_LEADARTIST},
 
134
                        {ID3FID_BAND, TAG_ID3_BAND},
 
135
                        {ID3FID_CONDUCTOR, TAG_ID3_CONDUCTOR},
 
136
                        {ID3FID_MIXARTIST, TAG_ID3_MIXARTIST},
 
137
                        {ID3FID_PARTINSET, TAG_ID3_PARTINSET},
 
138
                        {ID3FID_PRODUCEDNOTICE, TAG_ID3_PRODUCEDNOTICE},
 
139
                        {ID3FID_PUBLISHER, TAG_ID3_PUBLISHER},
 
140
                        {ID3FID_TRACKNUM, TAG_ID3_TRACKNUM},
 
141
                        {ID3FID_RECORDINGDATES, TAG_ID3_RECORDINGDATES},
 
142
                        {ID3FID_NETRADIOSTATION, TAG_ID3_NETRADIOSTATION},
 
143
                        {ID3FID_NETRADIOOWNER, TAG_ID3_NETRADIOOWNER},
 
144
                        {ID3FID_SIZE, TAG_ID3_SIZE},
 
145
                        {ID3FID_ALBUMSORTORDER, TAG_ID3_ALBUMSORTORDER},
 
146
                        {ID3FID_PERFORMERSORTORDER, TAG_ID3_PERFORMERSORTORDER},
 
147
                        {ID3FID_TITLESORTORDER, TAG_ID3_TITLESORTORDER},
 
148
                        {ID3FID_ISRC, TAG_ID3_ISRC},
 
149
                        {ID3FID_ENCODERSETTINGS, TAG_ID3_ENCODERSETTINGS},
 
150
                        {ID3FID_SETSUBTITLE, TAG_ID3_SETSUBTITLE},
 
151
                        {ID3FID_USERTEXT, TAG_ID3_USERTEXT},
 
152
                        {ID3FID_YEAR, TAG_ID3_YEAR},
 
153
                        {ID3FID_UNIQUEFILEID, TAG_ID3_UNIQUEFILEID},
 
154
                        {ID3FID_TERMSOFUSE, TAG_ID3_TERMSOFUSE},
 
155
                        {ID3FID_UNSYNCEDLYRICS, TAG_ID3_UNSYNCEDLYRICS},
 
156
                        {ID3FID_WWWCOMMERCIALINFO, TAG_ID3_WWWCOMMERCIALINFO},
 
157
                        {ID3FID_WWWCOPYRIGHT, TAG_ID3_WWWCOPYRIGHT},
 
158
                        {ID3FID_WWWAUDIOFILE, TAG_ID3_WWWAUDIOFILE},
 
159
                        {ID3FID_WWWARTIST, TAG_ID3_WWWARTIST},
 
160
                        {ID3FID_WWWAUDIOSOURCE, TAG_ID3_WWWAUDIOSOURCE},
 
161
                        {ID3FID_WWWRADIOPAGE, TAG_ID3_WWWRADIOPAGE},
 
162
                        {ID3FID_WWWPAYMENT, TAG_ID3_WWWPAYMENT},
 
163
                        {ID3FID_WWWPUBLISHER, TAG_ID3_WWWPUBLISHER},
 
164
                        {ID3FID_WWWUSER, TAG_ID3_WWWUSER},
 
165
                        {ID3FID_GENRE, TAG_ID3_GENRE}};
 
166
 
 
167
 
 
168
    if (id3_tag>=ID3FID_NUM_FRAMES)
 
169
        return &(tag[0].gcmd);
 
170
 
 
171
    TAG t;
 
172
 
 
173
    t.id3 = id3_tag;
 
174
 
 
175
    TAG *elem = (TAG *) bsearch(&t,tag,sizeof(tag)/sizeof(TAG),sizeof(TAG),id3_tagcmp);
 
176
 
 
177
    return elem ? &(elem->gcmd) : &(tag[0].gcmd);
 
178
}
 
179
 
 
180
 
 
181
inline gchar *get_genre (guint genre_code)
 
182
{
 
183
    if (genre_code>=ID3_INVALID_GENRE)    /* empty */
 
184
        return "";
 
185
    else if (genre_code>GENRE_MAX)        /* unknown tag */
 
186
        return _("Unknown");
 
187
    else                                  /* known tag */
 
188
        return id3_genres[genre_code];
 
189
}
 
190
 
 
191
 
 
192
static void ID3Frame_GetString(GHashTable *metadata, const ID3Frame *frame)
 
193
{
 
194
    ID3Field *field = NULL;
 
195
    size_t size;
 
196
    gchar *s = NULL;
 
197
 
 
198
    ID3_FrameID frame_ID = ID3Frame_GetID(frame);
 
199
    GnomeCmdTag *id = get_gcmd_tag(frame_ID);
 
200
 
 
201
    switch (frame_ID)
 
202
    {
 
203
        case ID3FID_WWWARTIST:
 
204
        case ID3FID_WWWAUDIOFILE:
 
205
        case ID3FID_WWWAUDIOSOURCE:
 
206
        case ID3FID_WWWCOMMERCIALINFO:
 
207
        case ID3FID_WWWCOPYRIGHT:
 
208
        case ID3FID_WWWPAYMENT:
 
209
        case ID3FID_WWWPUBLISHER:
 
210
        case ID3FID_WWWRADIOPAGE:
 
211
        case ID3FID_WWWUSER:
 
212
            field = ID3Frame_GetField(frame, ID3FN_URL);
 
213
            if (!field)  return;
 
214
 
 
215
            break;
 
216
 
 
217
        case ID3FID_PRIVATE:
 
218
            return;
 
219
 
 
220
        case ID3FID_AUDIOCRYPTO:
 
221
        case ID3FID_BUFFERSIZE:
 
222
        case ID3FID_CDID:
 
223
        case ID3FID_EQUALIZATION:
 
224
        case ID3FID_EVENTTIMING:
 
225
        case ID3FID_METACRYPTO:
 
226
        case ID3FID_MPEGLOOKUP:
 
227
        case ID3FID_OWNERSHIP:
 
228
        case ID3FID_POSITIONSYNC:
 
229
        case ID3FID_REVERB:
 
230
        case ID3FID_SYNCEDTEMPO:
 
231
        case ID3FID_VOLUMEADJ:
 
232
            g_hash_table_replace(metadata, id, g_strdup("(unimplemented)"));
 
233
            return;
 
234
 
 
235
        case ID3FID_PLAYCOUNTER:
 
236
            field = ID3Frame_GetField(frame, ID3FN_COUNTER);
 
237
            if (!field)  return;
 
238
 
 
239
            g_hash_table_replace(metadata, id, g_strdup_printf ("%u", ID3Field_GetINT(field)));
 
240
            return;
 
241
 
 
242
        default:
 
243
            field = ID3Frame_GetField(frame, ID3FN_TEXT);
 
244
            if (!field)  return;
 
245
 
 
246
            break;
 
247
    }
 
248
 
 
249
    size = ID3Field_Size (field);
 
250
    s = (gchar *) g_try_malloc0 (size+1);   // since glib >= 2.8
 
251
 
 
252
    if (!s)  return;
 
253
 
 
254
    ID3Field_GetASCII(field, s, size);
 
255
    g_strstrip (s);
 
256
 
 
257
    switch (frame_ID)
 
258
    {
 
259
        case ID3FID_CONTENTTYPE:
 
260
            {
 
261
                /*
 
262
                 * We manipulate only the name of the genre
 
263
                 * Genre is written like this :
 
264
                 *    - "(<genre_id>)"              -> "(3)"
 
265
                 *    - "<genre_name>"              -> "Dance"
 
266
                 *    - "(<genre_id>)<refinement>"  -> "(3)EuroDance"
 
267
                 */
 
268
                gchar *tmp;
 
269
                gchar *s0 = s;
 
270
 
 
271
                if ((s[0]=='(') && (tmp=strchr(s,')')) && (strlen((tmp+1))>0))  // Convert a genre written as '(3)EuroDance' into 'EuroDance'
 
272
                {
 
273
                    s = g_strdup(tmp+1);
 
274
                    g_free(s0);
 
275
                }
 
276
                else
 
277
                if ((s[0]=='(') && strchr(s,')'))                               // Convert a genre written as '(3)' into 'EuroDance'
 
278
                {
 
279
                    s = g_strdup(get_genre(atoi(s+1)));
 
280
                    g_free(s0);
 
281
                }
 
282
 
 
283
                g_hash_table_replace(metadata, get_gcmd_tag((ID3_FrameID) ID3FID_GENRE), g_strdup(s));
 
284
            }
 
285
            break;
 
286
 
 
287
        case ID3FID_TRACKNUM:
 
288
            {
 
289
                gchar *s0 = s;
 
290
                s = g_strdup_printf("%02u", atoi(s));                           // Just to have numbers like this : '01', '05', '12', ...
 
291
                g_free(s0);
 
292
            }
 
293
            break;
 
294
 
 
295
        default:
 
296
            break;
 
297
    }
 
298
 
 
299
    if (*s)
 
300
        g_hash_table_replace(metadata, id, s);
 
301
    else
 
302
        g_free(s);
 
303
}
 
304
 
 
305
 
 
306
static void Read_MPEG_Header_Info (GHashTable *metadata, ID3Tag *id3_tag)
 
307
{
 
308
    static const gchar *layer_names[] =
 
309
    {
 
310
        N_("Undefined"),
 
311
        N_("Layer III"),
 
312
        N_("Layer II"),
 
313
        N_("Layer I")
 
314
    };
 
315
 
 
316
    static const gchar *version_names[] =
 
317
    {
 
318
        "MPEG2.5",
 
319
        N_("Reserved"),
 
320
        "MPEG2",
 
321
        "MPEG1"
 
322
    };
 
323
 
 
324
    static const gchar *channel_mode_names[] =
 
325
    {
 
326
        N_("Stereo"),
 
327
        N_("Joint stereo"),
 
328
        N_("Dual channel"),
 
329
        N_("Single channel")
 
330
    };
 
331
 
 
332
    static const gchar *emphasis_names[] =
 
333
    {
 
334
        N_("None"),
 
335
        N_("10-15ms"),
 
336
        N_("Reserved"),
 
337
        N_("CCIT J17")
 
338
    };
 
339
 
 
340
    const Mp3_Headerinfo *headerInfo = ID3Tag_GetMp3HeaderInfo(id3_tag);
 
341
 
 
342
    if (!headerInfo)
 
343
        return;
 
344
 
 
345
    switch (headerInfo->layer)
 
346
    {
 
347
        case MPEGLAYER_I:
 
348
        case MPEGLAYER_II:
 
349
        case MPEGLAYER_III:
 
350
        case MPEGLAYER_UNDEFINED:
 
351
            g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_MPEGLAYER), g_strdup(_(layer_names[headerInfo->layer])));
 
352
            break;
 
353
 
 
354
        default:
 
355
            break;
 
356
    }
 
357
 
 
358
    switch (headerInfo->version)
 
359
    {
 
360
        case MPEGVERSION_2_5:
 
361
        case MPEGVERSION_2:
 
362
        case MPEGVERSION_1:
 
363
            g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_MPEGVERSION), g_strdup(_(version_names[headerInfo->version])));
 
364
            break;
 
365
        case MPEGVERSION_Reserved:
 
366
            g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_MPEGVERSION), g_strdup(_("Reserved")));
 
367
            break;
 
368
 
 
369
        default:
 
370
            break;
 
371
    }
 
372
 
 
373
    switch (headerInfo->channelmode)
 
374
    {
 
375
        case MP3CHANNELMODE_STEREO:
 
376
        case MP3CHANNELMODE_JOINT_STEREO:
 
377
        case MP3CHANNELMODE_DUAL_CHANNEL:
 
378
            g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_CHANNELMODE), g_strdup(_(channel_mode_names[headerInfo->channelmode])));
 
379
            g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_CHANNELS), g_strdup("2"));
 
380
            break;
 
381
 
 
382
        case MP3CHANNELMODE_SINGLE_CHANNEL:
 
383
            g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_CHANNELMODE), g_strdup(_(channel_mode_names[headerInfo->channelmode])));
 
384
            g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_CHANNELS), g_strdup("1"));
 
385
            break;
 
386
 
 
387
        default:
 
388
            break;
 
389
    }
 
390
 
 
391
    switch (headerInfo->emphasis)
 
392
    {
 
393
        case MPEGLAYER_I:
 
394
        case MPEGLAYER_II:
 
395
        case MPEGLAYER_III:
 
396
        case MPEGLAYER_UNDEFINED:
 
397
            g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_EMPHASIS), g_strdup(_(emphasis_names[headerInfo->emphasis])));
 
398
            break;
 
399
 
 
400
        default:
 
401
            break;
 
402
    }
 
403
 
 
404
    g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_SAMPLERATE), g_strdup_printf ("%u", headerInfo->frequency));
 
405
 
 
406
    if (headerInfo->vbr_bitrate>0)
 
407
        g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_BITRATE), g_strdup_printf ("%u", headerInfo->vbr_bitrate/1000));
 
408
    else
 
409
        g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_BITRATE), g_strdup_printf ("%u", headerInfo->bitrate/1000));
 
410
 
 
411
    g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_DURATION), g_strdup_printf ("%u", headerInfo->time));
 
412
 
 
413
    g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_DURATIONMMSS), g_strdup_printf ("%u:%02u", headerInfo->time/60, headerInfo->time%60));
 
414
 
 
415
    g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_FRAMES), g_strdup_printf ("%u", headerInfo->frames));
 
416
}
 
417
#endif
 
418
 
 
419
 
 
420
// inline
 
421
void gcmd_tags_id3lib_load_metadata(GnomeCmdFile *finfo)
 
422
{
 
423
    g_return_if_fail (finfo != NULL);
 
424
    g_return_if_fail (finfo->info != NULL);
 
425
 
 
426
#ifdef HAVE_ID3
 
427
    if (finfo->id3.accessed)  return;
 
428
 
 
429
    finfo->id3.accessed = TRUE;
 
430
 
 
431
    if (!gnome_cmd_file_is_local(finfo))  return;
 
432
 
 
433
    finfo->id3.metadata = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free);
 
434
 
 
435
    ID3Tag *id3_tag = ID3Tag_New();
 
436
 
 
437
    ID3Tag_Link(id3_tag, gnome_cmd_file_get_real_path(finfo));
 
438
 
 
439
    ID3TagConstIterator *iter = ID3Tag_CreateConstIterator(id3_tag);
 
440
 
 
441
    Read_MPEG_Header_Info((GHashTable *) finfo->id3.metadata, id3_tag);
 
442
 
 
443
    for (const ID3Frame *frame=ID3TagConstIterator_GetNext(iter); frame; frame=ID3TagConstIterator_GetNext(iter))
 
444
        ID3Frame_GetString((GHashTable *) finfo->id3.metadata, frame);
 
445
 
 
446
    ID3TagConstIterator_Delete(iter);
 
447
    ID3Tag_Delete(id3_tag);
 
448
#endif
 
449
}
 
450
 
 
451
 
 
452
void gcmd_tags_id3lib_free_metadata(GnomeCmdFile *finfo)
 
453
{
 
454
    g_return_if_fail (finfo != NULL);
 
455
 
 
456
#ifdef HAVE_ID3
 
457
    if (finfo->id3.accessed)
 
458
        g_hash_table_destroy((GHashTable *) finfo->id3.metadata);
 
459
    finfo->id3.metadata = NULL;
 
460
#endif
 
461
}
 
462
 
 
463
 
 
464
// ID3FN_NOFIELD = 0,    /**< No field */
 
465
// ID3FN_TEXTENC,        /**< Text encoding (unicode or ASCII) */
 
466
// ID3FN_TEXT,           /**< Text field */
 
467
// ID3FN_URL,            /**< A URL */
 
468
// ID3FN_DATA,           /**< Data field */
 
469
// ID3FN_DESCRIPTION,    /**< Description field */
 
470
// ID3FN_OWNER,          /**< Owner field */
 
471
// ID3FN_EMAIL,          /**< Email field */
 
472
// ID3FN_RATING,         /**< Rating field */
 
473
// ID3FN_FILENAME,       /**< Filename field */
 
474
// ID3FN_LANGUAGE,       /**< Language field */
 
475
// ID3FN_PICTURETYPE,    /**< Picture type field */
 
476
// ID3FN_IMAGEFORMAT,    /**< Image format field */
 
477
// ID3FN_MIMETYPE,       /**< Mimetype field */
 
478
// ID3FN_COUNTER,        /**< Counter field */
 
479
// ID3FN_ID,             /**< Identifier/Symbol field */
 
480
// ID3FN_VOLUMEADJ,      /**< Volume adjustment field */
 
481
// ID3FN_NUMBITS,        /**< Number of bits field */
 
482
// ID3FN_VOLCHGRIGHT,    /**< Volume chage on the right channel */
 
483
// ID3FN_VOLCHGLEFT,     /**< Volume chage on the left channel */
 
484
// ID3FN_PEAKVOLRIGHT,   /**< Peak volume on the right channel */
 
485
// ID3FN_PEAKVOLLEFT,    /**< Peak volume on the left channel */
 
486
// ID3FN_TIMESTAMPFORMAT,/**< SYLT Timestamp Format */
 
487
// ID3FN_CONTENTTYPE,    /**< SYLT content type */
 
488
 
 
489
// ID3FID_ALBUM,             /**< Album/Movie/Show title */
 
490
// ID3FID_ALBUMSORTORDER,    /**< Album sort order */
 
491
// ID3FID_AUDIOCRYPTO,       /**< Audio encryption */
 
492
// ID3FID_AUDIOSEEKPOINT,    /**< Audio seek point index */
 
493
// ID3FID_BAND,              /**< Band/orchestra/accompaniment */
 
494
// ID3FID_BPM,               /**< BPM (beats per minute) */
 
495
// ID3FID_BUFFERSIZE,        /**< Recommended buffer size */
 
496
// ID3FID_CDID,              /**< Music CD identifier */
 
497
// ID3FID_COMMENT,           /**< Comments */
 
498
// ID3FID_COMMERCIAL,        /**< Commercial frame */
 
499
// ID3FID_COMPOSER,          /**< Composer */
 
500
// ID3FID_CONDUCTOR,         /**< Conductor/performer refinement */
 
501
// ID3FID_CONTENTGROUP,      /**< Content group description */
 
502
// ID3FID_CONTENTTYPE,       /**< Content type */
 
503
// ID3FID_COPYRIGHT,         /**< Copyright message */
 
504
// ID3FID_CRYPTOREG,         /**< Encryption method registration */
 
505
// ID3FID_DATE,              /**< Date */
 
506
// ID3FID_ENCODEDBY,         /**< Encoded by */
 
507
// ID3FID_ENCODERSETTINGS,   /**< Software/Hardware and settings used for encoding */
 
508
// ID3FID_ENCODINGTIME,      /**< Encoding time */
 
509
// ID3FID_EQUALIZATION,      /**< Equalization */
 
510
// ID3FID_EQUALIZATION2,     /**< Equalisation (2) */
 
511
// ID3FID_EVENTTIMING,       /**< Event timing codes */
 
512
// ID3FID_FILEOWNER,         /**< File owner/licensee */
 
513
// ID3FID_FILETYPE,          /**< File type */
 
514
// ID3FID_GENERALOBJECT,     /**< General encapsulated object */
 
515
// ID3FID_GROUPINGREG,       /**< Group identification registration */
 
516
// ID3FID_INITIALKEY,        /**< Initial key */
 
517
// ID3FID_INVOLVEDPEOPLE,    /**< Involved people list */
 
518
// ID3FID_INVOLVEDPEOPLE2,   /**< Involved people list */
 
519
// ID3FID_ISRC,              /**< ISRC (international standard recording code) */
 
520
// ID3FID_LANGUAGE,          /**< Language(s) */
 
521
// ID3FID_LEADARTIST,        /**< Lead performer(s)/Soloist(s) */
 
522
// ID3FID_LINKEDINFO,        /**< Linked information */
 
523
// ID3FID_LYRICIST,          /**< Lyricist/Text writer */
 
524
// ID3FID_MEDIATYPE,         /**< Media type */
 
525
// ID3FID_METACOMPRESSION,   /**< Compressed meta frame (id3v2.2.1) */
 
526
// ID3FID_METACRYPTO,        /**< Encrypted meta frame (id3v2.2.x) */
 
527
// ID3FID_MIXARTIST,         /**< Interpreted, remixed, or otherwise modified by */
 
528
// ID3FID_MOOD,              /**< Mood */
 
529
// ID3FID_MPEGLOOKUP,        /**< MPEG location lookup table */
 
530
// ID3FID_MUSICIANCREDITLIST,/**< Musician credits list */
 
531
// ID3FID_NETRADIOOWNER,     /**< Internet radio station owner */
 
532
// ID3FID_NETRADIOSTATION,   /**< Internet radio station name */
 
533
// ID3FID_ORIGALBUM,         /**< Original album/movie/show title */
 
534
// ID3FID_ORIGARTIST,        /**< Original artist(s)/performer(s) */
 
535
// ID3FID_ORIGFILENAME,      /**< Original filename */
 
536
// ID3FID_ORIGLYRICIST,      /**< Original lyricist(s)/text writer(s) */
 
537
// ID3FID_ORIGRELEASETIME,   /**< Original release time */
 
538
// ID3FID_ORIGYEAR,          /**< Original release year */
 
539
// ID3FID_OWNERSHIP,         /**< Ownership frame */
 
540
// ID3FID_PARTINSET,         /**< Part of a set */
 
541
// ID3FID_PERFORMERSORTORDER,/**< Performer sort order */
 
542
// ID3FID_PICTURE,           /**< Attached picture */
 
543
// ID3FID_PLAYCOUNTER,       /**< Play counter */
 
544
// ID3FID_PLAYLISTDELAY,     /**< Playlist delay */
 
545
// ID3FID_POPULARIMETER,     /**< Popularimeter */
 
546
// ID3FID_POSITIONSYNC,      /**< Position synchronisation frame */
 
547
// ID3FID_PRIVATE,           /**< Private frame */
 
548
// ID3FID_PRODUCEDNOTICE,    /**< Produced notice */
 
549
// ID3FID_PUBLISHER,         /**< Publisher */
 
550
// ID3FID_RECORDINGDATES,    /**< Recording dates */
 
551
// ID3FID_RECORDINGTIME,     /**< Recording time */
 
552
// ID3FID_RELEASETIME,       /**< Release time */
 
553
// ID3FID_REVERB,            /**< Reverb */
 
554
// ID3FID_SEEKFRAME,         /**< Seek frame */
 
555
// ID3FID_SETSUBTITLE,       /**< Set subtitle */
 
556
// ID3FID_SIGNATURE,         /**< Signature frame */
 
557
// ID3FID_SIZE,              /**< Size */
 
558
// ID3FID_SONGLEN,           /**< Length */
 
559
// ID3FID_SUBTITLE,          /**< Subtitle/Description refinement */
 
560
// ID3FID_SYNCEDLYRICS,      /**< Synchronized lyric/text */
 
561
// ID3FID_SYNCEDTEMPO,       /**< Synchronized tempo codes */
 
562
// ID3FID_TAGGINGTIME,       /**< Tagging time */
 
563
// ID3FID_TERMSOFUSE,        /**< Terms of use */
 
564
// ID3FID_TIME,              /**< Time */
 
565
// ID3FID_TITLE,             /**< Title/songname/content description */
 
566
// ID3FID_TITLESORTORDER,    /**< Title sort order */
 
567
// ID3FID_TRACKNUM,          /**< Track number/Position in set */
 
568
// ID3FID_UNIQUEFILEID,      /**< Unique file identifier */
 
569
// ID3FID_UNSYNCEDLYRICS,    /**< Unsynchronized lyric/text transcription */
 
570
// ID3FID_USERTEXT,          /**< User defined text information */
 
571
// ID3FID_VOLUMEADJ,         /**< Relative volume adjustment */
 
572
// ID3FID_VOLUMEADJ2,        /**< Relative volume adjustment (2) */
 
573
// ID3FID_WWWARTIST,         /**< Official artist/performer webpage */
 
574
// ID3FID_WWWAUDIOFILE,      /**< Official audio file webpage */
 
575
// ID3FID_WWWAUDIOSOURCE,    /**< Official audio source webpage */
 
576
// ID3FID_WWWCOMMERCIALINFO, /**< Commercial information */
 
577
// ID3FID_WWWCOPYRIGHT,      /**< Copyright/Legal infromation */
 
578
// ID3FID_WWWPAYMENT,        /**< Payment */
 
579
// ID3FID_WWWPUBLISHER,      /**< Official publisher webpage */
 
580
// ID3FID_WWWRADIOPAGE,      /**< Official internet radio station homepage */
 
581
// ID3FID_WWWUSER,           /**< User defined URL link */
 
582
// ID3FID_YEAR,              /**< Year */
 
583
 
 
584
 
 
585
const gchar *gcmd_tags_id3lib_get_value(GnomeCmdFile *finfo, const guint tag)
 
586
{
 
587
    g_return_val_if_fail (finfo != NULL, NULL);
 
588
 
 
589
#ifdef HAVE_ID3
 
590
    gcmd_tags_id3lib_load_metadata(finfo);
 
591
 
 
592
    const gchar *value = (const gchar *) g_hash_table_lookup((GHashTable *) finfo->id3.metadata, &tag);
 
593
 
 
594
    return value ? value : empty_string;
 
595
#else
 
596
    return no_support_for_id3lib_tags_string;
 
597
#endif
 
598
}
 
599
 
 
600
 
 
601
const gchar *gcmd_tags_id3lib_get_value_by_name(GnomeCmdFile *finfo, const gchar *tag_name)
 
602
{
 
603
    g_return_val_if_fail (finfo != NULL, NULL);
 
604
 
 
605
#ifdef HAVE_ID3
 
606
    return NULL;
 
607
#else
 
608
    return no_support_for_id3lib_tags_string;
 
609
#endif
 
610
}
 
611
 
 
612
 
 
613
const gchar *gcmd_tags_id3lib_get_title_by_name(GnomeCmdFile *finfo, const gchar *tag_name)
 
614
{
 
615
    g_return_val_if_fail (finfo != NULL, NULL);
 
616
 
 
617
#ifdef HAVE_ID3
 
618
    return empty_string;
 
619
#else
 
620
    return no_support_for_id3lib_tags_string;
 
621
#endif
 
622
}
 
623
 
 
624
 
 
625
const gchar *gcmd_tags_id3lib_get_description_by_name(GnomeCmdFile *finfo, const gchar *tag_name)
 
626
{
 
627
    g_return_val_if_fail (finfo != NULL, NULL);
 
628
 
 
629
#ifdef HAVE_ID3
 
630
    return empty_string;
 
631
#else
 
632
    return no_support_for_id3lib_tags_string;
 
633
#endif
 
634
}