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 +4 -4
- data/README.md +10 -2
- data/VERSION +1 -1
- data/id3tag.gemspec +12 -4
- data/lib/id3tag.rb +6 -2
- data/lib/id3tag/audio_file.rb +7 -1
- data/lib/id3tag/frame_id_advisor.rb +2 -0
- data/lib/id3tag/frames/v2/comments_frame.rb +10 -10
- data/lib/id3tag/frames/v2/frame_fabricator.rb +6 -0
- data/lib/id3tag/frames/v2/involved_people_list_frame.rb +8 -0
- data/lib/id3tag/frames/v2/private_frame.rb +8 -0
- data/lib/id3tag/frames/v2/text_frame.rb +7 -9
- data/lib/id3tag/frames/v2/unique_file_id_frame.rb +1 -1
- data/lib/id3tag/frames/v2/user_text_frame.rb +22 -0
- data/lib/id3tag/id3_v1_frame_parser.rb +1 -1
- data/lib/id3tag/scope.rb +19 -0
- data/lib/id3tag/string_util.rb +6 -0
- data/lib/id3tag/tag.rb +40 -55
- data/spec/fixtures/pov_20131018-2100a.mp3.v1_tag_body +0 -0
- data/spec/fixtures/pov_20131018-2100a.mp3.v2_3_tag_body +0 -0
- data/spec/fixtures/signals_1.mp3.v2_3_tag_body +0 -0
- data/spec/id3tag_extract_tags +18 -0
- data/spec/lib/id3tag/audio_file_spec.rb +1 -1
- data/spec/lib/id3tag/id3_v1_frame_parser_spec.rb +8 -0
- data/spec/lib/id3tag/tag_spec.rb +75 -90
- data/tags +51 -17
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b979a732340ba5dc962c63c0dbb3eeaeaeda5ddc
|
4
|
+
data.tar.gz: 86bf018537df030ace61374ee53dde985eeae97d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 `
|
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.
|
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.
|
1
|
+
0.5.0
|
data/id3tag.gemspec
CHANGED
@@ -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.
|
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.
|
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
|
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.
|
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
|
data/lib/id3tag.rb
CHANGED
@@ -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,
|
31
|
-
tag = Tag.read(source,
|
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
|
data/lib/id3tag/audio_file.rb
CHANGED
@@ -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
|
-
|
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
|
@@ -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 ||=
|
13
|
+
@desciption ||= parts.first
|
13
14
|
end
|
14
15
|
|
15
16
|
def text
|
16
|
-
@text ||= cut_at_null_byte(
|
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
|
30
|
-
@
|
30
|
+
def parts
|
31
|
+
@parts ||= encoded_content.split(StringUtil::NULL_BYTE, 2)
|
31
32
|
end
|
32
33
|
|
33
|
-
def
|
34
|
-
|
34
|
+
def encoded_content
|
35
|
+
content_without_encoding_byte_and_language.encode(destination_encoding, source_encoding)
|
35
36
|
end
|
36
37
|
|
37
|
-
def
|
38
|
-
content_without_encoding_byte
|
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
|
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
|
@@ -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(
|
14
|
+
@content ||= StringUtil.cut_at_null_byte(encoded_content)
|
16
15
|
end
|
17
16
|
|
18
|
-
|
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
|
27
|
-
|
23
|
+
def encoded_content
|
24
|
+
content_without_encoding_byte.encode(destination_encoding, source_encoding)
|
28
25
|
end
|
29
26
|
|
30
|
-
def
|
27
|
+
def source_encoding
|
28
|
+
ENCODING_MAP.fetch(get_encoding_byte) { raise UnsupportedTextEncoding }
|
31
29
|
end
|
32
30
|
|
33
31
|
def destination_encoding
|
@@ -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
|
data/lib/id3tag/scope.rb
ADDED
@@ -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
|
data/lib/id3tag/string_util.rb
CHANGED
@@ -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
|
data/lib/id3tag/tag.rb
CHANGED
@@ -1,53 +1,49 @@
|
|
1
1
|
module ID3Tag
|
2
2
|
class Tag
|
3
|
-
|
3
|
+
MultipleFrameError = Class.new(StandardError)
|
4
4
|
|
5
5
|
class << self
|
6
|
-
def read(source,
|
7
|
-
new(source,
|
6
|
+
def read(source, scope = :all)
|
7
|
+
new(source, scope)
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
def initialize(source,
|
12
|
-
@source, @
|
11
|
+
def initialize(source, scope = :all)
|
12
|
+
@source, @scope = source, Scope.new(scope)
|
13
13
|
end
|
14
14
|
|
15
|
-
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
36
|
-
|
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
|
40
|
-
|
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
|
44
|
-
|
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? &&
|
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? &&
|
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
|
85
|
-
|
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
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
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
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
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
|
Binary file
|
Binary file
|
Binary file
|
@@ -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\
|
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
|
data/spec/lib/id3tag/tag_spec.rb
CHANGED
@@ -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 "
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
end
|
235
|
-
context "
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
subject.
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
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/
|
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
|
-
|
140
|
-
|
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/
|
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
|
-
|
239
|
-
read lib/id3tag.rb /^
|
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
|
+
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
|
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.
|
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
|