id3tag 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.travis.yml +7 -0
- data/Gemfile +9 -9
- data/Gemfile.lock +36 -14
- data/README.md +73 -0
- data/Rakefile +3 -2
- data/VERSION +1 -1
- data/id3tag.gemspec +75 -19
- data/lib/id3tag.rb +34 -0
- data/lib/id3tag/audio_file.rb +90 -0
- data/lib/id3tag/frame_id_advisor.rb +50 -0
- data/lib/id3tag/frames/util/genre_names.rb +140 -0
- data/lib/id3tag/frames/v1/comments_frame.rb +24 -0
- data/lib/id3tag/frames/v1/genre_frame.rb +19 -0
- data/lib/id3tag/frames/v1/text_frame.rb +27 -0
- data/lib/id3tag/frames/v1/track_nr_frame.rb +18 -0
- data/lib/id3tag/frames/v2/basic_frame.rb +26 -0
- data/lib/id3tag/frames/v2/comments_frame.rb +44 -0
- data/lib/id3tag/frames/v2/frame_fabricator.rb +36 -0
- data/lib/id3tag/frames/v2/genre_frame.rb +34 -0
- data/lib/id3tag/frames/v2/genre_frame/genre_parser.rb +36 -0
- data/lib/id3tag/frames/v2/genre_frame/genre_parser_24.rb +15 -0
- data/lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb +39 -0
- data/lib/id3tag/frames/v2/text_frame.rb +37 -0
- data/lib/id3tag/frames/v2/unique_file_id_frame.rb +25 -0
- data/lib/id3tag/id3_v1_frame_parser.rb +87 -0
- data/lib/id3tag/id3_v2_frame_parser.rb +72 -0
- data/lib/id3tag/id3_v2_tag_header.rb +61 -0
- data/lib/id3tag/number_util.rb +14 -0
- data/lib/id3tag/string_util.rb +7 -0
- data/lib/id3tag/synchsafe_integer.rb +28 -0
- data/lib/id3tag/tag.rb +121 -0
- data/spec/fixtures/id3v1_and_v2.mp3 +0 -0
- data/spec/fixtures/id3v1_with_track_nr.mp3 +0 -0
- data/spec/fixtures/id3v1_without_track_nr.mp3 +0 -0
- data/spec/fixtures/id3v2.mp3 +0 -0
- data/spec/lib/id3tag/audio_file_spec.rb +40 -0
- data/spec/lib/id3tag/frames/util/genre_name_by_id_finder_spec.rb +18 -0
- data/spec/lib/id3tag/frames/v1/comments_frame_spec.rb +31 -0
- data/spec/lib/id3tag/frames/v1/genre_frame_spec.rb +20 -0
- data/spec/lib/id3tag/frames/v1/text_frame_spec.rb +14 -0
- data/spec/lib/id3tag/frames/v1/track_nr_frame_spec.rb +19 -0
- data/spec/lib/id3tag/frames/v2/basic_frame_spec.rb +25 -0
- data/spec/lib/id3tag/frames/v2/comments_frame_spec.rb +45 -0
- data/spec/lib/id3tag/frames/v2/genre_frame/genre_parser_24_spec.rb +26 -0
- data/spec/lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24_spec.rb +48 -0
- data/spec/lib/id3tag/frames/v2/genre_frame_spec.rb +44 -0
- data/spec/lib/id3tag/frames/v2/text_frame_spec.rb +59 -0
- data/spec/lib/id3tag/frames/v2/unique_file_id_frame_spec.rb +31 -0
- data/spec/lib/id3tag/id3_v1_frame_parser_spec.rb +67 -0
- data/spec/lib/id3tag/id3_v2_frame_parser_spec.rb +18 -0
- data/spec/lib/id3tag/id3_v2_tag_header_spec.rb +60 -0
- data/spec/lib/id3tag/id3tag_spec.rb +17 -0
- data/spec/lib/id3tag/number_util_spec.rb +24 -0
- data/spec/lib/id3tag/string_util_spec.rb +21 -0
- data/spec/lib/id3tag/synchsafe_integer_spec.rb +14 -0
- data/spec/lib/id3tag/tag_spec.rb +84 -0
- data/spec/spec_helper.rb +9 -1
- data/spec/support/mp3_fixtures.rb +4 -0
- metadata +102 -38
- data/README.rdoc +0 -19
- data/spec/id3tag_spec.rb +0 -7
@@ -0,0 +1,67 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
describe ID3Tag::ID3V1FrameParser do
|
3
|
+
let(:mp3_with_v1_0_tag) { mp3_fixture('id3v1_without_track_nr.mp3') }
|
4
|
+
let(:mp3_with_v1_1_tag) { mp3_fixture('id3v1_with_track_nr.mp3') }
|
5
|
+
let(:frame_bytes_v1_0) { File.read(mp3_with_v1_0_tag, 125, 579) }
|
6
|
+
let(:frame_bytes_v1_1) { File.read(mp3_with_v1_1_tag, 125, 579) }
|
7
|
+
describe "#frames" do
|
8
|
+
subject { described_class.new(frame_bytes_v1_0).frames }
|
9
|
+
|
10
|
+
it "should return array or frames" do
|
11
|
+
subject.should be_kind_of(Set)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "common frames between v1.0 and v.1.1" do
|
15
|
+
|
16
|
+
it "should contain title frame" do
|
17
|
+
frame = subject.select { |frame| frame.id == :title }.first
|
18
|
+
frame.content.should == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaA"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should contain artist frame" do
|
22
|
+
frame = subject.select { |frame| frame.id == :artist }.first
|
23
|
+
frame.content.should == "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbB"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should contain album frame" do
|
27
|
+
frame = subject.select { |frame| frame.id == :album }.first
|
28
|
+
frame.content.should == "cccccccccccccccccccccccccccccC"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should contain year frame" do
|
32
|
+
frame = subject.select { |frame| frame.id == :year }.first
|
33
|
+
frame.content.should == "2003"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "frames with differences in v1.0 and v1.1" do
|
38
|
+
context "when reading v1.0 tag" do
|
39
|
+
it "should contain comments frame" do
|
40
|
+
frame = subject.select { |frame| frame.id == :comments }.first
|
41
|
+
frame.content.should == "dddddddddddddddddddddddddddddD"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should contain genre frame" do
|
45
|
+
frame = subject.select { |frame| frame.id == :genre }.first
|
46
|
+
frame.content.should == "Blues"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should not contain track nr frame" do
|
50
|
+
subject.select { |frame| frame.id == :track_nr }.first.should be_nil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
context "when reading v1.1 tag" do
|
54
|
+
subject { described_class.new(frame_bytes_v1_1).frames }
|
55
|
+
it "should contain comments frame" do
|
56
|
+
frame = subject.select { |frame| frame.id == :comments }.first
|
57
|
+
frame.content.should == "dddddddddddddddddddddddddddD"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should contain track nr frame" do
|
61
|
+
frame = subject.select { |frame| frame.id == :track_nr }.first
|
62
|
+
frame.content.should == "1"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
describe ID3Tag::ID3V2FrameParser do
|
3
|
+
let(:mp3_with_v2_3_tag) { mp3_fixture('id3v2.mp3') }
|
4
|
+
let(:frame_bytes) { File.read(mp3_with_v2_3_tag, 246, 10) }
|
5
|
+
let(:tag_major_version) { 3 }
|
6
|
+
describe "#frames" do
|
7
|
+
subject { described_class.new(frame_bytes, tag_major_version).frames }
|
8
|
+
it "should have frame TIT2" do
|
9
|
+
subject.select { |x| x.id == :TIT2 }.count.should == 1
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "text frames" do
|
13
|
+
it "should parse text frames and initialize as TextFrame objects" do
|
14
|
+
subject.select { |x| x.id == :TIT2 }.first.should be_kind_of(ID3Tag::Frames::V2::TextFrame)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ID3Tag::ID3v2TagHeader do
|
4
|
+
subject { described_class.new(header_data) }
|
5
|
+
|
6
|
+
describe "#major_version_number" do
|
7
|
+
context "when first bit represent 3" do
|
8
|
+
let(:header_data) { "ID3\03\00..." }
|
9
|
+
its(:major_version_number) { should == 3 }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#minor_version_number" do
|
14
|
+
context "when 2nd bit represent 2" do
|
15
|
+
let(:header_data) { "ID3\03\02..." }
|
16
|
+
its(:minor_version_number) { should == 2 }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#version_number" do
|
21
|
+
let(:header_data) { "ID3\02\03..." }
|
22
|
+
its(:version_number) { should == "2.3" }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "header flags" do
|
26
|
+
context "when flags bite is 0b10000000" do
|
27
|
+
let(:header_data) { "ID3\03\00#{0b10000000.chr}" }
|
28
|
+
its(:unsynchronisation?) { should be_true }
|
29
|
+
its(:extended_header?) { should be_false }
|
30
|
+
its(:experimental?) { should be_false }
|
31
|
+
its(:footer_present?) { should be_false }
|
32
|
+
end
|
33
|
+
context "when flags bite is 0b01000000" do
|
34
|
+
let(:header_data) { "ID3\03\00#{0b01000000.chr}" }
|
35
|
+
its(:unsynchronisation?) { should be_false }
|
36
|
+
its(:extended_header?) { should be_true }
|
37
|
+
its(:experimental?) { should be_false }
|
38
|
+
its(:footer_present?) { should be_false }
|
39
|
+
end
|
40
|
+
context "when flags bite is 0b00100000" do
|
41
|
+
let(:header_data) { "ID3\03\00#{0b00100000.chr}" }
|
42
|
+
its(:unsynchronisation?) { should be_false }
|
43
|
+
its(:extended_header?) { should be_false }
|
44
|
+
its(:experimental?) { should be_true }
|
45
|
+
its(:footer_present?) { should be_false }
|
46
|
+
end
|
47
|
+
context "when flags bite is 0b00010000" do
|
48
|
+
let(:header_data) { "ID3\03\00#{0b00010000.chr}" }
|
49
|
+
its(:unsynchronisation?) { should be_false }
|
50
|
+
its(:extended_header?) { should be_false }
|
51
|
+
its(:experimental?) { should be_false }
|
52
|
+
its(:footer_present?) { should be_true }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#tag_size" do
|
57
|
+
let(:header_data) { "ID3abc\x00\x00\x01\x7F" }
|
58
|
+
its(:tag_size) { should == 255 }
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ID3Tag do
|
4
|
+
let(:file) { mp3_fixture('id3v2.mp3') }
|
5
|
+
describe "#read" do
|
6
|
+
it "reads file tag" do
|
7
|
+
ID3Tag.read(file).should be_instance_of(ID3Tag::Tag)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "accepts block" do
|
11
|
+
expect do |b|
|
12
|
+
ID3Tag.read(file, &b)
|
13
|
+
end.to yield_control
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
describe ID3Tag::NumberUtil do
|
3
|
+
describe "#convert_string_to_32bit_integer" do
|
4
|
+
context "when string with 4 bytes given" do
|
5
|
+
it "should return integer" do
|
6
|
+
described_class.convert_string_to_32bit_integer("abcd").should == 1633837924
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
context "when string with less than 4 bytes given" do
|
11
|
+
it "should raise Argument error" do
|
12
|
+
expect do
|
13
|
+
described_class.convert_string_to_32bit_integer("ab")
|
14
|
+
end.to raise_error(ArgumentError)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#convert_32bit_integer_to_string" do
|
20
|
+
it "should return 4 byte string" do
|
21
|
+
described_class.convert_32bit_integer_to_string(1633837924).should == "abcd"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ID3Tag::StringUtil do
|
4
|
+
describe "#blank?" do
|
5
|
+
subject { described_class.blank?(test_string) }
|
6
|
+
context "when test string is like ''" do
|
7
|
+
let(:test_string) { "" }
|
8
|
+
it { should be_true }
|
9
|
+
end
|
10
|
+
|
11
|
+
context "when test string is like ' '" do
|
12
|
+
let(:test_string) { " " }
|
13
|
+
it { should be_true }
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when test string is like 'foo'" do
|
17
|
+
let(:test_string) { "foo" }
|
18
|
+
it { should be_false }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
describe ID3Tag::SynchsafeInteger do
|
3
|
+
it "encodes regular integers" do
|
4
|
+
described_class.encode(255).should eq(383)
|
5
|
+
described_class.encode(5).should eq(5)
|
6
|
+
described_class.encode(128).should eq(256)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "decodes synchsafe integers" do
|
10
|
+
described_class.decode(383).should eq(255)
|
11
|
+
described_class.decode(5).should eq(5)
|
12
|
+
described_class.decode(256).should eq(128)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ID3Tag::Tag do
|
4
|
+
let(:mp3_with_v1_tag) { mp3_fixture('id3v1_without_track_nr.mp3') }
|
5
|
+
let(:mp3_with_v1_1_tag) { mp3_fixture('id3v1_with_track_nr.mp3') }
|
6
|
+
context "when reading file with v1.x tag" do
|
7
|
+
subject { described_class.new(mp3_with_v1_tag)}
|
8
|
+
describe "#frames" do
|
9
|
+
it "reads frames from source" do
|
10
|
+
subject.frames.size.should > 0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "Class methods" do
|
15
|
+
describe "#read" do
|
16
|
+
it "should initialize new instance of tag object" do
|
17
|
+
described_class.read(mp3_with_v1_tag).should be_instance_of(described_class)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#get_frame" do
|
23
|
+
it "returns string with frames content" do
|
24
|
+
subject.get_frame(:title).should be_kind_of(ID3Tag::Frames::V1::TextFrame)
|
25
|
+
subject.get_frame(:title).id.should == :title
|
26
|
+
end
|
27
|
+
|
28
|
+
it "raises MultipleFrameError when tag has multiple tags with the same id" do
|
29
|
+
subject.stub(:frames) { [ID3Tag::Frames::V1::TextFrame.new(:TIT2, "some title"), ID3Tag::Frames::V1::TextFrame.new(:TIT2, "some other title")] }
|
30
|
+
expect { subject.get_frame(:TIT2) }.to raise_error(ID3Tag::Tag::MultipleFrameError)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#get_frames" do
|
35
|
+
it "returns string with frames content" do
|
36
|
+
subject.get_frames(:title).should be_kind_of(Array)
|
37
|
+
subject.get_frames(:title).count.should == 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "#frames" do
|
42
|
+
context "when file has v2.x tag version" do
|
43
|
+
before do
|
44
|
+
ID3Tag::AudioFile.any_instance.stub(:v1_tag_present?) { true }
|
45
|
+
ID3Tag::AudioFile.any_instance.stub(:v2_tag_present?) { true }
|
46
|
+
ID3Tag::ID3V2FrameParser.any_instance.stub(:frames) { [1,2,3] }
|
47
|
+
end
|
48
|
+
it "should return frames from ID3V2FrameParser class" do
|
49
|
+
subject.frames.should == [1,2,3]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
context "when file has v2.x tag version" do
|
53
|
+
before do
|
54
|
+
ID3Tag::AudioFile.any_instance.stub(:v1_tag_present?) { true }
|
55
|
+
ID3Tag::AudioFile.any_instance.stub(:v2_tag_present?) { false }
|
56
|
+
ID3Tag::ID3V1FrameParser.any_instance.stub(:frames) { [1,2,3] }
|
57
|
+
end
|
58
|
+
it "should return frames from ID3V1FrameParser class" do
|
59
|
+
subject.frames.should == [1,2,3]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#frame_ids" do
|
65
|
+
before do
|
66
|
+
subject.stub(:frames) { [ID3Tag::Frames::V1::TextFrame.new(:TIT2, "some title")] }
|
67
|
+
end
|
68
|
+
it "returns its of all frames" do
|
69
|
+
subject.frame_ids.should == [:TIT2]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "Easy access methods to text frames" do
|
75
|
+
subject { described_class.new(mp3_with_v1_1_tag)}
|
76
|
+
its(:title) { should == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaA" }
|
77
|
+
its(:artist) { should == "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbB" }
|
78
|
+
its(:album) { should == "cccccccccccccccccccccccccccccC" }
|
79
|
+
its(:comments) { should == "dddddddddddddddddddddddddddD" }
|
80
|
+
its(:genre) { should == "Blues" }
|
81
|
+
its(:year) { should == "2003" }
|
82
|
+
its(:track_nr) { should == "1" }
|
83
|
+
end
|
84
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
if ENV['CI']
|
2
|
+
require 'coveralls'
|
3
|
+
Coveralls.wear!
|
4
|
+
else
|
5
|
+
require 'simplecov'
|
6
|
+
SimpleCov.start
|
7
|
+
end
|
8
|
+
|
1
9
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
10
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
11
|
require 'rspec'
|
@@ -5,7 +13,7 @@ require 'id3tag'
|
|
5
13
|
|
6
14
|
# Requires supporting files with custom matchers and macros, etc,
|
7
15
|
# in ./support/ and its subdirectories.
|
8
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
16
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
9
17
|
|
10
18
|
RSpec.configure do |config|
|
11
19
|
|
metadata
CHANGED
@@ -1,36 +1,60 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: id3tag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Krists Ozols
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-05-01 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
14
|
+
name: debugger
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jeweler
|
16
29
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
30
|
requirements:
|
19
31
|
- - ~>
|
20
32
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
33
|
+
version: 1.8.4
|
22
34
|
type: :development
|
23
35
|
prerelease: false
|
24
36
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
37
|
requirements:
|
27
38
|
- - ~>
|
28
39
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
40
|
+
version: 1.8.4
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
30
55
|
- !ruby/object:Gem::Dependency
|
31
56
|
name: rdoc
|
32
57
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
58
|
requirements:
|
35
59
|
- - ~>
|
36
60
|
- !ruby/object:Gem::Version
|
@@ -38,47 +62,41 @@ dependencies:
|
|
38
62
|
type: :development
|
39
63
|
prerelease: false
|
40
64
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
65
|
requirements:
|
43
66
|
- - ~>
|
44
67
|
- !ruby/object:Gem::Version
|
45
68
|
version: '3.12'
|
46
69
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
70
|
+
name: rspec
|
48
71
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
72
|
requirements:
|
51
73
|
- - ~>
|
52
74
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
75
|
+
version: 2.13.0
|
54
76
|
type: :development
|
55
77
|
prerelease: false
|
56
78
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
79
|
requirements:
|
59
80
|
- - ~>
|
60
81
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
82
|
+
version: 2.13.0
|
62
83
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
84
|
+
name: simplecov
|
64
85
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
86
|
requirements:
|
67
|
-
- -
|
87
|
+
- - ! '>='
|
68
88
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
89
|
+
version: '0'
|
70
90
|
type: :development
|
71
91
|
prerelease: false
|
72
92
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
93
|
requirements:
|
75
|
-
- -
|
94
|
+
- - ! '>='
|
76
95
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
96
|
+
version: '0'
|
78
97
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
98
|
+
name: coveralls
|
80
99
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
100
|
requirements:
|
83
101
|
- - ! '>='
|
84
102
|
- !ruby/object:Gem::Version
|
@@ -86,57 +104,103 @@ dependencies:
|
|
86
104
|
type: :development
|
87
105
|
prerelease: false
|
88
106
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
107
|
requirements:
|
91
108
|
- - ! '>='
|
92
109
|
- !ruby/object:Gem::Version
|
93
110
|
version: '0'
|
94
|
-
description: Native Ruby ID3 tag reader
|
111
|
+
description: Native Ruby ID3 tag reader that aims for 100% covarage of ID3v2.x and
|
112
|
+
ID3v1.x standards
|
95
113
|
email: krists@iesals.lv
|
96
114
|
executables: []
|
97
115
|
extensions: []
|
98
116
|
extra_rdoc_files:
|
99
117
|
- LICENSE.txt
|
100
|
-
- README.
|
118
|
+
- README.md
|
101
119
|
files:
|
102
120
|
- .document
|
103
121
|
- .rspec
|
122
|
+
- .travis.yml
|
104
123
|
- Gemfile
|
105
124
|
- Gemfile.lock
|
106
125
|
- LICENSE.txt
|
107
|
-
- README.
|
126
|
+
- README.md
|
108
127
|
- Rakefile
|
109
128
|
- VERSION
|
110
129
|
- id3tag.gemspec
|
111
130
|
- lib/id3tag.rb
|
112
|
-
-
|
131
|
+
- lib/id3tag/audio_file.rb
|
132
|
+
- lib/id3tag/frame_id_advisor.rb
|
133
|
+
- lib/id3tag/frames/util/genre_names.rb
|
134
|
+
- lib/id3tag/frames/v1/comments_frame.rb
|
135
|
+
- lib/id3tag/frames/v1/genre_frame.rb
|
136
|
+
- lib/id3tag/frames/v1/text_frame.rb
|
137
|
+
- lib/id3tag/frames/v1/track_nr_frame.rb
|
138
|
+
- lib/id3tag/frames/v2/basic_frame.rb
|
139
|
+
- lib/id3tag/frames/v2/comments_frame.rb
|
140
|
+
- lib/id3tag/frames/v2/frame_fabricator.rb
|
141
|
+
- lib/id3tag/frames/v2/genre_frame.rb
|
142
|
+
- lib/id3tag/frames/v2/genre_frame/genre_parser.rb
|
143
|
+
- lib/id3tag/frames/v2/genre_frame/genre_parser_24.rb
|
144
|
+
- lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb
|
145
|
+
- lib/id3tag/frames/v2/text_frame.rb
|
146
|
+
- lib/id3tag/frames/v2/unique_file_id_frame.rb
|
147
|
+
- lib/id3tag/id3_v1_frame_parser.rb
|
148
|
+
- lib/id3tag/id3_v2_frame_parser.rb
|
149
|
+
- lib/id3tag/id3_v2_tag_header.rb
|
150
|
+
- lib/id3tag/number_util.rb
|
151
|
+
- lib/id3tag/string_util.rb
|
152
|
+
- lib/id3tag/synchsafe_integer.rb
|
153
|
+
- lib/id3tag/tag.rb
|
154
|
+
- spec/fixtures/id3v1_and_v2.mp3
|
155
|
+
- spec/fixtures/id3v1_with_track_nr.mp3
|
156
|
+
- spec/fixtures/id3v1_without_track_nr.mp3
|
157
|
+
- spec/fixtures/id3v2.mp3
|
158
|
+
- spec/lib/id3tag/audio_file_spec.rb
|
159
|
+
- spec/lib/id3tag/frames/util/genre_name_by_id_finder_spec.rb
|
160
|
+
- spec/lib/id3tag/frames/v1/comments_frame_spec.rb
|
161
|
+
- spec/lib/id3tag/frames/v1/genre_frame_spec.rb
|
162
|
+
- spec/lib/id3tag/frames/v1/text_frame_spec.rb
|
163
|
+
- spec/lib/id3tag/frames/v1/track_nr_frame_spec.rb
|
164
|
+
- spec/lib/id3tag/frames/v2/basic_frame_spec.rb
|
165
|
+
- spec/lib/id3tag/frames/v2/comments_frame_spec.rb
|
166
|
+
- spec/lib/id3tag/frames/v2/genre_frame/genre_parser_24_spec.rb
|
167
|
+
- spec/lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24_spec.rb
|
168
|
+
- spec/lib/id3tag/frames/v2/genre_frame_spec.rb
|
169
|
+
- spec/lib/id3tag/frames/v2/text_frame_spec.rb
|
170
|
+
- spec/lib/id3tag/frames/v2/unique_file_id_frame_spec.rb
|
171
|
+
- spec/lib/id3tag/id3_v1_frame_parser_spec.rb
|
172
|
+
- spec/lib/id3tag/id3_v2_frame_parser_spec.rb
|
173
|
+
- spec/lib/id3tag/id3_v2_tag_header_spec.rb
|
174
|
+
- spec/lib/id3tag/id3tag_spec.rb
|
175
|
+
- spec/lib/id3tag/number_util_spec.rb
|
176
|
+
- spec/lib/id3tag/string_util_spec.rb
|
177
|
+
- spec/lib/id3tag/synchsafe_integer_spec.rb
|
178
|
+
- spec/lib/id3tag/tag_spec.rb
|
113
179
|
- spec/spec_helper.rb
|
180
|
+
- spec/support/mp3_fixtures.rb
|
114
181
|
homepage: http://github.com/krists/id3tag
|
115
182
|
licenses:
|
116
183
|
- MIT
|
184
|
+
metadata: {}
|
117
185
|
post_install_message:
|
118
186
|
rdoc_options: []
|
119
187
|
require_paths:
|
120
188
|
- lib
|
121
189
|
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
190
|
requirements:
|
124
191
|
- - ! '>='
|
125
192
|
- !ruby/object:Gem::Version
|
126
|
-
version:
|
127
|
-
segments:
|
128
|
-
- 0
|
129
|
-
hash: -665629855
|
193
|
+
version: 1.9.2
|
130
194
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
-
none: false
|
132
195
|
requirements:
|
133
196
|
- - ! '>='
|
134
197
|
- !ruby/object:Gem::Version
|
135
198
|
version: '0'
|
136
199
|
requirements: []
|
137
200
|
rubyforge_project:
|
138
|
-
rubygems_version:
|
201
|
+
rubygems_version: 2.0.3
|
139
202
|
signing_key:
|
140
|
-
specification_version:
|
141
|
-
summary: Native Ruby ID3 tag reader
|
203
|
+
specification_version: 4
|
204
|
+
summary: Native Ruby ID3 tag reader that aims for 100% covarage of ID3v2.x and ID3v1.x
|
205
|
+
standards
|
142
206
|
test_files: []
|