id3tag 0.0.0 → 0.1.0
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.
- 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: []
|