1 /*
2 * Copyright (C) 2012 W. Michael Petullo.
3 *
4 * Contact: W. Michael Petullo <mike@flyn.org>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; version 2.1 of
9 * the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 *
21 */
22
23 #include <grilo.h>
24 #include <libdmapsharing/dmap.h>
25
26 #include "grl-daap-compat.h"
27 #include "grl-common.h"
28 #include "grl-daap-record.h"
29
30 struct GrlDaapRecordPrivate {
31 guint64 filesize;
32 char *location;
33 char *format;
34 gint mediakind;
35 char *title;
36 char *album;
37 char *sort_album;
38 char *artist;
39 char *sort_artist;
40 char *genre;
41 gboolean has_video;
42 gint rating;
43 gint32 duration;
44 gint32 track;
45 gint32 year;
46 gint32 firstseen;
47 gint32 mtime;
48 gint32 disc;
49 gint32 bitrate;
50 };
51
52 enum {
53 PROP_0,
54 PROP_LOCATION,
55 PROP_TITLE,
56 PROP_RATING,
57 PROP_FILESIZE,
58 PROP_ALBUM,
59 PROP_SORT_ALBUM,
60 PROP_ARTIST,
61 PROP_SORT_ARTIST,
62 PROP_GENRE,
63 PROP_FORMAT,
64 PROP_MEDIAKIND,
65 PROP_DURATION,
66 PROP_TRACK,
67 PROP_YEAR,
68 PROP_FIRSTSEEN,
69 PROP_MTIME,
70 PROP_DISC,
71 PROP_BITRATE,
72 PROP_HAS_VIDEO
73 };
74
75 static void
grl_daap_record_set_property(GObject * object,guint prop_id,const GValue * value,GParamSpec * pspec)76 grl_daap_record_set_property (GObject *object,
77 guint prop_id,
78 const GValue *value,
79 GParamSpec *pspec)
80 {
81 GrlDaapRecord *record = SIMPLE_DAAP_RECORD (object);
82
83 switch (prop_id) {
84 case PROP_LOCATION:
85 g_free (record->priv->location);
86 record->priv->location = g_value_dup_string (value);
87 break;
88 case PROP_TITLE:
89 g_free (record->priv->title);
90 record->priv->title = g_value_dup_string (value);
91 break;
92 case PROP_ALBUM:
93 g_free (record->priv->album);
94 record->priv->album = g_value_dup_string (value);
95 break;
96 case PROP_SORT_ALBUM:
97 g_free (record->priv->sort_album);
98 record->priv->sort_album = g_value_dup_string (value);
99 break;
100 case PROP_ARTIST:
101 g_free (record->priv->artist);
102 record->priv->artist = g_value_dup_string (value);
103 break;
104 case PROP_SORT_ARTIST:
105 g_free (record->priv->sort_artist);
106 record->priv->sort_artist = g_value_dup_string (value);
107 break;
108 case PROP_GENRE:
109 g_free (record->priv->genre);
110 record->priv->genre = g_value_dup_string (value);
111 break;
112 case PROP_FORMAT:
113 g_free (record->priv->format);
114 record->priv->format = g_value_dup_string (value);
115 break;
116 case PROP_MEDIAKIND:
117 record->priv->mediakind = g_value_get_enum (value);
118 break;
119 case PROP_RATING:
120 record->priv->rating = g_value_get_int (value);
121 break;
122 case PROP_FILESIZE:
123 record->priv->filesize = g_value_get_uint64 (value);
124 break;
125 case PROP_DURATION:
126 record->priv->duration = g_value_get_int (value);
127 break;
128 case PROP_TRACK:
129 record->priv->track = g_value_get_int (value);
130 break;
131 case PROP_YEAR:
132 record->priv->year = g_value_get_int (value);
133 break;
134 case PROP_FIRSTSEEN:
135 record->priv->firstseen = g_value_get_int (value);
136 break;
137 case PROP_MTIME:
138 record->priv->mtime = g_value_get_int (value);
139 break;
140 case PROP_DISC:
141 record->priv->disc = g_value_get_int (value);
142 break;
143 case PROP_BITRATE:
144 record->priv->bitrate = g_value_get_int (value);
145 break;
146 case PROP_HAS_VIDEO:
147 record->priv->has_video = g_value_get_boolean (value);
148 break;
149 default:
150 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
151 break;
152 }
153 }
154
155 static void
grl_daap_record_get_property(GObject * object,guint prop_id,GValue * value,GParamSpec * pspec)156 grl_daap_record_get_property (GObject *object,
157 guint prop_id,
158 GValue *value,
159 GParamSpec *pspec)
160 {
161 GrlDaapRecord *record = SIMPLE_DAAP_RECORD (object);
162
163 switch (prop_id) {
164 case PROP_LOCATION:
165 g_value_set_static_string (value, record->priv->location);
166 break;
167 case PROP_TITLE:
168 g_value_set_static_string (value, record->priv->title);
169 break;
170 case PROP_ALBUM:
171 g_value_set_static_string (value, record->priv->album);
172 break;
173 case PROP_SORT_ALBUM:
174 g_value_set_static_string (value, record->priv->sort_album);
175 break;
176 case PROP_ARTIST:
177 g_value_set_static_string (value, record->priv->artist);
178 break;
179 case PROP_SORT_ARTIST:
180 g_value_set_static_string (value, record->priv->sort_artist);
181 break;
182 case PROP_GENRE:
183 g_value_set_static_string (value, record->priv->genre);
184 break;
185 case PROP_FORMAT:
186 g_value_set_static_string (value, record->priv->format);
187 break;
188 case PROP_MEDIAKIND:
189 g_value_set_enum (value, record->priv->mediakind);
190 break;
191 case PROP_RATING:
192 g_value_set_int (value, record->priv->rating);
193 break;
194 case PROP_FILESIZE:
195 g_value_set_uint64 (value, record->priv->filesize);
196 break;
197 case PROP_DURATION:
198 g_value_set_int (value, record->priv->duration);
199 break;
200 case PROP_TRACK:
201 g_value_set_int (value, record->priv->track);
202 break;
203 case PROP_YEAR:
204 g_value_set_int (value, record->priv->year);
205 break;
206 case PROP_FIRSTSEEN:
207 g_value_set_int (value, record->priv->firstseen);
208 break;
209 case PROP_MTIME:
210 g_value_set_int (value, record->priv->mtime);
211 break;
212 case PROP_DISC:
213 g_value_set_int (value, record->priv->disc);
214 break;
215 case PROP_BITRATE:
216 g_value_set_int (value, record->priv->bitrate);
217 break;
218 case PROP_HAS_VIDEO:
219 g_value_set_boolean (value, record->priv->has_video);
220 break;
221 default:
222 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
223 break;
224 }
225 }
226
227 GrlDaapRecord *
grl_daap_record_new(void)228 grl_daap_record_new (void)
229 {
230 return SIMPLE_DAAP_RECORD (g_object_new (TYPE_SIMPLE_DAAP_RECORD, NULL));
231 }
232
233 GInputStream *
grl_daap_record_read(DmapAvRecord * record,GError ** error)234 grl_daap_record_read (DmapAvRecord *record, GError **error)
235 {
236 GFile *file;
237 GInputStream *stream;
238
239 file = g_file_new_for_uri (SIMPLE_DAAP_RECORD (record)->priv->location);
240 stream = G_INPUT_STREAM (g_file_read (file, NULL, error));
241
242 g_object_unref (file);
243
244 return stream;
245 }
246
247 static void
grl_daap_record_init(GrlDaapRecord * record)248 grl_daap_record_init (GrlDaapRecord *record)
249 {
250 record->priv = SIMPLE_DAAP_RECORD_GET_PRIVATE (record);
251 }
252
253 static void grl_daap_record_finalize (GObject *object);
254
255 static void
grl_daap_record_class_init(GrlDaapRecordClass * klass)256 grl_daap_record_class_init (GrlDaapRecordClass *klass)
257 {
258 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
259
260 gobject_class->set_property = grl_daap_record_set_property;
261 gobject_class->get_property = grl_daap_record_get_property;
262 gobject_class->finalize = grl_daap_record_finalize;
263
264 g_object_class_override_property (gobject_class, PROP_LOCATION, "location");
265 g_object_class_override_property (gobject_class, PROP_TITLE, "title");
266 g_object_class_override_property (gobject_class, PROP_ALBUM, "songalbum");
267 g_object_class_override_property (gobject_class, PROP_SORT_ALBUM, "sort-album");
268 g_object_class_override_property (gobject_class, PROP_ARTIST, "songartist");
269 g_object_class_override_property (gobject_class, PROP_SORT_ARTIST, "sort-artist");
270 g_object_class_override_property (gobject_class, PROP_GENRE, "songgenre");
271 g_object_class_override_property (gobject_class, PROP_FORMAT, "format");
272 g_object_class_override_property (gobject_class, PROP_RATING, "rating");
273 g_object_class_override_property (gobject_class, PROP_FILESIZE, "filesize");
274 g_object_class_override_property (gobject_class, PROP_DURATION, "duration");
275 g_object_class_override_property (gobject_class, PROP_TRACK, "track");
276 g_object_class_override_property (gobject_class, PROP_YEAR, "year");
277 g_object_class_override_property (gobject_class, PROP_FIRSTSEEN, "firstseen");
278 g_object_class_override_property (gobject_class, PROP_MTIME, "mtime");
279 g_object_class_override_property (gobject_class, PROP_DISC, "disc");
280 g_object_class_override_property (gobject_class, PROP_BITRATE, "bitrate");
281 g_object_class_override_property (gobject_class, PROP_HAS_VIDEO, "has-video");
282 g_object_class_override_property (gobject_class, PROP_MEDIAKIND, "mediakind");
283 }
284
285 static void
grl_daap_record_daap_iface_init(gpointer iface,gpointer data)286 grl_daap_record_daap_iface_init (gpointer iface, gpointer data)
287 {
288 DmapAvRecordInterface *daap_record = iface;
289
290 g_assert (G_TYPE_FROM_INTERFACE (daap_record) == DMAP_TYPE_AV_RECORD);
291
292 daap_record->read = grl_daap_record_read;
293 }
294
295 static void
grl_daap_record_dmap_iface_init(gpointer iface,gpointer data)296 grl_daap_record_dmap_iface_init (gpointer iface, gpointer data)
297 {
298 DmapRecordInterface *dmap_record = iface;
299
300 g_assert (G_TYPE_FROM_INTERFACE (dmap_record) == DMAP_TYPE_RECORD);
301 }
302
303
G_DEFINE_TYPE_WITH_CODE(GrlDaapRecord,grl_daap_record,G_TYPE_OBJECT,G_ADD_PRIVATE (GrlDaapRecord)G_IMPLEMENT_INTERFACE (DMAP_TYPE_AV_RECORD,grl_daap_record_daap_iface_init)G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD,grl_daap_record_dmap_iface_init))304 G_DEFINE_TYPE_WITH_CODE (GrlDaapRecord, grl_daap_record, G_TYPE_OBJECT,
305 G_ADD_PRIVATE (GrlDaapRecord)
306 G_IMPLEMENT_INTERFACE (DMAP_TYPE_AV_RECORD, grl_daap_record_daap_iface_init)
307 G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD, grl_daap_record_dmap_iface_init))
308
309 static void
310 grl_daap_record_finalize (GObject *object)
311 {
312 GrlDaapRecord *record = SIMPLE_DAAP_RECORD (object);
313
314 g_free (record->priv->location);
315 g_free (record->priv->title);
316 g_free (record->priv->album);
317 g_free (record->priv->sort_album);
318 g_free (record->priv->artist);
319 g_free (record->priv->sort_artist);
320 g_free (record->priv->genre);
321 g_free (record->priv->format);
322
323 G_OBJECT_CLASS (grl_daap_record_parent_class)->finalize (object);
324 }
325