id3tag 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +15 -0
  2. data/.travis.yml +7 -0
  3. data/Gemfile +9 -9
  4. data/Gemfile.lock +36 -14
  5. data/README.md +73 -0
  6. data/Rakefile +3 -2
  7. data/VERSION +1 -1
  8. data/id3tag.gemspec +75 -19
  9. data/lib/id3tag.rb +34 -0
  10. data/lib/id3tag/audio_file.rb +90 -0
  11. data/lib/id3tag/frame_id_advisor.rb +50 -0
  12. data/lib/id3tag/frames/util/genre_names.rb +140 -0
  13. data/lib/id3tag/frames/v1/comments_frame.rb +24 -0
  14. data/lib/id3tag/frames/v1/genre_frame.rb +19 -0
  15. data/lib/id3tag/frames/v1/text_frame.rb +27 -0
  16. data/lib/id3tag/frames/v1/track_nr_frame.rb +18 -0
  17. data/lib/id3tag/frames/v2/basic_frame.rb +26 -0
  18. data/lib/id3tag/frames/v2/comments_frame.rb +44 -0
  19. data/lib/id3tag/frames/v2/frame_fabricator.rb +36 -0
  20. data/lib/id3tag/frames/v2/genre_frame.rb +34 -0
  21. data/lib/id3tag/frames/v2/genre_frame/genre_parser.rb +36 -0
  22. data/lib/id3tag/frames/v2/genre_frame/genre_parser_24.rb +15 -0
  23. data/lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb +39 -0
  24. data/lib/id3tag/frames/v2/text_frame.rb +37 -0
  25. data/lib/id3tag/frames/v2/unique_file_id_frame.rb +25 -0
  26. data/lib/id3tag/id3_v1_frame_parser.rb +87 -0
  27. data/lib/id3tag/id3_v2_frame_parser.rb +72 -0
  28. data/lib/id3tag/id3_v2_tag_header.rb +61 -0
  29. data/lib/id3tag/number_util.rb +14 -0
  30. data/lib/id3tag/string_util.rb +7 -0
  31. data/lib/id3tag/synchsafe_integer.rb +28 -0
  32. data/lib/id3tag/tag.rb +121 -0
  33. data/spec/fixtures/id3v1_and_v2.mp3 +0 -0
  34. data/spec/fixtures/id3v1_with_track_nr.mp3 +0 -0
  35. data/spec/fixtures/id3v1_without_track_nr.mp3 +0 -0
  36. data/spec/fixtures/id3v2.mp3 +0 -0
  37. data/spec/lib/id3tag/audio_file_spec.rb +40 -0
  38. data/spec/lib/id3tag/frames/util/genre_name_by_id_finder_spec.rb +18 -0
  39. data/spec/lib/id3tag/frames/v1/comments_frame_spec.rb +31 -0
  40. data/spec/lib/id3tag/frames/v1/genre_frame_spec.rb +20 -0
  41. data/spec/lib/id3tag/frames/v1/text_frame_spec.rb +14 -0
  42. data/spec/lib/id3tag/frames/v1/track_nr_frame_spec.rb +19 -0
  43. data/spec/lib/id3tag/frames/v2/basic_frame_spec.rb +25 -0
  44. data/spec/lib/id3tag/frames/v2/comments_frame_spec.rb +45 -0
  45. data/spec/lib/id3tag/frames/v2/genre_frame/genre_parser_24_spec.rb +26 -0
  46. data/spec/lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24_spec.rb +48 -0
  47. data/spec/lib/id3tag/frames/v2/genre_frame_spec.rb +44 -0
  48. data/spec/lib/id3tag/frames/v2/text_frame_spec.rb +59 -0
  49. data/spec/lib/id3tag/frames/v2/unique_file_id_frame_spec.rb +31 -0
  50. data/spec/lib/id3tag/id3_v1_frame_parser_spec.rb +67 -0
  51. data/spec/lib/id3tag/id3_v2_frame_parser_spec.rb +18 -0
  52. data/spec/lib/id3tag/id3_v2_tag_header_spec.rb +60 -0
  53. data/spec/lib/id3tag/id3tag_spec.rb +17 -0
  54. data/spec/lib/id3tag/number_util_spec.rb +24 -0
  55. data/spec/lib/id3tag/string_util_spec.rb +21 -0
  56. data/spec/lib/id3tag/synchsafe_integer_spec.rb +14 -0
  57. data/spec/lib/id3tag/tag_spec.rb +84 -0
  58. data/spec/spec_helper.rb +9 -1
  59. data/spec/support/mp3_fixtures.rb +4 -0
  60. metadata +102 -38
  61. data/README.rdoc +0 -19
  62. 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
 
@@ -0,0 +1,4 @@
1
+ def mp3_fixture(filename)
2
+ fixtures_dir = File.expand_path('../../fixtures', __FILE__)
3
+ File.open(File.join(fixtures_dir, filename))
4
+ end
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.0.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: 2012-12-25 00:00:00.000000000 Z
11
+ date: 2013-05-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: rspec
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: 2.8.0
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: 2.8.0
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: bundler
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: 1.1.5
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: 1.1.5
82
+ version: 2.13.0
62
83
  - !ruby/object:Gem::Dependency
63
- name: jeweler
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: 1.8.4
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: 1.8.4
96
+ version: '0'
78
97
  - !ruby/object:Gem::Dependency
79
- name: simplecov
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/writer.
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.rdoc
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.rdoc
126
+ - README.md
108
127
  - Rakefile
109
128
  - VERSION
110
129
  - id3tag.gemspec
111
130
  - lib/id3tag.rb
112
- - spec/id3tag_spec.rb
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: '0'
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: 1.8.24
201
+ rubygems_version: 2.0.3
139
202
  signing_key:
140
- specification_version: 3
141
- summary: Native Ruby ID3 tag reader/writer.
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: []