id3tag 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 192009692506623f17cd3c91ff040cb5afddd8db
4
- data.tar.gz: ea9a1c3f2009ac8d4cfaad09f5e7d3837a527934
3
+ metadata.gz: b979a732340ba5dc962c63c0dbb3eeaeaeda5ddc
4
+ data.tar.gz: 86bf018537df030ace61374ee53dde985eeae97d
5
5
  SHA512:
6
- metadata.gz: f796886149fa97049de4262cd06d29aa43033d1e61f1c33f80be3298a8c6e9b0fb0109f5ad1518f408644c32e712e1e8da0f482bc6e39de2526f9c4b8808f7d7
7
- data.tar.gz: 03b35723226f0a0d93c14958b755bbe79f8064930739f7868241a6a8ea6ec03c846312483457db180e47a1316a8e9d87ca3fd0396823e58b7aad445f6d3e1177
6
+ metadata.gz: 482d8a339e51dfb36274429a23e497409d11459f9dbfd5f2fcbef75944558070ebaef7d2c688cc3f582723375a7243cab372208652a5c06621051528547a5be1
7
+ data.tar.gz: 4276bb8473958cb3e8d4de143722bee763324ba0d37f16f0dfb8bd866fa8a62a6b6f49393f932288b76e9e0b7d2f7469ea29a31810de4ee3ba87e6f38dc5a8ee
data/README.md CHANGED
@@ -25,9 +25,11 @@ mp3_file = File.open('/path/to/your/favorite_song.mp3')
25
25
  tag = ID3Tag.read(mp3_file)
26
26
  puts "#{tag.artist} - #{tag.title}"
27
27
  ```
28
- `ID3Tag::Tag` class provides easy accessors to frames like `artist`, `title`, `album`, `year`, `track_nr`, `genre` but you can read any frame by using `get_frame(id)` or `get_frame_content(id)` or browsing all frames by calling `frames`.
28
+ `ID3Tag::Tag` class provides easy accessors to frames like `artist`, `title`, `album`, `year`, `track_nr`, `genre`, `comments` but you can read any frame by using `get_frame(id)` or `get_frames(id)` or browsing all frames by calling `frames`.
29
29
  When using easy accessors to frames like `artist` the reader will look for v.2.x tags artist frame first and if it can not find it artist frame from v1.x will be returned (if v1.x tag exists)
30
30
 
31
+ There can be more than one `comments` frame in the tag. They differ by language, too access specific comment frame an extra argument can be passed (Default is english). For example `tag.comments(:lav)` will look for comments in Latvian. Language codes can be seen here: `https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes`
32
+
31
33
  ```ruby
32
34
  mp3s = Dir.entries("/some/dir").select { |filename| filename =~ /\.mp3/i }
33
35
 
@@ -41,7 +43,9 @@ mp3s.each do |file|
41
43
  puts tag.track_nr
42
44
  puts tag.genre
43
45
  puts "---"
44
- puts tag.get_frame_content(:TIT2)
46
+ puts tag.get_frame(:TIT2).content
47
+ puts tag.get_frames(:COMM).first.content
48
+ puts tag.get_frames(:COMM).last.language
45
49
  end
46
50
  end
47
51
  ```
@@ -78,3 +82,7 @@ You can inspect tag by calling `frame_ids` to see available frame ids or `frames
78
82
  Copyright (c) 2013 Krists Ozols. See LICENSE.txt for
79
83
  further details.
80
84
 
85
+
86
+
87
+ [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/krists/id3tag/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
88
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.0
@@ -2,15 +2,15 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: id3tag 0.4.0 ruby lib
5
+ # stub: id3tag 0.5.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "id3tag"
9
- s.version = "0.4.0"
9
+ s.version = "0.5.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.authors = ["Krists Ozols"]
13
- s.date = "2013-10-22"
13
+ s.date = "2013-11-10"
14
14
  s.description = "Native Ruby ID3 tag reader that aims for 100% covarage of ID3v2.x and ID3v1.x standards"
15
15
  s.email = "krists@iesals.lv"
16
16
  s.extra_rdoc_files = [
@@ -44,13 +44,17 @@ Gem::Specification.new do |s|
44
44
  "lib/id3tag/frames/v2/genre_frame/genre_parser.rb",
45
45
  "lib/id3tag/frames/v2/genre_frame/genre_parser_24.rb",
46
46
  "lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb",
47
+ "lib/id3tag/frames/v2/involved_people_list_frame.rb",
48
+ "lib/id3tag/frames/v2/private_frame.rb",
47
49
  "lib/id3tag/frames/v2/text_frame.rb",
48
50
  "lib/id3tag/frames/v2/unique_file_id_frame.rb",
49
51
  "lib/id3tag/frames/v2/unsychronized_transcription_frame.rb",
52
+ "lib/id3tag/frames/v2/user_text_frame.rb",
50
53
  "lib/id3tag/id3_v1_frame_parser.rb",
51
54
  "lib/id3tag/id3_v2_frame_parser.rb",
52
55
  "lib/id3tag/id3_v2_tag_header.rb",
53
56
  "lib/id3tag/number_util.rb",
57
+ "lib/id3tag/scope.rb",
54
58
  "lib/id3tag/string_util.rb",
55
59
  "lib/id3tag/synchsafe_integer.rb",
56
60
  "lib/id3tag/tag.rb",
@@ -61,6 +65,10 @@ Gem::Specification.new do |s|
61
65
  "spec/fixtures/id3v1_with_track_nr.mp3",
62
66
  "spec/fixtures/id3v1_without_track_nr.mp3",
63
67
  "spec/fixtures/id3v2.mp3",
68
+ "spec/fixtures/pov_20131018-2100a.mp3.v1_tag_body",
69
+ "spec/fixtures/pov_20131018-2100a.mp3.v2_3_tag_body",
70
+ "spec/fixtures/signals_1.mp3.v2_3_tag_body",
71
+ "spec/id3tag_extract_tags",
64
72
  "spec/lib/id3tag/audio_file_spec.rb",
65
73
  "spec/lib/id3tag/frames/util/genre_name_by_id_finder_spec.rb",
66
74
  "spec/lib/id3tag/frames/v1/comments_frame_spec.rb",
@@ -97,7 +105,7 @@ Gem::Specification.new do |s|
97
105
  s.licenses = ["MIT"]
98
106
  s.require_paths = ["lib"]
99
107
  s.required_ruby_version = Gem::Requirement.new(">= 1.9.2")
100
- s.rubygems_version = "2.1.5"
108
+ s.rubygems_version = "2.1.10"
101
109
  s.summary = "Native Ruby ID3 tag reader that aims for 100% covarage of ID3v2.x and ID3v1.x standards"
102
110
 
103
111
  if s.respond_to? :specification_version then
@@ -9,6 +9,7 @@ require "id3tag/id3_v1_frame_parser"
9
9
  require "id3tag/id3_v2_frame_parser"
10
10
  require "id3tag/frame_id_advisor"
11
11
  require "id3tag/tag"
12
+ require "id3tag/scope"
12
13
  require "id3tag/frames/util/genre_names"
13
14
  require "id3tag/frames/v1/text_frame"
14
15
  require "id3tag/frames/v1/genre_frame"
@@ -16,7 +17,10 @@ require "id3tag/frames/v1/comments_frame"
16
17
  require "id3tag/frames/v1/track_nr_frame"
17
18
  require "id3tag/frames/v2/basic_frame"
18
19
  require "id3tag/frames/v2/text_frame"
20
+ require "id3tag/frames/v2/user_text_frame"
21
+ require "id3tag/frames/v2/involved_people_list_frame"
19
22
  require "id3tag/frames/v2/unique_file_id_frame"
23
+ require "id3tag/frames/v2/private_frame"
20
24
  require "id3tag/frames/v2/comments_frame"
21
25
  require "id3tag/frames/v2/unsychronized_transcription_frame"
22
26
  require "id3tag/frames/v2/genre_frame"
@@ -27,8 +31,8 @@ require "id3tag/frames/v2/frame_fabricator"
27
31
  require "id3tag/frames/v2/frame_flags"
28
32
 
29
33
  module ID3Tag
30
- def self.read(source, version = :all)
31
- tag = Tag.read(source, version)
34
+ def self.read(source, scope = :all)
35
+ tag = Tag.read(source, scope)
32
36
  yield tag if block_given?
33
37
  tag
34
38
  end
@@ -57,7 +57,13 @@ module ID3Tag
57
57
 
58
58
  def get_v2_extended_header_size
59
59
  if v2_tag_header.extended_header?
60
- SynchsafeInteger.decode(NumberUtil.convert_string_to_32bit_integer(v2_extended_header_size_bytes))
60
+ if v2_tag_major_version_number == 3
61
+ # ext. header size for 2.3.0 does not include size bytes.
62
+ # There are only 2 possible sizes - 6 or 10 bytes, which means extended header can take 10 or 14 bytes.
63
+ 4 + NumberUtil.convert_string_to_32bit_integer(v2_extended_header_size_bytes)
64
+ else
65
+ SynchsafeInteger.decode(NumberUtil.convert_string_to_32bit_integer(v2_extended_header_size_bytes))
66
+ end
61
67
  else
62
68
  0
63
69
  end
@@ -1,5 +1,7 @@
1
1
  module ID3Tag
2
2
  class FrameIdAdvisor
3
+ ANY_MAJOR_VERSION = 'x'
4
+
3
5
  COMMON_FRAME_IDS_BY_VERSION = {
4
6
  'v1.x' => {
5
7
  :artist => :artist,
@@ -2,6 +2,7 @@ module ID3Tag
2
2
  module Frames
3
3
  module V2
4
4
  class CommentsFrame < TextFrame
5
+ LANGUAGE_BYTE_COUNT = 3
5
6
 
6
7
  # language code according to https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes
7
8
  def language
@@ -9,11 +10,11 @@ module ID3Tag
9
10
  end
10
11
 
11
12
  def description
12
- @desciption ||= encoded_text_and_content_parts.first
13
+ @desciption ||= parts.first
13
14
  end
14
15
 
15
16
  def text
16
- @text ||= cut_at_null_byte(encoded_text_and_content_parts.last)
17
+ @text ||= StringUtil.cut_at_null_byte(parts.last)
17
18
  end
18
19
 
19
20
  def content
@@ -26,23 +27,22 @@ module ID3Tag
26
27
 
27
28
  private
28
29
 
29
- def encoded_text_and_content_parts
30
- @encoded_text_and_content_parts ||= encoded_text_and_content.split(NULL_BYTE)
30
+ def parts
31
+ @parts ||= encoded_content.split(StringUtil::NULL_BYTE, 2)
31
32
  end
32
33
 
33
- def encoded_text_and_content
34
- raw_text_and_content.encode(destination_encoding, source_encoding)
34
+ def encoded_content
35
+ content_without_encoding_byte_and_language.encode(destination_encoding, source_encoding)
35
36
  end
36
37
 
37
- def raw_text_and_content
38
- content_without_encoding_byte[3..-1]
38
+ def content_without_encoding_byte_and_language
39
+ content_without_encoding_byte.byteslice(LANGUAGE_BYTE_COUNT, content_without_encoding_byte.bytesize - LANGUAGE_BYTE_COUNT)
39
40
  end
40
41
 
41
42
  def get_language
42
- content_without_encoding_byte[0..2].downcase
43
+ content_without_encoding_byte[0...LANGUAGE_BYTE_COUNT].downcase
43
44
  end
44
45
  end
45
46
  end
46
47
  end
47
48
  end
48
-
@@ -20,6 +20,8 @@ module ID3Tag
20
20
  case @id
21
21
  when /^(TCON|TCO)$/
22
22
  GenreFrame
23
+ when /^TXX$/
24
+ UserTextFrame
23
25
  when /^T/
24
26
  TextFrame
25
27
  when /^(COM|COMM)$/
@@ -28,6 +30,10 @@ module ID3Tag
28
30
  UnsychronizedTranscriptionFrame
29
31
  when /^UFID$/
30
32
  UniqueFileIdFrame
33
+ when /^(IPL|IPLS)$/
34
+ InvolvedPeopleListFrame
35
+ when /^PRIV$/
36
+ PrivateFrame
31
37
  else
32
38
  BasicFrame
33
39
  end
@@ -0,0 +1,8 @@
1
+ module ID3Tag
2
+ module Frames
3
+ module V2
4
+ class InvolvedPeopleListFrame < TextFrame
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module ID3Tag
2
+ module Frames
3
+ module V2
4
+ class PrivateFrame < UniqueFileIdFrame
5
+ end
6
+ end
7
+ end
8
+ end
@@ -2,7 +2,6 @@ module ID3Tag
2
2
  module Frames
3
3
  module V2
4
4
  class TextFrame < BasicFrame
5
- NULL_BYTE = "\x00"
6
5
  UnsupportedTextEncoding = Class.new(StandardError)
7
6
  ENCODING_MAP = {
8
7
  0b0 => Encoding::ISO8859_1,
@@ -12,22 +11,21 @@ module ID3Tag
12
11
  }
13
12
 
14
13
  def content
15
- @content ||= cut_at_null_byte(content_without_encoding_byte.encode(destination_encoding, source_encoding))
14
+ @content ||= StringUtil.cut_at_null_byte(encoded_content)
16
15
  end
17
16
 
18
- alias inspectable_content content
19
-
20
- def cut_at_null_byte(string)
21
- string.split(NULL_BYTE, 2).first
17
+ def inspectable_content
18
+ content
22
19
  end
23
20
 
24
21
  private
25
22
 
26
- def source_encoding
27
- ENCODING_MAP.fetch(get_encoding_byte) { raise UnsupportedTextEncoding }
23
+ def encoded_content
24
+ content_without_encoding_byte.encode(destination_encoding, source_encoding)
28
25
  end
29
26
 
30
- def current_encoding_map
27
+ def source_encoding
28
+ ENCODING_MAP.fetch(get_encoding_byte) { raise UnsupportedTextEncoding }
31
29
  end
32
30
 
33
31
  def destination_encoding
@@ -17,7 +17,7 @@ module ID3Tag
17
17
  private
18
18
 
19
19
  def content_split_apart_by_null_byte
20
- usable_content.split("\x00", 2)
20
+ usable_content.split(StringUtil::NULL_BYTE, 2)
21
21
  end
22
22
  end
23
23
  end
@@ -0,0 +1,22 @@
1
+ module ID3Tag
2
+ module Frames
3
+ module V2
4
+ class UserTextFrame < TextFrame
5
+
6
+ def content
7
+ StringUtil.cut_at_null_byte(content_parts.last)
8
+ end
9
+
10
+ def description
11
+ content_parts.first
12
+ end
13
+
14
+ private
15
+
16
+ def content_parts
17
+ @parts ||= encoded_content.split(StringUtil::NULL_BYTE, 2)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -73,7 +73,7 @@ module ID3Tag
73
73
  value = ""
74
74
  limit.times do
75
75
  char = @input.getc
76
- break if char == "\x00"
76
+ break if char == StringUtil::NULL_BYTE
77
77
  value << char
78
78
  end
79
79
  value
@@ -0,0 +1,19 @@
1
+ module ID3Tag
2
+ class Scope
3
+ UnsupportedScopeError = Class.new(ArgumentError)
4
+ SUPPORTED_SCOPES = [:v1, :v2, :all]
5
+
6
+ def initialize(version)
7
+ raise UnsupportedScopeError unless SUPPORTED_SCOPES.include?(version)
8
+ if version == :all
9
+ @included_versions = [:v1, :v2]
10
+ else
11
+ @included_versions = [version]
12
+ end
13
+ end
14
+
15
+ def include?(version)
16
+ @included_versions.include?(version)
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,7 @@
1
1
  module ID3Tag
2
2
  module StringUtil
3
+ NULL_BYTE = "\x00"
4
+
3
5
  def self.blank?(string)
4
6
  string !~ /[^[:space:]]/
5
7
  end
@@ -15,5 +17,9 @@ module ID3Tag
15
17
  unsynch.remove
16
18
  unsynch.output
17
19
  end
20
+
21
+ def self.cut_at_null_byte(string)
22
+ string.split(NULL_BYTE, 2).first
23
+ end
18
24
  end
19
25
  end
@@ -1,53 +1,49 @@
1
1
  module ID3Tag
2
2
  class Tag
3
- class MultipleFrameError < StandardError; end
3
+ MultipleFrameError = Class.new(StandardError)
4
4
 
5
5
  class << self
6
- def read(source, version = :all)
7
- new(source, version)
6
+ def read(source, scope = :all)
7
+ new(source, scope)
8
8
  end
9
9
  end
10
10
 
11
- def initialize(source, version = :all)
12
- @source, @version = source, version
11
+ def initialize(source, scope = :all)
12
+ @source, @scope = source, Scope.new(scope)
13
13
  end
14
14
 
15
- def artist
16
- get_frame_content(frame_id(:v2, :artist), frame_id(:v1, :artist))
17
- end
18
-
19
- def title
20
- get_frame_content(frame_id(:v2, :title), frame_id(:v1, :title))
21
- end
22
-
23
- def album
24
- get_frame_content(frame_id(:v2, :album), frame_id(:v1, :album))
25
- end
15
+ attr_reader :source, :scope
26
16
 
27
- def year
28
- get_frame_content(frame_id(:v2, :year), frame_id(:v1, :year))
29
- end
30
-
31
- def track_nr
32
- get_frame_content(frame_id(:v2, :track_nr), frame_id(:v1, :track_nr))
17
+ [:artist, :title, :album, :year, :track_nr, :genre].each do |name|
18
+ define_method(name) do
19
+ frame = first_frame_by_id(*possible_frame_ids_by_name(name))
20
+ frame && frame.content
21
+ end
33
22
  end
34
23
 
35
- def genre
36
- get_frame_content(frame_id(:v2, :genre), frame_id(:v1, :genre))
24
+ # TODO: Add Terms of use frame and Synchronised lyrics/text frame
25
+ [:comments, :unsychronized_transcription].each do |name|
26
+ define_method(name) do |lang = :eng|
27
+ frame = all_frames_by_id(*possible_frame_ids_by_name(name)).find { |x| x.language == lang.to_s }
28
+ frame && frame.content
29
+ end
37
30
  end
38
31
 
39
- def comments
40
- get_frame_content(frame_id(:v2, :comments), frame_id(:v1, :comments))
32
+ def first_frame_by_id(*ids)
33
+ first_existing_id = ids.find { |id| frame_ids.include?(id) }
34
+ first_existing_id && get_frame(first_existing_id)
41
35
  end
42
36
 
43
- def unsychronized_transcription
44
- get_frame_content(frame_id(:v2, :unsychronized_transcription))
37
+ def all_frames_by_id(*ids)
38
+ ids.inject([]) do |frames, id|
39
+ frames += get_frames(id)
40
+ end
45
41
  end
46
42
 
47
43
  def get_frame(frame_id)
48
44
  frames = get_frames(frame_id)
49
45
  if frames.count > 1
50
- raise MultipleFrameError, "Could not return only one frame with id: #{frame_id}. Tag has #{frames.count} of them"
46
+ raise MultipleFrameError, "Could not return only one frame with id: #{frame_id}. Tag has #{frames.count} of them. Try #get_frames to get all of them"
51
47
  else
52
48
  frames.first
53
49
  end
@@ -58,7 +54,7 @@ module ID3Tag
58
54
  end
59
55
 
60
56
  def frame_ids
61
- frames.map { |frame| frame.id }
57
+ @frame_ids ||= frames.map { |frame| frame.id }
62
58
  end
63
59
 
64
60
  def frames
@@ -66,7 +62,7 @@ module ID3Tag
66
62
  end
67
63
 
68
64
  def v2_frames
69
- if audio_file.v2_tag_present? && [:v2, :all].include?(@version)
65
+ if audio_file.v2_tag_present? && scope.include?(:v2)
70
66
  ID3V2FrameParser.new(audio_file.v2_tag_body, audio_file.v2_tag_major_version_number).frames
71
67
  else
72
68
  []
@@ -74,39 +70,28 @@ module ID3Tag
74
70
  end
75
71
 
76
72
  def v1_frames
77
- if audio_file.v1_tag_present? && [:v1, :all].include?(@version)
73
+ if audio_file.v1_tag_present? && scope.include?(:v1)
78
74
  ID3V1FrameParser.new(audio_file.v1_tag_body).frames
79
75
  else
80
76
  []
81
77
  end
82
78
  end
83
79
 
84
- def get_frame_content(frame_id, *alt_frame_ids)
85
- frame = nil
86
- alt_frame_ids.unshift(frame_id).each do |frame_id|
87
- frame = get_frame(frame_id)
88
- break if frame
89
- end
90
- frame && frame.content
80
+ def audio_file
81
+ @audio_file ||= AudioFile.new(@source)
91
82
  end
92
83
 
93
- private
94
-
95
- def frame_id(version, name)
96
- case version
97
- when :v2
98
- if audio_file.v2_tag_present?
99
- FrameIdAdvisor.new(2, audio_file.v2_tag_major_version_number).advise(name)
100
- end
101
- when :v1
102
- FrameIdAdvisor.new(1, 'x').advise(name)
103
- else
104
- nil
84
+ def possible_frame_ids_by_name(name)
85
+ ids = []
86
+ if scope.include?(:v2) && audio_file.v2_tag_present?
87
+ id = FrameIdAdvisor.new(2, audio_file.v2_tag_major_version_number).advise(name)
88
+ ids << id if id
105
89
  end
106
- end
107
-
108
- def audio_file
109
- @audio_file ||= AudioFile.new(@source)
90
+ if scope.include?(:v1) && audio_file.v1_tag_present?
91
+ id = FrameIdAdvisor.new(1, FrameIdAdvisor::ANY_MAJOR_VERSION).advise(name)
92
+ ids << id if id
93
+ end
94
+ ids
110
95
  end
111
96
  end
112
97
  end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/ruby
2
+ #
3
+ $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
4
+ require "id3tag"
5
+
6
+ ARGV.each do |file|
7
+ audio_file = ID3Tag.read(File.open(file, "r")).send(:audio_file)
8
+ if audio_file.v1_tag_present?
9
+ handle = File.open(file + ".v1_tag_body", "w")
10
+ handle.write(audio_file.v1_tag_body)
11
+ handle.close
12
+ end
13
+ if audio_file.v2_tag_present?
14
+ handle = File.open(file + ".v2_#{audio_file.v2_tag_major_version_number}_tag_body", "w")
15
+ handle.write(audio_file.v2_tag_body)
16
+ handle.close
17
+ end
18
+ end
@@ -39,7 +39,7 @@ describe ID3Tag::AudioFile do
39
39
  end
40
40
  end
41
41
  context "when extended header is present" do
42
- subject { described_class.new(StringIO.new("ID3\u0003\u0000\u0040\u0000\u0000\u0000\u0011" + "\u0000\u0000\u0000\u000E" + ("\u0000" * 10) + "ABC")) }
42
+ subject { described_class.new(StringIO.new("ID3\u0003\u0000\u0040\u0000\u0000\u0000\u0011" + "\u0000\u0000\u0000\u000A" + ("\u0000" * 10) + "ABC")) }
43
43
  it "should return frame and padding bytes" do
44
44
  subject.v2_tag_body.should == "ABC"
45
45
  end
@@ -60,4 +60,12 @@ describe ID3Tag::ID3V1FrameParser do
60
60
  end
61
61
  end
62
62
  end
63
+
64
+ describe "Test with real-world tag" do
65
+ let(:tag_body) { File.read mp3_fixture("pov_20131018-2100a.mp3.v1_tag_body") }
66
+ subject { described_class.new(tag_body) }
67
+ it "have title" do
68
+ subject.frames.find { |f| f.id == :title }.content.should eq("pov_20131018-2100a.mp3")
69
+ end
70
+ end
63
71
  end
@@ -3,56 +3,6 @@ require "spec_helper"
3
3
  describe ID3Tag::Tag do
4
4
  describe "class method #read"
5
5
 
6
- context "when file has v2.4.x tag and v.1.x tag" do
7
- subject { described_class.read(nil) }
8
- before :each do
9
- ID3Tag::AudioFile.any_instance.stub(:v2_tag_present?) { true }
10
- ID3Tag::AudioFile.any_instance.stub(:v2_tag_major_version_number) { 4 }
11
- end
12
-
13
- describe "#artist" do
14
- it "reads TPE1 or v1 artist" do
15
- subject.should_receive(:get_frame_content).with(:TPE1, :artist).and_return('A')
16
- subject.artist.should eq('A')
17
- end
18
- end
19
-
20
- describe "#title" do
21
- it "reads TIT2 or v1 title" do
22
- subject.should_receive(:get_frame_content).with(:TIT2, :title).and_return('A')
23
- subject.title.should eq('A')
24
- end
25
- end
26
-
27
- describe "#album" do
28
- it "reads TALB or v1 album" do
29
- subject.should_receive(:get_frame_content).with(:TALB, :album).and_return('A')
30
- subject.album.should eq('A')
31
- end
32
- end
33
-
34
- describe "#year" do
35
- it "reads TDRC or v1 year" do
36
- subject.should_receive(:get_frame_content).with(:TDRC, :year).and_return('A')
37
- subject.year.should eq('A')
38
- end
39
- end
40
-
41
- describe "#track_nr" do
42
- it "reads TRCK or v1 track_nr" do
43
- subject.should_receive(:get_frame_content).with(:TRCK, :track_nr).and_return('A')
44
- subject.track_nr.should eq('A')
45
- end
46
- end
47
-
48
- describe "#genre" do
49
- it "reads TCON or v1 genre" do
50
- subject.should_receive(:get_frame_content).with(:TCON, :genre).and_return('A')
51
- subject.genre.should eq('A')
52
- end
53
- end
54
- end
55
-
56
6
  describe "#get_frame" do
57
7
  subject { described_class.read(nil) }
58
8
  context "when more that one frame by that ID exists" do
@@ -219,46 +169,81 @@ describe ID3Tag::Tag do
219
169
  end
220
170
  end
221
171
 
222
- describe "#get_frame_content" do
223
- subject { described_class.read(nil, :all) }
224
- let(:frame_1) { ID3Tag::Frames::V1::TextFrame.new(:some_id, 'some content') }
225
- let(:frame_2) { ID3Tag::Frames::V1::TextFrame.new(:some_other_id, 'some other content') }
226
- context "with one ID as argument" do
227
- context "when frame with ID exists" do
228
- before :each do
229
- subject.stub(:get_frame).with(:some_id) { frame_1 }
230
- end
231
- it "should return frame" do
232
- subject.get_frame_content(:some_id).should == 'some content'
233
- end
234
- end
235
- context "when frame with ID does not exists" do
236
- before :each do
237
- subject.stub(:get_frame).with(:some_id) { nil }
238
- end
239
- it "should return none" do
240
- subject.get_frame_content(:some_id).should be_nil
241
- end
242
- end
243
- end
244
-
245
- context "with multiple ID as armguments" do
246
- context "when first one does exist" do
247
- before :each do
248
- subject.stub(:get_frame).with(:some_id) { frame_1 }
249
- subject.stub(:get_frame).with(:some_other_id) { frame_2 }
250
- end
251
- it "should return first existing frame's content" do
252
- subject.get_frame_content(:some_id, :some_other_id).should eq 'some content'
253
- end
254
- end
255
- context "when second exists" do
256
- before :each do
257
- subject.stub(:get_frame).with(:some_id) { nil }
258
- subject.stub(:get_frame).with(:some_other_id) { frame_2 }
259
- end
260
- it "should return first existing frame's content" do
261
- subject.get_frame_content(:some_id, :some_other_id).should eq 'some other content'
172
+ describe "Tests with real-world tags" do
173
+ let(:audio_file) { double("Fake Audio file") }
174
+
175
+ context "signals_1.mp3.v2_3_tag_body" do
176
+ before(:each) do
177
+ subject.stub(:audio_file) { audio_file }
178
+ audio_file.stub({
179
+ :v1_tag_present? => true,
180
+ :v2_tag_present? => true,
181
+ :v2_tag_body => File.read(mp3_fixture("signals_1.mp3.v2_3_tag_body")),
182
+ :v2_tag_major_version_number => 3
183
+ })
184
+ end
185
+ context "Reading only v2" do
186
+ subject { described_class.new(nil, :v2) }
187
+ its(:artist) { should eq("Sabled Sun") }
188
+ its(:title) { should eq("Sabled Sun - Signals I") }
189
+ its(:album) { should eq("Signals I") }
190
+ its(:year) { should eq("2013") }
191
+ its(:track_nr) { should eq "1" }
192
+ its(:genre) { should eq "Jazz" }
193
+ its(:comments) { should eq("Visit http://cryochamber.bandcamp.com") }
194
+ it "should return eng comment" do
195
+ subject.comments(:eng).should eq("Visit http://cryochamber.bandcamp.com")
196
+ end
197
+ it "should read private frames" do
198
+ subject.get_frames(:PRIV).find { |f| f.owner_identifier == "WM/MediaClassPrimaryID" }.should be_kind_of(ID3Tag::Frames::V2::PrivateFrame)
199
+ end
200
+ end
201
+ end
202
+
203
+ context "pov_20131018-2100a.mp3" do
204
+ before(:each) do
205
+ subject.stub(:audio_file) { audio_file }
206
+ audio_file.stub({
207
+ :v1_tag_present? => true,
208
+ :v2_tag_present? => true,
209
+ :v1_tag_body => File.read(mp3_fixture("pov_20131018-2100a.mp3.v1_tag_body")),
210
+ :v2_tag_body => File.read(mp3_fixture("pov_20131018-2100a.mp3.v2_3_tag_body")),
211
+ :v2_tag_major_version_number => 3
212
+ })
213
+ end
214
+ context "Reading only v1" do
215
+ subject { described_class.new(nil, :v1) }
216
+ its(:artist) { should eq("") }
217
+ its(:title) { should eq("pov_20131018-2100a.mp3") }
218
+ its(:album) { should eq("") }
219
+ its(:year) { should eq("") }
220
+ its(:track_nr) { should be_nil }
221
+ its(:genre) { should eq("Blues") }
222
+ its(:comments) { should be_nil }
223
+ its(:frame_ids) { should eq [:title, :artist, :album, :year, :comments, :genre] }
224
+ end
225
+ context "Reading only v2" do
226
+ subject { described_class.new(nil, :v2) }
227
+ its(:artist) { should eq("BBC Radio 4") }
228
+ its(:title) { should eq("PoV: Lisa Jardine: Machine Intelligence: 18 Oct 13") }
229
+ its(:album) { should eq("A Point of View") }
230
+ its(:year) { should eq("2013") }
231
+ its(:track_nr) { should be_nil }
232
+ it "should return nil for genre as this tag have incorect genre frame" do
233
+ subject.genre.should eq("")
234
+ end
235
+ its(:comments) { should eq("Lisa Jardine compares the contributions of Ada Lovelace and Alan Turing a century later to computer science and contrasts their views on the potential of and limits to machine intelligence. \r\nProducer: Sheila Cook") }
236
+ it "should return eng comment" do
237
+ subject.comments(:eng).should eq("Lisa Jardine compares the contributions of Ada Lovelace and Alan Turing a century later to computer science and contrasts their views on the potential of and limits to machine intelligence. \r\nProducer: Sheila Cook")
238
+ end
239
+ it "should return blank string for latvian comments" do
240
+ subject.comments(:lav).should be_nil
241
+ end
242
+ its(:frame_ids) { should eq [:TALB, :TPE1, :COMM, :USLT, :TCON, :TIT2, :TYER, :TCOP, :APIC] }
243
+ it "should have comments frame with short desc and language code" do
244
+ subject.get_frames(:COMM).size.should eq(1)
245
+ subject.get_frame(:COMM).language.should eq("eng")
246
+ subject.get_frame(:COMM).description.should eq("")
262
247
  end
263
248
  end
264
249
  end
data/tags CHANGED
@@ -26,8 +26,12 @@ Frames lib/id3tag/frames/v2/genre_frame.rb /^ module Frames$/;" m class:ID3Tag
26
26
  Frames lib/id3tag/frames/v2/genre_frame/genre_parser.rb /^ module Frames$/;" m class:ID3Tag
27
27
  Frames lib/id3tag/frames/v2/genre_frame/genre_parser_24.rb /^ module Frames$/;" m class:ID3Tag
28
28
  Frames lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb /^ module Frames$/;" m class:ID3Tag
29
+ Frames lib/id3tag/frames/v2/involved_people_list.rb /^ module Frames$/;" m class:ID3Tag
30
+ Frames lib/id3tag/frames/v2/involved_people_list_frame.rb /^ module Frames$/;" m class:ID3Tag
31
+ Frames lib/id3tag/frames/v2/private_frame.rb /^ module Frames$/;" m class:ID3Tag
29
32
  Frames lib/id3tag/frames/v2/text_frame.rb /^ module Frames$/;" m class:ID3Tag
30
33
  Frames lib/id3tag/frames/v2/unique_file_id_frame.rb /^ module Frames$/;" m class:ID3Tag
34
+ Frames lib/id3tag/frames/v2/user_text_frame.rb /^ module Frames$/;" m class:ID3Tag
31
35
  GenreFrame lib/id3tag/frames/v1/genre_frame.rb /^ class GenreFrame$/;" c class:ID3Tag.Frames.V1
32
36
  GenreFrame lib/id3tag/frames/v2/genre_frame.rb /^ class GenreFrame < BasicFrame$/;" c class:ID3Tag.Frames.V2
33
37
  GenreFrame lib/id3tag/frames/v2/genre_frame/genre_parser.rb /^ class GenreFrame$/;" c class:ID3Tag.Frames.V2
@@ -54,22 +58,32 @@ ID3Tag lib/id3tag/frames/v2/genre_frame.rb /^module ID3Tag$/;" m
54
58
  ID3Tag lib/id3tag/frames/v2/genre_frame/genre_parser.rb /^module ID3Tag$/;" m
55
59
  ID3Tag lib/id3tag/frames/v2/genre_frame/genre_parser_24.rb /^module ID3Tag$/;" m
56
60
  ID3Tag lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb /^module ID3Tag$/;" m
61
+ ID3Tag lib/id3tag/frames/v2/involved_people_list.rb /^module ID3Tag$/;" m
62
+ ID3Tag lib/id3tag/frames/v2/involved_people_list_frame.rb /^module ID3Tag$/;" m
63
+ ID3Tag lib/id3tag/frames/v2/private_frame.rb /^module ID3Tag$/;" m
57
64
  ID3Tag lib/id3tag/frames/v2/text_frame.rb /^module ID3Tag$/;" m
58
65
  ID3Tag lib/id3tag/frames/v2/unique_file_id_frame.rb /^module ID3Tag$/;" m
66
+ ID3Tag lib/id3tag/frames/v2/user_text_frame.rb /^module ID3Tag$/;" m
59
67
  ID3Tag lib/id3tag/id3_v1_frame_parser.rb /^module ID3Tag$/;" m
68
+ ID3Tag lib/id3tag/id3_v2_extended_header.rb /^module ID3Tag$/;" m
60
69
  ID3Tag lib/id3tag/id3_v2_frame_parser.rb /^module ID3Tag$/;" m
61
70
  ID3Tag lib/id3tag/id3_v2_tag_header.rb /^module ID3Tag$/;" m
62
71
  ID3Tag lib/id3tag/number_util.rb /^module ID3Tag$/;" m
72
+ ID3Tag lib/id3tag/scope.rb /^module ID3Tag$/;" m
63
73
  ID3Tag lib/id3tag/string_util.rb /^module ID3Tag$/;" m
64
74
  ID3Tag lib/id3tag/synchsafe_integer.rb /^module ID3Tag$/;" m
65
75
  ID3Tag lib/id3tag/tag.rb /^module ID3Tag$/;" m
66
76
  ID3Tag lib/id3tag/unsynchronization.rb /^module ID3Tag$/;" m
67
77
  ID3V1FrameParser lib/id3tag/id3_v1_frame_parser.rb /^ class ID3V1FrameParser$/;" c class:ID3Tag
68
78
  ID3V2FrameParser lib/id3tag/id3_v2_frame_parser.rb /^ class ID3V2FrameParser$/;" c class:ID3Tag
79
+ ID3v2ExtendedHeader lib/id3tag/id3_v2_extended_header.rb /^ class ID3v2ExtendedHeader$/;" c class:ID3Tag
69
80
  ID3v2TagHeader lib/id3tag/id3_v2_tag_header.rb /^ class ID3v2TagHeader$/;" c class:ID3Tag
81
+ InvolvedPeopleList lib/id3tag/frames/v2/involved_people_list.rb /^ class InvolvedPeopleList < TextFrame$/;" c class:ID3Tag.Frames.V2
82
+ InvolvedPeopleListFrame lib/id3tag/frames/v2/involved_people_list_frame.rb /^ class InvolvedPeopleListFrame < TextFrame$/;" c class:ID3Tag.Frames.V2
70
83
  MissingGenreParser lib/id3tag/frames/v2/genre_frame.rb /^ class MissingGenreParser < StandardError; end$/;" c class:ID3Tag.Frames.V2.GenreFrame
71
- MultipleFrameError lib/id3tag/tag.rb /^ class MultipleFrameError < StandardError; end$/;" c class:ID3Tag.Tag
72
84
  NumberUtil lib/id3tag/number_util.rb /^ module NumberUtil$/;" m class:ID3Tag
85
+ PrivateFrame lib/id3tag/frames/v2/private_frame.rb /^ class PrivateFrame < UniqueFileIdFrame$/;" c class:ID3Tag.Frames.V2
86
+ Scope lib/id3tag/scope.rb /^ class Scope$/;" c class:ID3Tag
73
87
  StringUtil lib/id3tag/string_util.rb /^ module StringUtil$/;" m class:ID3Tag
74
88
  SynchsafeInteger lib/id3tag/synchsafe_integer.rb /^ class SynchsafeInteger$/;" c class:ID3Tag
75
89
  Tag lib/id3tag/tag.rb /^ class Tag$/;" c class:ID3Tag
@@ -78,6 +92,7 @@ TextFrame lib/id3tag/frames/v2/text_frame.rb /^ class TextFrame < BasicFram
78
92
  TrackNrFrame lib/id3tag/frames/v1/track_nr_frame.rb /^ class TrackNrFrame$/;" c class:ID3Tag.Frames.V1
79
93
  UniqueFileIdFrame lib/id3tag/frames/v2/unique_file_id_frame.rb /^ class UniqueFileIdFrame < BasicFrame$/;" c class:ID3Tag.Frames.V2
80
94
  Unsynchronization lib/id3tag/unsynchronization.rb /^ class Unsynchronization$/;" c class:ID3Tag
95
+ UserTextFrame lib/id3tag/frames/v2/user_text_frame.rb /^ class UserTextFrame < TextFrame$/;" c class:ID3Tag.Frames.V2
81
96
  Util lib/id3tag/frames/util/genre_names.rb /^ module Util$/;" m class:ID3Tag.Frames
82
97
  V1 lib/id3tag/frames/v1/comments_frame.rb /^ module V1$/;" m class:ID3Tag.Frames
83
98
  V1 lib/id3tag/frames/v1/genre_frame.rb /^ module V1$/;" m class:ID3Tag.Frames
@@ -92,16 +107,19 @@ V2 lib/id3tag/frames/v2/genre_frame.rb /^ module V2$/;" m class:ID3Tag.Frame
92
107
  V2 lib/id3tag/frames/v2/genre_frame/genre_parser.rb /^ module V2$/;" m class:ID3Tag.Frames
93
108
  V2 lib/id3tag/frames/v2/genre_frame/genre_parser_24.rb /^ module V2$/;" m class:ID3Tag.Frames
94
109
  V2 lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb /^ module V2$/;" m class:ID3Tag.Frames
110
+ V2 lib/id3tag/frames/v2/involved_people_list.rb /^ module V2$/;" m class:ID3Tag.Frames
111
+ V2 lib/id3tag/frames/v2/involved_people_list_frame.rb /^ module V2$/;" m class:ID3Tag.Frames
112
+ V2 lib/id3tag/frames/v2/private_frame.rb /^ module V2$/;" m class:ID3Tag.Frames
95
113
  V2 lib/id3tag/frames/v2/text_frame.rb /^ module V2$/;" m class:ID3Tag.Frames
96
114
  V2 lib/id3tag/frames/v2/unique_file_id_frame.rb /^ module V2$/;" m class:ID3Tag.Frames
115
+ V2 lib/id3tag/frames/v2/user_text_frame.rb /^ module V2$/;" m class:ID3Tag.Frames
97
116
  additional_info_byte_count lib/id3tag/frames/v2/basic_frame.rb /^ def additional_info_byte_count$/;" f class:ID3Tag.Frames.V2.BasicFrame
98
117
  additional_info_byte_count lib/id3tag/frames/v2/frame_flags.rb /^ def additional_info_byte_count$/;" f class:ID3Tag.Frames.V2.FrameFlags
99
118
  additional_info_flags_in_effect lib/id3tag/frames/v2/frame_flags.rb /^ def additional_info_flags_in_effect$/;" f class:ID3Tag.Frames.V2.FrameFlags
100
119
  advise lib/id3tag/frame_id_advisor.rb /^ def advise(frame_name)$/;" f class:ID3Tag.FrameIdAdvisor
101
- album lib/id3tag/tag.rb /^ def album$/;" f class:ID3Tag
102
120
  album_frame lib/id3tag/id3_v1_frame_parser.rb /^ def album_frame$/;" f class:ID3Tag.ID3V1FrameParser
121
+ all_frames_by_id lib/id3tag/tag.rb /^ def all_frames_by_id(*ids)$/;" f class:ID3Tag
103
122
  apply lib/id3tag/unsynchronization.rb /^ def apply$/;" f class:ID3Tag.Unsynchronization
104
- artist lib/id3tag/tag.rb /^ def artist$/;" f class:ID3Tag
105
123
  artist_frame lib/id3tag/id3_v1_frame_parser.rb /^ def artist_frame$/;" f class:ID3Tag.ID3V1FrameParser
106
124
  audio_file lib/id3tag/tag.rb /^ def audio_file$/;" f class:ID3Tag
107
125
  blank lib/id3tag/string_util.rb /^ def self.blank?(string)$/;" F class:ID3Tag.StringUtil
@@ -119,53 +137,59 @@ content lib/id3tag/frames/v2/comments_frame.rb /^ def content$/;" f class
119
137
  content lib/id3tag/frames/v2/genre_frame.rb /^ def content$/;" f class:ID3Tag.Frames.V2.GenreFrame
120
138
  content lib/id3tag/frames/v2/text_frame.rb /^ def content$/;" f class:ID3Tag.Frames.V2.TextFrame
121
139
  content lib/id3tag/frames/v2/unique_file_id_frame.rb /^ def content$/;" f class:ID3Tag.Frames.V2.UniqueFileIdFrame
140
+ content lib/id3tag/frames/v2/user_text_frame.rb /^ def content$/;" f class:ID3Tag.Frames.V2.UserTextFrame
141
+ content_parts lib/id3tag/frames/v2/user_text_frame.rb /^ def content_parts$/;" f class:ID3Tag.Frames.V2.UserTextFrame
122
142
  content_split_apart_by_null_byte lib/id3tag/frames/v2/unique_file_id_frame.rb /^ def content_split_apart_by_null_byte$/;" f class:ID3Tag.Frames.V2.UniqueFileIdFrame
123
143
  content_without_encoding_byte lib/id3tag/frames/v2/text_frame.rb /^ def content_without_encoding_byte$/;" f class:ID3Tag.Frames.V2.TextFrame
144
+ content_without_encoding_byte_and_language lib/id3tag/frames/v2/comments_frame.rb /^ def content_without_encoding_byte_and_language$/;" f class:ID3Tag.Frames.V2.CommentsFrame
124
145
  convert_32bit_integer_to_string lib/id3tag/number_util.rb /^ def self.convert_32bit_integer_to_string(integer)$/;" F class:ID3Tag.NumberUtil
125
146
  convert_string_to_32bit_integer lib/id3tag/number_util.rb /^ def self.convert_string_to_32bit_integer(string)$/;" F class:ID3Tag.NumberUtil
126
147
  current_additional_info_map lib/id3tag/frames/v2/frame_flags.rb /^ def current_additional_info_map$/;" f class:ID3Tag.Frames.V2.FrameFlags
127
- current_encoding_map lib/id3tag/frames/v2/text_frame.rb /^ def current_encoding_map$/;" f class:ID3Tag.Frames.V2.TextFrame
128
148
  current_flag_map lib/id3tag/frames/v2/frame_flags.rb /^ def current_flag_map$/;" f class:ID3Tag.Frames.V2.FrameFlags
129
- cut_at_null_byte lib/id3tag/frames/v2/text_frame.rb /^ def cut_at_null_byte(string)$/;" f class:ID3Tag.Frames.V2.TextFrame
149
+ cut_at_null_byte lib/id3tag/string_util.rb /^ def self.cut_at_null_byte(string)$/;" F class:ID3Tag.StringUtil
130
150
  data_length_indicator? lib/id3tag/frames/v2/basic_frame.rb /^ def data_length_indicator?$/;" f class:ID3Tag.Frames.V2.BasicFrame
131
151
  data_length_indicator? lib/id3tag/frames/v2/frame_flags.rb /^ def data_length_indicator?$/;" f class:ID3Tag.Frames.V2.FrameFlags
132
152
  decode lib/id3tag/synchsafe_integer.rb /^ def decode(synchsafe_int)$/;" f class:ID3Tag.SynchsafeInteger.encode
133
153
  desciption lib/id3tag/frames/v1/comments_frame.rb /^ def desciption$/;" f class:ID3Tag.Frames.V1.CommentsFrame
134
154
  description lib/id3tag/frames/v2/comments_frame.rb /^ def description$/;" f class:ID3Tag.Frames.V2.CommentsFrame
155
+ description lib/id3tag/frames/v2/user_text_frame.rb /^ def description$/;" f class:ID3Tag.Frames.V2.UserTextFrame
135
156
  destination_encoding lib/id3tag/frames/v1/text_frame.rb /^ def destination_encoding$/;" f class:ID3Tag.Frames.V1.TextFrame
136
157
  destination_encoding lib/id3tag/frames/v2/text_frame.rb /^ def destination_encoding$/;" f class:ID3Tag.Frames.V2.TextFrame
137
158
  do_unsynchronization lib/id3tag/string_util.rb /^ def self.do_unsynchronization(input)$/;" F class:ID3Tag.StringUtil
138
159
  encode lib/id3tag/synchsafe_integer.rb /^ def encode(int)$/;" f class:ID3Tag.SynchsafeInteger
139
- encoded_text_and_content lib/id3tag/frames/v2/comments_frame.rb /^ def encoded_text_and_content$/;" f class:ID3Tag.Frames.V2.CommentsFrame
140
- encoded_text_and_content_parts lib/id3tag/frames/v2/comments_frame.rb /^ def encoded_text_and_content_parts$/;" f class:ID3Tag.Frames.V2.CommentsFrame
160
+ encoded_content lib/id3tag/frames/v2/comments_frame.rb /^ def encoded_content$/;" f class:ID3Tag.Frames.V2.CommentsFrame
161
+ encoded_content lib/id3tag/frames/v2/text_frame.rb /^ def encoded_content$/;" f class:ID3Tag.Frames.V2.TextFrame
141
162
  encoding_byte_from_flags lib/id3tag/frames/v2/frame_header_flags.rb /^ def encoding_byte_from_flags$/;" f class:ID3Tag.Frames.V2.FrameFlags
142
163
  encrypted? lib/id3tag/frames/v2/basic_frame.rb /^ def encrypted?$/;" f class:ID3Tag.Frames.V2.BasicFrame
143
164
  encrypted? lib/id3tag/frames/v2/frame_flags.rb /^ def encrypted?$/;" f class:ID3Tag.Frames.V2.FrameFlags
144
165
  encrypted? lib/id3tag/frames/v2/frame_header_flags.rb /^ def encrypted?$/;" f class:ID3Tag.Frames.V2.FrameFlags
145
166
  encryption_id lib/id3tag/frames/v2/basic_frame.rb /^ def encryption_id$/;" f class:ID3Tag.Frames.V2.BasicFrame
146
167
  expand_abbreviation lib/id3tag/frames/v2/genre_frame/genre_parser.rb /^ def expand_abbreviation(abbreviation)$/;" f class:ID3Tag.Frames.V2.GenreFrame.GenreParser
168
+ experimental? lib/id3tag/id3_v2_extended_header.rb /^ def experimental?$/;" f class:ID3Tag.ID3v2ExtendedHeader
147
169
  experimental? lib/id3tag/id3_v2_tag_header.rb /^ def experimental?$/;" f class:ID3Tag.ID3v2TagHeader
170
+ extended_header? lib/id3tag/id3_v2_extended_header.rb /^ def extended_header?$/;" f class:ID3Tag.ID3v2ExtendedHeader
148
171
  extended_header? lib/id3tag/id3_v2_tag_header.rb /^ def extended_header?$/;" f class:ID3Tag.ID3v2TagHeader
149
172
  fabricate lib/id3tag/frames/v2/frame_fabricator.rb /^ def fabricate(id, content, flags, major_version_number)$/;" f class:ID3Tag.Frames.V2.FrameFabricator
150
173
  fabricate lib/id3tag/frames/v2/frame_fabricator.rb /^ def fabricate$/;" f class:ID3Tag.Frames.V2
151
174
  final_size lib/id3tag/frames/v2/basic_frame.rb /^ def final_size$/;" f class:ID3Tag.Frames.V2.BasicFrame
152
175
  find_by_id lib/id3tag/frames/util/genre_names.rb /^ def self.find_by_id(id)$/;" F class:ID3Tag.Frames.Util.GenreNames
153
176
  find_position_and_length_for_additional_info lib/id3tag/frames/v2/frame_flags.rb /^ def find_position_and_length_for_additional_info(*methods_of_interest)$/;" f class:ID3Tag.Frames.V2.FrameFlags
177
+ first_frame_by_id lib/id3tag/tag.rb /^ def first_frame_by_id(*ids)$/;" f class:ID3Tag
154
178
  flag lib/id3tag/frames/v2/frame_flags.rb /^ def flag(scope, name)$/;" f class:ID3Tag.Frames.V2.FrameFlags
179
+ flags_byte lib/id3tag/id3_v2_extended_header.rb /^ def flags_byte$/;" f class:ID3Tag.ID3v2ExtendedHeader
155
180
  flags_byte lib/id3tag/id3_v2_tag_header.rb /^ def flags_byte$/;" f class:ID3Tag.ID3v2TagHeader
156
181
  flags_byte_pair lib/id3tag/frames/v2/frame_header_flags.rb /^ def flags_byte_pair$/;" f class:ID3Tag.Frames.V2.FrameFlags
157
182
  flags_for_scope lib/id3tag/frames/v2/frame_flags.rb /^ def flags_for_scope(scope)$/;" f class:ID3Tag.Frames.V2.FrameFlags
183
+ footer_present? lib/id3tag/id3_v2_extended_header.rb /^ def footer_present?$/;" f class:ID3Tag.ID3v2ExtendedHeader
158
184
  footer_present? lib/id3tag/id3_v2_tag_header.rb /^ def footer_present?$/;" f class:ID3Tag.ID3v2TagHeader
159
185
  frame_class lib/id3tag/frames/v2/frame_fabricator.rb /^ def frame_class$/;" f class:ID3Tag.Frames.V2
160
186
  frame_flags lib/id3tag/frames/v2/basic_frame.rb /^ def frame_flags$/;" f class:ID3Tag.Frames.V2.BasicFrame
161
- frame_id lib/id3tag/tag.rb /^ def frame_id(version, name)$/;" f class:ID3Tag
162
187
  frame_id_length lib/id3tag/id3_v2_frame_parser.rb /^ def frame_id_length$/;" f class:ID3Tag.ID3V2FrameParser
163
188
  frame_ids lib/id3tag/tag.rb /^ def frame_ids$/;" f class:ID3Tag
164
189
  frames lib/id3tag/id3_v1_frame_parser.rb /^ def frames$/;" f class:ID3Tag.ID3V1FrameParser
165
190
  frames lib/id3tag/id3_v2_frame_parser.rb /^ def frames$/;" f class:ID3Tag.ID3V2FrameParser
166
191
  frames lib/id3tag/tag.rb /^ def frames$/;" f class:ID3Tag
167
192
  frames_has_flags? lib/id3tag/id3_v2_frame_parser.rb /^ def frames_has_flags?$/;" f class:ID3Tag.ID3V2FrameParser
168
- genre lib/id3tag/tag.rb /^ def genre$/;" f class:ID3Tag
169
193
  genre_frame lib/id3tag/id3_v1_frame_parser.rb /^ def genre_frame$/;" f class:ID3Tag.ID3V1FrameParser
170
194
  genre_parser lib/id3tag/frames/v2/genre_frame.rb /^ def genre_parser$/;" f class:ID3Tag.Frames.V2.GenreFrame
171
195
  genres lib/id3tag/frames/v2/genre_frame.rb /^ def genres$/;" f class:ID3Tag.Frames.V2.GenreFrame
@@ -173,14 +197,15 @@ genres lib/id3tag/frames/v2/genre_frame/genre_parser.rb /^ def genres$/
173
197
  genres lib/id3tag/frames/v2/genre_frame/genre_parser_24.rb /^ def genres$/;" f class:ID3Tag.Frames.V2.GenreFrame.GenreParser24
174
198
  genres lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb /^ def genres$/;" f class:ID3Tag.Frames.V2.GenreFrame.GenreParserPre24
175
199
  get_encoding_byte lib/id3tag/frames/v2/text_frame.rb /^ def get_encoding_byte$/;" f class:ID3Tag.Frames.V2.TextFrame
200
+ get_flags_byte lib/id3tag/id3_v2_extended_header.rb /^ def get_flags_byte$/;" f class:ID3Tag.ID3v2ExtendedHeader
176
201
  get_flags_byte lib/id3tag/id3_v2_tag_header.rb /^ def get_flags_byte$/;" f class:ID3Tag.ID3v2TagHeader
177
202
  get_frame lib/id3tag/tag.rb /^ def get_frame(frame_id)$/;" f class:ID3Tag
178
- get_frame_content lib/id3tag/tag.rb /^ def get_frame_content(frame_id, *alt_frame_ids)$/;" f class:ID3Tag
179
203
  get_frames lib/id3tag/id3_v1_frame_parser.rb /^ def get_frames$/;" f class:ID3Tag.ID3V1FrameParser
180
204
  get_frames lib/id3tag/id3_v2_frame_parser.rb /^ def get_frames$/;" f class:ID3Tag.ID3V2FrameParser
181
205
  get_frames lib/id3tag/tag.rb /^ def get_frames(frame_id)$/;" f class:ID3Tag
182
206
  get_genres lib/id3tag/frames/v2/genre_frame.rb /^ def get_genres$/;" f class:ID3Tag.Frames.V2.GenreFrame
183
207
  get_language lib/id3tag/frames/v2/comments_frame.rb /^ def get_language$/;" f class:ID3Tag.Frames.V2.CommentsFrame
208
+ get_tag_size lib/id3tag/id3_v2_extended_header.rb /^ def get_tag_size$/;" f class:ID3Tag.ID3v2ExtendedHeader
184
209
  get_tag_size lib/id3tag/id3_v2_tag_header.rb /^ def get_tag_size$/;" f class:ID3Tag.ID3v2TagHeader
185
210
  get_tag_version_1_1? lib/id3tag/id3_v1_frame_parser.rb /^ def get_tag_version_1_1?$/;" f class:ID3Tag.ID3V1FrameParser
186
211
  get_v2_extended_header_size lib/id3tag/audio_file.rb /^ def get_v2_extended_header_size$/;" f class:ID3Tag.AudioFile
@@ -189,6 +214,7 @@ group_id lib/id3tag/frames/v2/basic_frame.rb /^ def group_id$/;" f class:
189
214
  grouped? lib/id3tag/frames/v2/basic_frame.rb /^ def grouped?$/;" f class:ID3Tag.Frames.V2.BasicFrame
190
215
  grouped? lib/id3tag/frames/v2/frame_flags.rb /^ def grouped?$/;" f class:ID3Tag.Frames.V2.FrameFlags
191
216
  grouped? lib/id3tag/frames/v2/frame_header_flags.rb /^ def grouped?$/;" f class:ID3Tag.Frames.V2.FrameFlags
217
+ include? lib/id3tag/scope.rb /^ def include?(version)$/;" f class:ID3Tag.Scope
192
218
  index_of_flag lib/id3tag/frames/v2/frame_flags.rb /^ def index_of_flag(scope, name)$/;" f class:ID3Tag.Frames.V2.FrameFlags
193
219
  initialize lib/id3tag/audio_file.rb /^ def initialize(file)$/;" f class:ID3Tag.AudioFile
194
220
  initialize lib/id3tag/frame_id_advisor.rb /^ def initialize(version, major_version)$/;" f class:ID3Tag.FrameIdAdvisor
@@ -201,33 +227,41 @@ initialize lib/id3tag/frames/v2/frame_flags.rb /^ def initialize(flag_byt
201
227
  initialize lib/id3tag/frames/v2/frame_header_flags.rb /^ def initialize(flag_bytes, major_version_number)$/;" f class:ID3Tag.Frames.V2.FrameFlags
202
228
  initialize lib/id3tag/frames/v2/genre_frame/genre_parser.rb /^ def initialize(genre_string)$/;" f class:ID3Tag.Frames.V2.GenreFrame.GenreParser
203
229
  initialize lib/id3tag/id3_v1_frame_parser.rb /^ def initialize(input)$/;" f class:ID3Tag.ID3V1FrameParser
230
+ initialize lib/id3tag/id3_v2_extended_header.rb /^ def initialize(header_chunk)$/;" f class:ID3Tag.ID3v2ExtendedHeader
204
231
  initialize lib/id3tag/id3_v2_frame_parser.rb /^ def initialize(input, major_version_number)$/;" f class:ID3Tag.ID3V2FrameParser
205
232
  initialize lib/id3tag/id3_v2_tag_header.rb /^ def initialize(header_chunk)$/;" f class:ID3Tag.ID3v2TagHeader
206
- initialize lib/id3tag/tag.rb /^ def initialize(source, version = :all)$/;" f class:ID3Tag
233
+ initialize lib/id3tag/scope.rb /^ def initialize(version)$/;" f class:ID3Tag.Scope
234
+ initialize lib/id3tag/tag.rb /^ def initialize(source, scope = :all)$/;" f class:ID3Tag
207
235
  initialize lib/id3tag/unsynchronization.rb /^ def initialize(input)$/;" f class:ID3Tag.Unsynchronization
208
236
  input_bytes lib/id3tag/unsynchronization.rb /^ def input_bytes$/;" f class:ID3Tag.Unsynchronization
209
237
  inspect lib/id3tag/frames/v2/basic_frame.rb /^ def inspect$/;" f class:ID3Tag.Frames.V2.BasicFrame
238
+ inspect lib/id3tag/id3_v2_extended_header.rb /^ def inspect$/;" f class:ID3Tag.ID3v2ExtendedHeader
210
239
  inspect lib/id3tag/id3_v2_tag_header.rb /^ def inspect$/;" f class:ID3Tag.ID3v2TagHeader
211
240
  inspectable_content lib/id3tag/frames/v2/basic_frame.rb /^ def inspectable_content$/;" f class:ID3Tag.Frames.V2.BasicFrame
212
241
  inspectable_content lib/id3tag/frames/v2/comments_frame.rb /^ def inspectable_content$/;" f class:ID3Tag.Frames.V2.CommentsFrame
242
+ inspectable_content lib/id3tag/frames/v2/text_frame.rb /^ def inspectable_content$/;" f class:ID3Tag.Frames.V2.TextFrame
213
243
  inspectable_content lib/id3tag/frames/v2/unique_file_id_frame.rb /^ def inspectable_content$/;" f class:ID3Tag.Frames.V2.UniqueFileIdFrame
214
244
  just_genres lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb /^ def just_genres$/;" f class:ID3Tag.Frames.V2.GenreFrame.GenreParserPre24
215
245
  just_requirements lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb /^ def just_requirements$/;" f class:ID3Tag.Frames.V2.GenreFrame.GenreParserPre24
216
246
  language lib/id3tag/frames/v1/comments_frame.rb /^ def language$/;" f class:ID3Tag.Frames.V1.CommentsFrame
217
247
  language lib/id3tag/frames/v2/comments_frame.rb /^ def language$/;" f class:ID3Tag.Frames.V2.CommentsFrame
248
+ major_version_number lib/id3tag/id3_v2_extended_header.rb /^ def major_version_number$/;" f class:ID3Tag.ID3v2ExtendedHeader
218
249
  major_version_number lib/id3tag/id3_v2_tag_header.rb /^ def major_version_number$/;" f class:ID3Tag.ID3v2TagHeader
250
+ minor_version_number lib/id3tag/id3_v2_extended_header.rb /^ def minor_version_number$/;" f class:ID3Tag.ID3v2ExtendedHeader
219
251
  minor_version_number lib/id3tag/id3_v2_tag_header.rb /^ def minor_version_number$/;" f class:ID3Tag.ID3v2TagHeader
220
252
  mp3_fixture spec/support/mp3_fixtures.rb /^def mp3_fixture(filename)$/;" f
221
253
  output lib/id3tag/unsynchronization.rb /^ def output$/;" f class:ID3Tag.Unsynchronization
222
254
  output_bytes lib/id3tag/unsynchronization.rb /^ def output_bytes$/;" f class:ID3Tag.Unsynchronization
223
255
  owner_identifier lib/id3tag/frames/v2/unique_file_id_frame.rb /^ def owner_identifier$/;" f class:ID3Tag.Frames.V2.UniqueFileIdFrame
224
256
  padding_or_eof_reached? lib/id3tag/id3_v2_frame_parser.rb /^ def padding_or_eof_reached?$/;" f class:ID3Tag.ID3V2FrameParser
257
+ parts lib/id3tag/frames/v2/comments_frame.rb /^ def parts$/;" f class:ID3Tag.Frames.V2.CommentsFrame
225
258
  position_and_count_of_data_length_bytes lib/id3tag/frames/v2/basic_frame.rb /^ def position_and_count_of_data_length_bytes$/;" f class:ID3Tag.Frames.V2.BasicFrame
226
259
  position_and_count_of_data_length_bytes lib/id3tag/frames/v2/frame_flags.rb /^ def position_and_count_of_data_length_bytes$/;" f class:ID3Tag.Frames.V2.FrameFlags
227
260
  position_and_count_of_encryption_id_bytes lib/id3tag/frames/v2/basic_frame.rb /^ def position_and_count_of_encryption_id_bytes$/;" f class:ID3Tag.Frames.V2.BasicFrame
228
261
  position_and_count_of_encryption_id_bytes lib/id3tag/frames/v2/frame_flags.rb /^ def position_and_count_of_encryption_id_bytes$/;" f class:ID3Tag.Frames.V2.FrameFlags
229
262
  position_and_count_of_group_id_bytes lib/id3tag/frames/v2/basic_frame.rb /^ def position_and_count_of_group_id_bytes$/;" f class:ID3Tag.Frames.V2.BasicFrame
230
263
  position_and_count_of_group_id_bytes lib/id3tag/frames/v2/frame_flags.rb /^ def position_and_count_of_group_id_bytes$/;" f class:ID3Tag.Frames.V2.FrameFlags
264
+ possible_frame_ids_by_name lib/id3tag/tag.rb /^ def possible_frame_ids_by_name(name)$/;" f class:ID3Tag
231
265
  preserve_on_file_alteration? lib/id3tag/frames/v2/basic_frame.rb /^ def preserve_on_file_alteration?$/;" f class:ID3Tag.Frames.V2.BasicFrame
232
266
  preserve_on_file_alteration? lib/id3tag/frames/v2/frame_flags.rb /^ def preserve_on_file_alteration?$/;" f class:ID3Tag.Frames.V2.FrameFlags
233
267
  preserve_on_file_alteration? lib/id3tag/frames/v2/frame_header_flags.rb /^ def preserve_on_file_alteration?$/;" f class:ID3Tag.Frames.V2.FrameFlags
@@ -235,9 +269,8 @@ preserve_on_tag_alteration? lib/id3tag/frames/v2/basic_frame.rb /^ def pr
235
269
  preserve_on_tag_alteration? lib/id3tag/frames/v2/frame_flags.rb /^ def preserve_on_tag_alteration?$/;" f class:ID3Tag.Frames.V2.FrameFlags
236
270
  preserve_on_tag_alteration? lib/id3tag/frames/v2/frame_header_flags.rb /^ def preserve_on_tag_alteration?$/;" f class:ID3Tag.Frames.V2.FrameFlags
237
271
  raw_content_io lib/id3tag/frames/v2/basic_frame.rb /^ def raw_content_io$/;" f class:ID3Tag.Frames.V2.BasicFrame
238
- raw_text_and_content lib/id3tag/frames/v2/comments_frame.rb /^ def raw_text_and_content$/;" f class:ID3Tag.Frames.V2.CommentsFrame
239
- read lib/id3tag.rb /^ def self.read(source, version = :all)$/;" F class:ID3Tag
240
- read lib/id3tag/tag.rb /^ def read(source, version = :all)$/;" f class:ID3Tag.Tag
272
+ read lib/id3tag.rb /^ def self.read(source, scope = :all)$/;" F class:ID3Tag
273
+ read lib/id3tag/tag.rb /^ def read(source, scope = :all)$/;" f class:ID3Tag.Tag
241
274
  read_additional_info_byte lib/id3tag/frames/v2/basic_frame.rb /^ def read_additional_info_byte(position, byte_count)$/;" f class:ID3Tag.Frames.V2.BasicFrame
242
275
  read_from_pos_till_limit lib/id3tag/id3_v1_frame_parser.rb /^ def read_from_pos_till_limit(position, limit)$/;" f class:ID3Tag.ID3V1FrameParser
243
276
  read_from_pos_till_null_byte_or_limit lib/id3tag/id3_v1_frame_parser.rb /^ def read_from_pos_till_null_byte_or_limit(position, limit)$/;" f class:ID3Tag.ID3V1FrameParser
@@ -253,16 +286,17 @@ rewind_input lib/id3tag/id3_v2_frame_parser.rb /^ def rewind_input$/;" f clas
253
286
  source_encoding lib/id3tag/frames/v1/text_frame.rb /^ def source_encoding$/;" f class:ID3Tag.Frames.V1.TextFrame
254
287
  source_encoding lib/id3tag/frames/v2/text_frame.rb /^ def source_encoding$/;" f class:ID3Tag.Frames.V2.TextFrame
255
288
  status_byte_from_flags lib/id3tag/frames/v2/frame_header_flags.rb /^ def status_byte_from_flags$/;" f class:ID3Tag.Frames.V2.FrameFlags
289
+ tag_size lib/id3tag/id3_v2_extended_header.rb /^ def tag_size$/;" f class:ID3Tag.ID3v2ExtendedHeader
256
290
  tag_size lib/id3tag/id3_v2_tag_header.rb /^ def tag_size$/;" f class:ID3Tag.ID3v2TagHeader
291
+ tag_size_bytes lib/id3tag/id3_v2_extended_header.rb /^ def tag_size_bytes$/;" f class:ID3Tag.ID3v2ExtendedHeader
257
292
  tag_size_bytes lib/id3tag/id3_v2_tag_header.rb /^ def tag_size_bytes$/;" f class:ID3Tag.ID3v2TagHeader
258
293
  tag_version_1_1? lib/id3tag/id3_v1_frame_parser.rb /^ def tag_version_1_1?$/;" f class:ID3Tag.ID3V1FrameParser
259
294
  text lib/id3tag/frames/v1/comments_frame.rb /^ def text$/;" f class:ID3Tag.Frames.V1.CommentsFrame
260
295
  text lib/id3tag/frames/v2/comments_frame.rb /^ def text$/;" f class:ID3Tag.Frames.V2.CommentsFrame
261
- title lib/id3tag/tag.rb /^ def title$/;" f class:ID3Tag
262
296
  title_frame lib/id3tag/id3_v1_frame_parser.rb /^ def title_frame$/;" f class:ID3Tag.ID3V1FrameParser
263
- track_nr lib/id3tag/tag.rb /^ def track_nr$/;" f class:ID3Tag
264
297
  track_nr_frame lib/id3tag/id3_v1_frame_parser.rb /^ def track_nr_frame$/;" f class:ID3Tag.ID3V1FrameParser
265
298
  undo_unsynchronization lib/id3tag/string_util.rb /^ def self.undo_unsynchronization(input)$/;" F class:ID3Tag.StringUtil
299
+ unsynchronisation? lib/id3tag/id3_v2_extended_header.rb /^ def unsynchronisation?$/;" f class:ID3Tag.ID3v2ExtendedHeader
266
300
  unsynchronisation? lib/id3tag/id3_v2_tag_header.rb /^ def unsynchronisation?$/;" f class:ID3Tag.ID3v2TagHeader
267
301
  unsynchronised? lib/id3tag/frames/v2/basic_frame.rb /^ def unsynchronised?$/;" f class:ID3Tag.Frames.V2.BasicFrame
268
302
  unsynchronised? lib/id3tag/frames/v2/frame_flags.rb /^ def unsynchronised?$/;" f class:ID3Tag.Frames.V2.FrameFlags
@@ -284,7 +318,7 @@ v2_tag_minor_version_number lib/id3tag/audio_file.rb /^ def v2_tag_minor_vers
284
318
  v2_tag_present? lib/id3tag/audio_file.rb /^ def v2_tag_present?$/;" f class:ID3Tag.AudioFile
285
319
  v2_tag_version lib/id3tag/audio_file.rb /^ def v2_tag_version$/;" f class:ID3Tag.AudioFile
286
320
  version_ids lib/id3tag/frame_id_advisor.rb /^ def version_ids$/;" f class:ID3Tag.FrameIdAdvisor
321
+ version_number lib/id3tag/id3_v2_extended_header.rb /^ def version_number$/;" f class:ID3Tag.ID3v2ExtendedHeader
287
322
  version_number lib/id3tag/id3_v2_tag_header.rb /^ def version_number$/;" f class:ID3Tag.ID3v2TagHeader
288
323
  version_of_interest lib/id3tag/frame_id_advisor.rb /^ def version_of_interest$/;" f class:ID3Tag.FrameIdAdvisor
289
- year lib/id3tag/tag.rb /^ def year$/;" f class:ID3Tag
290
324
  year_frame lib/id3tag/id3_v1_frame_parser.rb /^ def year_frame$/;" f class:ID3Tag.ID3V1FrameParser
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: id3tag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Krists Ozols
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-22 00:00:00.000000000 Z
11
+ date: 2013-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: debugger
@@ -143,13 +143,17 @@ files:
143
143
  - lib/id3tag/frames/v2/genre_frame/genre_parser.rb
144
144
  - lib/id3tag/frames/v2/genre_frame/genre_parser_24.rb
145
145
  - lib/id3tag/frames/v2/genre_frame/genre_parser_pre_24.rb
146
+ - lib/id3tag/frames/v2/involved_people_list_frame.rb
147
+ - lib/id3tag/frames/v2/private_frame.rb
146
148
  - lib/id3tag/frames/v2/text_frame.rb
147
149
  - lib/id3tag/frames/v2/unique_file_id_frame.rb
148
150
  - lib/id3tag/frames/v2/unsychronized_transcription_frame.rb
151
+ - lib/id3tag/frames/v2/user_text_frame.rb
149
152
  - lib/id3tag/id3_v1_frame_parser.rb
150
153
  - lib/id3tag/id3_v2_frame_parser.rb
151
154
  - lib/id3tag/id3_v2_tag_header.rb
152
155
  - lib/id3tag/number_util.rb
156
+ - lib/id3tag/scope.rb
153
157
  - lib/id3tag/string_util.rb
154
158
  - lib/id3tag/synchsafe_integer.rb
155
159
  - lib/id3tag/tag.rb
@@ -160,6 +164,10 @@ files:
160
164
  - spec/fixtures/id3v1_with_track_nr.mp3
161
165
  - spec/fixtures/id3v1_without_track_nr.mp3
162
166
  - spec/fixtures/id3v2.mp3
167
+ - spec/fixtures/pov_20131018-2100a.mp3.v1_tag_body
168
+ - spec/fixtures/pov_20131018-2100a.mp3.v2_3_tag_body
169
+ - spec/fixtures/signals_1.mp3.v2_3_tag_body
170
+ - spec/id3tag_extract_tags
163
171
  - spec/lib/id3tag/audio_file_spec.rb
164
172
  - spec/lib/id3tag/frames/util/genre_name_by_id_finder_spec.rb
165
173
  - spec/lib/id3tag/frames/v1/comments_frame_spec.rb
@@ -211,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
219
  version: '0'
212
220
  requirements: []
213
221
  rubyforge_project:
214
- rubygems_version: 2.1.5
222
+ rubygems_version: 2.1.10
215
223
  signing_key:
216
224
  specification_version: 4
217
225
  summary: Native Ruby ID3 tag reader that aims for 100% covarage of ID3v2.x and ID3v1.x