2
GNOME Commander - A GNOME based file manager
3
Copyright (C) 2001-2006 Marcus Bjurman
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.
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.
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.
20
/* Code for ID3 and Ogg Vorbis data processing comes from EasyTAG and is adjusted to GNOME Commander needs.
24
EasyTAG - Tag editor for MP3 and Ogg Vorbis files
25
Copyright (C) 2001-2003 Jerome Couderc <easytag@gmail.com> */
32
#include "gnome-cmd-includes.h"
33
#include "gnome-cmd-tags-id3.h"
34
#include "id3lib/id3_bugfix.h"
35
#include "id3lib/genres.h"
44
static char empty_string[] = "";
47
static char no_support_for_id3lib_tags_string[] = N_("<ID3 tags not supported>");
61
static int id3_tagcmp(const void *t1, const void *t2)
63
return (int)(((TAG *) t1)->id3) - (int)(((TAG *) t2)->id3);
67
const ID3_FrameID ID3FID_GENRE = (ID3_FrameID) (ID3FID_LASTFRAMEID+1);
68
const gint ID3FID_NUM_FRAMES = (ID3FID_GENRE+1);
71
static GnomeCmdTag *get_gcmd_tag(const ID3_FrameID id3_tag)
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}};
168
if (id3_tag>=ID3FID_NUM_FRAMES)
169
return &(tag[0].gcmd);
175
TAG *elem = (TAG *) bsearch(&t,tag,sizeof(tag)/sizeof(TAG),sizeof(TAG),id3_tagcmp);
177
return elem ? &(elem->gcmd) : &(tag[0].gcmd);
181
inline gchar *get_genre (guint genre_code)
183
if (genre_code>=ID3_INVALID_GENRE) /* empty */
185
else if (genre_code>GENRE_MAX) /* unknown tag */
188
return id3_genres[genre_code];
192
static void ID3Frame_GetString(GHashTable *metadata, const ID3Frame *frame)
194
ID3Field *field = NULL;
198
ID3_FrameID frame_ID = ID3Frame_GetID(frame);
199
GnomeCmdTag *id = get_gcmd_tag(frame_ID);
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:
212
field = ID3Frame_GetField(frame, ID3FN_URL);
220
case ID3FID_AUDIOCRYPTO:
221
case ID3FID_BUFFERSIZE:
223
case ID3FID_EQUALIZATION:
224
case ID3FID_EVENTTIMING:
225
case ID3FID_METACRYPTO:
226
case ID3FID_MPEGLOOKUP:
227
case ID3FID_OWNERSHIP:
228
case ID3FID_POSITIONSYNC:
230
case ID3FID_SYNCEDTEMPO:
231
case ID3FID_VOLUMEADJ:
232
g_hash_table_replace(metadata, id, g_strdup("(unimplemented)"));
235
case ID3FID_PLAYCOUNTER:
236
field = ID3Frame_GetField(frame, ID3FN_COUNTER);
239
g_hash_table_replace(metadata, id, g_strdup_printf ("%u", ID3Field_GetINT(field)));
243
field = ID3Frame_GetField(frame, ID3FN_TEXT);
249
size = ID3Field_Size (field);
250
s = (gchar *) g_try_malloc0 (size+1); // since glib >= 2.8
254
ID3Field_GetASCII(field, s, size);
259
case ID3FID_CONTENTTYPE:
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"
271
if ((s[0]=='(') && (tmp=strchr(s,')')) && (strlen((tmp+1))>0)) // Convert a genre written as '(3)EuroDance' into 'EuroDance'
277
if ((s[0]=='(') && strchr(s,')')) // Convert a genre written as '(3)' into 'EuroDance'
279
s = g_strdup(get_genre(atoi(s+1)));
283
g_hash_table_replace(metadata, get_gcmd_tag((ID3_FrameID) ID3FID_GENRE), g_strdup(s));
287
case ID3FID_TRACKNUM:
290
s = g_strdup_printf("%02u", atoi(s)); // Just to have numbers like this : '01', '05', '12', ...
300
g_hash_table_replace(metadata, id, s);
306
static void Read_MPEG_Header_Info (GHashTable *metadata, ID3Tag *id3_tag)
308
static const gchar *layer_names[] =
316
static const gchar *version_names[] =
324
static const gchar *channel_mode_names[] =
332
static const gchar *emphasis_names[] =
340
const Mp3_Headerinfo *headerInfo = ID3Tag_GetMp3HeaderInfo(id3_tag);
345
switch (headerInfo->layer)
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])));
358
switch (headerInfo->version)
360
case MPEGVERSION_2_5:
363
g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_MPEGVERSION), g_strdup(_(version_names[headerInfo->version])));
365
case MPEGVERSION_Reserved:
366
g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_MPEGVERSION), g_strdup(_("Reserved")));
373
switch (headerInfo->channelmode)
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"));
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"));
391
switch (headerInfo->emphasis)
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])));
404
g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_SAMPLERATE), g_strdup_printf ("%u", headerInfo->frequency));
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));
409
g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_BITRATE), g_strdup_printf ("%u", headerInfo->bitrate/1000));
411
g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_DURATION), g_strdup_printf ("%u", headerInfo->time));
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));
415
g_hash_table_replace(metadata, gcmd_tags_get_pointer_to_tag(TAG_ID3_FRAMES), g_strdup_printf ("%u", headerInfo->frames));
421
void gcmd_tags_id3lib_load_metadata(GnomeCmdFile *finfo)
423
g_return_if_fail (finfo != NULL);
424
g_return_if_fail (finfo->info != NULL);
427
if (finfo->id3.accessed) return;
429
finfo->id3.accessed = TRUE;
431
if (!gnome_cmd_file_is_local(finfo)) return;
433
finfo->id3.metadata = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free);
435
ID3Tag *id3_tag = ID3Tag_New();
437
ID3Tag_Link(id3_tag, gnome_cmd_file_get_real_path(finfo));
439
ID3TagConstIterator *iter = ID3Tag_CreateConstIterator(id3_tag);
441
Read_MPEG_Header_Info((GHashTable *) finfo->id3.metadata, id3_tag);
443
for (const ID3Frame *frame=ID3TagConstIterator_GetNext(iter); frame; frame=ID3TagConstIterator_GetNext(iter))
444
ID3Frame_GetString((GHashTable *) finfo->id3.metadata, frame);
446
ID3TagConstIterator_Delete(iter);
447
ID3Tag_Delete(id3_tag);
452
void gcmd_tags_id3lib_free_metadata(GnomeCmdFile *finfo)
454
g_return_if_fail (finfo != NULL);
457
if (finfo->id3.accessed)
458
g_hash_table_destroy((GHashTable *) finfo->id3.metadata);
459
finfo->id3.metadata = NULL;
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 */
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 */
585
const gchar *gcmd_tags_id3lib_get_value(GnomeCmdFile *finfo, const guint tag)
587
g_return_val_if_fail (finfo != NULL, NULL);
590
gcmd_tags_id3lib_load_metadata(finfo);
592
const gchar *value = (const gchar *) g_hash_table_lookup((GHashTable *) finfo->id3.metadata, &tag);
594
return value ? value : empty_string;
596
return no_support_for_id3lib_tags_string;
601
const gchar *gcmd_tags_id3lib_get_value_by_name(GnomeCmdFile *finfo, const gchar *tag_name)
603
g_return_val_if_fail (finfo != NULL, NULL);
608
return no_support_for_id3lib_tags_string;
613
const gchar *gcmd_tags_id3lib_get_title_by_name(GnomeCmdFile *finfo, const gchar *tag_name)
615
g_return_val_if_fail (finfo != NULL, NULL);
620
return no_support_for_id3lib_tags_string;
625
const gchar *gcmd_tags_id3lib_get_description_by_name(GnomeCmdFile *finfo, const gchar *tag_name)
627
g_return_val_if_fail (finfo != NULL, NULL);
632
return no_support_for_id3lib_tags_string;