rbpod 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ext/rbpod/device.c CHANGED
@@ -2,42 +2,74 @@
2
2
 
3
3
  #include "rbpod.h"
4
4
  #include "device.h"
5
-
6
- inline VALUE rbpod_device_create(Itdb_Device *device)
7
- {
8
- return Data_Wrap_Struct(cRbPodDevice, NULL, NULL, (void *) device);
9
- }
10
-
5
+ #include "database.h"
6
+
7
+ /*
8
+ * call-seq:
9
+ * supports_chapter_images?() -> Boolean
10
+ *
11
+ * Returns true of false if the device supports chapter images.
12
+ */
11
13
  static VALUE rbpod_device_chapter_image_support_p(VALUE self)
12
14
  {
13
15
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
14
16
  return BooleanValue(itdb_device_supports_chapter_image(device));
15
17
  }
16
18
 
19
+ /*
20
+ * call-seq:
21
+ * supports_podcasts?() -> Boolean
22
+ *
23
+ * Returns true of false if the device supports podcasts.
24
+ */
17
25
  static VALUE rbpod_device_podcast_support_p(VALUE self)
18
26
  {
19
27
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
20
28
  return BooleanValue(itdb_device_supports_podcast(device));
21
29
  }
22
30
 
31
+ /*
32
+ * call-seq:
33
+ * supports_artwork?() -> Boolean
34
+ *
35
+ * Returns true of false if the device supports artwork.
36
+ */
23
37
  static VALUE rbpod_device_artwork_support_p(VALUE self)
24
38
  {
25
39
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
26
40
  return BooleanValue(itdb_device_supports_artwork(device));
27
41
  }
28
42
 
43
+ /*
44
+ * call-seq:
45
+ * supports_videos?() -> Boolean
46
+ *
47
+ * Returns true of false if the device supports videos.
48
+ */
29
49
  static VALUE rbpod_device_video_support_p(VALUE self)
30
50
  {
31
51
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
32
52
  return BooleanValue(itdb_device_supports_video(device));
33
53
  }
34
54
 
55
+ /*
56
+ * call-seq:
57
+ * supports_photos?() -> Boolean
58
+ *
59
+ * Returns true of false if the device supports photos.
60
+ */
35
61
  static VALUE rbpod_device_photo_support_p(VALUE self)
36
62
  {
37
63
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
38
64
  return BooleanValue(itdb_device_supports_photo(device));
39
65
  }
40
66
 
67
+ /*
68
+ * call-seq:
69
+ * model_name() -> String
70
+ *
71
+ * Returns the model name of the device.
72
+ */
41
73
  static VALUE rbpod_device_model_name_get(VALUE self)
42
74
  {
43
75
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
@@ -45,6 +77,12 @@ static VALUE rbpod_device_model_name_get(VALUE self)
45
77
  return rb_str_new2(itdb_info_get_ipod_model_name_string(info->ipod_model));
46
78
  }
47
79
 
80
+ /*
81
+ * call-seq:
82
+ * model_number() -> String
83
+ *
84
+ * Returns the model number of the device.
85
+ */
48
86
  static VALUE rbpod_device_model_number_get(VALUE self)
49
87
  {
50
88
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
@@ -52,6 +90,12 @@ static VALUE rbpod_device_model_number_get(VALUE self)
52
90
  return rb_str_new2(info->model_number);
53
91
  }
54
92
 
93
+ /*
94
+ * call-seq:
95
+ * generation() -> String
96
+ *
97
+ * Returns the generation of the device.
98
+ */
55
99
  static VALUE rbpod_device_generation_get(VALUE self)
56
100
  {
57
101
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
@@ -59,6 +103,12 @@ static VALUE rbpod_device_generation_get(VALUE self)
59
103
  return rb_str_new2(itdb_info_get_ipod_generation_string(info->ipod_generation));
60
104
  }
61
105
 
106
+ /*
107
+ * call-seq:
108
+ * capacity() -> Float
109
+ *
110
+ * Returns the capacity of the device in gigabytes (GB).
111
+ */
62
112
  static VALUE rbpod_device_capacity_get(VALUE self)
63
113
  {
64
114
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
@@ -66,6 +116,12 @@ static VALUE rbpod_device_capacity_get(VALUE self)
66
116
  return DBL2NUM(info->capacity);
67
117
  }
68
118
 
119
+ /*
120
+ * call-seq:
121
+ * uuid() -> String
122
+ *
123
+ * Returns the UUID of the device.
124
+ */
69
125
  static VALUE rbpod_device_uuid_get(VALUE self)
70
126
  {
71
127
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
@@ -73,6 +129,12 @@ static VALUE rbpod_device_uuid_get(VALUE self)
73
129
  return (uuid == NULL) ? Qnil : rb_str_new2(uuid);
74
130
  }
75
131
 
132
+ /*
133
+ * call-seq:
134
+ * [](key) -> String
135
+ *
136
+ * Returns the SysInfo entry for the given key, or nil.
137
+ */
76
138
  static VALUE rbpod_device_sysinfo_get(VALUE self, VALUE key)
77
139
  {
78
140
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
@@ -87,6 +149,12 @@ static VALUE rbpod_device_sysinfo_get(VALUE self, VALUE key)
87
149
 
88
150
  }
89
151
 
152
+ /*
153
+ * call-seq:
154
+ * []=(key, value) -> nil
155
+ *
156
+ * Sets the given SysInfo entry to a value and returns nil.
157
+ */
90
158
  static VALUE rbpod_device_sysinfo_set(VALUE self, VALUE key, VALUE value)
91
159
  {
92
160
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
@@ -100,6 +168,12 @@ static VALUE rbpod_device_sysinfo_set(VALUE self, VALUE key, VALUE value)
100
168
  return Qnil;
101
169
  }
102
170
 
171
+ /*
172
+ * call-seq:
173
+ * save!() -> nil
174
+ *
175
+ * Writes the SysInfo data back to the device. Call this if you change any entries.
176
+ */
103
177
  static VALUE rbpod_device_sysinfo_save(VALUE self)
104
178
  {
105
179
  Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
@@ -112,20 +186,32 @@ static VALUE rbpod_device_sysinfo_save(VALUE self)
112
186
  return Qnil;
113
187
  }
114
188
 
115
- static VALUE rbpod_device_initialize(VALUE self)
189
+ /*
190
+ * call-seq:
191
+ * initialize(database) -> RbPod::Device
192
+ *
193
+ * Creates an RbPod::Device for a given RbPod::Database. You shouldn't have to call this.
194
+ */
195
+ static VALUE rbpod_device_initialize(VALUE self, VALUE database)
116
196
  {
117
- /* Private method, no setup required yet. */
118
- return self;
119
- }
197
+ Itdb_iTunesDB *_database = TYPED_DATA_PTR(database, Itdb_iTunesDB);
120
198
 
121
- static void rbpod_device_deallocate(void *handle)
122
- {
123
- itdb_device_free((Itdb_Device *) handle);
124
- }
199
+ /* Make sure we were given an instance of a RbPod::Database. */
200
+ if (rb_class_of(database) != cRbPodDatabase) {
201
+ rb_raise(eRbPodError, "Given database must be an instance of RbPod::Database: %s", StringValueCStr(database));
202
+ return Qnil;
203
+ }
125
204
 
126
- static VALUE rbpod_device_allocate(VALUE self)
127
- {
128
- return Data_Wrap_Struct(cRbPodDevice, NULL, rbpod_device_deallocate, (void *) itdb_device_new());
205
+ /* The database pointer and it's device should both be non-NULL. */
206
+ if (_database == NULL || _database->device == NULL) {
207
+ rb_raise(eRbPodError, "Given database and/or device was NULL.");
208
+ return Qnil;
209
+ }
210
+
211
+ /* Attach our data pointer to this database's backing device. */
212
+ DATA_PTR(self) = _database->device;
213
+
214
+ return self;
129
215
  }
130
216
 
131
217
  void Init_rbpod_device(void)
@@ -135,10 +221,7 @@ void Init_rbpod_device(void)
135
221
  #endif
136
222
  cRbPodDevice = rb_define_class_under(mRbPod, "Device", rb_cObject);
137
223
 
138
- rb_define_alloc_func(cRbPodDevice, rbpod_device_allocate);
139
-
140
- /* We don't want to explicitly create these, so mark the constructor as private. */
141
- rb_define_private_method(cRbPodDevice, "initialize", rbpod_device_initialize, 0);
224
+ rb_define_method(cRbPodDevice, "initialize", rbpod_device_initialize, 1);
142
225
 
143
226
  rb_define_method(cRbPodDevice, "[]", rbpod_device_sysinfo_get, 1);
144
227
  rb_define_method(cRbPodDevice, "[]=", rbpod_device_sysinfo_set, 2);
data/ext/rbpod/device.h CHANGED
@@ -7,6 +7,4 @@ RUBY_EXTERN VALUE cRbPodDevice;
7
7
 
8
8
  void Init_rbpod_device(void);
9
9
 
10
- inline VALUE rbpod_device_create(Itdb_Device *device);
11
-
12
10
  #endif /* RBPOD_DEVICE_H */
data/ext/rbpod/playlist.c CHANGED
@@ -4,73 +4,152 @@
4
4
  #include "playlist.h"
5
5
  #include "track_collection.h"
6
6
 
7
+ /*
8
+ * call-seq:
9
+ * is_podcast_playlist?() -> Boolean
10
+ *
11
+ * Returns true or false if this playlist is the podcast-only playlist.
12
+ */
7
13
  static VALUE rbpod_playlist_podcast_p(VALUE self)
8
14
  {
9
15
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
10
16
  return BooleanValue(itdb_playlist_is_podcasts(playlist));
11
17
  }
12
18
 
19
+ /*
20
+ * call-seq:
21
+ * is_master_playlist?() -> Boolean
22
+ *
23
+ * Returns true or false if this playlist is the master playlist.
24
+ */
13
25
  static VALUE rbpod_playlist_master_p(VALUE self)
14
26
  {
15
27
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
16
28
  return BooleanValue(itdb_playlist_is_mpl(playlist));
17
29
  }
18
30
 
31
+ /*
32
+ * call-seq:
33
+ * is_smart_playlist?() -> Boolean
34
+ *
35
+ * Returns true or false if this playlist is a smart playlist.
36
+ */
19
37
  static VALUE rbpod_playlist_smart_p(VALUE self)
20
38
  {
21
39
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
22
40
  return BooleanValue(playlist->is_spl);
23
41
  }
24
42
 
43
+ /*
44
+ * call-seq:
45
+ * timestamp() -> Time
46
+ * created_on() -> Time
47
+ *
48
+ * Returns a Time object representing the time that this playlist was created.
49
+ */
25
50
  static VALUE rbpod_playlist_timestamp_get(VALUE self)
26
51
  {
27
52
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
28
53
  return rb_funcall(rb_cTime, rb_intern("at"), 1, INT2NUM(playlist->timestamp));
29
54
  }
30
55
 
31
- static VALUE rbpod_playlist_shuffle(VALUE self)
56
+ /*
57
+ * call-seq:
58
+ * shuffle!() -> nil
59
+ *
60
+ * Shuffles the tracks in this playlist in place.
61
+ */
62
+ static VALUE rbpod_playlist_shuffle_bang(VALUE self)
32
63
  {
33
64
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
34
65
  itdb_playlist_randomize(playlist);
35
66
  return Qnil;
36
67
  }
37
68
 
69
+ /*
70
+ * call-seq:
71
+ * tracks() -> RbPod::Collection
72
+ *
73
+ * Returns a collection of the tracks in this playlist.
74
+ */
38
75
  static VALUE rbpod_playlist_tracks_get(VALUE self)
39
76
  {
40
77
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
41
78
  return rbpod_track_collection_create(self, playlist->members);
42
79
  }
43
80
 
81
+ /*
82
+ * call-seq:
83
+ * length() -> Integer
84
+ *
85
+ * Returns the total number of tracks in this playlist.
86
+ */
44
87
  static VALUE rbpod_playlist_length_get(VALUE self)
45
88
  {
46
89
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
47
90
  return INT2NUM(itdb_playlist_tracks_number(playlist));
48
91
  }
49
92
 
93
+ /*
94
+ * call-seq:
95
+ * name() -> String
96
+ *
97
+ * Returns the name of this playlist.
98
+ */
50
99
  static VALUE rbpod_playlist_name_get(VALUE self)
51
100
  {
52
101
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
53
102
  return rb_str_new2(playlist->name);
54
103
  }
55
104
 
105
+ /*
106
+ * call-seq:
107
+ * <=>(other) -> Integer
108
+ *
109
+ * Compares two playlists based on their names.
110
+ */
111
+ static VALUE rbpod_playlist_compare(VALUE self, VALUE other)
112
+ {
113
+ VALUE this_playlist_name, other_playlist_name;
114
+
115
+ if (rb_class_of(other) != cRbPodPlaylist) {
116
+ rb_raise(eRbPodError, "Can't compare a Playlist with %s", StringValueCStr(other));
117
+ return Qnil;
118
+ }
119
+
120
+ this_playlist_name = rbpod_playlist_name_get(self);
121
+ other_playlist_name = rbpod_playlist_name_get(other);
122
+
123
+ return rb_str_cmp(this_playlist_name, other_playlist_name);
124
+ }
125
+
126
+ /*
127
+ * call-seq:
128
+ * id() -> Fixnum
129
+ *
130
+ * Returns the internal ID number for this playlist. Do not use this method.
131
+ */
56
132
  static VALUE rbpod_playlist_id_get(VALUE self)
57
133
  {
58
134
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
59
135
  return INT2NUM(playlist->id);
60
136
  }
61
137
 
138
+ /*
139
+ * call-seq:
140
+ * initialize(name, is_smart_playlist) -> RbPod::Playlist
141
+ *
142
+ * Creates a detached playlist. (Not managed by the database.)
143
+ */
62
144
  static VALUE rbpod_playlist_initialize(VALUE self, VALUE playlist_name, VALUE smart_playlist)
63
145
  {
64
146
  Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
65
147
  gchar *_playlist_name = StringValueCStr(playlist_name);
66
148
 
67
- /* Kill off the dummy playlist. */
68
149
  itdb_playlist_free(playlist);
69
150
 
70
- /* Create a new playlist based on the values provided. */
71
151
  playlist = itdb_playlist_new(_playlist_name, (smart_playlist == Qtrue) ? TRUE : FALSE);
72
152
 
73
- /* Store the new playlist. */
74
153
  DATA_PTR(self) = playlist;
75
154
 
76
155
  return self;
@@ -97,7 +176,7 @@ static VALUE rbpod_playlist_allocate(VALUE self)
97
176
  void Init_rbpod_playlist(void)
98
177
  {
99
178
  #if RDOC_CAN_PARSE_DOCUMENTATION
100
- mRbPod = rb_define_module("RbPod");
179
+ mRbPod = rb_define_module("RbPod");
101
180
  #endif
102
181
  cRbPodPlaylist = rb_define_class_under(mRbPod, "Playlist", rb_cObject);
103
182
 
@@ -105,16 +184,21 @@ void Init_rbpod_playlist(void)
105
184
 
106
185
  rb_define_method(cRbPodPlaylist, "initialize", rbpod_playlist_initialize, 2);
107
186
 
108
- rb_define_method(cRbPodPlaylist, "id", rbpod_playlist_id_get, 0);
187
+ rb_define_private_method(cRbPodPlaylist, "id", rbpod_playlist_id_get, 0);
188
+
189
+ rb_define_method(cRbPodPlaylist, "<=>", rbpod_playlist_compare, 1);
190
+
109
191
  rb_define_method(cRbPodPlaylist, "name", rbpod_playlist_name_get, 0);
110
192
  rb_define_method(cRbPodPlaylist, "length", rbpod_playlist_length_get, 0);
111
193
  rb_define_method(cRbPodPlaylist, "tracks", rbpod_playlist_tracks_get, 0);
112
- rb_define_method(cRbPodPlaylist, "shuffle!", rbpod_playlist_shuffle, 0);
113
- rb_define_method(cRbPodPlaylist, "created_on", rbpod_playlist_timestamp_get, 0);
194
+ rb_define_method(cRbPodPlaylist, "shuffle!", rbpod_playlist_shuffle_bang, 0);
195
+ rb_define_method(cRbPodPlaylist, "timestamp", rbpod_playlist_timestamp_get, 0);
196
+
197
+ rb_define_alias(cRbPodPlaylist, "created_on", "timestamp");
114
198
 
115
- rb_define_method(cRbPodPlaylist, "smart_playlist?", rbpod_playlist_smart_p, 0);
116
- rb_define_method(cRbPodPlaylist, "master_playlist?", rbpod_playlist_master_p, 0);
117
- rb_define_method(cRbPodPlaylist, "podcast_playlist?", rbpod_playlist_podcast_p, 0);
199
+ rb_define_method(cRbPodPlaylist, "is_smart_playlist?", rbpod_playlist_smart_p, 0);
200
+ rb_define_method(cRbPodPlaylist, "is_master_playlist?", rbpod_playlist_master_p, 0);
201
+ rb_define_method(cRbPodPlaylist, "is_podcast_playlist?", rbpod_playlist_podcast_p, 0);
118
202
 
119
203
  return;
120
204
  }
@@ -5,56 +5,77 @@
5
5
  #include "collection.h"
6
6
  #include "playlist_collection.h"
7
7
 
8
- static VALUE rbpod_playlist_collection_parent(VALUE self)
8
+ /*
9
+ * call-seq:
10
+ * database() -> RbPod::Database
11
+ *
12
+ * The database from which this collection of playlists is attached to.
13
+ */
14
+ static VALUE rbpod_playlist_collection_database(VALUE self)
9
15
  {
10
- return rb_iv_get(self, "@parent");
16
+ return rb_iv_get(self, "@database");
11
17
  }
12
18
 
19
+ /*
20
+ * call-seq:
21
+ * [](index) -> RbPod::Playlist
22
+ * [](name) -> RbPod::Playlist
23
+ *
24
+ * Returns a playlist by either position or name in the collection, or nil if it wasn't found.
25
+ */
13
26
  static VALUE rbpod_playlist_collection_get(VALUE self, VALUE key)
14
27
  {
15
- VALUE parent = rbpod_playlist_collection_parent(self);
28
+ VALUE parent = rbpod_playlist_collection_database(self);
16
29
  Itdb_iTunesDB *database = TYPED_DATA_PTR(parent, Itdb_iTunesDB);
17
30
  Itdb_Playlist *playlist = NULL;
31
+ int key_type = TYPE(key);
18
32
 
19
- switch (TYPE(key)) {
20
- case T_SYMBOL:
21
- case T_STRING:
33
+ if (key_type == T_SYMBOL || key_type == T_STRING) {
22
34
  playlist = itdb_playlist_by_name(database, StringValueCStr(key));
23
- break;
24
- case T_FIXNUM:
25
- playlist = itdb_playlist_by_nr(database, FIX2INT(key));
26
- break;
35
+ return Data_Wrap_Struct(cRbPodPlaylist, NULL, NULL, (void *) playlist);
27
36
  }
28
37
 
29
- if (playlist == NULL) {
30
- return Qnil;
38
+ if (key_type == T_FIXNUM) {
39
+ playlist = itdb_playlist_by_nr(database, FIX2INT(key));
40
+ return Data_Wrap_Struct(cRbPodPlaylist, NULL, NULL, (void *) playlist);
31
41
  }
32
42
 
33
- return Data_Wrap_Struct(cRbPodPlaylist, NULL, NULL, (void *) playlist);
43
+ return Qnil;
34
44
  }
35
45
 
36
- static VALUE rbpod_playlist_collection_podcasts_get(VALUE self)
46
+ /*
47
+ * call-seq:
48
+ * podcast() -> RbPod::Playlist
49
+ *
50
+ * Returns the podcast playlist in this collection.
51
+ */
52
+ static VALUE rbpod_playlist_collection_podcast_get(VALUE self)
37
53
  {
38
- VALUE parent = rbpod_playlist_collection_parent(self);
54
+ VALUE parent = rbpod_playlist_collection_database(self);
39
55
  Itdb_iTunesDB *database = TYPED_DATA_PTR(parent, Itdb_iTunesDB);
40
56
  Itdb_Playlist *podcasts = itdb_playlist_podcasts(database);
41
57
  return Data_Wrap_Struct(cRbPodPlaylist, NULL, NULL, (void *) podcasts);
42
58
  }
43
59
 
60
+ /*
61
+ * call-seq:
62
+ * master() -> RbPod::Playlist
63
+ *
64
+ * Returns the master playlist in this collection.
65
+ */
44
66
  static VALUE rbpod_playlist_collection_master_get(VALUE self)
45
67
  {
46
- VALUE parent = rbpod_playlist_collection_parent(self);
68
+ VALUE parent = rbpod_playlist_collection_database(self);
47
69
  Itdb_iTunesDB *database = TYPED_DATA_PTR(parent, Itdb_iTunesDB);
48
70
  Itdb_Playlist *master = itdb_playlist_mpl(database);
49
71
  return Data_Wrap_Struct(cRbPodPlaylist, NULL, NULL, (void *) master);
50
72
  }
51
73
 
52
- inline VALUE rbpod_playlist_collection_create(VALUE parent, GList *items)
74
+ inline VALUE rbpod_playlist_collection_create(VALUE database, GList *items)
53
75
  {
54
76
  VALUE collection = rbpod_collection_create(items, cRbPodPlaylist);
55
77
  rb_extend_object(collection, mRbPodPlaylistCollection);
56
- rb_extend_object(collection, rb_mComparable);
57
- rb_iv_set(collection, "@parent", parent);
78
+ rb_iv_set(collection, "@database", database);
58
79
  return collection;
59
80
  }
60
81
 
@@ -63,12 +84,13 @@ void Init_rbpod_playlist_collection(void)
63
84
  #if RDOC_CAN_PARSE_DOCUMENTATION
64
85
  mRbPod = rb_define_module("RbPod");
65
86
  #endif
87
+ /* This module extends any collection of playlists at runtime. */
66
88
  mRbPodPlaylistCollection = rb_define_module_under(mRbPod, "PlaylistCollection");
67
89
 
68
- rb_define_private_method(mRbPodPlaylistCollection, "parent", rbpod_playlist_collection_parent, 0);
90
+ rb_define_method(mRbPodPlaylistCollection, "database", rbpod_playlist_collection_database, 0);
69
91
 
70
92
  rb_define_method(mRbPodPlaylistCollection, "master", rbpod_playlist_collection_master_get, 0);
71
- rb_define_method(mRbPodPlaylistCollection, "podcasts", rbpod_playlist_collection_podcasts_get, 0);
93
+ rb_define_method(mRbPodPlaylistCollection, "podcast", rbpod_playlist_collection_podcast_get, 0);
72
94
 
73
95
  rb_define_method(mRbPodPlaylistCollection, "[]", rbpod_playlist_collection_get, 1);
74
96
 
data/ext/rbpod/rbpod.c CHANGED
@@ -23,6 +23,7 @@ VALUE mRbPodPlaylistCollection;
23
23
  VALUE cRbPodTrack;
24
24
  VALUE mRbPodTrackCollection;
25
25
 
26
+ VALUE rb_cPathname;
26
27
 
27
28
  inline VALUE rbpod_raise_error(GError *error)
28
29
  {
@@ -37,12 +38,28 @@ inline VALUE rbpod_raise_error(GError *error)
37
38
  return Qnil;
38
39
  }
39
40
 
41
+ /*
42
+ * call-seq:
43
+ * RbPod(mount_point) -> RbPod::Database
44
+ *
45
+ * A shortcut for creating an RbPod::Database instance from a mount point.
46
+ *
47
+ */
48
+ static VALUE rbpod_load_database(VALUE self, VALUE mount_point)
49
+ {
50
+ return rb_class_new_instance(1, &mount_point, cRbPodDatabase);
51
+ }
52
+
40
53
  void Init_rbpod(void)
41
54
  {
55
+ /* This is the wrapper for all RbPod related classes. */
42
56
  mRbPod = rb_define_module("RbPod");
43
57
 
58
+ /* This is a generic subclass of RuntimeError for RbPod-specific errors.*/
44
59
  eRbPodError = rb_define_class_under(mRbPod, "Error", rb_eRuntimeError);
45
60
 
61
+ rb_cPathname = rb_const_get(rb_cObject, rb_intern("Pathname"));
62
+
46
63
  Init_rbpod_database();
47
64
  Init_rbpod_device();
48
65
  Init_rbpod_collection();
@@ -51,6 +68,8 @@ void Init_rbpod(void)
51
68
  Init_rbpod_track();
52
69
  Init_rbpod_track_collection();
53
70
 
71
+ rb_define_global_function("RbPod", rbpod_load_database, 1);
72
+
54
73
  return;
55
74
  }
56
75
 
data/ext/rbpod/rbpod.h CHANGED
@@ -13,6 +13,8 @@
13
13
  RUBY_EXTERN VALUE mRbPod;
14
14
  RUBY_EXTERN VALUE eRbPodError;
15
15
 
16
+ RUBY_EXTERN VALUE rb_cPathname;
17
+
16
18
  inline VALUE rbpod_raise_error(GError *error);
17
19
 
18
20
  #endif /* RBPOD_H */