id3tag 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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
|
+
[](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
|