72
77
RHYTHMDB_PROP_DURATION,
73
78
RHYTHMDB_PROP_FILE_SIZE,
74
79
RHYTHMDB_PROP_LOCATION,
80
RHYTHMDB_PROP_MOUNTPOINT,
75
81
RHYTHMDB_PROP_MTIME,
82
RHYTHMDB_PROP_FIRST_SEEN,
83
RHYTHMDB_PROP_LAST_SEEN,
76
84
RHYTHMDB_PROP_RATING,
77
RHYTHMDB_PROP_AUTO_RATE,
78
85
RHYTHMDB_PROP_PLAY_COUNT,
79
86
RHYTHMDB_PROP_LAST_PLAYED,
80
87
RHYTHMDB_PROP_BITRATE,
81
89
RHYTHMDB_PROP_TRACK_GAIN,
82
90
RHYTHMDB_PROP_TRACK_PEAK,
83
91
RHYTHMDB_PROP_ALBUM_GAIN,
84
92
RHYTHMDB_PROP_ALBUM_PEAK,
85
93
RHYTHMDB_PROP_MIMETYPE,
86
/* This should always be the last element of this enum */
87
RHYTHMDB_NUM_SAVED_PROPERTIES
91
/* If you modify this enum, don't forget to modify
92
* rhythmdb_unsaved_prop_get_type
96
RHYTHMDB_PROP_TITLE_SORT_KEY = RHYTHMDB_NUM_SAVED_PROPERTIES,
94
RHYTHMDB_PROP_TITLE_SORT_KEY,
97
95
RHYTHMDB_PROP_GENRE_SORT_KEY,
98
96
RHYTHMDB_PROP_ARTIST_SORT_KEY,
99
97
RHYTHMDB_PROP_ALBUM_SORT_KEY,
102
100
RHYTHMDB_PROP_ARTIST_FOLDED,
103
101
RHYTHMDB_PROP_ALBUM_FOLDED,
104
102
RHYTHMDB_PROP_LAST_PLAYED_STR,
105
/* This should always be the last element of this enum */
103
RHYTHMDB_PROP_HIDDEN,
104
RHYTHMDB_PROP_PLAYBACK_ERROR,
105
RHYTHMDB_PROP_FIRST_SEEN_STR,
106
RHYTHMDB_PROP_SEARCH_MATCH,
109
RHYTHMDB_PROP_STATUS,
110
RHYTHMDB_PROP_DESCRIPTION,
111
RHYTHMDB_PROP_SUBTITLE,
112
RHYTHMDB_PROP_SUMMARY,
114
RHYTHMDB_PROP_COPYRIGHT,
116
RHYTHMDB_PROP_POST_TIME,
106
118
RHYTHMDB_NUM_PROPERTIES
107
} RhythmDBUnsavedPropType;
122
RHYTHMDB_PODCAST_STATUS_COMPLETE = 100,
123
RHYTHMDB_PODCAST_STATUS_ERROR = 101,
124
RHYTHMDB_PODCAST_STATUS_WAITING = 102,
125
RHYTHMDB_PODCAST_STATUS_PAUSED = 103,
109
128
GType rhythmdb_query_get_type (void);
110
129
GType rhythmdb_prop_get_type (void);
111
GType rhythmdb_unsaved_prop_get_type (void);
113
131
#define RHYTHMDB_TYPE_QUERY (rhythmdb_query_get_type ())
114
132
#define RHYTHMDB_TYPE_PROP (rhythmdb_prop_get_type ())
115
#define RHYTHMDB_TYPE_UNSAVED_PROP (rhythmdb_unsaved_prop_get_type ())
121
138
GPtrArray *subquery;
122
139
} RhythmDBQueryData;
124
typedef void RhythmDBEntry;
143
RBRefString *description;
144
RBRefString *subtitle;
145
RBRefString *summary;
147
RBRefString *copyright;
149
gulong status; //0-99: downloading; 100: Conplete; 101: Error; 102: wait; 103: pause;
151
} RhythmDBPodcastFields;
156
#ifndef G_DISABLE_ASSERT
181
RBRefString *mountpoint;
183
RBRefString *mimetype;
186
GnomeVFSInodeNumber inode;
198
RBRefString *last_played_str;
199
RBRefString *first_seen_str;
201
/* playback error string */
202
char *playback_error;
204
/* visibility (to hide entries on unmounted volumes) */
208
RhythmDBPodcastFields *podcast;
212
RhythmDBPropType prop;
215
} RhythmDBEntryChange;
217
void rhythmdb_entry_get (RhythmDBEntry *entry, RhythmDBPropType propid, GValue *val);
218
G_INLINE_FUNC const char *rhythmdb_entry_get_string (RhythmDBEntry *entry, RhythmDBPropType propid);
219
G_INLINE_FUNC gboolean rhythmdb_entry_get_boolean (RhythmDBEntry *entry, RhythmDBPropType propid);
220
G_INLINE_FUNC guint64 rhythmdb_entry_get_uint64 (RhythmDBEntry *entry, RhythmDBPropType propid);
221
G_INLINE_FUNC gulong rhythmdb_entry_get_ulong (RhythmDBEntry *entry, RhythmDBPropType propid);
222
G_INLINE_FUNC double rhythmdb_entry_get_double (RhythmDBEntry *entry, RhythmDBPropType propid);
224
#if defined (G_CAN_INLINE) || defined (__RHYTHMDB_C__)
226
G_INLINE_FUNC const char *
227
rhythmdb_entry_get_string (RhythmDBEntry *entry, RhythmDBPropType propid)
231
case RHYTHMDB_PROP_TITLE:
232
return rb_refstring_get (entry->title);
233
case RHYTHMDB_PROP_ALBUM:
234
return rb_refstring_get (entry->album);
235
case RHYTHMDB_PROP_ARTIST:
236
return rb_refstring_get (entry->artist);
237
case RHYTHMDB_PROP_GENRE:
238
return rb_refstring_get (entry->genre);
239
case RHYTHMDB_PROP_MIMETYPE:
240
return rb_refstring_get (entry->mimetype);
241
case RHYTHMDB_PROP_TITLE_SORT_KEY:
242
return rb_refstring_get_sort_key (entry->title);
243
case RHYTHMDB_PROP_ALBUM_SORT_KEY:
244
return rb_refstring_get_sort_key (entry->album);
245
case RHYTHMDB_PROP_ARTIST_SORT_KEY:
246
return rb_refstring_get_sort_key (entry->artist);
247
case RHYTHMDB_PROP_GENRE_SORT_KEY:
248
return rb_refstring_get_sort_key (entry->genre);
249
case RHYTHMDB_PROP_TITLE_FOLDED:
250
return rb_refstring_get_folded (entry->title);
251
case RHYTHMDB_PROP_ALBUM_FOLDED:
252
return rb_refstring_get_folded (entry->album);
253
case RHYTHMDB_PROP_ARTIST_FOLDED:
254
return rb_refstring_get_folded (entry->artist);
255
case RHYTHMDB_PROP_GENRE_FOLDED:
256
return rb_refstring_get_folded (entry->genre);
257
case RHYTHMDB_PROP_LOCATION:
258
return entry->location;
259
case RHYTHMDB_PROP_MOUNTPOINT:
260
return rb_refstring_get (entry->mountpoint);
261
case RHYTHMDB_PROP_LAST_PLAYED_STR:
262
return rb_refstring_get (entry->last_played_str);
263
case RHYTHMDB_PROP_PLAYBACK_ERROR:
264
return entry->playback_error;
265
case RHYTHMDB_PROP_FIRST_SEEN_STR:
266
return rb_refstring_get (entry->first_seen_str);
268
case RHYTHMDB_PROP_DESCRIPTION:
270
return rb_refstring_get (entry->podcast->description);
273
case RHYTHMDB_PROP_SUBTITLE:
275
return rb_refstring_get (entry->podcast->subtitle);
278
case RHYTHMDB_PROP_SUMMARY:
280
return rb_refstring_get (entry->podcast->summary);
283
case RHYTHMDB_PROP_LANG:
285
return rb_refstring_get (entry->podcast->lang);
288
case RHYTHMDB_PROP_COPYRIGHT:
290
return rb_refstring_get (entry->podcast->copyright);
293
case RHYTHMDB_PROP_IMAGE:
295
return rb_refstring_get (entry->podcast->image);
300
g_assert_not_reached ();
305
G_INLINE_FUNC gboolean
306
rhythmdb_entry_get_boolean (RhythmDBEntry *entry, RhythmDBPropType propid)
309
case RHYTHMDB_PROP_HIDDEN:
310
return entry->hidden;
312
g_assert_not_reached ();
317
G_INLINE_FUNC guint64
318
rhythmdb_entry_get_uint64 (RhythmDBEntry *entry, RhythmDBPropType propid)
321
case RHYTHMDB_PROP_FILE_SIZE:
322
return entry->file_size;
324
g_assert_not_reached ();
330
rhythmdb_entry_get_ulong (RhythmDBEntry *entry, RhythmDBPropType propid)
333
case RHYTHMDB_PROP_TYPE:
335
case RHYTHMDB_PROP_TRACK_NUMBER:
336
return entry->tracknum;
337
case RHYTHMDB_PROP_DISC_NUMBER:
338
return entry->discnum;
339
case RHYTHMDB_PROP_DURATION:
340
return entry->duration;
341
case RHYTHMDB_PROP_MTIME:
343
case RHYTHMDB_PROP_FIRST_SEEN:
344
return entry->first_seen;
345
case RHYTHMDB_PROP_LAST_SEEN:
346
return entry->last_seen;
347
case RHYTHMDB_PROP_LAST_PLAYED:
348
return entry->last_played;
349
case RHYTHMDB_PROP_PLAY_COUNT:
350
return entry->play_count;
351
case RHYTHMDB_PROP_BITRATE:
352
return entry->bitrate;
353
case RHYTHMDB_PROP_DATE:
355
return g_date_get_julian (entry->date);
358
case RHYTHMDB_PROP_POST_TIME:
360
return entry->podcast->post_time;
363
case RHYTHMDB_PROP_STATUS:
365
return entry->podcast->status;
369
g_assert_not_reached ();
375
rhythmdb_entry_get_double (RhythmDBEntry *entry, RhythmDBPropType propid)
378
case RHYTHMDB_PROP_TRACK_GAIN:
379
return entry->track_gain;
380
case RHYTHMDB_PROP_TRACK_PEAK:
381
return entry->track_peak;
382
case RHYTHMDB_PROP_ALBUM_GAIN:
383
return entry->album_gain;
384
case RHYTHMDB_PROP_ALBUM_PEAK:
385
return entry->album_peak;
386
case RHYTHMDB_PROP_RATING:
387
return entry->rating;
389
g_assert_not_reached ();
149
418
void (*entry_added) (RhythmDBEntry *entry);
150
419
void (*entry_restored) (RhythmDBEntry *entry);
151
void (*entry_changed) (RhythmDBEntry *entry, RhythmDBPropType prop,
152
const GValue *old, const GValue *new);
420
void (*entry_changed) (RhythmDBEntry *entry, GSList *changes); /* list of RhythmDBEntryChanges */
153
421
void (*entry_deleted) (RhythmDBEntry *entry);
154
void (*load_complete) (RhythmDBEntry *entry);
155
void (*save_complete) (RhythmDBEntry *entry);
422
void (*load_complete) (void);
423
void (*save_complete) (void);
156
424
void (*error) (const char *uri, const char *msg);
425
void (*read_only) (gboolean readonly);
158
427
/* virtual methods */
160
429
void (*impl_load) (RhythmDB *db, gboolean *dead);
161
430
void (*impl_save) (RhythmDB *db);
163
RhythmDBEntry * (*impl_entry_new) (RhythmDB *db, RhythmDBEntryType type,
432
void (*impl_entry_new) (RhythmDB *db, RhythmDBEntry *entry);
166
void (*impl_entry_set) (RhythmDB *db, RhythmDBEntry *entry,
167
guint propid, const GValue *value);
434
gboolean (*impl_entry_set) (RhythmDB *db, RhythmDBEntry *entry,
435
guint propid, const GValue *value);
169
437
void (*impl_entry_get) (RhythmDB *db, RhythmDBEntry *entry,
170
438
guint propid, GValue *value);
189
459
void rhythmdb_shutdown (RhythmDB *db);
192
* This function must be called WITHOUT the RhythmDB lock held!
194
461
void rhythmdb_load (RhythmDB *db);
196
463
void rhythmdb_save (RhythmDB *db);
197
void rhythmdb_save_blocking (RhythmDB *db);
200
/* Used to mark DB as dirty after first start so that we
201
* always save a rhythmdb.xml.
203
void rhythmdb_set_dirty (RhythmDB *db);
205
void rhythmdb_read_lock (RhythmDB *db);
206
void rhythmdb_write_lock (RhythmDB *db);
207
void rhythmdb_read_unlock (RhythmDB *db);
208
void rhythmdb_write_unlock (RhythmDB *db);
464
void rhythmdb_save_async (RhythmDB *db);
466
void rhythmdb_commit (RhythmDB *db);
210
468
gboolean rhythmdb_entry_is_editable (RhythmDB *db, RhythmDBEntry *entry);
212
470
RhythmDBEntry * rhythmdb_entry_new (RhythmDB *db, RhythmDBEntryType type, const char *uri);
214
void rhythmdb_add_uri_async (RhythmDB *db, const char *uri);
215
RhythmDBEntry * rhythmdb_add_song (RhythmDB *db, const char *uri, GError **error);
472
void rhythmdb_add_uri (RhythmDB *db, const char *uri);
217
474
void rhythmdb_entry_set (RhythmDB *db, RhythmDBEntry *entry,
218
guint propid, GValue *value);
220
void rhythmdb_entry_queue_set(RhythmDB *db, RhythmDBEntry *entry,
221
guint propid, GValue *value);
223
void rhythmdb_entry_get (RhythmDB *db, RhythmDBEntry *entry,
224
guint propid, GValue *value);
226
#ifndef WITH_RHYTHMDB_TREE
227
#define rhythmdb_entry_ref(DB, ENTRY)
228
#define rhythmdb_entry_ref_unlocked(DB, ENTRY)
229
#define rhythmdb_entry_unref(DB, ENTRY)
230
#define rhythmdb_entry_unref_unlocked(DB, ENTRY)
232
#include "rhythmdb-tree.h"
475
guint propid, const GValue *value);
476
void rhythmdb_entry_set_nonotify (RhythmDB *db, RhythmDBEntry *entry,
477
guint propid, const GValue *value);
478
void rhythmdb_entry_set_uninserted (RhythmDB *db, RhythmDBEntry *entry,
479
guint propid, const GValue *value);
235
481
void rhythmdb_entry_delete (RhythmDB *db, RhythmDBEntry *entry);
236
482
void rhythmdb_entry_delete_by_type (RhythmDB *db,
237
483
RhythmDBEntryType type);
240
const char * rhythmdb_entry_get_string (RhythmDB *db,
241
RhythmDBEntry *entry,
243
gboolean rhythmdb_entry_get_boolean (RhythmDB *db,
244
RhythmDBEntry *entry,
246
long rhythmdb_entry_get_long (RhythmDB *db,
247
RhythmDBEntry *entry,
249
guint64 rhythmdb_entry_get_uint64 (RhythmDB *db,
250
RhythmDBEntry *entry,
252
int rhythmdb_entry_get_int (RhythmDB *db,
253
RhythmDBEntry *entry,
255
double rhythmdb_entry_get_double (RhythmDB *db,
256
RhythmDBEntry *entry,
258
float rhythmdb_entry_get_float (RhythmDB *db,
259
RhythmDBEntry *entry,
261
gpointer rhythmdb_entry_get_pointer (RhythmDB *db,
262
RhythmDBEntry *entry,
265
486
RhythmDBEntry * rhythmdb_entry_lookup_by_location (RhythmDB *db, const char *uri);
267
488
gboolean rhythmdb_evaluate_query (RhythmDB *db, GPtrArray *query,
268
489
RhythmDBEntry *entry);
491
void rhythmdb_entry_foreach (RhythmDB *db,
271
496
* Returns a freshly allocated GtkTreeModel which represents the query.
272
497
* The extended arguments alternate between RhythmDBQueryType args
273
* and their values. Here's an example:
275
* rhythmdb_do_full_query (db, RHYTHMDB_QUERY_PROP_EQUALS, "genre", "Classical",
276
* RHYTHMDB_QUERY_PROP_GREATER, "rating", 5,
277
* RHYTHMDB_QUERY_END);
498
* and their values. Items are prioritized like algebraic expressions, and
499
* implicitly ANDed. Here's an example:
501
rhythmdb_do_full_query (db,
502
RHYTHMDB_QUERY_PROP_EQUALS,
503
RHYTHMDB_PROP_ARTIST, "Pink Floyd",
504
RHYTHMDB_QUERY_DISJUNCTION,
505
RHYTHMDB_QUERY_PROP_EQUALS,
506
RHYTHMDB_PROP_GENRE, "Classical",
507
RHYTHMDB_QUERY_PROP_GREATER,
508
RHYTHMDB_PROP_RATING, 5,
510
* Which means: artist = Pink Floyd OR (genre = Classical AND rating >= 5)
280
512
void rhythmdb_do_full_query (RhythmDB *db,
281
513
GtkTreeModel *main_model,
292
524
void rhythmdb_query_cancel (RhythmDB *db, GtkTreeModel *query_model);
294
GType rhythmdb_get_property_type (RhythmDB *db, guint property_id);
296
void rhythmdb_entry_sync_mirrored (RhythmDB *db, RhythmDBEntry *entry,
297
guint propid, GValue *value);
526
void rhythmdb_entry_sync_mirrored (RhythmDB *db, RhythmDBEntry *entry, guint propid);
299
528
GPtrArray * rhythmdb_query_parse (RhythmDB *db, ...);
300
529
void rhythmdb_query_append (RhythmDB *db, GPtrArray *query, ...);
301
530
void rhythmdb_query_free (GPtrArray *query);
302
531
GPtrArray * rhythmdb_query_copy (GPtrArray *array);
532
void rhythmdb_query_preprocess (GPtrArray *query);
304
534
void rhythmdb_query_serialize (RhythmDB *db, GPtrArray *query,
305
535
xmlNodePtr node);
307
537
GPtrArray * rhythmdb_query_deserialize (RhythmDB *db, xmlNodePtr node);
309
inline const char * rhythmdb_nice_elt_name_from_propid (RhythmDB *db, gint propid);
310
inline int rhythmdb_propid_from_nice_elt_name (RhythmDB *db, const char *name);
539
inline const xmlChar * rhythmdb_nice_elt_name_from_propid (RhythmDB *db, RhythmDBPropType propid);
540
inline int rhythmdb_propid_from_nice_elt_name (RhythmDB *db, const xmlChar *name);
312
542
void rhythmdb_emit_entry_added (RhythmDB *db, RhythmDBEntry *entry);
313
void rhythmdb_emit_entry_restored (RhythmDB *db, RhythmDBEntry *entry);
314
543
void rhythmdb_emit_entry_deleted (RhythmDB *db, RhythmDBEntry *entry);
316
char * rhythmdb_get_status (RhythmDB *db);
545
gboolean rhythmdb_is_busy (RhythmDB *db);
317
546
char * rhythmdb_compute_status_normal (gint n_songs, glong duration,
318
547
GnomeVFSFileSize size);
319
548
RhythmDBEntryType rhythmdb_entry_register_type (void);
321
550
RhythmDBEntryType rhythmdb_entry_song_get_type (void);
322
551
RhythmDBEntryType rhythmdb_entry_iradio_get_type (void);
552
RhythmDBEntryType rhythmdb_entry_podcast_post_get_type (void);
553
RhythmDBEntryType rhythmdb_entry_podcast_feed_get_type (void);
323
554
RhythmDBEntryType rhythmdb_entry_icecast_get_type (void);
556
extern GType rhythmdb_property_type_map[RHYTHMDB_NUM_PROPERTIES];
557
G_INLINE_FUNC GType rhythmdb_get_property_type (RhythmDB *db, guint property_id);
559
#if defined (G_CAN_INLINE) || defined (__RHYTHMDB_C__)
562
rhythmdb_get_property_type (RhythmDB *db, guint property_id)
564
g_assert (property_id >= 0 && property_id < RHYTHMDB_NUM_PROPERTIES);
565
return rhythmdb_property_type_map[property_id];
570
void rhythmdb_entry_ref (RhythmDB *db, RhythmDBEntry *entry);
572
void rhythmdb_entry_unref (RhythmDB *db, RhythmDBEntry *entry);