~matttbe/ubuntu/raring/rhythmbox/lp1010619_RB_2.98

« back to all changes in this revision

Viewing changes to plugins/audiocd/sj-metadata-musicbrainz4.c

  • Committer: Package Import Robot
  • Author(s): Jeremy Bicha
  • Date: 2012-11-06 20:52:57 UTC
  • mfrom: (1.1.67) (214.1.1 quantal-proposed)
  • Revision ID: package-import@ubuntu.com-20121106205257-0btjh8jqley153el
Tags: 2.98-0ubuntu1
* New upstream release (LP: #1060601)
* debian/control.in:
  - Bump minimum glib, gtk, totem-plparser, clutter, and clutter-gst
  - Drop no longer needed musicbrainz dependency
* Refreshed 09_keywords.patch
* Updated 11_fix_cd_pausing.patch with fix from git
* Dropped patches applied in new version:
  - 00git_musicbrainz5.patch
  - 08_CVE-2012-3355.patch
  - dont_free_consumed_floating_gvariant.patch
  - git_scale_click.patch
  - git_crash_during_monitor.patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * sj-metadata-musicbrainz4.c
3
 
 * Copyright (C) 2008 Ross Burton <ross@burtonini.com>
4
 
 * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
5
 
 * Copyright (C) 2011 Christophe Fergeau <cfergeau@redhat.com>
6
 
 *
7
 
 * This library is free software; you can redistribute it and/or
8
 
 * modify it under the terms of the GNU Library General Public
9
 
 * License as published by the Free Software Foundation; either
10
 
 * version 2 of the License, or (at your option) any later version.
11
 
 *
12
 
 * This library is distributed in the hope that it will be useful,
13
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 
 * Library General Public License for more details.
16
 
 *
17
 
 * You should have received a copy of the GNU Library General Public
18
 
 * License along with this library; if not, write to the
19
 
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20
 
 * Boston, MA 02111-1307, USA.
21
 
 */
22
 
 
23
 
#ifdef HAVE_CONFIG_H
24
 
#include "config.h"
25
 
#endif /* HAVE_CONFIG_H */
26
 
 
27
 
#include <string.h>
28
 
#include <stdlib.h>
29
 
#include <glib.h>
30
 
#include <glib-object.h>
31
 
#include <gconf/gconf-client.h>
32
 
#include <discid/discid.h>
33
 
#include <musicbrainz4/mb4_c.h>
34
 
 
35
 
#include "sj-metadata-musicbrainz4.h"
36
 
#include "sj-structures.h"
37
 
#include "sj-error.h"
38
 
 
39
 
#define GET(field, function, obj) {                                             \
40
 
        function (obj, buffer, sizeof (buffer));                                \
41
 
        if (field)                                                              \
42
 
                g_free (field);                                                 \
43
 
        if (*buffer == '\0')                                                    \
44
 
                field = NULL;                                                   \
45
 
        else                                                                    \
46
 
                field = g_strdup (buffer);                                      \
47
 
}
48
 
 
49
 
#define GCONF_MUSICBRAINZ_SERVER "/apps/sound-juicer/musicbrainz_server"
50
 
#define GCONF_PROXY_USE_PROXY "/system/http_proxy/use_http_proxy"
51
 
#define GCONF_PROXY_HOST "/system/http_proxy/host"
52
 
#define GCONF_PROXY_PORT "/system/http_proxy/port"
53
 
#define GCONF_PROXY_USE_AUTHENTICATION "/system/http_proxy/use_authentication"
54
 
#define GCONF_PROXY_USERNAME "/system/http_proxy/authentication_user"
55
 
#define GCONF_PROXY_PASSWORD "/system/http_proxy/authentication_password"
56
 
#define SJ_MUSICBRAINZ_USER_AGENT "libjuicer-"VERSION
57
 
 
58
 
typedef struct {
59
 
  Mb4Query mb;
60
 
  DiscId *disc;
61
 
  char *cdrom;
62
 
  /* Proxy */
63
 
  char *http_proxy;
64
 
  int http_proxy_port;
65
 
} SjMetadataMusicbrainz4Private;
66
 
 
67
 
#define GET_PRIVATE(o)  \
68
 
  (G_TYPE_INSTANCE_GET_PRIVATE ((o), SJ_TYPE_METADATA_MUSICBRAINZ4, SjMetadataMusicbrainz4Private))
69
 
 
70
 
enum {
71
 
  PROP_0,
72
 
  PROP_DEVICE,
73
 
  PROP_USE_PROXY,
74
 
  PROP_PROXY_HOST,
75
 
  PROP_PROXY_PORT,
76
 
};
77
 
 
78
 
static void metadata_interface_init (gpointer g_iface, gpointer iface_data);
79
 
 
80
 
G_DEFINE_TYPE_WITH_CODE (SjMetadataMusicbrainz4,
81
 
                         sj_metadata_musicbrainz4,
82
 
                         G_TYPE_OBJECT,
83
 
                         G_IMPLEMENT_INTERFACE (SJ_TYPE_METADATA,
84
 
                                                metadata_interface_init));
85
 
 
86
 
 
87
 
/*
88
 
 * Private methods
89
 
 */
90
 
#ifdef DUMP_DETAILS
91
 
static void
92
 
sj_mb4_album_details_dump (AlbumDetails *details)
93
 
{
94
 
  if (details->country)
95
 
    g_print ("Country: %s\n", details->country);
96
 
  if (details->type)
97
 
    g_print ("Type: %s\n", details->type);
98
 
  if (details->lyrics_url)
99
 
    g_print ("Lyrics URL: %s\n", details->lyrics_url);
100
 
}
101
 
#else
102
 
#define sj_mb4_album_details_dump(...)
103
 
#endif
104
 
 
105
 
static GList *
106
 
get_artist_list (Mb4ArtistCredit credit)
107
 
{
108
 
  Mb4NameCreditList name_list;
109
 
  GList *artists;
110
 
  unsigned int i;
111
 
  char buffer[512]; /* for the GET macro */
112
 
 
113
 
  if (credit == NULL)
114
 
    return NULL;
115
 
 
116
 
  name_list = mb4_artistcredit_get_namecreditlist (credit);
117
 
  if (name_list == NULL) {
118
 
    return NULL;
119
 
  }
120
 
 
121
 
  artists = NULL;
122
 
  for (i = 0; i < mb4_namecredit_list_size (name_list); i++) {
123
 
    Mb4NameCredit name_credit;
124
 
    Mb4Artist artist;
125
 
    ArtistDetails *details;
126
 
 
127
 
    name_credit = mb4_namecredit_list_item (name_list, i);
128
 
    details = g_new0 (ArtistDetails, 1);
129
 
    GET (details->joinphrase, mb4_namecredit_get_joinphrase, name_credit);
130
 
    artists = g_list_prepend (artists, details);
131
 
    artist = mb4_namecredit_get_artist (name_credit);
132
 
    if (!artist) {
133
 
      g_warning ("no Mb4Artist associated with Mb4NameCredit, falling back to Mb4NameCredit::name");
134
 
      GET (details->name, mb4_namecredit_get_name, name_credit);
135
 
      continue;
136
 
    }
137
 
 
138
 
    GET (details->id, mb4_artist_get_id, artist);
139
 
    GET (details->name, mb4_artist_get_name, artist);
140
 
    GET (details->sortname, mb4_artist_get_sortname, artist);
141
 
    GET (details->disambiguation, mb4_artist_get_disambiguation, artist);
142
 
    GET (details->gender, mb4_artist_get_gender, artist);
143
 
    GET (details->country, mb4_artist_get_country, artist);
144
 
  }
145
 
 
146
 
  return g_list_reverse(artists);
147
 
}
148
 
 
149
 
static void
150
 
get_artist_info (GList *artists, char **name, char **sortname, char **id)
151
 
{
152
 
  GString *artist_name;
153
 
  GList *it;
154
 
  unsigned int artist_count;
155
 
 
156
 
  artist_name = g_string_new (NULL);
157
 
  artist_count = 0;
158
 
  for (it = artists; it != NULL; it = it->next) {
159
 
    ArtistDetails *details = (ArtistDetails *)it->data;
160
 
    artist_count++;
161
 
    g_string_append (artist_name, details->name);
162
 
    if (details->joinphrase != NULL)
163
 
      g_string_append (artist_name, details->joinphrase);
164
 
  }
165
 
 
166
 
  if (artist_count != 1) {
167
 
      g_warning ("multiple artists");
168
 
      if (sortname != NULL)
169
 
        *sortname = NULL;
170
 
      if (id != NULL)
171
 
        *id = NULL;
172
 
  } else {
173
 
      ArtistDetails *details = (ArtistDetails *)artists->data;
174
 
      if (sortname != NULL)
175
 
        *sortname = g_strdup (details->sortname);
176
 
      if (id != NULL)
177
 
        *id = g_strdup (details->id);
178
 
  }
179
 
 
180
 
  if (name != NULL)
181
 
    *name = artist_name->str;
182
 
 
183
 
  g_string_free (artist_name, FALSE);
184
 
}
185
 
 
186
 
 
187
 
static void
188
 
fill_relations (Mb4RelationList relations, AlbumDetails *album)
189
 
{
190
 
  unsigned int i;
191
 
 
192
 
  for (i = 0; i < mb4_relation_list_size (relations); i++) {
193
 
    Mb4Relation relation;
194
 
    char buffer[512]; /* for the GET() macro */
195
 
    char *type = NULL;
196
 
 
197
 
    relation = mb4_relation_list_item (relations, i);
198
 
    if (relation == NULL)
199
 
      continue;
200
 
 
201
 
    GET (type, mb4_relation_get_type, relation);
202
 
    if (type == NULL) {
203
 
      continue;
204
 
    }
205
 
    if (g_str_equal (type, "wikipedia")) {
206
 
      char *wikipedia = NULL;
207
 
      GET (wikipedia, mb4_relation_get_target, relation);
208
 
      if (wikipedia != NULL) {
209
 
          g_free (album->wikipedia);
210
 
          album->wikipedia = wikipedia;
211
 
      }
212
 
    } else if (g_str_equal (type, "discogs")) {
213
 
      char *discogs = NULL;
214
 
      GET (discogs, mb4_relation_get_target, relation);
215
 
      if (discogs != NULL) {
216
 
          g_free (album->discogs);
217
 
          album->discogs = discogs;
218
 
      }
219
 
    } else if (g_str_equal (type, "lyrics")) {
220
 
      char *lyrics = NULL;
221
 
      GET (lyrics, mb4_relation_get_target, relation);
222
 
      if (lyrics != NULL) {
223
 
          g_free (album->lyrics_url);
224
 
          album->lyrics_url = lyrics;
225
 
      }
226
 
    }
227
 
    g_free (type);
228
 
  }
229
 
}
230
 
 
231
 
static void
232
 
fill_tracks_from_medium (Mb4Medium medium, AlbumDetails *album)
233
 
{
234
 
  Mb4TrackList track_list;
235
 
  GList *tracks;
236
 
  unsigned int i;
237
 
  char buffer[512]; /* for the GET() macro */
238
 
 
239
 
  track_list = mb4_medium_get_tracklist (medium);
240
 
  if (!track_list)
241
 
    return;
242
 
 
243
 
  album->number = mb4_track_list_size (track_list);
244
 
 
245
 
  tracks = NULL;
246
 
 
247
 
  for (i = 0; i < mb4_track_list_size (track_list); i++) {
248
 
    Mb4Track mbt;
249
 
    Mb4ArtistCredit credit;
250
 
    Mb4Recording recording;
251
 
    TrackDetails *track;
252
 
 
253
 
    mbt = mb4_track_list_item (track_list, i);
254
 
    if (!mbt)
255
 
      continue;
256
 
 
257
 
    track = g_new0 (TrackDetails, 1);
258
 
 
259
 
    track->album = album;
260
 
 
261
 
    track->number = mb4_track_get_position (mbt);
262
 
    recording = mb4_track_get_recording (mbt);
263
 
    if (recording != NULL) {
264
 
      GET (track->title, mb4_recording_get_title, recording);
265
 
      GET (track->track_id, mb4_recording_get_id, recording);
266
 
      track->duration = mb4_recording_get_length (recording) / 1000;
267
 
      credit = mb4_recording_get_artistcredit (recording);
268
 
    } else {
269
 
      GET (track->title, mb4_track_get_title, mbt);
270
 
      track->duration = mb4_track_get_length (mbt) / 1000;
271
 
      credit = mb4_track_get_artistcredit (mbt);
272
 
    }
273
 
 
274
 
    if (credit) {
275
 
      GList *artists;
276
 
      artists = get_artist_list (credit);
277
 
      if (artists) {
278
 
        get_artist_info (artists, &track->artist,
279
 
                         &track->artist_sortname,
280
 
                         &track->artist_id);
281
 
      }
282
 
      track->artists = artists;
283
 
    }
284
 
    if (track->artist == NULL)
285
 
      track->artist = g_strdup (album->artist);
286
 
    if (track->artist_sortname == NULL)
287
 
      track->artist_sortname = g_strdup (album->artist_sortname);
288
 
    if (track->artist_id == NULL)
289
 
      track->artist_id = g_strdup (album->artist_id);
290
 
 
291
 
    tracks = g_list_prepend (tracks, track);
292
 
  }
293
 
  album->tracks = g_list_reverse (tracks);
294
 
}
295
 
 
296
 
static AlbumDetails *
297
 
make_album_from_release (Mb4ReleaseGroup group,
298
 
                         Mb4Release release,
299
 
                         Mb4Medium medium)
300
 
{
301
 
  AlbumDetails *album;
302
 
  Mb4ArtistCredit credit;
303
 
  GList *artists;
304
 
  char *date = NULL;
305
 
  char buffer[512]; /* for the GET macro */
306
 
 
307
 
  g_assert (release);
308
 
  g_return_val_if_fail (medium != NULL, NULL);
309
 
 
310
 
  album = g_new0 (AlbumDetails, 1);
311
 
 
312
 
  GET (album->album_id, mb4_release_get_id, release);
313
 
  GET (album->title, mb4_medium_get_title, medium);
314
 
  if (album->title == NULL)
315
 
    GET (album->title, mb4_release_get_title, release);
316
 
 
317
 
  credit = mb4_release_get_artistcredit (release);
318
 
 
319
 
  artists = get_artist_list (credit);
320
 
  if (artists) {
321
 
    get_artist_info (artists, &album->artist,
322
 
                     &album->artist_sortname,
323
 
                     &album->artist_id);
324
 
  }
325
 
  album->artists = artists;
326
 
 
327
 
  GET (date, mb4_release_get_date, release);
328
 
  album->release_date = sj_metadata_helper_scan_date (date);
329
 
  g_free (date);
330
 
 
331
 
  GET (album->asin, mb4_release_get_asin, release);
332
 
  GET (album->country, mb4_release_get_country, release);
333
 
  if (group) {
334
 
    GET (album->type, mb4_releasegroup_get_type, group);
335
 
    if (g_str_has_suffix (album->type, "Spokenword")
336
 
        || g_str_has_suffix (album->type, "Interview")
337
 
        || g_str_has_suffix (album->type, "Audiobook")) {
338
 
      album->is_spoken_word = TRUE;
339
 
    }
340
 
    fill_relations (mb4_releasegroup_get_relationlist(group), album);
341
 
  }
342
 
 
343
 
  album->disc_number = mb4_medium_get_position (medium);
344
 
  fill_tracks_from_medium (medium, album);
345
 
  fill_relations (mb4_release_get_relationlist (release), album);
346
 
 
347
 
  sj_mb4_album_details_dump (album);
348
 
  return album;
349
 
}
350
 
 
351
 
/*
352
 
 * Virtual methods
353
 
 */
354
 
static GList *
355
 
mb4_list_albums (SjMetadata *metadata, char **url, GError **error)
356
 
{
357
 
  SjMetadataMusicbrainz4Private *priv;
358
 
  GList *albums = NULL;
359
 
  Mb4ReleaseList releases;
360
 
  Mb4Release release;
361
 
  const char *discid = NULL;
362
 
  char buffer[1024];
363
 
  int i;
364
 
  g_return_val_if_fail (SJ_IS_METADATA_MUSICBRAINZ4 (metadata), NULL);
365
 
 
366
 
  priv = GET_PRIVATE (metadata);
367
 
 
368
 
  if (sj_metadata_helper_check_media (priv->cdrom, error) == FALSE) {
369
 
    return NULL;
370
 
  }
371
 
 
372
 
  priv->disc = discid_new ();
373
 
  if (priv->disc == NULL)
374
 
    return NULL;
375
 
  if (discid_read (priv->disc, priv->cdrom) == 0)
376
 
    return NULL;
377
 
 
378
 
  if (url != NULL)
379
 
    *url = g_strdup (discid_get_submission_url (priv->disc));
380
 
 
381
 
  if (g_getenv("MUSICBRAINZ_FORCE_DISC_ID")) {
382
 
    discid = g_getenv("MUSICBRAINZ_FORCE_DISC_ID");
383
 
  } else {
384
 
    discid = discid_get_id (priv->disc);
385
 
  }
386
 
 
387
 
  releases = mb4_query_lookup_discid(priv->mb, discid);
388
 
 
389
 
  if (releases == NULL) {
390
 
    return NULL;
391
 
  }
392
 
 
393
 
  if (mb4_release_list_size (releases) == 0) {
394
 
    return NULL;
395
 
  }
396
 
 
397
 
  for (i = 0; i < mb4_release_list_size (releases); i++) {
398
 
    AlbumDetails *album;
399
 
 
400
 
    release = mb4_release_list_item (releases, i);
401
 
    if (release) {
402
 
      char *releaseid = NULL;
403
 
      Mb4Release full_release;
404
 
 
405
 
      releaseid = NULL;
406
 
      GET(releaseid, mb4_release_get_id, release);
407
 
 
408
 
      full_release = mb4_query_lookup_release (priv->mb, releaseid);
409
 
      g_free (releaseid);
410
 
      if (full_release) {
411
 
        Mb4MediumList media;
412
 
        Mb4Metadata metadata = NULL;
413
 
        Mb4ReleaseGroup group;
414
 
        unsigned int j;
415
 
 
416
 
        group = mb4_release_get_releasegroup (full_release);
417
 
        if (group) {
418
 
          /* The release-group information we can extract from the
419
 
           * lookup_release query doesn't have the url relations for the
420
 
           * release-group, so run a separate query to get these urls
421
 
           */
422
 
          char *releasegroupid = NULL;
423
 
          char *params_names[] = { "inc" };
424
 
          char *params_values[] = { "artists url-rels" };
425
 
 
426
 
          GET (releasegroupid, mb4_releasegroup_get_id, group);
427
 
          metadata = mb4_query_query (priv->mb, "release-group", releasegroupid, "",
428
 
                                      1, params_names, params_values);
429
 
          g_free (releasegroupid);
430
 
        }
431
 
 
432
 
        if (metadata && mb4_metadata_get_releasegroup (metadata))
433
 
          group = mb4_metadata_get_releasegroup (metadata);
434
 
 
435
 
        media = mb4_release_media_matching_discid (full_release, discid);
436
 
        for (j = 0; j < mb4_medium_list_size (media); j++) {
437
 
          Mb4Medium medium;
438
 
          medium = mb4_medium_list_item (media, j);
439
 
          if (medium) {
440
 
            album = make_album_from_release (group, full_release, medium);
441
 
            album->metadata_source = SOURCE_MUSICBRAINZ;
442
 
            albums = g_list_append (albums, album);
443
 
          }
444
 
        }
445
 
        mb4_metadata_delete (metadata);
446
 
        mb4_medium_list_delete (media);
447
 
        mb4_release_delete (full_release);
448
 
      }
449
 
    }
450
 
  }
451
 
  mb4_release_list_delete (releases);
452
 
  return albums;
453
 
}
454
 
 
455
 
/*
456
 
 * GObject methods
457
 
 */
458
 
 
459
 
static void
460
 
metadata_interface_init (gpointer g_iface, gpointer iface_data)
461
 
{
462
 
  SjMetadataClass *klass = (SjMetadataClass*)g_iface;
463
 
 
464
 
  klass->list_albums = mb4_list_albums;
465
 
}
466
 
 
467
 
static void
468
 
sj_metadata_musicbrainz4_init (SjMetadataMusicbrainz4 *self)
469
 
{
470
 
  GConfClient *gconf_client;
471
 
  gchar *server_name;
472
 
 
473
 
  SjMetadataMusicbrainz4Private *priv;
474
 
 
475
 
  priv = GET_PRIVATE (self);
476
 
 
477
 
  gconf_client = gconf_client_get_default ();
478
 
 
479
 
  server_name = gconf_client_get_string (gconf_client, GCONF_MUSICBRAINZ_SERVER, NULL);
480
 
 
481
 
  if (server_name && (*server_name == '\0')) {
482
 
    g_free (server_name);
483
 
    server_name = NULL;
484
 
  }
485
 
 
486
 
  priv->mb = mb4_query_new (SJ_MUSICBRAINZ_USER_AGENT, server_name, 0);
487
 
  g_free (server_name);
488
 
 
489
 
 
490
 
  /* Set the HTTP proxy */
491
 
  if (gconf_client_get_bool (gconf_client, GCONF_PROXY_USE_PROXY, NULL)) {
492
 
    char *proxy_host;
493
 
    int port;
494
 
 
495
 
    proxy_host = gconf_client_get_string (gconf_client, GCONF_PROXY_HOST, NULL);
496
 
    mb4_query_set_proxyhost (priv->mb, proxy_host);
497
 
    g_free (proxy_host);
498
 
 
499
 
    port = gconf_client_get_int (gconf_client, GCONF_PROXY_PORT, NULL);
500
 
    mb4_query_set_proxyport (priv->mb, port);
501
 
 
502
 
    if (gconf_client_get_bool (gconf_client, GCONF_PROXY_USE_AUTHENTICATION, NULL)) {
503
 
      char *username, *password;
504
 
 
505
 
      username = gconf_client_get_string (gconf_client, GCONF_PROXY_USERNAME, NULL);
506
 
      mb4_query_set_proxyusername (priv->mb, username);
507
 
      g_free (username);
508
 
 
509
 
      password = gconf_client_get_string (gconf_client, GCONF_PROXY_PASSWORD, NULL);
510
 
      mb4_query_set_proxypassword (priv->mb, password);
511
 
      g_free (password);
512
 
    }
513
 
  }
514
 
 
515
 
  g_object_unref (gconf_client);
516
 
}
517
 
 
518
 
static void
519
 
sj_metadata_musicbrainz4_get_property (GObject *object, guint property_id,
520
 
                                       GValue *value, GParamSpec *pspec)
521
 
{
522
 
  SjMetadataMusicbrainz4Private *priv = GET_PRIVATE (object);
523
 
  g_assert (priv);
524
 
 
525
 
  switch (property_id) {
526
 
  case PROP_DEVICE:
527
 
    g_value_set_string (value, priv->cdrom);
528
 
    break;
529
 
  case PROP_PROXY_HOST:
530
 
    g_value_set_string (value, priv->http_proxy);
531
 
    break;
532
 
  case PROP_PROXY_PORT:
533
 
    g_value_set_int (value, priv->http_proxy_port);
534
 
    break;
535
 
  default:
536
 
    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
537
 
  }
538
 
}
539
 
 
540
 
static void
541
 
sj_metadata_musicbrainz4_set_property (GObject *object, guint property_id,
542
 
                                       const GValue *value, GParamSpec *pspec)
543
 
{
544
 
  SjMetadataMusicbrainz4Private *priv = GET_PRIVATE (object);
545
 
  g_assert (priv);
546
 
 
547
 
  switch (property_id) {
548
 
  case PROP_DEVICE:
549
 
    if (priv->cdrom)
550
 
      g_free (priv->cdrom);
551
 
    priv->cdrom = g_value_dup_string (value);
552
 
    break;
553
 
  case PROP_PROXY_HOST:
554
 
    if (priv->http_proxy) {
555
 
      g_free (priv->http_proxy);
556
 
    }
557
 
    priv->http_proxy = g_value_dup_string (value);
558
 
    /* TODO: check this unsets the proxy if NULL, or should we pass "" ? */
559
 
    mb4_query_set_proxyhost (priv->mb, priv->http_proxy);
560
 
    break;
561
 
  case PROP_PROXY_PORT:
562
 
    priv->http_proxy_port = g_value_get_int (value);
563
 
    mb4_query_set_proxyport (priv->mb, priv->http_proxy_port);
564
 
    break;
565
 
  default:
566
 
    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
567
 
  }
568
 
}
569
 
 
570
 
static void
571
 
sj_metadata_musicbrainz4_finalize (GObject *object)
572
 
{
573
 
  SjMetadataMusicbrainz4Private *priv;
574
 
 
575
 
  priv = GET_PRIVATE (object);
576
 
 
577
 
  if (priv->mb != NULL) {
578
 
    mb4_query_delete (priv->mb);
579
 
    priv->mb = NULL;
580
 
  }
581
 
  if (priv->disc != NULL) {
582
 
      discid_free (priv->disc);
583
 
      priv->disc = NULL;
584
 
  }
585
 
  g_free (priv->cdrom);
586
 
 
587
 
  G_OBJECT_CLASS (sj_metadata_musicbrainz4_parent_class)->finalize (object);
588
 
}
589
 
 
590
 
static void
591
 
sj_metadata_musicbrainz4_class_init (SjMetadataMusicbrainz4Class *class)
592
 
{
593
 
  GObjectClass *object_class = (GObjectClass*)class;
594
 
 
595
 
  g_type_class_add_private (class, sizeof (SjMetadataMusicbrainz4Private));
596
 
 
597
 
  object_class->get_property = sj_metadata_musicbrainz4_get_property;
598
 
  object_class->set_property = sj_metadata_musicbrainz4_set_property;
599
 
  object_class->finalize = sj_metadata_musicbrainz4_finalize;
600
 
 
601
 
  g_object_class_override_property (object_class, PROP_DEVICE, "device");
602
 
  g_object_class_override_property (object_class, PROP_PROXY_HOST, "proxy-host");
603
 
  g_object_class_override_property (object_class, PROP_PROXY_PORT, "proxy-port");
604
 
}
605
 
 
606
 
 
607
 
/*
608
 
 * Public methods.
609
 
 */
610
 
 
611
 
GObject *
612
 
sj_metadata_musicbrainz4_new (void)
613
 
{
614
 
  return g_object_new (SJ_TYPE_METADATA_MUSICBRAINZ4, NULL);
615
 
}