rbpod 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/README.md +75 -29
- data/Rakefile +12 -0
- data/ext/rbpod/collection.c +44 -17
- data/ext/rbpod/collection.h +1 -1
- data/ext/rbpod/database.c +112 -57
- data/ext/rbpod/database.h +1 -1
- data/ext/rbpod/device.c +55 -30
- data/ext/rbpod/device.h +1 -1
- data/ext/rbpod/extconf.rb +3 -0
- data/ext/rbpod/playlist.c +55 -34
- data/ext/rbpod/playlist.h +1 -4
- data/ext/rbpod/playlist_collection.c +77 -0
- data/ext/rbpod/playlist_collection.h +14 -0
- data/ext/rbpod/rbpod.c +31 -12
- data/ext/rbpod/rbpod.h +4 -2
- data/ext/rbpod/track.c +26 -25
- data/ext/rbpod/track.h +1 -4
- data/ext/rbpod/track_collection.c +33 -0
- data/ext/rbpod/track_collection.h +14 -0
- data/lib/rbpod/version.rb +1 -1
- data/rbpod.gemspec +1 -0
- data/spec/collection_spec.rb +39 -0
- data/spec/database_spec.rb +98 -0
- data/spec/device_spec.rb +83 -0
- data/spec/playlist_spec.rb +3 -0
- data/spec/rbpod_spec.rb +3 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/track_spec.rb +3 -0
- metadata +37 -4
data/ext/rbpod/device.c
CHANGED
@@ -3,67 +3,78 @@
|
|
3
3
|
#include "rbpod.h"
|
4
4
|
#include "device.h"
|
5
5
|
|
6
|
-
VALUE
|
7
|
-
|
8
|
-
inline VALUE rbpod_device_create(Itdb_Device *device) {
|
6
|
+
inline VALUE rbpod_device_create(Itdb_Device *device)
|
7
|
+
{
|
9
8
|
return Data_Wrap_Struct(cRbPodDevice, NULL, NULL, (void *) device);
|
10
9
|
}
|
11
10
|
|
12
|
-
static VALUE
|
11
|
+
static VALUE rbpod_device_chapter_image_support_p(VALUE self)
|
12
|
+
{
|
13
13
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
14
14
|
return BooleanValue(itdb_device_supports_chapter_image(device));
|
15
15
|
}
|
16
16
|
|
17
|
-
static VALUE
|
17
|
+
static VALUE rbpod_device_podcast_support_p(VALUE self)
|
18
|
+
{
|
18
19
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
19
20
|
return BooleanValue(itdb_device_supports_podcast(device));
|
20
21
|
}
|
21
22
|
|
22
|
-
static VALUE
|
23
|
+
static VALUE rbpod_device_artwork_support_p(VALUE self)
|
24
|
+
{
|
23
25
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
24
26
|
return BooleanValue(itdb_device_supports_artwork(device));
|
25
27
|
}
|
26
28
|
|
27
|
-
static VALUE
|
29
|
+
static VALUE rbpod_device_video_support_p(VALUE self)
|
30
|
+
{
|
28
31
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
29
32
|
return BooleanValue(itdb_device_supports_video(device));
|
30
33
|
}
|
31
34
|
|
32
|
-
static VALUE
|
35
|
+
static VALUE rbpod_device_photo_support_p(VALUE self)
|
36
|
+
{
|
33
37
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
34
38
|
return BooleanValue(itdb_device_supports_photo(device));
|
35
39
|
}
|
36
40
|
|
37
|
-
static VALUE rbpod_device_model_name_get(VALUE self)
|
41
|
+
static VALUE rbpod_device_model_name_get(VALUE self)
|
42
|
+
{
|
38
43
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
39
44
|
const Itdb_IpodInfo *info = itdb_device_get_ipod_info(device);
|
40
45
|
return rb_str_new2(itdb_info_get_ipod_model_name_string(info->ipod_model));
|
41
46
|
}
|
42
47
|
|
43
|
-
static VALUE rbpod_device_model_number_get(VALUE self)
|
48
|
+
static VALUE rbpod_device_model_number_get(VALUE self)
|
49
|
+
{
|
44
50
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
45
51
|
const Itdb_IpodInfo *info = itdb_device_get_ipod_info(device);
|
46
52
|
return rb_str_new2(info->model_number);
|
47
53
|
}
|
48
54
|
|
49
|
-
static VALUE rbpod_device_generation_get(VALUE self)
|
55
|
+
static VALUE rbpod_device_generation_get(VALUE self)
|
56
|
+
{
|
50
57
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
51
58
|
const Itdb_IpodInfo *info = itdb_device_get_ipod_info(device);
|
52
59
|
return rb_str_new2(itdb_info_get_ipod_generation_string(info->ipod_generation));
|
53
60
|
}
|
54
61
|
|
55
|
-
static VALUE rbpod_device_capacity_get(VALUE self)
|
62
|
+
static VALUE rbpod_device_capacity_get(VALUE self)
|
63
|
+
{
|
56
64
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
57
65
|
const Itdb_IpodInfo *info = itdb_device_get_ipod_info(device);
|
58
66
|
return DBL2NUM(info->capacity);
|
59
67
|
}
|
60
68
|
|
61
|
-
static VALUE rbpod_device_uuid_get(VALUE self)
|
69
|
+
static VALUE rbpod_device_uuid_get(VALUE self)
|
70
|
+
{
|
62
71
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
63
|
-
|
72
|
+
const gchar *uuid = itdb_device_get_uuid(device);
|
73
|
+
return (uuid == NULL) ? Qnil : rb_str_new2(uuid);
|
64
74
|
}
|
65
75
|
|
66
|
-
static VALUE rbpod_device_sysinfo_get(VALUE self, VALUE key)
|
76
|
+
static VALUE rbpod_device_sysinfo_get(VALUE self, VALUE key)
|
77
|
+
{
|
67
78
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
68
79
|
gchar *value = NULL;
|
69
80
|
VALUE result;
|
@@ -76,7 +87,8 @@ static VALUE rbpod_device_sysinfo_get(VALUE self, VALUE key) {
|
|
76
87
|
|
77
88
|
}
|
78
89
|
|
79
|
-
static VALUE rbpod_device_sysinfo_set(VALUE self, VALUE key, VALUE value)
|
90
|
+
static VALUE rbpod_device_sysinfo_set(VALUE self, VALUE key, VALUE value)
|
91
|
+
{
|
80
92
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
81
93
|
gchar *_value, *_key;
|
82
94
|
|
@@ -85,29 +97,42 @@ static VALUE rbpod_device_sysinfo_set(VALUE self, VALUE key, VALUE value) {
|
|
85
97
|
|
86
98
|
itdb_device_set_sysinfo(device, _key, _value);
|
87
99
|
|
88
|
-
return
|
100
|
+
return Qnil;
|
89
101
|
}
|
90
102
|
|
91
|
-
static VALUE
|
103
|
+
static VALUE rbpod_device_sysinfo_save(VALUE self)
|
104
|
+
{
|
92
105
|
Itdb_Device *device = TYPED_DATA_PTR(self, Itdb_Device);
|
93
|
-
|
94
|
-
|
106
|
+
GError *error = NULL;
|
107
|
+
|
108
|
+
if (itdb_device_write_sysinfo(device, &error) == FALSE) {
|
109
|
+
return rbpod_raise_error(error);
|
110
|
+
}
|
111
|
+
|
112
|
+
return Qnil;
|
95
113
|
}
|
96
114
|
|
97
|
-
static VALUE rbpod_device_initialize(VALUE self)
|
115
|
+
static VALUE rbpod_device_initialize(VALUE self)
|
116
|
+
{
|
98
117
|
/* Private method, no setup required yet. */
|
99
118
|
return self;
|
100
119
|
}
|
101
120
|
|
102
|
-
static void rbpod_device_deallocate(void *handle)
|
121
|
+
static void rbpod_device_deallocate(void *handle)
|
122
|
+
{
|
103
123
|
itdb_device_free((Itdb_Device *) handle);
|
104
124
|
}
|
105
125
|
|
106
|
-
static VALUE rbpod_device_allocate(VALUE self)
|
126
|
+
static VALUE rbpod_device_allocate(VALUE self)
|
127
|
+
{
|
107
128
|
return Data_Wrap_Struct(cRbPodDevice, NULL, rbpod_device_deallocate, (void *) itdb_device_new());
|
108
129
|
}
|
109
130
|
|
110
|
-
void Init_rbpod_device(void)
|
131
|
+
void Init_rbpod_device(void)
|
132
|
+
{
|
133
|
+
#if RDOC_CAN_PARSE_DOCUMENTATION
|
134
|
+
mRbPod = rb_define_module("RbPod");
|
135
|
+
#endif
|
111
136
|
cRbPodDevice = rb_define_class_under(mRbPod, "Device", rb_cObject);
|
112
137
|
|
113
138
|
rb_define_alloc_func(cRbPodDevice, rbpod_device_allocate);
|
@@ -117,7 +142,7 @@ void Init_rbpod_device(void) {
|
|
117
142
|
|
118
143
|
rb_define_method(cRbPodDevice, "[]", rbpod_device_sysinfo_get, 1);
|
119
144
|
rb_define_method(cRbPodDevice, "[]=", rbpod_device_sysinfo_set, 2);
|
120
|
-
rb_define_method(cRbPodDevice, "save!",
|
145
|
+
rb_define_method(cRbPodDevice, "save!", rbpod_device_sysinfo_save, 0);
|
121
146
|
|
122
147
|
rb_define_method(cRbPodDevice, "uuid", rbpod_device_uuid_get, 0);
|
123
148
|
rb_define_method(cRbPodDevice, "capacity", rbpod_device_capacity_get, 0);
|
@@ -125,11 +150,11 @@ void Init_rbpod_device(void) {
|
|
125
150
|
rb_define_method(cRbPodDevice, "model_name", rbpod_device_model_name_get, 0);
|
126
151
|
rb_define_method(cRbPodDevice, "model_number", rbpod_device_model_number_get, 0);
|
127
152
|
|
128
|
-
rb_define_method(cRbPodDevice, "supports_photos?",
|
129
|
-
rb_define_method(cRbPodDevice, "supports_videos?",
|
130
|
-
rb_define_method(cRbPodDevice, "supports_artwork?",
|
131
|
-
rb_define_method(cRbPodDevice, "supports_podcasts?",
|
132
|
-
rb_define_method(cRbPodDevice, "supports_chapter_images?",
|
153
|
+
rb_define_method(cRbPodDevice, "supports_photos?", rbpod_device_photo_support_p, 0);
|
154
|
+
rb_define_method(cRbPodDevice, "supports_videos?", rbpod_device_video_support_p, 0);
|
155
|
+
rb_define_method(cRbPodDevice, "supports_artwork?", rbpod_device_artwork_support_p, 0);
|
156
|
+
rb_define_method(cRbPodDevice, "supports_podcasts?", rbpod_device_podcast_support_p, 0);
|
157
|
+
rb_define_method(cRbPodDevice, "supports_chapter_images?", rbpod_device_chapter_image_support_p, 0);
|
133
158
|
|
134
159
|
return;
|
135
160
|
}
|
data/ext/rbpod/device.h
CHANGED
data/ext/rbpod/extconf.rb
CHANGED
data/ext/rbpod/playlist.c
CHANGED
@@ -1,86 +1,109 @@
|
|
1
1
|
/* playlist.c */
|
2
2
|
|
3
3
|
#include "rbpod.h"
|
4
|
-
#include "track.h"
|
5
4
|
#include "playlist.h"
|
6
|
-
#include "
|
5
|
+
#include "track_collection.h"
|
7
6
|
|
8
|
-
VALUE
|
9
|
-
|
10
|
-
|
11
|
-
inline VALUE rbpod_playlist_collection_create(VALUE parent, GList *items) {
|
12
|
-
VALUE collection = rbpod_collection_create(items, cRbPodPlaylist);
|
13
|
-
rb_extend_object(collection, mRbPodPlaylistCollection);
|
14
|
-
rb_iv_set(collection, "@parent", parent);
|
15
|
-
return collection;
|
16
|
-
}
|
17
|
-
|
18
|
-
static VALUE rbpod_playlist_is_podcast(VALUE self) {
|
7
|
+
static VALUE rbpod_playlist_podcast_p(VALUE self)
|
8
|
+
{
|
19
9
|
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
20
10
|
return BooleanValue(itdb_playlist_is_podcasts(playlist));
|
21
11
|
}
|
22
12
|
|
23
|
-
static VALUE
|
13
|
+
static VALUE rbpod_playlist_master_p(VALUE self)
|
14
|
+
{
|
24
15
|
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
25
16
|
return BooleanValue(itdb_playlist_is_mpl(playlist));
|
26
17
|
}
|
27
18
|
|
28
|
-
static VALUE
|
19
|
+
static VALUE rbpod_playlist_smart_p(VALUE self)
|
20
|
+
{
|
29
21
|
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
30
22
|
return BooleanValue(playlist->is_spl);
|
31
23
|
}
|
32
24
|
|
33
|
-
static VALUE rbpod_playlist_timestamp_get(VALUE self)
|
25
|
+
static VALUE rbpod_playlist_timestamp_get(VALUE self)
|
26
|
+
{
|
34
27
|
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
35
28
|
return rb_funcall(rb_cTime, rb_intern("at"), 1, INT2NUM(playlist->timestamp));
|
36
29
|
}
|
37
30
|
|
38
|
-
static VALUE rbpod_playlist_shuffle(VALUE self)
|
31
|
+
static VALUE rbpod_playlist_shuffle(VALUE self)
|
32
|
+
{
|
39
33
|
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
40
34
|
itdb_playlist_randomize(playlist);
|
41
35
|
return Qnil;
|
42
36
|
}
|
43
37
|
|
44
|
-
static VALUE rbpod_playlist_tracks_get(VALUE self)
|
38
|
+
static VALUE rbpod_playlist_tracks_get(VALUE self)
|
39
|
+
{
|
45
40
|
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
46
41
|
return rbpod_track_collection_create(self, playlist->members);
|
47
42
|
}
|
48
43
|
|
49
|
-
static VALUE rbpod_playlist_length_get(VALUE self)
|
44
|
+
static VALUE rbpod_playlist_length_get(VALUE self)
|
45
|
+
{
|
50
46
|
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
51
47
|
return INT2NUM(itdb_playlist_tracks_number(playlist));
|
52
48
|
}
|
53
49
|
|
54
|
-
static VALUE rbpod_playlist_name_get(VALUE self)
|
50
|
+
static VALUE rbpod_playlist_name_get(VALUE self)
|
51
|
+
{
|
55
52
|
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
56
53
|
return rb_str_new2(playlist->name);
|
57
54
|
}
|
58
55
|
|
59
|
-
static VALUE rbpod_playlist_id_get(VALUE self)
|
56
|
+
static VALUE rbpod_playlist_id_get(VALUE self)
|
57
|
+
{
|
60
58
|
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
61
59
|
return INT2NUM(playlist->id);
|
62
60
|
}
|
63
61
|
|
64
|
-
static VALUE rbpod_playlist_initialize(VALUE self)
|
65
|
-
|
62
|
+
static VALUE rbpod_playlist_initialize(VALUE self, VALUE playlist_name, VALUE smart_playlist)
|
63
|
+
{
|
64
|
+
Itdb_Playlist *playlist = TYPED_DATA_PTR(self, Itdb_Playlist);
|
65
|
+
gchar *_playlist_name = StringValueCStr(playlist_name);
|
66
|
+
|
67
|
+
/* Kill off the dummy playlist. */
|
68
|
+
itdb_playlist_free(playlist);
|
69
|
+
|
70
|
+
/* Create a new playlist based on the values provided. */
|
71
|
+
playlist = itdb_playlist_new(_playlist_name, (smart_playlist == Qtrue) ? TRUE : FALSE);
|
72
|
+
|
73
|
+
/* Store the new playlist. */
|
74
|
+
DATA_PTR(self) = playlist;
|
75
|
+
|
66
76
|
return self;
|
67
77
|
}
|
68
78
|
|
69
|
-
static void rbpod_playlist_deallocate(void *handle)
|
70
|
-
|
79
|
+
static void rbpod_playlist_deallocate(void *handle)
|
80
|
+
{
|
81
|
+
Itdb_Playlist *playlist = (Itdb_Playlist *) handle;
|
82
|
+
|
83
|
+
/* This playlist was unmanaged, so free it manually. */
|
84
|
+
if (playlist->itdb == NULL || playlist->id == 0) {
|
85
|
+
itdb_playlist_free(playlist);
|
86
|
+
}
|
87
|
+
|
88
|
+
return;
|
71
89
|
}
|
72
90
|
|
73
|
-
static VALUE rbpod_playlist_allocate(VALUE self)
|
74
|
-
|
91
|
+
static VALUE rbpod_playlist_allocate(VALUE self)
|
92
|
+
{
|
93
|
+
Itdb_Playlist *playlist = itdb_playlist_new("KILROY WAS HERE", FALSE);
|
75
94
|
return Data_Wrap_Struct(cRbPodPlaylist, NULL, rbpod_playlist_deallocate, (void *) playlist);
|
76
95
|
}
|
77
96
|
|
78
|
-
void Init_rbpod_playlist(void)
|
97
|
+
void Init_rbpod_playlist(void)
|
98
|
+
{
|
99
|
+
#if RDOC_CAN_PARSE_DOCUMENTATION
|
100
|
+
mRbPod = rb_define_module("RbPod");
|
101
|
+
#endif
|
79
102
|
cRbPodPlaylist = rb_define_class_under(mRbPod, "Playlist", rb_cObject);
|
80
103
|
|
81
104
|
rb_define_alloc_func(cRbPodPlaylist, rbpod_playlist_allocate);
|
82
105
|
|
83
|
-
rb_define_method(cRbPodPlaylist, "initialize", rbpod_playlist_initialize,
|
106
|
+
rb_define_method(cRbPodPlaylist, "initialize", rbpod_playlist_initialize, 2);
|
84
107
|
|
85
108
|
rb_define_method(cRbPodPlaylist, "id", rbpod_playlist_id_get, 0);
|
86
109
|
rb_define_method(cRbPodPlaylist, "name", rbpod_playlist_name_get, 0);
|
@@ -89,11 +112,9 @@ void Init_rbpod_playlist(void) {
|
|
89
112
|
rb_define_method(cRbPodPlaylist, "shuffle!", rbpod_playlist_shuffle, 0);
|
90
113
|
rb_define_method(cRbPodPlaylist, "created_on", rbpod_playlist_timestamp_get, 0);
|
91
114
|
|
92
|
-
rb_define_method(cRbPodPlaylist, "smart_playlist?",
|
93
|
-
rb_define_method(cRbPodPlaylist, "master_playlist?",
|
94
|
-
rb_define_method(cRbPodPlaylist, "podcast_playlist?",
|
95
|
-
|
96
|
-
mRbPodPlaylistCollection = rb_define_module_under(cRbPodPlaylist, "Collection");
|
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);
|
97
118
|
|
98
119
|
return;
|
99
120
|
}
|
data/ext/rbpod/playlist.h
CHANGED
@@ -3,11 +3,8 @@
|
|
3
3
|
#ifndef RBPOD_PLAYLIST_H
|
4
4
|
#define RBPOD_PLAYLIST_H
|
5
5
|
|
6
|
-
|
7
|
-
extern VALUE mRbPodPlaylistCollection;
|
6
|
+
RUBY_EXTERN VALUE cRbPodPlaylist;
|
8
7
|
|
9
8
|
void Init_rbpod_playlist(void);
|
10
9
|
|
11
|
-
inline VALUE rbpod_playlist_collection_create(VALUE parent, GList *items);
|
12
|
-
|
13
10
|
#endif /* RBPOD_PLAYLIST_H */
|
@@ -0,0 +1,77 @@
|
|
1
|
+
/* playlist_collection.c */
|
2
|
+
|
3
|
+
#include "rbpod.h"
|
4
|
+
#include "playlist.h"
|
5
|
+
#include "collection.h"
|
6
|
+
#include "playlist_collection.h"
|
7
|
+
|
8
|
+
static VALUE rbpod_playlist_collection_parent(VALUE self)
|
9
|
+
{
|
10
|
+
return rb_iv_get(self, "@parent");
|
11
|
+
}
|
12
|
+
|
13
|
+
static VALUE rbpod_playlist_collection_get(VALUE self, VALUE key)
|
14
|
+
{
|
15
|
+
VALUE parent = rbpod_playlist_collection_parent(self);
|
16
|
+
Itdb_iTunesDB *database = TYPED_DATA_PTR(parent, Itdb_iTunesDB);
|
17
|
+
Itdb_Playlist *playlist = NULL;
|
18
|
+
|
19
|
+
switch (TYPE(key)) {
|
20
|
+
case T_SYMBOL:
|
21
|
+
case T_STRING:
|
22
|
+
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;
|
27
|
+
}
|
28
|
+
|
29
|
+
if (playlist == NULL) {
|
30
|
+
return Qnil;
|
31
|
+
}
|
32
|
+
|
33
|
+
return Data_Wrap_Struct(cRbPodPlaylist, NULL, NULL, (void *) playlist);
|
34
|
+
}
|
35
|
+
|
36
|
+
static VALUE rbpod_playlist_collection_podcasts_get(VALUE self)
|
37
|
+
{
|
38
|
+
VALUE parent = rbpod_playlist_collection_parent(self);
|
39
|
+
Itdb_iTunesDB *database = TYPED_DATA_PTR(parent, Itdb_iTunesDB);
|
40
|
+
Itdb_Playlist *podcasts = itdb_playlist_podcasts(database);
|
41
|
+
return Data_Wrap_Struct(cRbPodPlaylist, NULL, NULL, (void *) podcasts);
|
42
|
+
}
|
43
|
+
|
44
|
+
static VALUE rbpod_playlist_collection_master_get(VALUE self)
|
45
|
+
{
|
46
|
+
VALUE parent = rbpod_playlist_collection_parent(self);
|
47
|
+
Itdb_iTunesDB *database = TYPED_DATA_PTR(parent, Itdb_iTunesDB);
|
48
|
+
Itdb_Playlist *master = itdb_playlist_mpl(database);
|
49
|
+
return Data_Wrap_Struct(cRbPodPlaylist, NULL, NULL, (void *) master);
|
50
|
+
}
|
51
|
+
|
52
|
+
inline VALUE rbpod_playlist_collection_create(VALUE parent, GList *items)
|
53
|
+
{
|
54
|
+
VALUE collection = rbpod_collection_create(items, cRbPodPlaylist);
|
55
|
+
rb_extend_object(collection, mRbPodPlaylistCollection);
|
56
|
+
rb_extend_object(collection, rb_mComparable);
|
57
|
+
rb_iv_set(collection, "@parent", parent);
|
58
|
+
return collection;
|
59
|
+
}
|
60
|
+
|
61
|
+
void Init_rbpod_playlist_collection(void)
|
62
|
+
{
|
63
|
+
#if RDOC_CAN_PARSE_DOCUMENTATION
|
64
|
+
mRbPod = rb_define_module("RbPod");
|
65
|
+
#endif
|
66
|
+
mRbPodPlaylistCollection = rb_define_module_under(mRbPod, "PlaylistCollection");
|
67
|
+
|
68
|
+
rb_define_private_method(mRbPodPlaylistCollection, "parent", rbpod_playlist_collection_parent, 0);
|
69
|
+
|
70
|
+
rb_define_method(mRbPodPlaylistCollection, "master", rbpod_playlist_collection_master_get, 0);
|
71
|
+
rb_define_method(mRbPodPlaylistCollection, "podcasts", rbpod_playlist_collection_podcasts_get, 0);
|
72
|
+
|
73
|
+
rb_define_method(mRbPodPlaylistCollection, "[]", rbpod_playlist_collection_get, 1);
|
74
|
+
|
75
|
+
return;
|
76
|
+
}
|
77
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/* playlist_collection.h */
|
2
|
+
|
3
|
+
#ifndef RBPOD_PLAYLIST_COLLECTION_H
|
4
|
+
#define RBPOD_PLAYLIST_COLLECTION_H
|
5
|
+
|
6
|
+
#include "playlist.h"
|
7
|
+
|
8
|
+
RUBY_EXTERN VALUE mRbPodPlaylistCollection;
|
9
|
+
|
10
|
+
void Init_rbpod_playlist_collection(void);
|
11
|
+
|
12
|
+
inline VALUE rbpod_playlist_collection_create(VALUE parent, GList *items);
|
13
|
+
|
14
|
+
#endif /* RBPOD_PLAYLIST_COLLECTION_H */
|
data/ext/rbpod/rbpod.c
CHANGED
@@ -6,31 +6,50 @@
|
|
6
6
|
#include "playlist.h"
|
7
7
|
#include "database.h"
|
8
8
|
#include "collection.h"
|
9
|
+
#include "track_collection.h"
|
10
|
+
#include "playlist_collection.h"
|
9
11
|
|
10
12
|
VALUE mRbPod;
|
11
13
|
VALUE eRbPodError;
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
+
VALUE cRbPodDatabase;
|
16
|
+
VALUE cRbPodDevice;
|
17
|
+
|
18
|
+
VALUE cRbPodCollection;
|
19
|
+
|
20
|
+
VALUE cRbPodPlaylist;
|
21
|
+
VALUE mRbPodPlaylistCollection;
|
22
|
+
|
23
|
+
VALUE cRbPodTrack;
|
24
|
+
VALUE mRbPodTrackCollection;
|
25
|
+
|
26
|
+
|
27
|
+
inline VALUE rbpod_raise_error(GError *error)
|
28
|
+
{
|
29
|
+
VALUE error_message;
|
30
|
+
|
31
|
+
if (error != NULL) {
|
32
|
+
error_message = rb_str_new2(error->message);
|
33
|
+
g_error_free(error);
|
34
|
+
rb_raise(eRbPodError, "%s", StringValueCStr(error_message));
|
35
|
+
}
|
36
|
+
|
37
|
+
return Qnil;
|
38
|
+
}
|
39
|
+
|
40
|
+
void Init_rbpod(void)
|
41
|
+
{
|
15
42
|
mRbPod = rb_define_module("RbPod");
|
16
43
|
|
17
|
-
/* Subclass RuntimeError for ourselves. */
|
18
44
|
eRbPodError = rb_define_class_under(mRbPod, "Error", rb_eRuntimeError);
|
19
45
|
|
20
|
-
/* Set up the RbPod::Database class. */
|
21
46
|
Init_rbpod_database();
|
22
|
-
|
23
|
-
/* Set up the RbPod::Device class. */
|
24
47
|
Init_rbpod_device();
|
25
|
-
|
26
|
-
/* Set up the RbPod::Collection class. */
|
27
48
|
Init_rbpod_collection();
|
28
|
-
|
29
|
-
/* Set up the RbPod::Playlist class. */
|
30
49
|
Init_rbpod_playlist();
|
31
|
-
|
32
|
-
/* Set up the RbPod::Track class. */
|
50
|
+
Init_rbpod_playlist_collection();
|
33
51
|
Init_rbpod_track();
|
52
|
+
Init_rbpod_track_collection();
|
34
53
|
|
35
54
|
return;
|
36
55
|
}
|
data/ext/rbpod/rbpod.h
CHANGED
@@ -10,7 +10,9 @@
|
|
10
10
|
|
11
11
|
#define TYPED_DATA_PTR(self, type) ((type *) DATA_PTR(self))
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
RUBY_EXTERN VALUE mRbPod;
|
14
|
+
RUBY_EXTERN VALUE eRbPodError;
|
15
|
+
|
16
|
+
inline VALUE rbpod_raise_error(GError *error);
|
15
17
|
|
16
18
|
#endif /* RBPOD_H */
|
data/ext/rbpod/track.c
CHANGED
@@ -2,68 +2,71 @@
|
|
2
2
|
|
3
3
|
#include "rbpod.h"
|
4
4
|
#include "track.h"
|
5
|
-
#include "collection.h"
|
6
5
|
|
7
|
-
VALUE
|
8
|
-
|
9
|
-
|
10
|
-
inline VALUE rbpod_track_collection_create(VALUE parent, GList *items) {
|
11
|
-
VALUE collection = rbpod_collection_create(items, cRbPodTrack);
|
12
|
-
rb_extend_object(collection, mRbPodTrackCollection);
|
13
|
-
rb_iv_set(collection, "@parent", parent);
|
14
|
-
return collection;
|
15
|
-
}
|
16
|
-
|
17
|
-
static VALUE rbpod_track_is_transferred(VALUE self) {
|
6
|
+
static VALUE rbpod_track_transferred_p(VALUE self)
|
7
|
+
{
|
18
8
|
Itdb_Track *track = TYPED_DATA_PTR(self, Itdb_Track);
|
19
9
|
return BooleanValue(track->transferred);
|
20
10
|
}
|
21
11
|
|
22
|
-
static VALUE rbpod_track_ipod_path_get(VALUE self)
|
12
|
+
static VALUE rbpod_track_ipod_path_get(VALUE self)
|
13
|
+
{
|
23
14
|
Itdb_Track *track = TYPED_DATA_PTR(self, Itdb_Track);
|
24
15
|
return rb_str_new2(track->ipod_path);
|
25
16
|
}
|
26
17
|
|
27
|
-
static VALUE rbpod_track_file_type_get(VALUE self)
|
18
|
+
static VALUE rbpod_track_file_type_get(VALUE self)
|
19
|
+
{
|
28
20
|
Itdb_Track *track = TYPED_DATA_PTR(self, Itdb_Track);
|
29
21
|
return rb_str_new2(track->filetype);
|
30
22
|
}
|
31
23
|
|
32
|
-
static VALUE rbpod_track_artist_get(VALUE self)
|
24
|
+
static VALUE rbpod_track_artist_get(VALUE self)
|
25
|
+
{
|
33
26
|
Itdb_Track *track = TYPED_DATA_PTR(self, Itdb_Track);
|
34
27
|
return rb_str_new2(track->artist);
|
35
28
|
}
|
36
29
|
|
37
|
-
static VALUE rbpod_track_album_get(VALUE self)
|
30
|
+
static VALUE rbpod_track_album_get(VALUE self)
|
31
|
+
{
|
38
32
|
Itdb_Track *track = TYPED_DATA_PTR(self, Itdb_Track);
|
39
33
|
return rb_str_new2(track->album);
|
40
34
|
}
|
41
35
|
|
42
|
-
static VALUE rbpod_track_title_get(VALUE self)
|
36
|
+
static VALUE rbpod_track_title_get(VALUE self)
|
37
|
+
{
|
43
38
|
Itdb_Track *track = TYPED_DATA_PTR(self, Itdb_Track);
|
44
39
|
return rb_str_new2(track->title);
|
45
40
|
}
|
46
41
|
|
47
|
-
static VALUE rbpod_track_id_get(VALUE self)
|
42
|
+
static VALUE rbpod_track_id_get(VALUE self)
|
43
|
+
{
|
48
44
|
Itdb_Track *track = TYPED_DATA_PTR(self, Itdb_Track);
|
49
45
|
return rb_str_new2(track->filetype);
|
50
46
|
}
|
51
47
|
|
52
|
-
static VALUE rbpod_track_initialize(VALUE self)
|
48
|
+
static VALUE rbpod_track_initialize(VALUE self)
|
49
|
+
{
|
53
50
|
return self;
|
54
51
|
}
|
55
52
|
|
56
|
-
static void rbpod_track_deallocate(void *handle)
|
53
|
+
static void rbpod_track_deallocate(void *handle)
|
54
|
+
{
|
57
55
|
itdb_track_free((Itdb_Track *) handle);
|
58
56
|
return;
|
59
57
|
}
|
60
58
|
|
61
|
-
static VALUE rbpod_track_allocate(VALUE self)
|
59
|
+
static VALUE rbpod_track_allocate(VALUE self)
|
60
|
+
{
|
62
61
|
Itdb_Track *track = itdb_track_new();
|
63
62
|
return Data_Wrap_Struct(cRbPodTrack, NULL, rbpod_track_deallocate, (void *) track);
|
64
63
|
}
|
65
64
|
|
66
|
-
void Init_rbpod_track(void)
|
65
|
+
void Init_rbpod_track(void)
|
66
|
+
{
|
67
|
+
#if RDOC_CAN_PARSE_DOCUMENTATION
|
68
|
+
mRbPod = rb_define_module("RbPod");
|
69
|
+
#endif
|
67
70
|
cRbPodTrack = rb_define_class_under(mRbPod, "Track", rb_cObject);
|
68
71
|
|
69
72
|
rb_define_alloc_func(cRbPodTrack, rbpod_track_allocate);
|
@@ -77,9 +80,7 @@ void Init_rbpod_track(void) {
|
|
77
80
|
rb_define_method(cRbPodTrack, "file_type", rbpod_track_file_type_get, 0);
|
78
81
|
rb_define_method(cRbPodTrack, "ipod_path", rbpod_track_ipod_path_get, 0);
|
79
82
|
|
80
|
-
rb_define_method(cRbPodTrack, "transferred?",
|
81
|
-
|
82
|
-
mRbPodTrackCollection = rb_define_module_under(cRbPodTrack, "Collection");
|
83
|
+
rb_define_method(cRbPodTrack, "transferred?", rbpod_track_transferred_p, 0);
|
83
84
|
|
84
85
|
return;
|
85
86
|
}
|
data/ext/rbpod/track.h
CHANGED
@@ -3,11 +3,8 @@
|
|
3
3
|
#ifndef RBPOD_TRACK_H
|
4
4
|
#define RBPOD_TRACK_H
|
5
5
|
|
6
|
-
|
7
|
-
extern VALUE mRbPodTrackCollection;
|
6
|
+
RUBY_EXTERN VALUE cRbPodTrack;
|
8
7
|
|
9
8
|
void Init_rbpod_track(void);
|
10
9
|
|
11
|
-
inline VALUE rbpod_track_collection_create(VALUE parent, GList *items);
|
12
|
-
|
13
10
|
#endif /* RBPOD_TRACK_H */
|
@@ -0,0 +1,33 @@
|
|
1
|
+
/* track_collection.c */
|
2
|
+
|
3
|
+
#include "rbpod.h"
|
4
|
+
#include "track.h"
|
5
|
+
#include "collection.h"
|
6
|
+
#include "track_collection.h"
|
7
|
+
|
8
|
+
static VALUE rbpod_track_collection_parent(VALUE self)
|
9
|
+
{
|
10
|
+
return rb_iv_get(self, "@parent");
|
11
|
+
}
|
12
|
+
|
13
|
+
inline VALUE rbpod_track_collection_create(VALUE parent, GList *items)
|
14
|
+
{
|
15
|
+
VALUE collection = rbpod_collection_create(items, cRbPodTrack);
|
16
|
+
rb_extend_object(collection, mRbPodTrackCollection);
|
17
|
+
rb_extend_object(collection, rb_mComparable);
|
18
|
+
rb_iv_set(collection, "@parent", parent);
|
19
|
+
return collection;
|
20
|
+
}
|
21
|
+
|
22
|
+
void Init_rbpod_track_collection(void)
|
23
|
+
{
|
24
|
+
#if RDOC_CAN_PARSE_DOCUMENTATION
|
25
|
+
mRbPod = rb_define_module("RbPod");
|
26
|
+
#endif
|
27
|
+
mRbPodTrackCollection = rb_define_module_under(mRbPod, "TrackCollection");
|
28
|
+
|
29
|
+
rb_define_private_method(mRbPodTrackCollection, "parent", rbpod_track_collection_parent, 0);
|
30
|
+
|
31
|
+
return;
|
32
|
+
}
|
33
|
+
|