rbpod 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -70,12 +70,12 @@ device['PotsdamConf45'] = "Kilroy Was Here"
70
70
  device.save!
71
71
  ```
72
72
 
73
- ### RbPod::Collection
73
+ ### RbPod::PlaylistCollection
74
74
 
75
- All methods that return lists return a `Collection` enumerator decorated depending on it's contents:
75
+ You can get direct access to the playlists on the device:
76
76
 
77
77
  ```ruby
78
- database.playlists # => #<RbPod::Collection:0xdeadbeef>
78
+ database.playlists # => #<RbPod::PlaylistCollection:0xdeadbeef>
79
79
 
80
80
  # For a list of all the names of playlists on the iPod:
81
81
  database.playlists.map(&:name) # => ["iPod", "Podcasts", "Recently Added"]
@@ -83,8 +83,8 @@ database.playlists.map(&:name) # => ["iPod", "Podcasts", "Recently Added"]
83
83
  # For direct access to the master playlist:
84
84
  database.playlists.master # => #<RbPod::Playlist:0xdeadbeef>
85
85
 
86
- # For direct access to the podcasts playlist:
87
- database.playlists.podcasts # => #<RbPod::Playlist:0xdeadbeef>
86
+ # For direct access to the podcast playlist:
87
+ database.playlists.podcast # => #<RbPod::Playlist:0xdeadbeef>
88
88
  ```
89
89
 
90
90
  ### RbPod::Playlist
@@ -98,11 +98,11 @@ playlist.name # => "iPod"
98
98
  playlist.length # => 400
99
99
  playlist.created_on # => 2008-04-05 08:47:46 -0700
100
100
 
101
- playlist.master_playlist? # => true
102
- playlist.smart_playlist? # => false
103
- playlist.podcast_playlist? # => false
101
+ playlist.master? # => true
102
+ playlist.smart? # => false
103
+ playlist.podcast? # => false
104
104
 
105
- playlist.tracks # => #<RbPod::Collection:0xdeadbeef>
105
+ playlist.tracks # => #<RbPod::TrackCollection:0xdeadbeef>
106
106
  ```
107
107
 
108
108
  ### RbPod::Track
data/Rakefile CHANGED
@@ -13,8 +13,8 @@ require 'rspec/core/rake_task'
13
13
  # Bring in RDoc's built-in rake task.
14
14
  require 'rdoc/task'
15
15
 
16
- # By default, clean, compile and then test.
17
- task :default => [ :compile, :test ]
16
+ # By default, run rspec tests.
17
+ task :default => [ :test ]
18
18
 
19
19
  # Let Rake know what is safe to remove.
20
20
  CLEAN.include [ 'pkg/*', 'doc/*' ]
@@ -27,7 +27,7 @@ Rake::ExtensionTask.new do |extension|
27
27
  extension.lib_dir = 'lib/rbpod'
28
28
 
29
29
  # Monitor sources for change tracking.
30
- extension.source_pattern = '*.{c,h}'
30
+ extension.source_pattern = '*.[ch]'
31
31
  end
32
32
 
33
33
  desc "Run all available RSpec tests."
@@ -36,6 +36,8 @@ RSpec::Core::RakeTask.new(:test) do |task|
36
36
  # Execute ruby with warnings enabled.
37
37
  task.ruby_opts = '-w'
38
38
  end
39
+ # Make compilation a prerequisite of testing.
40
+ Rake::Task[:test].prerequisites << :compile
39
41
 
40
42
  desc "Build all RDoc documentation."
41
43
  RDoc::Task.new(:rdoc) do |task|
@@ -3,37 +3,28 @@
3
3
  #include "rbpod.h"
4
4
  #include "collection.h"
5
5
 
6
- struct collection {
7
- VALUE klass;
8
- GList *list;
9
- };
10
-
11
- inline VALUE rbpod_collection_create(GList *list, VALUE type)
12
- {
13
- struct collection *collection = ALLOC(struct collection);
14
- collection->list = list;
15
- collection->klass = type;
16
- return Data_Wrap_Struct(cRbPodCollection, NULL, NULL, (void *) collection);
17
- }
18
-
19
6
  /*
20
7
  * call-seq:
21
8
  * [](index) -> Object or nil
22
9
  *
23
- * Return the item located at the given position in the list.
10
+ * Given an integer +index+, return the item at that position in the collection.
24
11
  */
25
12
  static VALUE rbpod_collection_get(VALUE self, VALUE key)
26
13
  {
27
- struct collection *collection = TYPED_DATA_PTR(self, struct collection);
28
- GList *current = NULL;
14
+ GList *current = NULL, *collection = TYPED_DATA_PTR(self, GList);
15
+ VALUE klass = rb_funcall(self, rb_intern("type"), 0);
29
16
 
30
17
  if (FIXNUM_P(key) == FALSE) {
31
18
  return Qnil;
32
19
  }
33
20
 
34
- current = g_list_nth(collection->list, FIX2INT(key));
21
+ current = g_list_nth(collection, FIX2INT(key));
35
22
 
36
- return Data_Wrap_Struct(collection->klass, NULL, NULL, (void *) current->data);
23
+ if (current == NULL) {
24
+ return Qnil;
25
+ }
26
+
27
+ return rb_class_new_instance_with_data(0, NULL, klass, current->data);
37
28
  }
38
29
 
39
30
  /*
@@ -44,14 +35,15 @@ static VALUE rbpod_collection_get(VALUE self, VALUE key)
44
35
  */
45
36
  static VALUE rbpod_collection_last(VALUE self)
46
37
  {
47
- struct collection *collection = TYPED_DATA_PTR(self, struct collection);
48
- GList *current = g_list_last(collection->list);
38
+ VALUE klass = rb_funcall(self, rb_intern("type"), 0);
39
+ GList *collection = TYPED_DATA_PTR(self, GList);
40
+ GList *current = g_list_last(collection);
49
41
 
50
42
  if (current == NULL) {
51
43
  return Qnil;
52
44
  }
53
45
 
54
- return Data_Wrap_Struct(collection->klass, NULL, NULL, (void *) current->data);
46
+ return rb_class_new_instance_with_data(0, NULL, klass, current->data);
55
47
  }
56
48
 
57
49
  /*
@@ -62,26 +54,27 @@ static VALUE rbpod_collection_last(VALUE self)
62
54
  */
63
55
  static VALUE rbpod_collection_first(VALUE self)
64
56
  {
65
- struct collection *collection = TYPED_DATA_PTR(self, struct collection);
66
- GList *current = g_list_first(collection->list);
57
+ VALUE klass = rb_funcall(self, rb_intern("type"), 0);
58
+ GList *collection = TYPED_DATA_PTR(self, GList);
59
+ GList *current = g_list_first(collection);
67
60
 
68
61
  if (current == NULL) {
69
62
  return Qnil;
70
63
  }
71
64
 
72
- return Data_Wrap_Struct(collection->klass, NULL, NULL, (void *) current->data);
65
+ return rb_class_new_instance_with_data(0, NULL, klass, current->data);
73
66
  }
74
67
 
75
68
  /*
76
69
  * call-seq:
77
- * length() -> Integer
70
+ * size() -> Integer
78
71
  *
79
72
  * Return the total length of all items in the collection.
80
73
  */
81
- static VALUE rbpod_collection_length(VALUE self)
74
+ static VALUE rbpod_collection_size(VALUE self)
82
75
  {
83
- struct collection *collection = TYPED_DATA_PTR(self, struct collection);
84
- return INT2NUM(g_list_length(collection->list));
76
+ GList *collection = TYPED_DATA_PTR(self, GList);
77
+ return INT2NUM(g_list_length(collection));
85
78
  }
86
79
 
87
80
  /*
@@ -95,19 +88,25 @@ static VALUE rbpod_collection_length(VALUE self)
95
88
  */
96
89
  static VALUE rbpod_collection_each(VALUE self, VALUE argv)
97
90
  {
98
- struct collection *collection = TYPED_DATA_PTR(self, struct collection);
99
- VALUE item = Qnil, arguments = rb_ary_dup(argv);
100
- GList *current = NULL;
91
+ GList *current = NULL, *collection = TYPED_DATA_PTR(self, GList);
92
+ VALUE klass, item, arguments;
101
93
 
102
94
  /* Return an enumerator if a block was not supplied. */
103
95
  RETURN_ENUMERATOR(self, 0, 0);
104
96
 
97
+ /* What sort of items are we casting this data to? */
98
+ klass = rb_funcall(self, rb_intern("type"), 0);
99
+
100
+ /* Create a shallow copy of the passed arguments. */
101
+ arguments = rb_ary_dup(argv);
102
+
105
103
  /* Prepend an empty element as a placeholder. */
106
104
  rb_ary_unshift(arguments, Qnil);
107
105
 
108
106
  /* If we were supplied a block, enumerate the entire list. */
109
- for (current = collection->list; current != NULL; current = current->next) {
110
- item = Data_Wrap_Struct(collection->klass, NULL, NULL, (void *) current->data);
107
+ for (current = collection; current != NULL; current = g_list_next(current)) {
108
+ /* TODO: Find a better workaround than this or Data_Wrap_Struct. */
109
+ item = rb_class_new_instance_with_data(0, NULL, klass, current->data);
111
110
  rb_ary_store(arguments, 0, item);
112
111
  rb_yield_splat(arguments);
113
112
  }
@@ -115,24 +114,28 @@ static VALUE rbpod_collection_each(VALUE self, VALUE argv)
115
114
  return self;
116
115
  }
117
116
 
118
- static void rbpod_collection_deallocate(void *handle)
117
+ /*
118
+ * :nodoc:
119
+ */
120
+ static VALUE rbpod_collection_type(VALUE self)
119
121
  {
120
- struct collection *collection = (struct collection *) handle;
121
-
122
- if (collection->list != NULL) {
123
- g_list_free(collection->list);
124
- }
125
-
126
- xfree(handle);
127
- return;
122
+ /* We should get an error if we try to create an instance of NilClass. */
123
+ return Qnil;
128
124
  }
129
125
 
130
- static VALUE rbpod_collection_allocate(VALUE self)
126
+ /*
127
+ * :nodoc:
128
+ */
129
+ static VALUE rbpod_collection_included(VALUE self, VALUE other)
131
130
  {
132
- struct collection *collection = ALLOC(struct collection);
133
- collection->list = NULL;
134
- collection->klass = Qnil;
135
- return Data_Wrap_Struct(cRbPodCollection, NULL, rbpod_collection_deallocate, (void *) collection);
131
+ /* Collections should be Enumerable and Comparable. */
132
+ rb_include_module(other, rb_mEnumerable);
133
+ rb_include_module(other, rb_mComparable);
134
+
135
+ /* Override Enumerable with our methods. */
136
+ rb_extend_object(other, self);
137
+
138
+ return self;
136
139
  }
137
140
 
138
141
  void Init_rbpod_collection(void)
@@ -140,22 +143,17 @@ void Init_rbpod_collection(void)
140
143
  #if RDOC_CAN_PARSE_DOCUMENTATION
141
144
  mRbPod = rb_define_module("RbPod");
142
145
  #endif
143
- cRbPodCollection = rb_define_class_under(mRbPod, "Collection", rb_cObject);
144
-
145
- rb_define_alloc_func(cRbPodCollection, rbpod_collection_allocate);
146
-
147
- rb_include_module(cRbPodCollection, rb_mEnumerable);
148
- rb_include_module(cRbPodCollection, rb_mComparable);
146
+ mRbPodCollection = rb_define_module_under(mRbPod, "Collection");
149
147
 
150
- rb_define_method(cRbPodCollection, "each", rbpod_collection_each, -2);
148
+ rb_define_singleton_method(mRbPodCollection, "included", rbpod_collection_included, 1);
151
149
 
152
- rb_define_method(cRbPodCollection, "length", rbpod_collection_length, 0);
150
+ rb_define_private_method(mRbPodCollection, "type", rbpod_collection_type, 0);
153
151
 
154
- rb_define_alias(cRbPodCollection, "size", "length");
155
- rb_define_alias(cRbPodCollection, "count", "length");
152
+ rb_define_method(mRbPodCollection, "each", rbpod_collection_each, -2);
153
+ rb_define_method(mRbPodCollection, "size", rbpod_collection_size, 0);
156
154
 
157
- rb_define_method(cRbPodCollection, "first", rbpod_collection_first, 0);
158
- rb_define_method(cRbPodCollection, "last", rbpod_collection_last, 0);
155
+ rb_define_method(mRbPodCollection, "first", rbpod_collection_first, 0);
156
+ rb_define_method(mRbPodCollection, "last", rbpod_collection_last, 0);
159
157
 
160
- rb_define_method(cRbPodCollection, "[]", rbpod_collection_get, 1);
158
+ rb_define_method(mRbPodCollection, "[]", rbpod_collection_get, 1);
161
159
  }
@@ -3,10 +3,8 @@
3
3
  #ifndef RBPOD_COLLECTION_H
4
4
  #define RBPOD_COLLECTION_H
5
5
 
6
- RUBY_EXTERN VALUE cRbPodCollection;
6
+ RUBY_EXTERN VALUE mRbPodCollection;
7
7
 
8
8
  void Init_rbpod_collection(void);
9
9
 
10
- inline VALUE rbpod_collection_create(GList *list, VALUE type);
11
-
12
10
  #endif /* RBPOD_COLLECTION_H */
data/ext/rbpod/database.c CHANGED
@@ -1,8 +1,10 @@
1
1
  /* database.c */
2
2
 
3
3
  #include "rbpod.h"
4
+ #include "error.h"
4
5
  #include "device.h"
5
6
  #include "database.h"
7
+ #include "playlist.h"
6
8
  #include "track_collection.h"
7
9
  #include "playlist_collection.h"
8
10
 
@@ -39,22 +41,26 @@ static VALUE rbpod_database_synchronized_p(VALUE self)
39
41
 
40
42
  /*
41
43
  * call-seq:
42
- * playlists() -> RbPod::Collection
44
+ * playlists() -> RbPod::PlaylistCollection
43
45
  *
44
46
  * Returns a collection of all playlists added to this database.
45
47
  */
46
48
  static VALUE rbpod_database_playlists_get(VALUE self)
47
49
  {
48
- Itdb_iTunesDB *database = TYPED_DATA_PTR(self, Itdb_iTunesDB);
49
- return rbpod_playlist_collection_create(self, database->playlists);
50
+ return rb_class_new_instance(1, &self, cRbPodPlaylistCollection);
50
51
  }
51
52
 
53
+ /*
54
+ * call-seq:
55
+ * tracks() -> RbPod::TrackCollection
56
+ *
57
+ * Returns a collection of all tracks added to this database.
58
+ */
52
59
  static VALUE rbpod_database_tracks_get(VALUE self)
53
60
  {
54
- Itdb_iTunesDB *database = TYPED_DATA_PTR(self, Itdb_iTunesDB);
55
- Itdb_Playlist *playlist = itdb_playlist_mpl(database);
56
- VALUE parent = Data_Wrap_Struct(cRbPodPlaylist, NULL, NULL, (void *) playlist);
57
- return rbpod_track_collection_create(parent, database->tracks);
61
+ VALUE playlists = rbpod_database_playlists_get(self);
62
+ VALUE master = rb_funcall(playlists, rb_intern("master"), 0);
63
+ return rb_class_new_instance(1, &master, cRbPodTrackCollection);
58
64
  }
59
65
 
60
66
  /*
@@ -93,6 +99,9 @@ static VALUE rbpod_database_version_get(VALUE self)
93
99
  return INT2NUM(database->version);
94
100
  }
95
101
 
102
+ /*
103
+ * :nodoc:
104
+ */
96
105
  static VALUE rbpod_database_id_get(VALUE self)
97
106
  {
98
107
  Itdb_iTunesDB *database = TYPED_DATA_PTR(self, Itdb_iTunesDB);
@@ -112,6 +121,9 @@ static VALUE rbpod_database_mountpoint_get(VALUE self)
112
121
  return rb_class_new_instance(1, &mount_point, rb_cPathname);
113
122
  }
114
123
 
124
+ /*
125
+ * :nodoc:
126
+ */
115
127
  static VALUE rbpod_database_mountpoint_set(VALUE self, VALUE path)
116
128
  {
117
129
  Itdb_iTunesDB *database = TYPED_DATA_PTR(self, Itdb_iTunesDB);
@@ -137,6 +149,12 @@ static VALUE rbpod_database_initialize(VALUE self, VALUE mount_point)
137
149
  Itdb_iTunesDB *previous = database;
138
150
  GError *error = NULL;
139
151
 
152
+ /* Check if the mount point is a directory. */
153
+ if (rb_file_directory_p(rb_cFile, mount_point) != Qtrue) {
154
+ rb_raise(eRbPodError, "The mount point must be a directory!");
155
+ return Qnil;
156
+ }
157
+
140
158
  /* Try to parse the database from the given mount point. */
141
159
  database = itdb_parse(StringValueCStr(mount_point), &error);
142
160
 
@@ -170,6 +188,7 @@ static VALUE rbpod_database_allocate(VALUE self)
170
188
  static VALUE rbpod_database_create(int argc, VALUE *argv, VALUE self)
171
189
  {
172
190
  gchar *_mount_point, *_device_name, *_model_number;
191
+ VALUE model_matcher, model_regexp, ignorecase;
173
192
  VALUE mount_point, device_name, model_number;
174
193
  GError *error = NULL;
175
194
 
@@ -185,19 +204,30 @@ static VALUE rbpod_database_create(int argc, VALUE *argv, VALUE self)
185
204
  }
186
205
 
187
206
  /* If we didn't specify a device name, default to 'iPod'. */
188
- if (RTEST(device_name) && (TYPE(device_name) != T_STRING || RSTRING_LEN(device_name) < 4)) {
189
- rb_raise(eRbPodError, "Device name should be a string of at least three characters.");
190
- return Qnil;
191
- } else {
207
+ if (RTEST(device_name) == FALSE) {
192
208
  device_name = rb_str_new2("iPod");
193
209
  }
194
210
 
195
- /* If the specified model number is specified but isn't a string, bail now. TODO: Use a regexp, stupid. */
196
- if (NIL_P(model_number) == FALSE && (TYPE(model_number) != T_STRING || RSTRING_LEN(model_number) < 4)) {
197
- rb_raise(eRbPodError, "Model number should be a string of at least four characters.");
211
+ /* Ensure it's a valid device name, if it was given. */
212
+ if (TYPE(device_name) == T_STRING && RSTRING_LEN(device_name) == 0) {
213
+ rb_raise(eRbPodError, "Device name must not be an empty string.");
198
214
  return Qnil;
199
215
  }
200
216
 
217
+ /* If a model number was given, ensure it's a string. */
218
+ if (RTEST(model_number)) {
219
+ Check_Type(device_name, T_STRING);
220
+
221
+ model_matcher = rb_str_new2("/x?[A-Z][0-9]{3}/");
222
+ ignorecase = rb_const_get(rb_cRegexp, rb_intern("IGNORECASE"));
223
+ model_regexp = rb_reg_new_str(model_matcher, ignorecase);
224
+
225
+ if (RTEST(rb_reg_match(model_regexp, model_number)) == FALSE) {
226
+ rb_raise(eRbPodError, "Model number must be a string matching: /x?[A-Z][0-9]{3}/i");
227
+ return Qnil;
228
+ }
229
+ }
230
+
201
231
  /* Extract pointers for glib use. */
202
232
  _mount_point = StringValueCStr(mount_point);
203
233
  _device_name = StringValueCStr(device_name);
@@ -228,7 +258,6 @@ void Init_rbpod_database(void)
228
258
  rb_define_singleton_method(cRbPodDatabase, "create!", rbpod_database_create, -1);
229
259
 
230
260
  rb_define_private_method(cRbPodDatabase, "id", rbpod_database_id_get, 0);
231
- rb_define_private_method(cRbPodDatabase, "tracks", rbpod_database_tracks_get, 0);
232
261
  rb_define_private_method(cRbPodDatabase, "mountpoint=", rbpod_database_mountpoint_set, 1);
233
262
 
234
263
  rb_define_method(cRbPodDatabase, "mountpoint", rbpod_database_mountpoint_get, 0);
@@ -237,6 +266,8 @@ void Init_rbpod_database(void)
237
266
  rb_define_method(cRbPodDatabase, "filename", rbpod_database_filename_get, 0);
238
267
 
239
268
  rb_define_method(cRbPodDatabase, "device", rbpod_database_device_get, 0);
269
+
270
+ rb_define_method(cRbPodDatabase, "tracks", rbpod_database_tracks_get, 0);
240
271
  rb_define_method(cRbPodDatabase, "playlists", rbpod_database_playlists_get, 0);
241
272
 
242
273
  rb_define_method(cRbPodDatabase, "synchronized?", rbpod_database_synchronized_p, 0);
data/ext/rbpod/device.c CHANGED
@@ -1,6 +1,7 @@
1
1
  /* device.c */
2
2
 
3
3
  #include "rbpod.h"
4
+ #include "error.h"
4
5
  #include "device.h"
5
6
  #include "database.h"
6
7
 
@@ -197,7 +198,7 @@ static VALUE rbpod_device_initialize(VALUE self, VALUE database)
197
198
  Itdb_iTunesDB *_database = TYPED_DATA_PTR(database, Itdb_iTunesDB);
198
199
 
199
200
  /* Make sure we were given an instance of a RbPod::Database. */
200
- if (rb_class_of(database) != cRbPodDatabase) {
201
+ if (rb_obj_is_instance_of(database, cRbPodDatabase) == FALSE) {
201
202
  rb_raise(eRbPodError, "Given database must be an instance of RbPod::Database: %s", StringValueCStr(database));
202
203
  return Qnil;
203
204
  }
data/ext/rbpod/error.c ADDED
@@ -0,0 +1,27 @@
1
+ /* error.c */
2
+
3
+ #include "rbpod.h"
4
+ #include "error.h"
5
+
6
+ inline VALUE rbpod_raise_error(GError *error)
7
+ {
8
+ VALUE error_message;
9
+
10
+ if (error != NULL) {
11
+ error_message = rb_str_new2(error->message);
12
+ g_error_free(error);
13
+ rb_raise(eRbPodError, "%s", StringValueCStr(error_message));
14
+ }
15
+
16
+ return Qnil;
17
+ }
18
+
19
+ void Init_rbpod_error(void)
20
+ {
21
+ #if RDOC_CAN_PARSE_DOCUMENTATION
22
+ mRbPod = rb_define_module("RbPod");
23
+ #endif
24
+ /* This is a generic subclass of RuntimeError for RbPod-specific errors.*/
25
+ eRbPodError = rb_define_class_under(mRbPod, "Error", rb_eRuntimeError);
26
+ }
27
+
data/ext/rbpod/error.h ADDED
@@ -0,0 +1,12 @@
1
+ /* error.h */
2
+
3
+ #ifndef RBPOD_ERROR_H
4
+ #define RBPOD_ERROR_H
5
+
6
+ RUBY_EXTERN VALUE eRbPodError;
7
+
8
+ void Init_rbpod_error(void);
9
+
10
+ inline VALUE rbpod_raise_error(GError *error);
11
+
12
+ #endif /* RBPOD_ERROR_H */
data/ext/rbpod/playlist.c CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  /*
8
8
  * call-seq:
9
- * is_podcast_playlist?() -> Boolean
9
+ * podcast?() -> Boolean
10
10
  *
11
11
  * Returns true or false if this playlist is the podcast-only playlist.
12
12
  */
@@ -18,7 +18,7 @@ static VALUE rbpod_playlist_podcast_p(VALUE self)
18
18
 
19
19
  /*
20
20
  * call-seq:
21
- * is_master_playlist?() -> Boolean
21
+ * master?() -> Boolean
22
22
  *
23
23
  * Returns true or false if this playlist is the master playlist.
24
24
  */
@@ -30,7 +30,7 @@ static VALUE rbpod_playlist_master_p(VALUE self)
30
30
 
31
31
  /*
32
32
  * call-seq:
33
- * is_smart_playlist?() -> Boolean
33
+ * smart?() -> Boolean
34
34
  *
35
35
  * Returns true or false if this playlist is a smart playlist.
36
36
  */
@@ -74,8 +74,7 @@ static VALUE rbpod_playlist_shuffle_bang(VALUE self)
74
74
  */
75
75
  static VALUE rbpod_playlist_tracks_get(VALUE self)
76
76
  {
77
- Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
78
- return rbpod_track_collection_create(self, playlist->members);
77
+ return rb_class_new_instance(1, &self, cRbPodTrackCollection);
79
78
  }
80
79
 
81
80
  /*
@@ -137,21 +136,13 @@ static VALUE rbpod_playlist_id_get(VALUE self)
137
136
 
138
137
  /*
139
138
  * call-seq:
140
- * initialize(name, is_smart_playlist) -> RbPod::Playlist
139
+ * initialize() -> RbPod::Playlist
141
140
  *
142
141
  * Creates a detached playlist. (Not managed by the database.)
143
142
  */
144
- static VALUE rbpod_playlist_initialize(VALUE self, VALUE playlist_name, VALUE smart_playlist)
143
+ static VALUE rbpod_playlist_initialize(VALUE self)
145
144
  {
146
- Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
147
- gchar *_playlist_name = StringValueCStr(playlist_name);
148
-
149
- itdb_playlist_free(playlist);
150
-
151
- playlist = itdb_playlist_new(_playlist_name, (smart_playlist == Qtrue) ? TRUE : FALSE);
152
-
153
- DATA_PTR(self) = playlist;
154
-
145
+ /* Nothing to see here. */
155
146
  return self;
156
147
  }
157
148
 
@@ -160,7 +151,7 @@ static void rbpod_playlist_deallocate(void *handle)
160
151
  Itdb_Playlist *playlist = (Itdb_Playlist *) handle;
161
152
 
162
153
  /* This playlist was unmanaged, so free it manually. */
163
- if (playlist->itdb == NULL || playlist->id == 0) {
154
+ if (playlist->itdb == NULL) {
164
155
  itdb_playlist_free(playlist);
165
156
  }
166
157
 
@@ -169,7 +160,7 @@ static void rbpod_playlist_deallocate(void *handle)
169
160
 
170
161
  static VALUE rbpod_playlist_allocate(VALUE self)
171
162
  {
172
- Itdb_Playlist *playlist = itdb_playlist_new("KILROY WAS HERE", FALSE);
163
+ Itdb_Playlist *playlist = itdb_playlist_new("New Playlist", FALSE);
173
164
  return Data_Wrap_Struct(cRbPodPlaylist, NULL, rbpod_playlist_deallocate, (void *) playlist);
174
165
  }
175
166
 
@@ -182,7 +173,7 @@ void Init_rbpod_playlist(void)
182
173
 
183
174
  rb_define_alloc_func(cRbPodPlaylist, rbpod_playlist_allocate);
184
175
 
185
- rb_define_method(cRbPodPlaylist, "initialize", rbpod_playlist_initialize, 2);
176
+ rb_define_method(cRbPodPlaylist, "initialize", rbpod_playlist_initialize, 0);
186
177
 
187
178
  rb_define_private_method(cRbPodPlaylist, "id", rbpod_playlist_id_get, 0);
188
179
 
@@ -194,11 +185,12 @@ void Init_rbpod_playlist(void)
194
185
  rb_define_method(cRbPodPlaylist, "shuffle!", rbpod_playlist_shuffle_bang, 0);
195
186
  rb_define_method(cRbPodPlaylist, "timestamp", rbpod_playlist_timestamp_get, 0);
196
187
 
188
+ /* :nodoc */
197
189
  rb_define_alias(cRbPodPlaylist, "created_on", "timestamp");
198
190
 
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);
191
+ rb_define_method(cRbPodPlaylist, "smart?", rbpod_playlist_smart_p, 0);
192
+ rb_define_method(cRbPodPlaylist, "master?", rbpod_playlist_master_p, 0);
193
+ rb_define_method(cRbPodPlaylist, "podcast?", rbpod_playlist_podcast_p, 0);
202
194
 
203
195
  return;
204
196
  }