MusicIds
music_ids contains classes that represent some of the main ID formats in use in the music industry for identifying individual pieces of recorded music.
There are often several ways that these IDs can be written, so the classes provide standard APIs to parse and normalise ID strings, as well as to break them into their components.
Currently we have classes for the ISRC (International Standard Recording Code) and GRid (Global Release Identifier).
Installation
Add this line to your application's Gemfile:
gem 'music_ids'And then execute:
$ bundle
Or install it yourself as:
$ gem install music_ids
Usage
(See API docs at http://www.rubydoc.info/gems/music_ids for more details including links to the relevant ID specifications.)
MusicIds::GRid and MusicIds::ISRC have the same basic API pattern: a
parse class method, to_s returns normalised string version of the ID and
as(format) returns different string representations of the Id.
Instances compare equal if their normalised string representations match. Parsing an existing instance just returns another instance of the same ID.
require 'music_ids'
isrc = MusicIds::ISRC.parse('FRZ039800212')
isrc.country #=> 'FR'
isrc.registrant #=> 'Z03'
isrc.year #=> '98'
isrc.designation #=> '00212'
other = ISRC.parse('FR-Z03-98-00212')
other.registrant #=> 'Z03'
isrc == other #=> true
isrc.to_s #=> 'FRZ039800212'
isrc.as(:full) #=> 'FR-Z03-98-00212'
MusicIds::ISRC.parse(isrc) == isrc #=> true
grid_with_hyphens = MusicIds::GRid.parse('A1-2425G-ABC1234002-M')
grid = MusicIds::GRid.parse('A12425GABC1234002M')
# You do see this form with GRids
grid_with_prefix = MusicIds::GRid.parse('GRID:A1-2425G-ABC1234002-M')
grid.scheme #=> 'A1'
grid.issuer #=> '2425G'
grid.release #=> 'ABC1234002'
grid.check #=> 'M'
grid_with_hyphens == grid #=> true
grid_with_prefix == grid #=> true
grid.to_s #=> 'A12425GABC1234002M'
grid.as(:full) #=> 'A1-2425G-ABC1234002-M'
grid.as(:prefixed) #=> 'GRID:A1-2425G-ABC1234002-M'
MusicIds::GRid.parse(grid) == grid #=> trueSupport for as_json is included so the basic JSON generation case will work:
require 'music_ids'
require 'json'
isrc = MusicIds::ISRC.parse('FRZ039800212')
grid = MusicIds::GRid.parse('A12425GABC1234002M')
isrc.as_json #=> 'FRZ039800212'
grid.as_json #=> 'A12425GABC1234002M'
JSON.generate({isrc: isrc, grid: grid})
#=> "{\"isrc\":\"FRZ039800212\",\"grid\":\"A12425GABC1234002M\"}"Problems with your ID will raise an ArgumentError on parsing
require 'music_ids'
begin
isrc = MusicIds::ISRC.parse('FRZ03')
rescue ArgumentError => e
e.message
end
#=> "'FRZ03' is not the right length to be a MusicIds::ISRC"
begin
grid = MusicIds::GRid.parse('A12425G')
rescue ArgumentError => e
e.message
end
#=> "'A12425G' is not the right length to be a MusicIds::GRid"If you have to sometimes deal with bad metadata, then you may want a more
forgiving approach. Enter 'relaxed' parsing. You can pass relaxed: true as an
options hash to .parse, or you can call .relaxed directly. A 'bad' instance
returned by relaxed mode parsing reports that it's not ok with #ok? and won't
return any components, and will only return the input string it was passed and
not the full or prefixed versions you can get for a well-formed ISRC.
require 'music_ids'
bad_isrc = MusicIds::ISRC.parse('bad', relaxed: true)
bad_isrc.ok? #=> false
bad_isrc.to_s #=> 'bad'
bad_isrc.country #=> nil
bad_isrc.as(:data) #=> 'bad'
bad_isrc.as(:full) #=> 'bad'
bad_isrc.as(:prefixed) #=> 'bad'
other_bad_isrc = MusicIds::ISRC.relaxed('bad')
other_bad_isrc.ok? #=> false
other_bad_isrc.to_s #=> 'bad'
bad_grid = MusicIds::GRid.parse('bad', relaxed: true)
bad_grid.ok? #=> false
bad_grid.to_s #=> 'bad'
bad_grid.scheme #=> nil
bad_grid.as(:data) #=> 'bad'
bad_grid.as(:full) #=> 'bad'
bad_grid.as(:prefixed) #=> 'bad'
other_bad_grid = MusicIds::GRid.relaxed('bad')
other_bad_grid.ok? #=> false
other_bad_grid.to_s #=> 'bad'
MusicIds::ISRC.relaxed(nil) #=> nil
MusicIds::GRid.relaxed(nil) #=> nil
# Of course, parsing valid IDs in relaxed mode works just fine:
MusicIds::ISRC.relaxed('FRZ039800212').ok? #=> true
MusicIds::GRid.relaxed('A12425GABC1234002M').ok? #=> true
# And strict parsed instances can tell you they're okay
MusicIds::ISRC.parse('FRZ039800212').ok? #=> true
MusicIds::GRid.parse('A12425GABC1234002M').ok? #=> trueFor more details, see the RDoc.
Development
After checking out the repo, run bin/setup to install dependencies. Then, run
bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install. To
release a new version, update the version number in version.rb, and then run
bundle exec rake release to create a git tag for the version, push git
commits and tags, and push the .gem file to
rubygems.org.
Contributing
- Fork it ( https://github.com/[my-github-username]/music_ids/fork )
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request