3
* arch-tag: Implementation of song metadata loading object
5
* Copyright (C) 2002 Jorn Baayen <jorn@nl.linux.org>
6
* Marco Pesenti Gritti <marco@it.gnome.org>
7
* Bastien Nocera <hadess@hadess.net>
8
* Seth Nickell <snickell@stanford.edu>
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation; either version 2 of the License, or
13
* (at your option) any later version.
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
20
* You should have received a copy of the GNU General Public License
21
* along with this program; if not, write to the Free Software
22
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
31
#include <libgnomevfs/gnome-vfs.h>
32
#include <libgnomevfs/gnome-vfs-mime-utils.h>
33
#include <libgnomevfs/gnome-vfs-utils.h>
35
#include "monkey-media-stream-info.h"
36
#include "monkey-media-private.h"
37
#ifdef HAVE_MUSICBRAINZ
38
#include "monkey-media-musicbrainz.h"
41
#include "vorbis-stream-info-impl.h"
42
#include "mp3-stream-info-impl.h"
43
#include "audiocd-stream-info-impl.h"
44
#include "flac-stream-info-impl.h"
46
static void monkey_media_stream_info_class_init (MonkeyMediaStreamInfoClass *klass);
47
static void monkey_media_stream_info_init (MonkeyMediaStreamInfo *info);
48
static void monkey_media_stream_info_finalize (GObject *object);
49
static void monkey_media_stream_info_set_property (GObject *object,
53
static void monkey_media_stream_info_get_property (GObject *object,
59
monkey_media_stream_info_field_get_type (void)
61
static GType etype = 0;
65
static const GEnumValue values[] =
68
{ MONKEY_MEDIA_STREAM_INFO_FIELD_TITLE, "MONKEY_MEDIA_STREAM_INFO_FIELD_TITLE", "title" },
69
{ MONKEY_MEDIA_STREAM_INFO_FIELD_ARTIST, "MONKEY_MEDIA_STREAM_INFO_FIELD_ARTIST", "artist" },
70
{ MONKEY_MEDIA_STREAM_INFO_FIELD_ALBUM, "MONKEY_MEDIA_STREAM_INFO_FIELD_ALBUM", "album" },
71
{ MONKEY_MEDIA_STREAM_INFO_FIELD_DATE, "MONKEY_MEDIA_STREAM_INFO_FIELD_DATE", "date" },
72
{ MONKEY_MEDIA_STREAM_INFO_FIELD_GENRE, "MONKEY_MEDIA_STREAM_INFO_FIELD_GENRE", "genre" },
73
{ MONKEY_MEDIA_STREAM_INFO_FIELD_COMMENT, "MONKEY_MEDIA_STREAM_INFO_FIELD_COMMENT", "comment" },
74
{ MONKEY_MEDIA_STREAM_INFO_FIELD_TRACK_NUMBER, "MONKEY_MEDIA_STREAM_INFO_FIELD_TRACK_NUMBER", "tracknumber" },
75
{ MONKEY_MEDIA_STREAM_INFO_FIELD_MAX_TRACK_NUMBER, "MONKEY_MEDIA_STREAM_INFO_FIELD_MAX_TRACK_NUMBER", "max_tracknumber" },
76
{ MONKEY_MEDIA_STREAM_INFO_FIELD_LOCATION, "MONKEY_MEDIA_STREAM_INFO_FIELD_LOCATION", "location" },
77
{ MONKEY_MEDIA_STREAM_INFO_FIELD_DESCRIPTION, "MONKEY_MEDIA_STREAM_INFO_FIELD_DESCRIPTION", "description" },
78
{ MONKEY_MEDIA_STREAM_INFO_FIELD_VERSION, "MONKEY_MEDIA_STREAM_INFO_FIELD_VERSION", "version" },
79
{ MONKEY_MEDIA_STREAM_INFO_FIELD_ISRC, "MONKEY_MEDIA_STREAM_INFO_FIELD_ISRC", "isrc" },
80
{ MONKEY_MEDIA_STREAM_INFO_FIELD_ORGANIZATION, "MONKEY_MEDIA_STREAM_INFO_FIELD_ORGANIZATION", "organization" },
81
{ MONKEY_MEDIA_STREAM_INFO_FIELD_COPYRIGHT, "MONKEY_MEDIA_STREAM_INFO_FIELD_COPYRIGHT", "copyright" },
82
{ MONKEY_MEDIA_STREAM_INFO_FIELD_CONTACT, "MONKEY_MEDIA_STREAM_INFO_FIELD_CONTACT", "contact" },
83
{ MONKEY_MEDIA_STREAM_INFO_FIELD_LICENSE, "MONKEY_MEDIA_STREAM_INFO_FIELD_LICENSE", "license" },
84
{ MONKEY_MEDIA_STREAM_INFO_FIELD_PERFORMER, "MONKEY_MEDIA_STREAM_INFO_FIELD_PERFORMER", "performer" },
86
/* generic stream information */
87
{ MONKEY_MEDIA_STREAM_INFO_FIELD_FILE_SIZE, "MONKEY_MEDIA_STREAM_INFO_FIELD_FILE_SIZE", "filesize" },
88
{ MONKEY_MEDIA_STREAM_INFO_FIELD_DURATION, "MONKEY_MEDIA_STREAM_INFO_FIELD_DURATION", "duration" },
91
{ MONKEY_MEDIA_STREAM_INFO_FIELD_HAS_AUDIO, "MONKEY_MEDIA_STREAM_INFO_FIELD_HAS_AUDIO", "has_audio" },
92
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_CODEC_INFO, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_CODEC_INFO", "audio_codecinfo" },
93
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_BIT_RATE, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_BIT_RATE", "audio_bitrate" },
94
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_AVERAGE_BIT_RATE, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_AVERAGE_BIT_RATE", "audio_average-bitrate" },
95
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_VARIABLE_BIT_RATE, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_VARIABLE_BIT_RATE", "audio_variable-bitrate" },
96
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_QUALITY, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_QUALITY", "audio_quality" },
97
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_SAMPLE_RATE, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_SAMPLE_RATE", "audio_samplerate" },
98
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_CHANNELS, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_CHANNELS", "audio_channels" },
99
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_VENDOR, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_VENDOR", "audio_vendor" },
100
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_SERIAL_NUMBER, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_SERIAL_NUMBER", "audio_serialnumber" },
101
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_ALBUM_GAIN, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_ALBUM_GAIN", "audio_album_gain" },
102
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_TRACK_GAIN, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_TRACK_GAIN", "audio_track_gain" },
103
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_ALBUM_PEAK, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_ALBUM_PEAK", "audio_album_peak" },
104
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_TRACK_PEAK, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_TRACK_PEAK", "audio_track_peak" },
105
{ MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_TRM_ID, "MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_TRM_ID", "audio_trm_id" },
108
{ MONKEY_MEDIA_STREAM_INFO_FIELD_HAS_VIDEO, "MONKEY_MEDIA_STREAM_INFO_FIELD_HAS_VIDEO", "has_video" },
109
{ MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_CODEC_INFO, "MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_CODEC_INFO", "video_codecinfo" },
110
{ MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_BIT_RATE, "MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_BIT_RATE", "video_bitrate" },
111
{ MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_AVERAGE_BIT_RATE, "MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_AVERAGE_BIT_RATE", "video_average-bitrate" },
112
{ MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_VARIABLE_BIT_RATE, "MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_VARIABLE_BIT_RATE", "video_variable-bitrate" },
113
{ MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_WIDTH, "MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_WIDTH", "video_width" },
114
{ MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_HEIGHT, "MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_HEIGHT", "video_height" },
115
{ MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_SERIAL_NUMBER, "MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_SERIAL_NUMBER", "video_serialnumber" },
116
{ MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_VENDOR, "MONKEY_MEDIA_STREAM_INFO_FIELD_VIDEO_VENDOR", "video_vendor" },
120
etype = g_enum_register_static ("MonkeyMediaStreamInfoField", values);
127
monkey_media_stream_info_uri_is_supported (const char *uri)
131
g_return_val_if_fail (uri != NULL, FALSE);
133
return (monkey_media_get_stream_info_impl_for (uri, &mimetype) != -1);
137
monkey_media_stream_info_error_quark (void)
141
quark = g_quark_from_static_string ("monkey_media_stream_info_error");
146
struct MonkeyMediaStreamInfoPrivate
160
static GObjectClass *parent_class = NULL;
163
monkey_media_stream_info_get_type (void)
165
static GType monkey_media_stream_info_type = 0;
167
if (monkey_media_stream_info_type == 0)
169
static const GTypeInfo our_info =
171
sizeof (MonkeyMediaStreamInfoClass),
174
(GClassInitFunc) monkey_media_stream_info_class_init,
177
sizeof (MonkeyMediaStreamInfo),
179
(GInstanceInitFunc) monkey_media_stream_info_init
182
monkey_media_stream_info_type = g_type_register_static (G_TYPE_OBJECT,
183
"MonkeyMediaStreamInfo",
187
return monkey_media_stream_info_type;
191
monkey_media_stream_info_class_init (MonkeyMediaStreamInfoClass *klass)
193
GObjectClass *object_class = G_OBJECT_CLASS (klass);
195
parent_class = g_type_class_peek_parent (klass);
197
object_class->finalize = monkey_media_stream_info_finalize;
199
object_class->set_property = monkey_media_stream_info_set_property;
200
object_class->get_property = monkey_media_stream_info_get_property;
202
g_object_class_install_property (object_class,
204
g_param_spec_string ("location",
208
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
209
g_object_class_install_property (object_class,
211
g_param_spec_pointer ("error",
213
"Failure information",
218
monkey_media_stream_info_init (MonkeyMediaStreamInfo *info)
220
info->priv = g_new0 (MonkeyMediaStreamInfoPrivate, 1);
224
monkey_media_stream_info_finalize (GObject *object)
226
MonkeyMediaStreamInfo *info;
228
g_return_if_fail (object != NULL);
229
g_return_if_fail (MONKEY_MEDIA_IS_STREAM_INFO (object));
231
info = MONKEY_MEDIA_STREAM_INFO (object);
233
g_return_if_fail (info->priv != NULL);
235
g_free (info->priv->location);
239
G_OBJECT_CLASS (parent_class)->finalize (object);
243
monkey_media_stream_info_set_property (GObject *object,
248
MonkeyMediaStreamInfo *info = MONKEY_MEDIA_STREAM_INFO (object);
254
MonkeyMediaStreamInfoClass *klass = MONKEY_MEDIA_STREAM_INFO_GET_CLASS (info);
256
info->priv->location = g_strdup (g_value_get_string (value));
258
klass->open_stream (info);
262
info->priv->error = g_value_get_pointer (value);
265
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
271
monkey_media_stream_info_get_property (GObject *object,
276
MonkeyMediaStreamInfo *info = MONKEY_MEDIA_STREAM_INFO (object);
281
g_value_set_string (value, info->priv->location);
284
g_value_set_pointer (value, info->priv->error);
287
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
292
MonkeyMediaStreamInfo *
293
monkey_media_stream_info_new (const char *uri, GError **error)
295
MonkeyMediaStreamInfo *info = NULL;
296
GType impl_type = -1;
297
char *mimetype = NULL;
300
g_return_val_if_fail (uri != NULL, NULL);
302
impl_type = monkey_media_get_stream_info_impl_for (uri, &mimetype);
308
MONKEY_MEDIA_STREAM_INFO_ERROR,
309
MONKEY_MEDIA_STREAM_INFO_ERROR_UNSUPPORTED_MIME_TYPE,
310
_("Unsupported MIME type %s"), mimetype);
313
MONKEY_MEDIA_STREAM_INFO_ERROR,
314
MONKEY_MEDIA_STREAM_INFO_ERROR_UNSUPPORTED_MIME_TYPE,
315
_("Unknown file type"));
319
info = MONKEY_MEDIA_STREAM_INFO (g_object_new (impl_type,
323
g_return_val_if_fail (info->priv != NULL, NULL);
325
g_object_get (G_OBJECT (info), "error", &tmp, NULL);
334
g_object_unref (G_OBJECT (info));
342
sanitize_values (gboolean ret,
343
MonkeyMediaStreamInfo *info,
344
MonkeyMediaStreamInfoField field,
349
/* Convert "\0" to NULL */
350
if (G_VALUE_HOLDS (value, G_TYPE_STRING))
354
str = g_value_get_string (value);
361
g_value_unset (value);
366
case MONKEY_MEDIA_STREAM_INFO_FIELD_TITLE:
368
GValue tracknum_value = { 0, };
371
g_value_init (value, G_TYPE_STRING);
373
if (monkey_media_stream_info_get_value (info,
374
MONKEY_MEDIA_STREAM_INFO_FIELD_TRACK_NUMBER,
376
&tracknum_value) == TRUE)
378
tracknum = g_value_get_int (&tracknum_value);
379
g_value_unset (&tracknum_value);
386
name = g_strdup_printf (_("Track %.2d"), tracknum);
387
g_value_set_string (value, name);
393
char *unescaped_basename;
396
basename = g_path_get_basename (info->priv->location);
397
unescaped_basename = gnome_vfs_unescape_string_for_display (basename);
398
utf8_basename = g_filename_to_utf8 (unescaped_basename,
399
g_utf8_strlen (unescaped_basename, -1),
401
if (utf8_basename != NULL)
402
g_value_set_string (value, utf8_basename);
404
g_value_set_string (value, _("Unknown"));
407
g_free (unescaped_basename);
408
g_free (utf8_basename);
414
case MONKEY_MEDIA_STREAM_INFO_FIELD_ARTIST:
415
case MONKEY_MEDIA_STREAM_INFO_FIELD_ALBUM:
416
case MONKEY_MEDIA_STREAM_INFO_FIELD_GENRE:
417
case MONKEY_MEDIA_STREAM_INFO_FIELD_ORGANIZATION:
418
case MONKEY_MEDIA_STREAM_INFO_FIELD_COPYRIGHT:
419
g_value_init (value, G_TYPE_STRING);
420
g_value_set_string (value, _("Unknown"));
432
monkey_media_stream_info_get_n_values (MonkeyMediaStreamInfo *info,
433
MonkeyMediaStreamInfoField field)
435
MonkeyMediaStreamInfoClass *klass;
438
g_return_val_if_fail (MONKEY_MEDIA_IS_STREAM_INFO (info), 0);
440
klass = MONKEY_MEDIA_STREAM_INFO_GET_CLASS (info);
442
ret = klass->get_n_values (info, field);
445
(field == MONKEY_MEDIA_STREAM_INFO_FIELD_TITLE ||
446
field == MONKEY_MEDIA_STREAM_INFO_FIELD_ARTIST ||
447
field == MONKEY_MEDIA_STREAM_INFO_FIELD_ALBUM ||
448
field == MONKEY_MEDIA_STREAM_INFO_FIELD_GENRE ||
449
field == MONKEY_MEDIA_STREAM_INFO_FIELD_ORGANIZATION ||
450
field == MONKEY_MEDIA_STREAM_INFO_FIELD_COPYRIGHT))
459
monkey_media_stream_info_get_value_list (MonkeyMediaStreamInfo *info,
460
MonkeyMediaStreamInfoField field)
462
MonkeyMediaStreamInfoClass *klass;
466
g_return_val_if_fail (MONKEY_MEDIA_IS_STREAM_INFO (info), NULL);
468
klass = MONKEY_MEDIA_STREAM_INFO_GET_CLASS (info);
470
max = klass->get_n_values (info, field);
472
for (i = 0; i < max; i++)
476
value = g_new0 (GValue, 1);
478
klass->get_value (info, field, i, value);
480
ret = g_list_append (ret, value);
487
monkey_media_stream_info_free_value_list (GList *list)
491
for (l = list; l != NULL; l = g_list_next (l))
495
value = (GValue *) l->data;
497
g_value_unset (value);
505
monkey_media_stream_info_get_value (MonkeyMediaStreamInfo *info,
506
MonkeyMediaStreamInfoField field,
510
MonkeyMediaStreamInfoClass *klass;
513
g_return_val_if_fail (MONKEY_MEDIA_IS_STREAM_INFO (info), FALSE);
515
klass = MONKEY_MEDIA_STREAM_INFO_GET_CLASS (info);
517
ret = klass->get_value (info, field, index, value);
519
ret = sanitize_values (ret, info, field, value);
525
monkey_media_stream_info_set_value (MonkeyMediaStreamInfo *info,
526
MonkeyMediaStreamInfoField field,
530
MonkeyMediaStreamInfoClass *klass;
532
g_return_val_if_fail (MONKEY_MEDIA_IS_STREAM_INFO (info), FALSE);
534
klass = MONKEY_MEDIA_STREAM_INFO_GET_CLASS (info);
536
return klass->set_value (info, field, index, value);
539
static const char *genres[] =
671
monkey_media_stream_info_list_all_genres (void)
673
static GList *list = NULL;
680
for (i = 0; i < G_N_ELEMENTS (genres); i++)
681
list = g_list_append (list, _(genres[i]));
683
list2 = g_list_sort (list, (GCompareFunc) strcmp);
690
monkey_media_stream_info_genre_to_index (const char *genre)
694
for (i = 0; i < G_N_ELEMENTS (genres); i++)
696
if (strcmp (genre, _(genres[i])) == 0)
700
return G_N_ELEMENTS (genres) - 1;
704
monkey_media_stream_info_index_to_genre (int index)
706
if (index >= G_N_ELEMENTS (genres))
707
return _(genres[G_N_ELEMENTS (genres) - 1]);
709
return _(genres[index]);
712
#ifdef HAVE_MUSICBRAINZ
714
clear_values (MonkeyMediaStreamInfo *info,
715
MonkeyMediaStreamInfoField field)
719
for (i = monkey_media_stream_info_get_n_values (info, field) - 1; i >= 0; i--)
721
GValue value = { 0, };
722
g_value_init (&value, G_TYPE_NONE);
723
monkey_media_stream_info_set_value (info, field, i, &value);
729
monkey_media_stream_info_get_value_net (MonkeyMediaStreamInfo *info,
730
MonkeyMediaStreamInfoField field,
734
#ifdef HAVE_MUSICBRAINZ
735
MonkeyMediaMusicbrainz *mb;
740
g_return_val_if_fail (MONKEY_MEDIA_IS_STREAM_INFO (info), FALSE);
742
if (monkey_media_stream_info_get_value (info,
743
MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_TRM_ID,
749
*error = g_error_new (MONKEY_MEDIA_STREAM_INFO_ERROR,
750
MONKEY_MEDIA_STREAM_INFO_ERROR_NO_TRM_ID,
751
_("No TRM ID for this song"));
756
#ifdef HAVE_MUSICBRAINZ
757
mb = monkey_media_musicbrainz_new ();
759
if (monkey_media_musicbrainz_load_info (mb,
760
MONKEY_MEDIA_MUSICBRAINZ_QUERY_SONG,
761
g_value_get_string (&val)) == FALSE)
765
*error = g_error_new (MONKEY_MEDIA_STREAM_INFO_ERROR,
766
MONKEY_MEDIA_STREAM_INFO_ERROR_NO_NET_INFO,
767
_("No information for this song found"));
769
g_value_unset (&val);
770
g_object_unref (G_OBJECT (mb));
774
g_value_unset (&val);
776
ret = monkey_media_musicbrainz_query (mb,
781
g_object_unref (G_OBJECT (mb));
789
monkey_media_stream_info_sync_from_net (MonkeyMediaStreamInfo *info,
792
#ifdef HAVE_MUSICBRAINZ
793
MonkeyMediaMusicbrainz *mb;
794
GValue value = { 0, };
797
static MonkeyMediaStreamInfoField sync_fields[] = {
798
MONKEY_MEDIA_STREAM_INFO_FIELD_TITLE,
799
MONKEY_MEDIA_STREAM_INFO_FIELD_ARTIST,
800
MONKEY_MEDIA_STREAM_INFO_FIELD_ALBUM,
801
MONKEY_MEDIA_STREAM_INFO_FIELD_TRACK_NUMBER,
802
MONKEY_MEDIA_STREAM_INFO_FIELD_MAX_TRACK_NUMBER
805
g_return_if_fail (MONKEY_MEDIA_IS_STREAM_INFO (info));
807
if (monkey_media_stream_info_get_value (info,
808
MONKEY_MEDIA_STREAM_INFO_FIELD_AUDIO_TRM_ID,
814
*error = g_error_new (MONKEY_MEDIA_STREAM_INFO_ERROR,
815
MONKEY_MEDIA_STREAM_INFO_ERROR_NO_TRM_ID,
816
_("No TRM ID for this song"));
821
mb = monkey_media_musicbrainz_new ();
823
if (monkey_media_musicbrainz_load_info (mb,
824
MONKEY_MEDIA_MUSICBRAINZ_QUERY_SONG,
825
g_value_get_string (&value)) == FALSE)
829
*error = g_error_new (MONKEY_MEDIA_STREAM_INFO_ERROR,
830
MONKEY_MEDIA_STREAM_INFO_ERROR_NO_NET_INFO,
831
_("No information for this song found"));
833
g_value_unset (&value);
834
g_object_unref (G_OBJECT (mb));
838
g_value_unset (&value);
840
for (i = 0; i < G_N_ELEMENTS (sync_fields); i++)
842
if (monkey_media_musicbrainz_query (mb,
847
clear_values (info, sync_fields[i]);
848
monkey_media_stream_info_set_value (info,
852
g_value_unset (&value);
856
g_object_unref (G_OBJECT (mb));