~ubuntu-branches/ubuntu/trusty/sound-juicer/trusty

« back to all changes in this revision

Viewing changes to libjuicer/sj-metadata-cdtext.c

  • Committer: Bazaar Package Importer
  • Author(s): Bilal Akhtar
  • Date: 2010-08-20 14:02:25 UTC
  • mfrom: (1.1.44 upstream)
  • Revision ID: james.westby@ubuntu.com-20100820140225-cj8w9u6uj4ml19or
Tags: 2.31.6-0ubuntu1
New upstream release. (LP: #621065)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * sj-metadata-cdtext.c
3
 
 * Copyright (C) 2005 Ross Burton <ross@burtonini.com>
4
 
 *
5
 
 * This library is free software; you can redistribute it and/or
6
 
 * modify it under the terms of the GNU Library General Public
7
 
 * License as published by the Free Software Foundation; either
8
 
 * version 2 of the License, or (at your option) any later version.
9
 
 *
10
 
 * This library 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 GNU
13
 
 * Library General Public License for more details.
14
 
 *
15
 
 * You should have received a copy of the GNU Library General Public
16
 
 * License along with this library; if not, write to the
17
 
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18
 
 * Boston, MA 02111-1307, USA.
19
 
 */
20
 
 
21
 
#ifdef HAVE_CONFIG_H
22
 
#include "config.h"
23
 
#endif /* HAVE_CONFIG_H */
24
 
 
25
 
#include <string.h>
26
 
#include <glib-object.h>
27
 
#include <glib/gi18n.h>
28
 
#include <glib.h>
29
 
#include <cdio/cdio.h>
30
 
#include <cdio/cdtext.h>
31
 
 
32
 
#include "sj-metadata-cdtext.h"
33
 
#include "sj-structures.h"
34
 
#include "sj-error.h"
35
 
#include "sj-util.h"
36
 
 
37
 
struct SjMetadataCdtextPrivate {
38
 
  char *cdrom;
39
 
};
40
 
 
41
 
#define GET_PRIVATE(o)  \
42
 
  (G_TYPE_INSTANCE_GET_PRIVATE ((o), SJ_TYPE_METADATA_CDTEXT, SjMetadataCdtextPrivate))
43
 
 
44
 
enum {
45
 
  PROP_0,
46
 
  PROP_DEVICE,
47
 
  PROP_PROXY_HOST,
48
 
  PROP_PROXY_PORT,
49
 
};
50
 
 
51
 
static void metadata_iface_init (gpointer g_iface, gpointer iface_data);
52
 
 
53
 
G_DEFINE_TYPE_WITH_CODE (SjMetadataCdtext, sj_metadata_cdtext,
54
 
                         G_TYPE_OBJECT,
55
 
                         G_IMPLEMENT_INTERFACE (SJ_TYPE_METADATA, metadata_iface_init));
56
 
 
57
 
 
58
 
/*
59
 
 * Private methods
60
 
 */
61
 
 
62
 
static GList *
63
 
cdtext_list_albums (SjMetadata *metadata, char **url, GError **error)
64
 
{
65
 
  SjMetadataCdtextPrivate *priv;
66
 
  AlbumDetails *album;
67
 
  CdIo *cdio;
68
 
  track_t cdtrack, last_cdtrack;
69
 
  const cdtext_t *cdtext;
70
 
 
71
 
  g_return_val_if_fail (SJ_IS_METADATA_CDTEXT (metadata), NULL);
72
 
 
73
 
  priv = SJ_METADATA_CDTEXT (metadata)->priv;
74
 
 
75
 
  cdio = cdio_open (priv->cdrom, DRIVER_UNKNOWN);
76
 
  if (!cdio) {
77
 
    g_warning ("Cannot open CD");
78
 
    g_set_error (error, SJ_ERROR, SJ_ERROR_INTERNAL_ERROR, _("Cannot read CD"));
79
 
    return NULL;
80
 
  }
81
 
 
82
 
  album = g_new0 (AlbumDetails, 1);
83
 
 
84
 
  /* TODO: why can't I do this first? */
85
 
  cdtext = cdio_get_cdtext(cdio, 0);
86
 
  if (cdtext) {
87
 
    album->title = g_strdup (cdtext_get (CDTEXT_TITLE, cdtext));
88
 
    album->artist = g_strdup (cdtext_get (CDTEXT_PERFORMER, cdtext));
89
 
    album->genre = g_strdup (cdtext_get (CDTEXT_GENRE, cdtext));
90
 
 
91
 
    album->metadata_source = SOURCE_CDTEXT;
92
 
  } else {
93
 
    album->artist = g_strdup (_("Unknown Artist"));
94
 
    album->title = g_strdup (_("Unknown Title"));
95
 
    album->genre = g_strdup ("");
96
 
 
97
 
    album->metadata_source = SOURCE_FALLBACK;
98
 
  }
99
 
 
100
 
  cdtrack = cdio_get_first_track_num(cdio);
101
 
  last_cdtrack = cdtrack + cdio_get_num_tracks(cdio);
102
 
 
103
 
  for ( ; cdtrack < last_cdtrack; cdtrack++ ) {
104
 
    TrackDetails *track;
105
 
    track = g_new0 (TrackDetails, 1);
106
 
    track->album = album;
107
 
    track->number = cdtrack;
108
 
    cdtext = cdio_get_cdtext(cdio, cdtrack);
109
 
    if (cdtext) {
110
 
      track->title = g_strdup (cdtext_get (CDTEXT_TITLE, cdtext));
111
 
      track->artist = g_strdup (cdtext_get (CDTEXT_PERFORMER, cdtext));
112
 
    } else {
113
 
      track->title = g_strdup_printf (_("Track %d"), cdtrack);
114
 
      track->artist = g_strdup (_("Unknown Artist"));
115
 
    }
116
 
    track->duration = cdio_get_track_sec_count (cdio, cdtrack) / CDIO_CD_FRAMES_PER_SEC;
117
 
 
118
 
    album->tracks = g_list_append (album->tracks, track);
119
 
    album->number++;
120
 
  }
121
 
 
122
 
  return g_list_append (NULL, album);
123
 
}
124
 
 
125
 
 
126
 
/*
127
 
 * GObject methods
128
 
 */
129
 
 
130
 
static void
131
 
sj_metadata_cdtext_get_property (GObject *object, guint property_id,
132
 
                                      GValue *value, GParamSpec *pspec)
133
 
{
134
 
  SjMetadataCdtextPrivate *priv = SJ_METADATA_CDTEXT (object)->priv;
135
 
  g_assert (priv);
136
 
 
137
 
  switch (property_id) {
138
 
  case PROP_DEVICE:
139
 
    g_value_set_string (value, priv->cdrom);
140
 
    break;
141
 
  case PROP_PROXY_HOST:
142
 
    /* Do nothing */
143
 
    g_value_set_string (value, "");
144
 
    break;
145
 
  case PROP_PROXY_PORT:
146
 
    /* Do nothing */
147
 
    g_value_set_int (value, 0);
148
 
    break;
149
 
  default:
150
 
    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
151
 
  }
152
 
}
153
 
 
154
 
static void
155
 
sj_metadata_cdtext_set_property (GObject *object, guint property_id,
156
 
                                      const GValue *value, GParamSpec *pspec)
157
 
{
158
 
  SjMetadataCdtextPrivate *priv = SJ_METADATA_CDTEXT (object)->priv;
159
 
  g_assert (priv);
160
 
 
161
 
  switch (property_id) {
162
 
  case PROP_DEVICE:
163
 
    if (priv->cdrom)
164
 
      g_free (priv->cdrom);
165
 
    priv->cdrom = g_value_dup_string (value);
166
 
    break;
167
 
  case PROP_PROXY_HOST:
168
 
  case PROP_PROXY_PORT:
169
 
    /* Do nothing */
170
 
    break;
171
 
  default:
172
 
    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
173
 
  }
174
 
}
175
 
 
176
 
static void
177
 
sj_metadata_cdtext_finalize (GObject *object)
178
 
{
179
 
  SjMetadataCdtextPrivate *priv = SJ_METADATA_CDTEXT (object)->priv;
180
 
  g_free (priv->cdrom);
181
 
}
182
 
 
183
 
static void
184
 
sj_metadata_cdtext_init (SjMetadataCdtext *cdtext)
185
 
{
186
 
  cdtext->priv = GET_PRIVATE (cdtext);
187
 
}
188
 
 
189
 
static void
190
 
metadata_iface_init (gpointer g_iface, gpointer iface_data)
191
 
{
192
 
  SjMetadataClass *klass = (SjMetadataClass*)g_iface;
193
 
  
194
 
  klass->list_albums = cdtext_list_albums;
195
 
}
196
 
 
197
 
static void
198
 
sj_metadata_cdtext_class_init (SjMetadataCdtextClass *class)
199
 
{
200
 
  GObjectClass *object_class = (GObjectClass*) class;
201
 
 
202
 
  g_type_class_add_private (class, sizeof (SjMetadataCdtextPrivate));
203
 
 
204
 
  object_class->get_property = sj_metadata_cdtext_get_property;
205
 
  object_class->set_property = sj_metadata_cdtext_set_property;
206
 
  object_class->finalize = sj_metadata_cdtext_finalize;
207
 
 
208
 
  g_object_class_override_property (object_class, PROP_DEVICE, "device");
209
 
  g_object_class_override_property (object_class, PROP_PROXY_HOST, "proxy-host");
210
 
  g_object_class_override_property (object_class, PROP_PROXY_PORT, "proxy-port");
211
 
}
212
 
 
213
 
 
214
 
/*
215
 
 * Public methods
216
 
 */
217
 
 
218
 
GObject *
219
 
sj_metadata_cdtext_new (void)
220
 
{
221
 
  return g_object_new (sj_metadata_cdtext_get_type (), NULL);
222
 
}