mb-discid 0.1.1-mswin32 → 0.1.2-mswin32
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/CHANGES +20 -0
- data/README +16 -12
- data/Rakefile +29 -4
- data/examples/discid.rb +16 -1
- data/ext/MB_DiscID.so +0 -0
- data/ext/mb_discid.c +97 -43
- data/lib/mb-discid.rb +81 -5
- data/test/test_discid.rb +108 -0
- metadata +9 -5
data/CHANGES
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
= Changelog
|
2
|
+
|
3
|
+
== 0.1.2 (2007-07-04)
|
4
|
+
* Support the method +put+ to set the TOC information directly instead of
|
5
|
+
reading it from a device.
|
6
|
+
* Fixed possible core dump if +read+ was called twice and failed the
|
7
|
+
second time.
|
8
|
+
* New to_s method (returns string representation of the ID itself).
|
9
|
+
* Complete RDoc documentation.
|
10
|
+
|
11
|
+
== 0.1.1 (2007-06-03)
|
12
|
+
* Minor changes to source to support MS compiler
|
13
|
+
* Provide Win32 binary gem
|
14
|
+
* Changed require of library to "require 'mb-discid'" (was "require 'DiscID'"
|
15
|
+
before, which was likely to cause problems)
|
16
|
+
|
17
|
+
== 0.1.0 (2007-06-02)
|
18
|
+
* Initial release
|
19
|
+
|
20
|
+
$Id: CHANGES 93 2007-07-04 19:22:17Z phw $
|
data/README
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
= MB-DiscID - Ruby bindings for MusicBrainz libdiscid
|
2
2
|
|
3
3
|
== About
|
4
|
-
MB-DiscID provides Ruby bindings for the MusicBrainz DiscID library
|
4
|
+
MB-DiscID provides Ruby bindings for the MusicBrainz DiscID library libdiscid.
|
5
5
|
It allows you to calculate MusicBrainz DiscIDs from audio CDs which you can use
|
6
6
|
to find the release entry for your CD in the MusicBrainz database.
|
7
7
|
|
@@ -12,25 +12,29 @@ http://musicbrainz.org/doc/libdiscid for more information on how to do this.
|
|
12
12
|
=== Installation with RubyGems
|
13
13
|
gem install mb-discid
|
14
14
|
|
15
|
-
|
16
|
-
For Windows a binary gem
|
17
|
-
it follow the instructions below:
|
15
|
+
=== Installation on Windows operating systems.
|
16
|
+
For Windows a binary gem <tt>mb-discid-x.x.x-mswin32.gem</tt> is available. To
|
17
|
+
install it follow the instructions below:
|
18
18
|
|
19
19
|
1. Make sure you have at least Ruby 1.8.6 installed.
|
20
20
|
2. Install RubyGems, if you don't already have it.
|
21
|
-
3. Download
|
21
|
+
3. Download <tt>libdiscid-0.1.1-win32bin.zip</tt> from
|
22
22
|
http://musicbrainz.org/doc/libdiscid.
|
23
|
-
4. Copy the file
|
24
|
-
bin directory (normally
|
25
|
-
5. Run
|
26
|
-
6. To test the installation try to run
|
23
|
+
4. Copy the file <tt>discid.dll</tt> from <tt>libdiscid-0.1.1-win32bin.zip</tt>
|
24
|
+
to your Ruby bin directory (normally <tt>C:\ruby\bin</tt>).
|
25
|
+
5. Run <tt>gem install mb-discid</tt> to install MB-DiscID.
|
26
|
+
6. To test the installation try to run <tt>examples/discid.rb</tt>.
|
27
27
|
|
28
28
|
=== Installing from source
|
29
29
|
rake install
|
30
30
|
|
31
31
|
== Usage
|
32
|
-
See the
|
32
|
+
See the documentation of MusicBrainz::DiscID or the example files in the
|
33
|
+
+examples+ directory for usage information.
|
33
34
|
|
34
35
|
== License
|
35
|
-
Copyright (c) 2007
|
36
|
-
|
36
|
+
MB-DiscID is Copyright (c) 2007 Philipp Wolfer.
|
37
|
+
It is free softare distributed under a BSD style license. See
|
38
|
+
LICENSE[link:files/LICENSE.html] for details.
|
39
|
+
|
40
|
+
$Id: README 89 2007-06-26 15:09:34Z phw $
|
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: Rakefile
|
1
|
+
# $Id: Rakefile 86 2007-06-05 10:27:42Z phw $
|
2
2
|
# Copyright (c) 2007, Philipp Wolfer
|
3
3
|
# All rights reserved.
|
4
4
|
# See LICENSE for permissions.
|
@@ -7,6 +7,8 @@
|
|
7
7
|
|
8
8
|
require 'rubygems'
|
9
9
|
require 'rake/gempackagetask'
|
10
|
+
require 'rake/testtask'
|
11
|
+
require 'rake/rdoctask'
|
10
12
|
|
11
13
|
task :default do
|
12
14
|
puts "Please see 'rake --tasks' for an overview of the available tasks."
|
@@ -15,7 +17,7 @@ end
|
|
15
17
|
# Packaging tasks: -------------------------------------------------------
|
16
18
|
|
17
19
|
PKG_NAME = 'mb-discid'
|
18
|
-
PKG_VERSION = '0.1.
|
20
|
+
PKG_VERSION = '0.1.2'
|
19
21
|
PKG_SUMMARY = 'Ruby bindings for libdiscid.'
|
20
22
|
PKG_AUTHOR = 'Philipp Wolfer'
|
21
23
|
PKG_EMAIL = 'phw@rubyforge.org'
|
@@ -25,11 +27,13 @@ PKG_DESCRIPTION = <<EOF
|
|
25
27
|
for more information on libdiscid and MusicBrainz.
|
26
28
|
EOF
|
27
29
|
PKG_FILES = FileList[
|
28
|
-
'Rakefile', 'LICENSE', 'README',
|
30
|
+
'Rakefile', 'LICENSE', 'README', 'CHANGES',
|
29
31
|
'examples/**/*',
|
30
32
|
'ext/**/*.{c,rb}',
|
31
|
-
'lib/**/*.rb'
|
33
|
+
'lib/**/*.rb',
|
34
|
+
'test/**/*.rb'
|
32
35
|
]
|
36
|
+
PKG_EXTRA_RDOC_FILES = ['README', 'LICENSE', 'CHANGES']
|
33
37
|
|
34
38
|
spec = Gem::Specification.new do |spec|
|
35
39
|
spec.name = PKG_NAME
|
@@ -53,6 +57,8 @@ spec = Gem::Specification.new do |spec|
|
|
53
57
|
spec.email = PKG_EMAIL
|
54
58
|
spec.homepage = PKG_HOMEPAGE
|
55
59
|
spec.rubyforge_project = 'rbrainz'
|
60
|
+
spec.has_rdoc = true
|
61
|
+
spec.extra_rdoc_files = PKG_EXTRA_RDOC_FILES
|
56
62
|
end
|
57
63
|
|
58
64
|
Rake::GemPackageTask.new(spec) do |pkg|
|
@@ -109,3 +115,22 @@ task :rebuild => [:clobber_build, :build]
|
|
109
115
|
desc 'Remove all files created during the build process'
|
110
116
|
task :clobber => [:clobber_build, :clobber_package]
|
111
117
|
|
118
|
+
# Test tasks: ------------------------------------------------------------
|
119
|
+
|
120
|
+
desc "Run just the unit tests"
|
121
|
+
Rake::TestTask.new(:test => [:rebuild]) do |test|
|
122
|
+
test.test_files = FileList['test/test*.rb']
|
123
|
+
test.libs = ['lib', 'ext']
|
124
|
+
test.warning = true
|
125
|
+
end
|
126
|
+
|
127
|
+
# Documentation tasks: ---------------------------------------------------
|
128
|
+
|
129
|
+
Rake::RDocTask.new do |rdoc|
|
130
|
+
rdoc.title = "MB-DiscID %s" % PKG_VERSION
|
131
|
+
rdoc.main = 'README'
|
132
|
+
rdoc.rdoc_dir = 'doc/api'
|
133
|
+
rdoc.rdoc_files.include('lib/**/*.rb', 'ext/**/*.c', PKG_EXTRA_RDOC_FILES)
|
134
|
+
rdoc.options << '--inline-source' << '--line-numbers' #<< '--diagram'
|
135
|
+
end
|
136
|
+
|
data/examples/discid.rb
CHANGED
@@ -1,16 +1,29 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Example script for MB-DiscID.
|
4
|
+
#
|
5
|
+
# This script will read the disc ID from the default device and print
|
6
|
+
# the results. You can specify an alternate device to use by giving the
|
7
|
+
# device's name as the first command line argument.
|
8
|
+
#
|
9
|
+
# Example:
|
10
|
+
# ./discid.rb /dev/dvd
|
11
|
+
#
|
12
|
+
# $Id: discid.rb 84 2007-06-05 00:41:14Z phw $
|
2
13
|
|
3
14
|
require 'mb-discid'
|
4
15
|
|
5
16
|
# Read the device name from the command line or use the default.
|
6
17
|
device = $*[0] ? $*[0] : MusicBrainz::DiscID.default_device
|
7
18
|
|
19
|
+
puts "Reading TOC from device '#{device}'."
|
20
|
+
|
8
21
|
disc = MusicBrainz::DiscID.new
|
9
22
|
disc.read(device)
|
10
23
|
|
11
24
|
print <<EOF
|
25
|
+
|
12
26
|
DiscID : #{disc.id}
|
13
|
-
Submit via : #{disc.submission_url}
|
14
27
|
FreeDB ID : #{disc.freedb_id}
|
15
28
|
First track: #{disc.first_track_num}
|
16
29
|
Last track : #{disc.last_track_num}
|
@@ -22,3 +35,5 @@ disc.tracks do |offset, length|
|
|
22
35
|
puts "Track #{track}: Offset #{offset}, Length #{length}"
|
23
36
|
track += 1
|
24
37
|
end
|
38
|
+
|
39
|
+
puts "\nSubmit via #{disc.submission_url}"
|
data/ext/MB_DiscID.so
CHANGED
Binary file
|
data/ext/mb_discid.c
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
|
2
|
-
$Id: mb_discid.c
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
/**
|
2
|
+
* $Id: mb_discid.c 95 2007-07-04 20:47:24Z phw $
|
3
|
+
*
|
4
|
+
* Ruby bindings for libdiscid. See http://musicbrainz.org/doc/libdiscid
|
5
|
+
* for more information on libdiscid and MusicBrainz.
|
6
|
+
*
|
7
|
+
* Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
|
8
|
+
* Copyright:: Copyright (c) 2007, Philipp Wolfer
|
9
|
+
* License:: MB-DiscID is free software distributed under a BSD style license.
|
10
|
+
* See LICENSE for permissions.
|
11
|
+
*/
|
10
12
|
|
11
13
|
#include "ruby.h"
|
12
14
|
#include "discid/discid.h"
|
@@ -24,7 +26,7 @@ static VALUE cDiscID;
|
|
24
26
|
/**
|
25
27
|
* Returns the DiscID as a string.
|
26
28
|
*
|
27
|
-
* Returns nil if no ID was yet read.
|
29
|
+
* Returns +nil+ if no ID was yet read.
|
28
30
|
*/
|
29
31
|
static VALUE mb_discid_id(VALUE self)
|
30
32
|
{
|
@@ -42,7 +44,7 @@ static VALUE mb_discid_id(VALUE self)
|
|
42
44
|
/**
|
43
45
|
* Returns a submission URL for the DiscID as a string.
|
44
46
|
*
|
45
|
-
* Returns nil if no ID was yet read.
|
47
|
+
* Returns +nil+ if no ID was yet read.
|
46
48
|
*/
|
47
49
|
static VALUE mb_discid_submission_url(VALUE self)
|
48
50
|
{
|
@@ -60,7 +62,7 @@ static VALUE mb_discid_submission_url(VALUE self)
|
|
60
62
|
/**
|
61
63
|
* Return a FreeDB DiscID as a string.
|
62
64
|
*
|
63
|
-
* Returns nil if no ID was yet read.
|
65
|
+
* Returns +nil+ if no ID was yet read.
|
64
66
|
*/
|
65
67
|
static VALUE mb_discid_freedb_id(VALUE self)
|
66
68
|
{
|
@@ -76,9 +78,9 @@ static VALUE mb_discid_freedb_id(VALUE self)
|
|
76
78
|
}
|
77
79
|
|
78
80
|
/**
|
79
|
-
* Return the number of the first track on this disc.
|
81
|
+
* Return the number of the first track on this disc (usually 1).
|
80
82
|
*
|
81
|
-
* Returns nil if no ID was yet read.
|
83
|
+
* Returns +nil+ if no ID was yet read.
|
82
84
|
*/
|
83
85
|
static VALUE mb_discid_first_track_num(VALUE self)
|
84
86
|
{
|
@@ -96,7 +98,7 @@ static VALUE mb_discid_first_track_num(VALUE self)
|
|
96
98
|
/**
|
97
99
|
* Return the number of the last track on this disc.
|
98
100
|
*
|
99
|
-
* Returns nil if no ID was yet read.
|
101
|
+
* Returns +nil+ if no ID was yet read.
|
100
102
|
*/
|
101
103
|
static VALUE mb_discid_last_track_num(VALUE self)
|
102
104
|
{
|
@@ -114,7 +116,7 @@ static VALUE mb_discid_last_track_num(VALUE self)
|
|
114
116
|
/**
|
115
117
|
* Return the length of the disc in sectors.
|
116
118
|
*
|
117
|
-
* Returns nil if no ID was yet read.
|
119
|
+
* Returns +nil+ if no ID was yet read.
|
118
120
|
*/
|
119
121
|
static VALUE mb_discid_sectors(VALUE self)
|
120
122
|
{
|
@@ -130,12 +132,13 @@ static VALUE mb_discid_sectors(VALUE self)
|
|
130
132
|
}
|
131
133
|
|
132
134
|
/**
|
133
|
-
* Returns an array of [offset, length] tuples for each track.
|
135
|
+
* Returns an array of <tt>[offset, length]</tt> tuples for each track.
|
134
136
|
*
|
135
|
-
*
|
136
|
-
* block
|
137
|
+
* Offset and length are both integer values representing sectors.
|
138
|
+
* If a block is given this method returns +nil+ and instead iterates over the
|
139
|
+
* block calling the block with two arguments <tt>|offset, length|</tt>.
|
137
140
|
*
|
138
|
-
* Returns always nil if no ID was yet read. The block won't be called in
|
141
|
+
* Returns always +nil+ if no ID was yet read. The block won't be called in
|
139
142
|
* this case.
|
140
143
|
*/
|
141
144
|
static VALUE mb_discid_tracks(VALUE self)
|
@@ -144,14 +147,14 @@ static VALUE mb_discid_tracks(VALUE self)
|
|
144
147
|
return Qnil;
|
145
148
|
else
|
146
149
|
{
|
147
|
-
DiscId *disc;
|
148
|
-
|
150
|
+
DiscId *disc; /* Pointer to the disc struct */
|
151
|
+
VALUE result = rb_ary_new(); /* Array of all [offset, length] tuples */
|
152
|
+
VALUE tuple; /* Array to store one [offset, length] tuple. */
|
153
|
+
int track; /* Counter for the track number to process. */
|
149
154
|
|
150
|
-
|
155
|
+
Data_Get_Struct(self, DiscId, disc);
|
151
156
|
|
152
|
-
|
153
|
-
VALUE tuple; // Array to store one [offset, length] tuple.
|
154
|
-
int track = discid_get_first_track_num(disc); // Track number
|
157
|
+
track = discid_get_first_track_num(disc); /* First track number */
|
155
158
|
while (track <= discid_get_last_track_num(disc))
|
156
159
|
{
|
157
160
|
tuple = rb_ary_new3(2,
|
@@ -170,8 +173,6 @@ static VALUE mb_discid_tracks(VALUE self)
|
|
170
173
|
return Qnil;
|
171
174
|
else
|
172
175
|
return result;
|
173
|
-
|
174
|
-
} // Stupid MS compiler.
|
175
176
|
}
|
176
177
|
}
|
177
178
|
|
@@ -179,39 +180,90 @@ static VALUE mb_discid_tracks(VALUE self)
|
|
179
180
|
* Read the disc ID from the given device.
|
180
181
|
*
|
181
182
|
* If no device is given the default device of the platform will be used.
|
183
|
+
* Throws an <tt>Exception</tt> if the CD's TOC can not be read.
|
182
184
|
*/
|
183
185
|
static VALUE mb_discid_read(int argc, VALUE *argv, VALUE self)
|
184
186
|
{
|
185
|
-
DiscId *disc;
|
186
|
-
|
187
|
-
|
188
|
-
{ // Stupid MS compiler.
|
187
|
+
DiscId *disc; /* Pointer to the disc struct */
|
188
|
+
VALUE device = Qnil; /* The device string as a Ruby string */
|
189
|
+
char* cdevice; /* The device string as a C string */
|
189
190
|
|
190
|
-
|
191
|
-
char* cdevice; // The device string as a C string.
|
191
|
+
Data_Get_Struct(self, DiscId, disc);
|
192
192
|
|
193
|
-
|
193
|
+
/* Check the number of arguments */
|
194
194
|
if (argc > 1)
|
195
195
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
|
196
|
-
|
197
|
-
else if (argc
|
198
|
-
|
196
|
+
/* Convert the given device to a T_STRING */
|
197
|
+
else if (argc == 1)
|
198
|
+
{
|
199
|
+
if(rb_respond_to(argv[0], rb_intern("to_s")))
|
200
|
+
device = rb_funcall(argv[0], rb_intern("to_s"), 0, 0);
|
201
|
+
else
|
202
|
+
rb_raise(rb_eTypeError, "wrong argument type (expected String)");
|
203
|
+
}
|
199
204
|
|
200
|
-
|
205
|
+
/* Use the default device if none was given. */
|
201
206
|
if (argc < 1 || RSTRING(device)->len == 0)
|
202
207
|
cdevice = discid_get_default_device();
|
203
208
|
else
|
204
209
|
cdevice = STR2CSTR(device);
|
205
210
|
|
206
|
-
|
211
|
+
/* Mark the disc id as unread in case something goes wrong. */
|
212
|
+
rb_iv_set(self, "@read", Qfalse);
|
213
|
+
|
214
|
+
/* Read the discid */
|
207
215
|
if (discid_read(disc, cdevice) == 0)
|
208
216
|
rb_raise(rb_eException, discid_get_error_msg(disc));
|
209
|
-
else
|
217
|
+
else /* Remember that we already read the ID. */
|
210
218
|
rb_iv_set(self, "@read", Qtrue);
|
211
219
|
|
212
220
|
return Qnil;
|
213
221
|
|
214
|
-
|
222
|
+
}
|
223
|
+
|
224
|
+
/**
|
225
|
+
* Set the TOC information directly instead of reading it from a device.
|
226
|
+
*
|
227
|
+
* Use this instead of read if the TOC information was already read elsewhere
|
228
|
+
* and you want to recalculate the ID.
|
229
|
+
* Throws an <tt>Exception</tt> if the CD's TOC can not be read.
|
230
|
+
*
|
231
|
+
* <b>Parameters:</b>
|
232
|
+
* [first_track] The number of the first track on the disc (usually 1).
|
233
|
+
* [sectors] The total number of sectors on the disc.
|
234
|
+
* [offsets] Array of all track offsets. The number of tracks must not exceed 99.
|
235
|
+
*/
|
236
|
+
static VALUE mb_discid_put(VALUE self, VALUE first_track, VALUE sectors,
|
237
|
+
VALUE offsets)
|
238
|
+
{
|
239
|
+
DiscId *disc; /* Pointer to the disc struct */
|
240
|
+
long length = RARRAY(offsets)->len; /* length of the offsets array */
|
241
|
+
int cfirst = NUM2INT(first_track); /* number of the first track */
|
242
|
+
int clast = length + 1 - cfirst; /* number of the last track */
|
243
|
+
int coffsets[100]; /* C array to hold the offsets */
|
244
|
+
int i = 1; /* Counter for iterating over coffsets*/
|
245
|
+
|
246
|
+
Data_Get_Struct(self, DiscId, disc);
|
247
|
+
|
248
|
+
/* Convert the Ruby array to an C array of integers. discid_puts expects
|
249
|
+
always an offsets array with exactly 100 elements. */
|
250
|
+
coffsets[0] = NUM2INT(sectors); /* 0 is always the leadout track */
|
251
|
+
while (i <= length && i < 100)
|
252
|
+
{
|
253
|
+
coffsets[i] = NUM2INT(rb_ary_entry(offsets, i - 1));
|
254
|
+
i++;
|
255
|
+
}
|
256
|
+
|
257
|
+
/* Mark the disc id as unread in case something goes wrong. */
|
258
|
+
rb_iv_set(self, "@read", Qfalse);
|
259
|
+
|
260
|
+
/* Read the discid */
|
261
|
+
if (discid_put(disc, cfirst, clast, coffsets) == 0)
|
262
|
+
rb_raise(rb_eException, discid_get_error_msg(disc));
|
263
|
+
else /* Remember that we already read the ID. */
|
264
|
+
rb_iv_set(self, "@read", Qtrue);
|
265
|
+
|
266
|
+
return Qnil;
|
215
267
|
}
|
216
268
|
|
217
269
|
/**
|
@@ -249,7 +301,8 @@ VALUE mb_discid_default_device(VALUE class)
|
|
249
301
|
/**
|
250
302
|
* Initialize the DiscID class and make it available in Ruby.
|
251
303
|
*/
|
252
|
-
void Init_MB_DiscID()
|
304
|
+
void Init_MB_DiscID()
|
305
|
+
{
|
253
306
|
mMusicBrainz = rb_define_module("MusicBrainz");
|
254
307
|
cDiscID = rb_define_class_under(mMusicBrainz, "DiscID", rb_cObject);
|
255
308
|
rb_define_singleton_method(cDiscID, "new", mb_discid_new, -1);
|
@@ -257,6 +310,7 @@ void Init_MB_DiscID() {
|
|
257
310
|
mb_discid_default_device, 0);
|
258
311
|
|
259
312
|
rb_define_method(cDiscID, "read", mb_discid_read, -1);
|
313
|
+
rb_define_method(cDiscID, "put", mb_discid_put, 3);
|
260
314
|
rb_define_method(cDiscID, "id", mb_discid_id, 0);
|
261
315
|
rb_define_method(cDiscID, "submission_url", mb_discid_submission_url, 0);
|
262
316
|
rb_define_method(cDiscID, "freedb_id", mb_discid_freedb_id, 0);
|
data/lib/mb-discid.rb
CHANGED
@@ -1,12 +1,88 @@
|
|
1
|
-
# $Id:mb-discid.rb
|
2
|
-
#
|
3
|
-
# All rights reserved.
|
4
|
-
# See LICENSE for permissions.
|
5
|
-
|
1
|
+
# $Id: mb-discid.rb 82 2007-06-05 00:21:51Z phw $
|
2
|
+
#
|
6
3
|
# Just a helper file to allow loading the MB-DiscID library with
|
7
4
|
# <tt>require 'mb-discid'</tt>, which is the only recommended way
|
8
5
|
# to load the library.
|
6
|
+
#
|
9
7
|
# This file may even provide extensions to the library in the future
|
10
8
|
# to avoid to have to write everything in C.
|
9
|
+
#
|
10
|
+
# Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
|
11
|
+
# Copyright:: Copyright (c) 2007, Philipp Wolfer
|
12
|
+
# License:: MB-DiscID is free software distributed under a BSD style license.
|
13
|
+
# See LICENSE[file:../LICENSE.html] for permissions.
|
11
14
|
|
12
15
|
require 'MB_DiscID.so'
|
16
|
+
|
17
|
+
module MusicBrainz
|
18
|
+
|
19
|
+
# Class to calculate a MusicBrainz DiscID from an audio CD in the drive.
|
20
|
+
#
|
21
|
+
# This is basically an interface to the libdiscid C library
|
22
|
+
# (http://musicbrainz.org/doc/libdiscid).
|
23
|
+
#
|
24
|
+
# == Usage
|
25
|
+
# === Basic Usage:
|
26
|
+
#
|
27
|
+
# require 'mb-discid'
|
28
|
+
#
|
29
|
+
# # Create a new DiscID object
|
30
|
+
# disc = MusicBrainz::DiscID.new
|
31
|
+
#
|
32
|
+
# # Read the TOC from the default device.
|
33
|
+
# # An audio CD must be inserted in the drive. An exception will be thrown
|
34
|
+
# # if the CD can't be read.
|
35
|
+
# disc.read
|
36
|
+
#
|
37
|
+
# # Print information about the disc:
|
38
|
+
# print <<EOF
|
39
|
+
# DiscID : #{disc.id}
|
40
|
+
# Submit via : #{disc.submission_url}
|
41
|
+
# FreeDB ID : #{disc.freedb_id}
|
42
|
+
# First track: #{disc.first_track_num}
|
43
|
+
# Last track : #{disc.last_track_num}
|
44
|
+
# Sectors : #{disc.sectors}
|
45
|
+
# EOF
|
46
|
+
#
|
47
|
+
# # Print information about individual tracks:
|
48
|
+
# track = disc.first_track_num
|
49
|
+
# disc.tracks do |offset, length|
|
50
|
+
# puts "Track #{track}: Offset #{offset}, Length #{length}"
|
51
|
+
# track += 1
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# === Specifying the device to read from:
|
55
|
+
#
|
56
|
+
# # Create a new DiscID object and read the disc in /dev/dvd:
|
57
|
+
# disc = MusicBrainz::DiscID.new
|
58
|
+
# disc.read('/dev/dvd')
|
59
|
+
#
|
60
|
+
# # Create a new DiscID object and directly read the disc in /dev/dvd:
|
61
|
+
# disc = MusicBrainz::DiscID.new('/dev/dvd')
|
62
|
+
#
|
63
|
+
# # Create a new DiscID object and directly read the disc in the platform's
|
64
|
+
# # default device:
|
65
|
+
# disc = MusicBrainz::DiscID.new(MusicBrainz::DiscID.default_device)
|
66
|
+
#
|
67
|
+
# === Calculating the DiscID for a given TOC
|
68
|
+
#
|
69
|
+
# disc = MusicBrainz::DiscID.new
|
70
|
+
#
|
71
|
+
# first_track = 1
|
72
|
+
# sectors = 224556
|
73
|
+
# track_offsets = [150, 9078, 13528, 34182, 53768, 70987, 96424,
|
74
|
+
# 118425, 136793, 159514, 179777, 198006]
|
75
|
+
#
|
76
|
+
# disc.put(first_track, sectors, track_offsets)
|
77
|
+
# puts disc.id # Should print "T_prJXQSrqbnH8OE.dgOKsHm5Uw-"
|
78
|
+
#
|
79
|
+
class DiscID
|
80
|
+
|
81
|
+
# DiscID to String conversion. Same as calling the method id.
|
82
|
+
def to_s
|
83
|
+
return id.to_s
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
data/test/test_discid.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
# $Id: test_discid.rb 95 2007-07-04 20:47:24Z phw $
|
2
|
+
#
|
3
|
+
# Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
|
4
|
+
# Copyright:: Copyright (c) 2007, Philipp Wolfer
|
5
|
+
# License:: RBrainz is free software distributed under a BSD style license.
|
6
|
+
# See LICENSE[file:../LICENSE.html] for permissions.
|
7
|
+
|
8
|
+
require 'test/unit'
|
9
|
+
require 'mb-discid'
|
10
|
+
|
11
|
+
# Helper class which can't be converted into a string.
|
12
|
+
class NotAString
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
# Unit test for the MusicBrainz::DiscID class.
|
22
|
+
class TestDiscID < Test::Unit::TestCase
|
23
|
+
|
24
|
+
def setup
|
25
|
+
@fiction_disc_id = 'Wn8eRBtfLDfM0qjYPdxrz.Zjs_U-'
|
26
|
+
@fiction_first_track = 1
|
27
|
+
@fiction_last_track = 10
|
28
|
+
@fiction_sectors = 206535
|
29
|
+
@fiction_offsets = [150, 18901, 39738, 59557, 79152, 100126,
|
30
|
+
124833, 147278, 166336, 182560]
|
31
|
+
@fiction_lengths = [18751, 20837, 19819, 19595, 20974,
|
32
|
+
24707, 22445, 19058, 16224, 23975]
|
33
|
+
end
|
34
|
+
|
35
|
+
def teardown
|
36
|
+
end
|
37
|
+
|
38
|
+
# Test reading the disc id from a device.
|
39
|
+
# We would need some kind of small test data to do this.
|
40
|
+
#def test_read
|
41
|
+
# assert false, "Not implemented yet"
|
42
|
+
#end
|
43
|
+
|
44
|
+
# Test how read reacts on different arguments.
|
45
|
+
# Those reads should all fail, but they must never cause a segmentation fault.
|
46
|
+
def test_read_invalid_arguments
|
47
|
+
assert_raise(TypeError) {MusicBrainz::DiscID.new(NotAString.new)}
|
48
|
+
assert_raise(Exception) {MusicBrainz::DiscID.new(1)}
|
49
|
+
assert_raise(Exception) {MusicBrainz::DiscID.new('invalid_device')}
|
50
|
+
assert_raise(Exception) {MusicBrainz::DiscID.new(:invalid_device)}
|
51
|
+
assert_raise(ArgumentError) {MusicBrainz::DiscID.new(
|
52
|
+
MusicBrainz::DiscID.default_device,
|
53
|
+
'second argument')}
|
54
|
+
|
55
|
+
disc = MusicBrainz::DiscID.new
|
56
|
+
assert_raise(TypeError) {disc.read(NotAString.new)}
|
57
|
+
assert_raise(Exception) {disc.read(1)}
|
58
|
+
assert_raise(Exception) {disc.read('invalid_device')}
|
59
|
+
assert_raise(Exception) {disc.read(:invalid_device)}
|
60
|
+
assert_raise(ArgumentError) {disc.read(MusicBrainz::DiscID.default_device,
|
61
|
+
'second argument')}
|
62
|
+
end
|
63
|
+
|
64
|
+
# Test calculation of the disc id if the TOC information
|
65
|
+
# gets set by the put method.
|
66
|
+
# All attributes should be nil after a failure, even if there was a
|
67
|
+
# successfull put before.
|
68
|
+
def test_put
|
69
|
+
disc = MusicBrainz::DiscID.new
|
70
|
+
assert_equal nil, disc.id
|
71
|
+
assert_equal '', disc.to_s
|
72
|
+
assert_equal nil, disc.first_track_num
|
73
|
+
assert_equal nil, disc.last_track_num
|
74
|
+
assert_equal nil, disc.sectors
|
75
|
+
assert_equal nil, disc.tracks
|
76
|
+
|
77
|
+
# First erroneous put
|
78
|
+
assert_raise(Exception) {disc.put(-1, @fiction_sectors, @fiction_offsets)}
|
79
|
+
assert_equal nil, disc.id
|
80
|
+
assert_equal '', disc.to_s
|
81
|
+
assert_equal nil, disc.first_track_num
|
82
|
+
assert_equal nil, disc.last_track_num
|
83
|
+
assert_equal nil, disc.sectors
|
84
|
+
assert_equal nil, disc.tracks
|
85
|
+
|
86
|
+
# Second successfull put
|
87
|
+
assert_nothing_raised {disc.put(@fiction_first_track, @fiction_sectors,
|
88
|
+
@fiction_offsets)}
|
89
|
+
assert_equal @fiction_disc_id, disc.id
|
90
|
+
assert_equal @fiction_disc_id, disc.to_s
|
91
|
+
assert_equal @fiction_first_track, disc.first_track_num
|
92
|
+
assert_equal @fiction_last_track, disc.last_track_num
|
93
|
+
assert_equal @fiction_sectors, disc.sectors
|
94
|
+
assert_equal @fiction_offsets, disc.tracks.map{|t| t[0]}
|
95
|
+
assert_equal @fiction_lengths, disc.tracks.map{|t| t[1]}
|
96
|
+
|
97
|
+
# Third erroneous put
|
98
|
+
assert_raise(Exception) {disc.put(@fiction_first_track, @fiction_sectors,
|
99
|
+
Array.new(100, 1))}
|
100
|
+
assert_equal nil, disc.id
|
101
|
+
assert_equal '', disc.to_s
|
102
|
+
assert_equal nil, disc.first_track_num
|
103
|
+
assert_equal nil, disc.last_track_num
|
104
|
+
assert_equal nil, disc.sectors
|
105
|
+
assert_equal nil, disc.tracks
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: mb-discid
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.1.2
|
7
|
+
date: 2007-07-04 00:00:00 +02:00
|
8
8
|
summary: Ruby bindings for libdiscid.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -16,7 +16,7 @@ description: Ruby bindings for libdiscid. See http://musicbrainz.org/doc/libdisc
|
|
16
16
|
autorequire: mb-discid
|
17
17
|
default_executable:
|
18
18
|
bindir: bin
|
19
|
-
has_rdoc:
|
19
|
+
has_rdoc: true
|
20
20
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
21
21
|
requirements:
|
22
22
|
- - ">="
|
@@ -33,17 +33,21 @@ files:
|
|
33
33
|
- Rakefile
|
34
34
|
- LICENSE
|
35
35
|
- README
|
36
|
+
- CHANGES
|
36
37
|
- examples/discid.rb
|
37
38
|
- ext/mb_discid.c
|
38
39
|
- ext/extconf.rb
|
39
40
|
- lib/mb-discid.rb
|
41
|
+
- test/test_discid.rb
|
40
42
|
- ext/MB_DiscID.so
|
41
43
|
test_files: []
|
42
44
|
|
43
45
|
rdoc_options: []
|
44
46
|
|
45
|
-
extra_rdoc_files:
|
46
|
-
|
47
|
+
extra_rdoc_files:
|
48
|
+
- README
|
49
|
+
- LICENSE
|
50
|
+
- CHANGES
|
47
51
|
executables: []
|
48
52
|
|
49
53
|
extensions: []
|