rbpod 0.0.7 → 0.0.8
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/extconf.rb +8 -0
- data/ext/rbpod/rbpod.h +8 -0
- data/ext/rbpod/track.c +65 -0
- data/lib/rbpod/version.rb +1 -1
- metadata +4 -4
data/ext/rbpod/extconf.rb
CHANGED
|
@@ -3,13 +3,21 @@ require 'mkmf'
|
|
|
3
3
|
# Fail immediately if we don't have libgpod-1.0 installed here.
|
|
4
4
|
abort "Please install libgpod-1.0" unless pkg_config('libgpod-1.0')
|
|
5
5
|
|
|
6
|
+
puts "Taglib is not installed; ID3 tag parsing disabled." unless pkg_config('taglib_c')
|
|
7
|
+
|
|
6
8
|
# Unfortunately, rdoc isn't capable of a lot of things.
|
|
7
9
|
$defs.push("-DRDOC_CAN_PARSE_DOCUMENTATION=0")
|
|
8
10
|
|
|
9
11
|
# Provide HAVE_STDDEF_H to the pre-processor.
|
|
10
12
|
have_header('stddef.h')
|
|
11
13
|
|
|
14
|
+
# Provide HAVE_SYS_STAT_H to the pre-processor.
|
|
15
|
+
have_header('sys/stat.h')
|
|
16
|
+
|
|
12
17
|
# Provide HAVE_GPOD_ITDB_H to the pre-processor.
|
|
13
18
|
have_header('gpod/itdb.h')
|
|
14
19
|
|
|
20
|
+
# Provide HAVE_TAGLIB_TAG_C_H to the pre-processor.
|
|
21
|
+
have_header('taglib/tag_c.h')
|
|
22
|
+
|
|
15
23
|
create_makefile('rbpod/rbpod')
|
data/ext/rbpod/rbpod.h
CHANGED
|
@@ -9,10 +9,18 @@
|
|
|
9
9
|
#include <stddef.h>
|
|
10
10
|
#endif
|
|
11
11
|
|
|
12
|
+
#ifdef HAVE_SYS_STAT_H
|
|
13
|
+
#include <sys/stat.h>
|
|
14
|
+
#endif
|
|
15
|
+
|
|
12
16
|
#ifdef HAVE_GPOD_ITDB_H
|
|
13
17
|
#include <gpod/itdb.h>
|
|
14
18
|
#endif
|
|
15
19
|
|
|
20
|
+
#ifdef HAVE_TAGLIB_TAG_C_H
|
|
21
|
+
#include <taglib/tag_c.h>
|
|
22
|
+
#endif
|
|
23
|
+
|
|
16
24
|
/* Pre-processor macros. */
|
|
17
25
|
#include "macros.h"
|
|
18
26
|
|
data/ext/rbpod/track.c
CHANGED
|
@@ -200,6 +200,69 @@ static VALUE rbpod_track_mark_unplayed_set(VALUE self, VALUE value)
|
|
|
200
200
|
return Qnil;
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
+
/*
|
|
204
|
+
* :nodoc:
|
|
205
|
+
*/
|
|
206
|
+
static inline gchar *ensure_string(const gchar *buffer)
|
|
207
|
+
{
|
|
208
|
+
return (buffer == NULL || buffer[0] == '\0') ? NULL : g_strdup(buffer);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/*
|
|
212
|
+
* call-seq:
|
|
213
|
+
* parse!(source) -> RbPod::Track
|
|
214
|
+
*
|
|
215
|
+
* Parses a given file +source+, attempts to extract ID3 tags, and returns an RbPod::Track.
|
|
216
|
+
*/
|
|
217
|
+
static VALUE rbpod_track_parse(VALUE klass, VALUE source)
|
|
218
|
+
{
|
|
219
|
+
VALUE self = rb_class_new_instance(1, &source, klass);
|
|
220
|
+
#ifdef HAVE_TAGLIB_TAG_C_H
|
|
221
|
+
Itdb_Track *track = TYPED_DATA_PTR(self, Itdb_Track);
|
|
222
|
+
const TagLib_AudioProperties *properties = NULL;
|
|
223
|
+
TagLib_File *media = NULL;
|
|
224
|
+
TagLib_Tag *tag = NULL;
|
|
225
|
+
struct stat buffer;
|
|
226
|
+
|
|
227
|
+
taglib_set_strings_unicode(FALSE);
|
|
228
|
+
|
|
229
|
+
media = taglib_file_new(track->userdata);
|
|
230
|
+
|
|
231
|
+
if (media == NULL || taglib_file_is_valid(media) == FALSE) {
|
|
232
|
+
rb_raise(eRbPodError, "Track is invalid or does not have an ID3 tag.");
|
|
233
|
+
return Qnil;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (stat(track->userdata, &buffer) == -1) {
|
|
237
|
+
rb_raise(eRbPodError, "Unable to stat() track; it probably doesn't exist.");
|
|
238
|
+
return Qnil;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
track->size = buffer.st_size;
|
|
242
|
+
|
|
243
|
+
tag = taglib_file_tag(media);
|
|
244
|
+
properties = taglib_file_audioproperties(media);
|
|
245
|
+
|
|
246
|
+
track->title = ensure_string(taglib_tag_title(tag));
|
|
247
|
+
track->artist = ensure_string(taglib_tag_artist(tag));
|
|
248
|
+
track->album = ensure_string(taglib_tag_album(tag));
|
|
249
|
+
track->genre = ensure_string(taglib_tag_genre(tag));
|
|
250
|
+
track->comment = ensure_string(taglib_tag_comment(tag));
|
|
251
|
+
|
|
252
|
+
track->year = taglib_tag_year(tag);
|
|
253
|
+
track->track_nr = taglib_tag_track(tag);
|
|
254
|
+
|
|
255
|
+
track->bitrate = taglib_audioproperties_bitrate(properties);
|
|
256
|
+
track->samplerate = taglib_audioproperties_samplerate(properties);
|
|
257
|
+
track->tracklen = taglib_audioproperties_length(properties) * 1000;
|
|
258
|
+
|
|
259
|
+
taglib_tag_free_strings();
|
|
260
|
+
taglib_file_free(media);
|
|
261
|
+
#endif
|
|
262
|
+
return self;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
|
|
203
266
|
/*
|
|
204
267
|
* call-seq:
|
|
205
268
|
* initialize(source = nil) -> RbPod::Track
|
|
@@ -258,6 +321,8 @@ void Init_rbpod_track(void)
|
|
|
258
321
|
|
|
259
322
|
rb_define_alloc_func(cRbPodTrack, rbpod_track_allocate);
|
|
260
323
|
|
|
324
|
+
rb_define_singleton_method(cRbPodTrack, "parse!", rbpod_track_parse, 1);
|
|
325
|
+
|
|
261
326
|
rb_define_method(cRbPodTrack, "initialize", rbpod_track_initialize, -1);
|
|
262
327
|
|
|
263
328
|
sMEDIA_TYPE_AUDIO_VIDEO = rb_intern("MEDIA_TYPE_AUDIO_VIDEO");
|
data/lib/rbpod/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rbpod
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.8
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2014-
|
|
12
|
+
date: 2014-07-03 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bundler
|
|
@@ -164,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
164
164
|
version: '0'
|
|
165
165
|
segments:
|
|
166
166
|
- 0
|
|
167
|
-
hash:
|
|
167
|
+
hash: -513999085
|
|
168
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
169
|
none: false
|
|
170
170
|
requirements:
|
|
@@ -173,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
173
173
|
version: '0'
|
|
174
174
|
segments:
|
|
175
175
|
- 0
|
|
176
|
-
hash:
|
|
176
|
+
hash: -513999085
|
|
177
177
|
requirements:
|
|
178
178
|
- libgpod-1.0
|
|
179
179
|
rubyforge_project:
|