discid 1.0.0.a1 → 1.0.0.rc1

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/.yardopts CHANGED
@@ -1 +1 @@
1
- --no-private --markup markdown
1
+ --no-private --markup markdown --markup-provider kramdown - CHANGES
data/CHANGES CHANGED
@@ -1,42 +1,45 @@
1
- = Changelog
2
- == 1.0.0.a1 (2013-04-22)
1
+ # Changelog
2
+
3
+ ## 1.0.0
4
+ * Support libdiscid versions 0.1.0 through 0.5.0
5
+ * Compatible with JRuby
6
+
7
+ ## 1.0.0.a1 (2013-04-22)
3
8
  * Use FFI instead of C module
4
9
  * Completely overhauled API
5
10
  * Full support for MCN, ISRC and libdiscid feature detection
6
11
  * Renamed from mb-discid to just discid
7
12
 
8
- == 0.2.0 (2013-02-17)
13
+ ## 0.2.0 (2013-02-17)
9
14
  * Support for MCN and ISRC (requires libdiscid >= 0.3)
10
15
 
11
- == 0.1.5 (2011-07-02)
16
+ ## 0.1.5 (2011-07-02)
12
17
  * Added binding for get_webservice_url()
13
18
  * Add lib path detection, allows out-of-the-box install when your
14
19
  libdiscid is in /usr/local (Matt Patterson)
15
20
 
16
- == 0.1.4 (2009-11-19)
17
- * Fixed calling +read+ method without argument
21
+ ## 0.1.4 (2009-11-19)
22
+ * Fixed calling read method without argument
18
23
 
19
- == 0.1.3 (2009-11-19)
20
- * Added singleton method +sectors_to_seconds+ to convert sectors into seconds
21
- * Added method +seconds+ to retrieve disc length in seconds
22
- * Added method +track_info+ for accessing more detailed information about tracks
24
+ ## 0.1.3 (2009-11-19)
25
+ * Added singleton method sectors_to_seconds to convert sectors into seconds
26
+ * Added method seconds to retrieve disc length in seconds
27
+ * Added method track_info for accessing more detailed information about tracks
23
28
  * Fixed building with Ruby 1.9 (Mihaly Csomay)
24
29
 
25
- == 0.1.2 (2007-07-04)
26
- * Support the method +put+ to set the TOC information directly instead of
30
+ ## 0.1.2 (2007-07-04)
31
+ * Support the method put to set the TOC information directly instead of
27
32
  reading it from a device.
28
- * Fixed possible core dump if +read+ was called twice and failed the
33
+ * Fixed possible core dump if read was called twice and failed the
29
34
  second time.
30
35
  * New to_s method (returns string representation of the ID itself).
31
36
  * Complete RDoc documentation.
32
37
 
33
- == 0.1.1 (2007-06-03)
38
+ ## 0.1.1 (2007-06-03)
34
39
  * Minor changes to source to support MS compiler
35
40
  * Provide Win32 binary gem
36
41
  * Changed require of library to "require 'mb-discid'" (was "require 'DiscID'"
37
42
  before, which was likely to cause problems)
38
43
 
39
- == 0.1.0 (2007-06-02)
44
+ ## 0.1.0 (2007-06-02)
40
45
  * Initial release
41
-
42
- $Id$
data/README.md CHANGED
@@ -8,7 +8,7 @@ the library can extract the MCN/UPC/EAN and the ISRCs from disc.
8
8
  ## Requirements
9
9
  * Ruby >= 1.8.6
10
10
  * Ruby-FFI
11
- * libdiscid >= 0.2.2
11
+ * libdiscid >= 0.1.0
12
12
 
13
13
  ## Installation
14
14
  Before installing ruby-discid make sure you have libdiscid installed. See
@@ -23,6 +23,7 @@ Or install it from the source tarball:
23
23
  rake install
24
24
 
25
25
  ## Usage
26
+
26
27
  ### Read only the TOC
27
28
 
28
29
  require 'discid'
@@ -52,5 +53,16 @@ Or install it from the source tarball:
52
53
  puts " ISRC : %s" % track.isrc
53
54
  end
54
55
 
55
- See the documentation of {DiscId} or the files in the `examples` directory for
56
- more usage information.
56
+ See the [API documentation](http://rubydoc.info/github/phw/ruby-discid/master/frames)
57
+ of {DiscId} or the files in the `examples` directory for more usage information.
58
+
59
+ ## Contribute
60
+ The source code for ruby-discid is available on
61
+ [GitHub](https://github.com/phw/ruby-discid).
62
+
63
+ Please report any issues on the
64
+ [issue tracker](https://github.com/phw/ruby-discid/issues).
65
+
66
+ ## License
67
+ ruby-discid is released under the GNU Lesser General Public License Version 3.
68
+ See LICENSE.txt for details.
data/discid.gemspec CHANGED
@@ -11,7 +11,8 @@ Gem::Specification.new do |spec|
11
11
  spec.description = %q{ruby-discid provides Ruby bindings for the MusicBrainz DiscID library libdiscid. It allows calculating DiscIDs (MusicBrainz and freedb) for Audio CDs. Additionally the library can extract the MCN/UPC/EAN and the ISRCs from disc.}
12
12
  spec.summary = %q{Ruby bindings for libdiscid}
13
13
  spec.homepage = "https://github.com/phw/ruby-discid"
14
- spec.license = "LGPL3"
14
+ spec.license = "LGPL-3"
15
+ spec.post_install_message = %q{Please make sure you have libdiscid (http://musicbrainz.org/doc/libdiscid) installed.}
15
16
 
16
17
  spec.files = `git ls-files`.split($/)
17
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -23,5 +24,5 @@ Gem::Specification.new do |spec|
23
24
  spec.add_development_dependency "bundler", "~> 1.3"
24
25
  spec.add_development_dependency "rake"
25
26
  spec.add_development_dependency "yard"
26
- spec.add_development_dependency "redcarpet"
27
+ spec.add_development_dependency "kramdown"
27
28
  end
data/examples/discid.rb CHANGED
@@ -41,10 +41,11 @@ First track : #{disc.first_track_num}
41
41
  Last track : #{disc.last_track_num}
42
42
  Total length: #{disc.seconds} seconds
43
43
  Sectors : #{disc.sectors}
44
- MCN : #{disc.mcn}
45
-
46
44
  EOF
47
45
 
46
+ puts "MCN : #{disc.mcn}" if DiscId.has_feature?(:mcn)
47
+ puts
48
+
48
49
  # Print information about individual tracks:
49
50
  disc.tracks do |track|
50
51
  puts "Track ##{track.number}"
@@ -54,10 +55,9 @@ disc.tracks do |track|
54
55
  [track.start_time / 60, track.start_time % 60, track.start_sector]
55
56
  puts " End : %02d:%02d (sector %i)" %
56
57
  [track.end_time / 60, track.end_time % 60, track.end_sector]
57
- puts " ISRC : %s" % track.isrc
58
+ puts " ISRC : %s" % track.isrc if DiscId.has_feature?(:isrc)
58
59
  end
59
60
 
60
61
  # Print a submission URL that can be used to submit
61
62
  # the disc ID to MusicBrainz.org.
62
63
  puts "\nSubmit via #{disc.submission_url}"
63
- #puts "\nWebservice #{disc.webservice_url}"
data/lib/discid.rb CHANGED
@@ -20,6 +20,50 @@ require 'discid/version'
20
20
  # The DiscId module allows calculating DiscIDs (MusicBrainz and freedb)
21
21
  # for Audio CDs. Additionally the library can extract the MCN/UPC/EAN and
22
22
  # the ISRCs from disc.
23
+ #
24
+ # The main interface for using this module are the {read} and {put}
25
+ # methods which both return an instance of {Disc}. {read} allows you to
26
+ # read the data from an actual CD drive while {put} allows you to
27
+ # calculate the DiscID for a previously read CD TOC.
28
+ #
29
+ # Depending on the version of libdiscid and the operating system used
30
+ # additional features like reading the MCN or ISRCs from the disc
31
+ # might be available. You can check for supported features with {has_feature?}.
32
+ #
33
+ # @see http://musicbrainz.org/doc/libdiscid#Feature_Matrix
34
+ #
35
+ # @example Read the TOC, MCN and ISRCs
36
+ # require 'discid'
37
+ #
38
+ # device = "/dev/cdrom"
39
+ # disc = DiscId.read(device, :mcn, :isrc)
40
+ #
41
+ # # Print information about the disc:
42
+ # puts "DiscID : #{disc.id}"
43
+ # puts "FreeDB ID : #{disc.freedb_id}"
44
+ # puts "Total length: #{disc.seconds} seconds"
45
+ # puts "MCN : #{disc.mcn}"
46
+ #
47
+ # # Print information about individual tracks:
48
+ # disc.tracks do |track|
49
+ # puts "Track ##{track.number}"
50
+ # puts " Length: %02d:%02d (%i sectors)" %
51
+ # [track.seconds / 60, track.seconds % 60, track.sectors]
52
+ # puts " ISRC : %s" % track.isrc
53
+ # end
54
+ #
55
+ # @example Get the DiscID for an existing TOC
56
+ # require 'discid'
57
+ #
58
+ # first_track = 1
59
+ # sectors = 82255
60
+ # offsets = [150, 16157, 35932, 57527]
61
+ # disc = DiscId.put(first_track, sectors, offsets)
62
+ # puts disc.id # Output: E5VLOkhodzhvsMlK8LSNVioYOgY-
63
+ #
64
+ # @example Check for supported MCN feature
65
+ # disc = DiscId.read(nil, :mcn)
66
+ # puts "MCN: #{disc.mcn}" if DiscId.has_feature?(:mcn)
23
67
  module DiscId
24
68
 
25
69
  # Read the disc in the given CD-ROM/DVD-ROM drive extracting only the
@@ -39,14 +83,20 @@ module DiscId
39
83
  # @example Read the TOC, MCN and ISRCs:
40
84
  # disc = DiscId.read(device, :mcn, :isrc)
41
85
  #
86
+ # @note libdiscid >= 0.5.0 is required for the feature selection to work.
87
+ # Older versions will allways read MCN and ISRCs when supported. See
88
+ # {http://musicbrainz.org/doc/libdiscid#Feature_Matrix} for a list of
89
+ # supported features by version and platform.
90
+ #
42
91
  # @raise [TypeError] `device` can not be converted to a String.
43
92
  # @raise [Exception] Error reading from `device`. `Exception#message` contains
44
93
  # error details.
45
- # @param device [String] The device identifier.
46
- # @param *features [:mcn, :isrc] List of features to use.
94
+ # @param device [String] The device identifier. If set to `nil` {default_device}
95
+ # will be used.
96
+ # @param features [:mcn, :isrc] List of features to use.
47
97
  # `:read` is always implied.
48
98
  # @return [Disc]
49
- def self.read(device, *features)
99
+ def self.read(device = nil, *features)
50
100
  disc = Disc.new
51
101
  disc.read device, *features
52
102
  return disc
@@ -79,12 +129,31 @@ module DiscId
79
129
 
80
130
  # Check if a certain feature is implemented on the current platform.
81
131
  #
132
+ # You can obtain a list of supported features with {feature_list}.
133
+ #
134
+ # @note libdiscid >= 0.5.0 required. Older versions will return `true`
135
+ # for `:read` and `false` for anything else.
136
+ #
82
137
  # @param feature [:read, :mcn, :isrc]
83
138
  # @return [Boolean] True if the feature is implemented and false if not.
84
139
  def self.has_feature?(feature)
85
140
  feature = feature.to_sym if feature.respond_to? :to_sym
86
- result = Lib.has_feature feature if Lib::Features.symbols.include? feature
87
- return result == 1
141
+ return self.feature_list.include? feature
142
+ end
143
+
144
+ # A list of features supported by the current platform.
145
+ #
146
+ # Currently the following features are available:
147
+ #
148
+ # * :read
149
+ # * :mcn
150
+ # * :isrc
151
+ #
152
+ # @note libdiscid >= 0.5.0 required. Older versions will return only [:read].
153
+ #
154
+ # @return [Array<Symbol>]
155
+ def self.feature_list
156
+ return Lib::Features.symbols.select {|f| Lib.has_feature(f) == 1}
88
157
  end
89
158
 
90
159
  # Converts sectors to seconds.
data/lib/discid/disc.rb CHANGED
@@ -36,7 +36,7 @@ module DiscId
36
36
  # @private
37
37
  def read(device, *features)
38
38
  @read = false
39
- device = self.class.default_device if device.nil?
39
+ device = DiscId.default_device if device.nil?
40
40
 
41
41
  if not device.respond_to? :to_s
42
42
  raise TypeError, 'wrong argument type (expected String)'
@@ -123,7 +123,11 @@ module DiscId
123
123
  #
124
124
  # Requires libdiscid >= 0.5. If not supported this method will always
125
125
  # return `nil`.
126
- #
126
+ #
127
+ # @note libdiscid >= 0.3.0 required. Older versions will always return nil.
128
+ # Not available on all platforms, see
129
+ # {http://musicbrainz.org/doc/libdiscid#Feature_Matrix}.
130
+ #
127
131
  # @return [String] MCN or `nil` if no ID was yet read.
128
132
  def mcn
129
133
  return nil unless @read
data/lib/discid/lib.rb CHANGED
@@ -18,7 +18,8 @@ require "ffi"
18
18
  module DiscId
19
19
 
20
20
  # This module encapsulates the C interface for libdiscid using FFI.
21
- # The Lib module is intended for internal use only and should be considered private.
21
+ # The Lib module is intended for internal use only and should be
22
+ # considered private.
22
23
  #
23
24
  # @private
24
25
  module Lib
@@ -29,8 +30,15 @@ module DiscId
29
30
 
30
31
  attach_function :free, :discid_free, [:pointer], :void
31
32
 
32
- # TODO: Handle old discid_read
33
- attach_function :read, :discid_read_sparse, [:pointer, :string, :uint], :int
33
+ begin
34
+ attach_function :read, :discid_read_sparse, [:pointer, :string, :uint], :int
35
+ rescue FFI::NotFoundError
36
+ attach_function :legacy_read, :discid_read, [:pointer, :string], :int
37
+
38
+ def self.read(handle, device, features)
39
+ legacy_read(handle, device)
40
+ end
41
+ end
34
42
 
35
43
  attach_function :put, :discid_put, [:pointer, :int, :int, :pointer], :int
36
44
 
@@ -54,27 +62,52 @@ module DiscId
54
62
 
55
63
  attach_function :get_track_length, :discid_get_track_length, [:pointer, :int], :int
56
64
 
57
- attach_function :get_mcn, :discid_get_mcn, [:pointer], :string
65
+ begin
66
+ attach_function :get_mcn, :discid_get_mcn, [:pointer], :string
67
+ rescue FFI::NotFoundError
68
+ def self.get_mcn(handle)
69
+ return nil
70
+ end
71
+ end
58
72
 
59
- attach_function :get_track_isrc, :discid_get_track_isrc, [:pointer, :int], :string
73
+ begin
74
+ attach_function :get_track_isrc, :discid_get_track_isrc, [:pointer, :int], :string
75
+ rescue FFI::NotFoundError
76
+ def self.get_track_isrc(handle, track)
77
+ return nil
78
+ end
79
+ end
60
80
 
61
81
  Features = enum(:feature, [:read, 1 << 0,
62
82
  :mcn, 1 << 1,
63
83
  :isrc, 1 << 2])
64
84
 
65
- attach_function :has_feature, :discid_has_feature, [:feature], :int
85
+ begin
86
+ attach_function :has_feature, :discid_has_feature, [:feature], :int
87
+ rescue FFI::NotFoundError
88
+ def self.has_feature(feature)
89
+ return feature.to_sym == :read ? 1 : 0
90
+ end
91
+ end
66
92
 
67
93
  #attach_function :get_feature_list, :discid_get_feature_list, [:pointer], :void
68
94
 
69
- attach_function :get_version_string, :discid_get_version_string, [], :string
70
-
95
+ begin
96
+ attach_function :get_version_string, :discid_get_version_string, [], :string
97
+ rescue FFI::NotFoundError
98
+ def self.get_version_string
99
+ return "libdiscid < 0.4.0"
100
+ end
101
+ end
102
+
71
103
  def self.features_to_int(features)
72
104
  feature_flag = 0
73
105
  features.each do |feature|
74
106
  if feature.respond_to? :to_sym
75
107
  feature = feature.to_sym
76
108
  feature_flag |= self::Features[feature] if
77
- self::Features.symbols.include?(feature)
109
+ self::Features.symbols.include?(feature) and
110
+ self.has_feature(feature)
78
111
  end
79
112
  end
80
113
 
@@ -55,7 +55,11 @@ module DiscId
55
55
  # @return [Integer]
56
56
  attr_reader :start_sector
57
57
 
58
- # ISRC number of the trac
58
+ # ISRC number of the track.
59
+ #
60
+ # @note libdiscid >= 0.3.0 required. Older versions will always return nil.
61
+ # Not available on all platforms, see
62
+ # {http://musicbrainz.org/doc/libdiscid#Feature_Matrix}.
59
63
  #
60
64
  # @return [String]
61
65
  attr_reader :isrc
@@ -15,5 +15,5 @@
15
15
 
16
16
 
17
17
  module DiscId
18
- VERSION = "1.0.0.a1"
18
+ VERSION = "1.0.0.rc1"
19
19
  end
data/test/test_discid.rb CHANGED
@@ -159,4 +159,9 @@ class TestDiscID < Test::Unit::TestCase
159
159
  "Feature 'notafeature' should not be supported")
160
160
  end
161
161
 
162
+ def test_feature_list_must_contain_read
163
+ assert(DiscId.feature_list.include?(:read),
164
+ "Feature :read should be supported")
165
+ end
166
+
162
167
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: discid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.a1
4
+ version: 1.0.0.rc1
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -76,7 +76,7 @@ dependencies:
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
78
  - !ruby/object:Gem::Dependency
79
- name: redcarpet
79
+ name: kramdown
80
80
  requirement: !ruby/object:Gem::Requirement
81
81
  none: false
82
82
  requirements:
@@ -119,8 +119,9 @@ files:
119
119
  - test/test_discid.rb
120
120
  homepage: https://github.com/phw/ruby-discid
121
121
  licenses:
122
- - LGPL3
123
- post_install_message:
122
+ - LGPL-3
123
+ post_install_message: Please make sure you have libdiscid (http://musicbrainz.org/doc/libdiscid)
124
+ installed.
124
125
  rdoc_options: []
125
126
  require_paths:
126
127
  - lib