3
* Copyright (C) 2005 Ross Burton <ross@burtonini.com>
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.
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.
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.
23
#endif /* HAVE_CONFIG_H */
26
#include <glib-object.h>
27
#include <glib/gi18n.h>
29
#include <cdio/cdio.h>
30
#include <cdio/cdtext.h>
32
#include "sj-metadata-cdtext.h"
33
#include "sj-structures.h"
37
struct SjMetadataCdtextPrivate {
41
#define GET_PRIVATE(o) \
42
(G_TYPE_INSTANCE_GET_PRIVATE ((o), SJ_TYPE_METADATA_CDTEXT, SjMetadataCdtextPrivate))
51
static void metadata_iface_init (gpointer g_iface, gpointer iface_data);
53
G_DEFINE_TYPE_WITH_CODE (SjMetadataCdtext, sj_metadata_cdtext,
55
G_IMPLEMENT_INTERFACE (SJ_TYPE_METADATA, metadata_iface_init));
63
cdtext_list_albums (SjMetadata *metadata, char **url, GError **error)
65
SjMetadataCdtextPrivate *priv;
68
track_t cdtrack, last_cdtrack;
69
const cdtext_t *cdtext;
71
g_return_val_if_fail (SJ_IS_METADATA_CDTEXT (metadata), NULL);
73
priv = SJ_METADATA_CDTEXT (metadata)->priv;
75
cdio = cdio_open (priv->cdrom, DRIVER_UNKNOWN);
77
g_warning ("Cannot open CD");
78
g_set_error (error, SJ_ERROR, SJ_ERROR_INTERNAL_ERROR, _("Cannot read CD"));
82
album = g_new0 (AlbumDetails, 1);
84
/* TODO: why can't I do this first? */
85
cdtext = cdio_get_cdtext(cdio, 0);
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));
91
album->metadata_source = SOURCE_CDTEXT;
93
album->artist = g_strdup (_("Unknown Artist"));
94
album->title = g_strdup (_("Unknown Title"));
95
album->genre = g_strdup ("");
97
album->metadata_source = SOURCE_FALLBACK;
100
cdtrack = cdio_get_first_track_num(cdio);
101
last_cdtrack = cdtrack + cdio_get_num_tracks(cdio);
103
for ( ; cdtrack < last_cdtrack; cdtrack++ ) {
105
track = g_new0 (TrackDetails, 1);
106
track->album = album;
107
track->number = cdtrack;
108
cdtext = cdio_get_cdtext(cdio, cdtrack);
110
track->title = g_strdup (cdtext_get (CDTEXT_TITLE, cdtext));
111
track->artist = g_strdup (cdtext_get (CDTEXT_PERFORMER, cdtext));
113
track->title = g_strdup_printf (_("Track %d"), cdtrack);
114
track->artist = g_strdup (_("Unknown Artist"));
116
track->duration = cdio_get_track_sec_count (cdio, cdtrack) / CDIO_CD_FRAMES_PER_SEC;
118
album->tracks = g_list_append (album->tracks, track);
122
return g_list_append (NULL, album);
131
sj_metadata_cdtext_get_property (GObject *object, guint property_id,
132
GValue *value, GParamSpec *pspec)
134
SjMetadataCdtextPrivate *priv = SJ_METADATA_CDTEXT (object)->priv;
137
switch (property_id) {
139
g_value_set_string (value, priv->cdrom);
141
case PROP_PROXY_HOST:
143
g_value_set_string (value, "");
145
case PROP_PROXY_PORT:
147
g_value_set_int (value, 0);
150
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
155
sj_metadata_cdtext_set_property (GObject *object, guint property_id,
156
const GValue *value, GParamSpec *pspec)
158
SjMetadataCdtextPrivate *priv = SJ_METADATA_CDTEXT (object)->priv;
161
switch (property_id) {
164
g_free (priv->cdrom);
165
priv->cdrom = g_value_dup_string (value);
167
case PROP_PROXY_HOST:
168
case PROP_PROXY_PORT:
172
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
177
sj_metadata_cdtext_finalize (GObject *object)
179
SjMetadataCdtextPrivate *priv = SJ_METADATA_CDTEXT (object)->priv;
180
g_free (priv->cdrom);
184
sj_metadata_cdtext_init (SjMetadataCdtext *cdtext)
186
cdtext->priv = GET_PRIVATE (cdtext);
190
metadata_iface_init (gpointer g_iface, gpointer iface_data)
192
SjMetadataClass *klass = (SjMetadataClass*)g_iface;
194
klass->list_albums = cdtext_list_albums;
198
sj_metadata_cdtext_class_init (SjMetadataCdtextClass *class)
200
GObjectClass *object_class = (GObjectClass*) class;
202
g_type_class_add_private (class, sizeof (SjMetadataCdtextPrivate));
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;
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");
219
sj_metadata_cdtext_new (void)
221
return g_object_new (sj_metadata_cdtext_get_type (), NULL);