taglib-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,170 @@
1
+ {
2
+ taglib_base SWIG_InitializeModule
3
+ exp-ptrcheck:SorG
4
+ fun:Init_taglib_base
5
+ fun:dln_load
6
+ }
7
+ {
8
+ taglib_id3v2 SWIG_InitializeModule
9
+ exp-ptrcheck:SorG
10
+ fun:Init_taglib_id3v2
11
+ fun:dln_load
12
+ }
13
+ {
14
+ taglib_mpeg SWIG_InitializeModule
15
+ exp-ptrcheck:SorG
16
+ fun:Init_taglib_mpeg
17
+ fun:dln_load
18
+ }
19
+ # Ruby 1.9 VM supressions
20
+ {
21
+ r1
22
+ Memcheck:Cond
23
+ fun:gc_mark
24
+ }
25
+ {
26
+ r2
27
+ Memcheck:Cond
28
+ fun:gc_mark_children
29
+ }
30
+ {
31
+ r3
32
+ Memcheck:Cond
33
+ fun:mark_current_machine_context
34
+ }
35
+ {
36
+ r4
37
+ Memcheck:Value8
38
+ fun:gc_mark
39
+ }
40
+ {
41
+ r5
42
+ Memcheck:Value8
43
+ fun:gc_mark_children
44
+ }
45
+ {
46
+ r6
47
+ Memcheck:Value8
48
+ fun:mark_current_machine_context
49
+ }
50
+ {
51
+ r7
52
+ Memcheck:Value8
53
+ fun:vm_exec_core
54
+ }
55
+ {
56
+ r8
57
+ Memcheck:Value4
58
+ fun:find_derivation
59
+ }
60
+ {
61
+ r9
62
+ Memcheck:Value8
63
+ fun:__gconv_read_conf
64
+ }
65
+ {
66
+ r10
67
+ Memcheck:Leak
68
+ fun:malloc
69
+ fun:vm_xmalloc
70
+ fun:ruby_strdup
71
+ }
72
+ {
73
+ r11
74
+ Memcheck:Leak
75
+ fun:malloc
76
+ fun:vm_xmalloc
77
+ fun:rb_include_module
78
+ }
79
+ {
80
+ r12
81
+ Memcheck:Leak
82
+ ...
83
+ fun:ruby_init
84
+ fun:main
85
+ }
86
+ {
87
+ r20
88
+ exp-ptrcheck:SorG
89
+ fun:insert_module
90
+ }
91
+ {
92
+ r21
93
+ exp-ptrcheck:SorG
94
+ fun:find_derivation
95
+ }
96
+ {
97
+ r22
98
+ exp-ptrcheck:SorG
99
+ fun:vm_exec_core
100
+ }
101
+ {
102
+ r23
103
+ exp-ptrcheck:SorG
104
+ fun:__gconv_read_conf
105
+ }
106
+ {
107
+ r24
108
+ exp-ptrcheck:SorG
109
+ fun:mark_current_machine_context
110
+ }
111
+ # Ruby 1.8 suppressions
112
+ {
113
+ r18_1
114
+ Memcheck:Cond
115
+ fun:mark_locations_array
116
+ ...
117
+ fun:yycompile
118
+ }
119
+ {
120
+ r18_2
121
+ Memcheck:Cond
122
+ fun:mark_locations_array
123
+ ...
124
+ fun:rb_eval
125
+ }
126
+ {
127
+ r18_3
128
+ Memcheck:Leak
129
+ fun:malloc
130
+ fun:ruby_xmalloc
131
+ fun:scope_dup
132
+ }
133
+ {
134
+ r18_4
135
+ Memcheck:Leak
136
+ fun:malloc
137
+ ...
138
+ fun:yycompile
139
+ }
140
+ {
141
+ r18_5
142
+ exp-ptrcheck:SorG
143
+ fun:mark_locations_array
144
+ fun:garbage_collect
145
+ ...
146
+ fun:yycompile
147
+ }
148
+ {
149
+ r18_6
150
+ exp-ptrcheck:Heap
151
+ ...
152
+ fun:rb_intern
153
+ fun:rb_str_intern
154
+ fun:rb_to_id
155
+ fun:rb_mod_alias_method
156
+ }
157
+ {
158
+ r18_7
159
+ exp-ptrcheck:SorG
160
+ fun:ruby_yyparse
161
+ fun:yycompile
162
+ }
163
+ {
164
+ r18_8
165
+ exp-ptrcheck:SorG
166
+ fun:ruby_re_compile_pattern
167
+ fun:rb_reg_initialize
168
+ ...
169
+ fun:rb_class_new_instance
170
+ }
@@ -0,0 +1,3 @@
1
+ require 'taglib/base'
2
+ require 'taglib/mpeg'
3
+ require 'taglib/id3v2'
@@ -0,0 +1 @@
1
+ require 'taglib_base'
@@ -0,0 +1,42 @@
1
+ require 'taglib_id3v2'
2
+
3
+ module TagLib
4
+ module ID3v2
5
+ class FrameList
6
+ include Enumerable
7
+
8
+ def each
9
+ it = self.begin
10
+ it_end = self.end
11
+ while it != it_end
12
+ frame = it.value
13
+ casted_frame = frame.cast
14
+ yield casted_frame
15
+ it = it.next
16
+ end
17
+ end
18
+ end
19
+ class Frame
20
+ def to_s
21
+ to_string
22
+ end
23
+ def cast
24
+ case frame_id
25
+ when "APIC" then to_attached_picture_frame
26
+ when "COMM" then to_comments_frame
27
+ when "GEOB" then to_general_encapsulated_object_frame
28
+ when "POPM" then to_popularimeter_frame
29
+ when "PRIV" then to_private_frame
30
+ when "RVAD" then to_relative_volume_frame
31
+ when "TXXX" then to_user_text_identification_frame
32
+ when /T.../ then to_text_identification_frame
33
+ when "UFID" then to_unique_file_identifier_frame
34
+ when "USLT" then to_unsynchronized_lyrics_frame
35
+ when "WXXX" then to_user_url_link_frame
36
+ when /W.../ then to_url_link_frame
37
+ else self
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1 @@
1
+ require 'taglib_mpeg'
@@ -0,0 +1,10 @@
1
+ module TagLib
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ PATCH = 0
6
+ BUILD = nil
7
+
8
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
9
+ end
10
+ end
Binary file
Binary file
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+
8
+ require 'taglib'
9
+
10
+ HAVE_ENCODING = !RUBY_VERSION.start_with?("1.8")
@@ -0,0 +1,93 @@
1
+ require 'helper'
2
+
3
+ class TestID3v2Frames < Test::Unit::TestCase
4
+ context "The sample.mp3 file's frames" do
5
+ setup do
6
+ read_properties = false
7
+ # It's important that file is an instance variable, otherwise the
8
+ # tag would get garbage collected along with the file, even if tag
9
+ # itself would still be reachable. The reason is because
10
+ # TagLib::MPEG::File owns the TagLib::ID3v2::Tag and automatically
11
+ # deletes it in its destructor.
12
+ @file = TagLib::MPEG::File.new("test/data/sample.mp3", read_properties)
13
+ picture_file = File.open("test/data/globe_east_540.jpg", "rb") do |f|
14
+ @picture_data = f.read
15
+ end
16
+ @tag = @file.id3v2_tag
17
+ @frames = @tag.frame_list
18
+ end
19
+
20
+ should "be complete" do
21
+ assert_not_nil @frames
22
+ assert_equal 11, @frames.size
23
+ iterator = @frames.begin
24
+ frame = iterator.value
25
+ assert_equal "Dummy Title", frame.to_string
26
+ end
27
+
28
+ should "be enumerable" do
29
+ ids = @frames.collect{ |frame| frame.frame_id }
30
+ assert_equal ["TIT2", "TPE1", "TALB", "TRCK", "TDRC",
31
+ "COMM", "COMM", "TCON", "TXXX", "COMM", "APIC"], ids
32
+ end
33
+
34
+ should "be automatically converted" do
35
+ apic = @tag.frame_list('APIC').first
36
+ comm = @tag.frame_list('COMM').first
37
+ tit2 = @tag.frame_list('TIT2').first
38
+ assert_equal TagLib::ID3v2::AttachedPictureFrame, apic.class
39
+ assert_equal TagLib::ID3v2::CommentsFrame, comm.class
40
+ assert_equal TagLib::ID3v2::TextIdentificationFrame, tit2.class
41
+ end
42
+
43
+ context "APIC frame" do
44
+ setup do
45
+ @apic = @tag.frame_list('APIC').first
46
+ end
47
+
48
+ should "have a type" do
49
+ assert_equal TagLib::ID3v2::AttachedPictureFrame::FrontCover, @apic.type
50
+ end
51
+
52
+ should "have a description" do
53
+ assert_equal "Blue Marble", @apic.description
54
+ end
55
+
56
+ should "have a mime type" do
57
+ assert_equal "image/jpeg", @apic.mime_type
58
+ end
59
+
60
+ should "have picture bytes" do
61
+ assert_equal 61649, @apic.picture.size
62
+ if HAVE_ENCODING
63
+ assert_equal @picture_data.encoding, @apic.picture.encoding
64
+ end
65
+ assert_equal @picture_data, @apic.picture
66
+ end
67
+ end
68
+
69
+ context "TXXX frame" do
70
+ setup do
71
+ @txxx_frame = @tag.frame_list('TXXX').first
72
+ end
73
+
74
+ should "exist" do
75
+ assert_not_nil @txxx_frame
76
+ end
77
+
78
+ should "have to_s" do
79
+ expected = "[MusicBrainz Album Id] MusicBrainz Album Id 992dc19a-5631-40f5-b252-fbfedbc328a9"
80
+ assert_equal expected, @txxx_frame.to_s
81
+ end
82
+
83
+ should "be convertable to its concrete type" do
84
+ txxx = @txxx_frame.to_user_text_identification_frame
85
+ assert_equal TagLib::ID3v2::UserTextIdentificationFrame, txxx.class
86
+ end
87
+
88
+ should "have field_list" do
89
+ assert_equal ["MusicBrainz Album Id", "992dc19a-5631-40f5-b252-fbfedbc328a9"], @txxx_frame.field_list
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,54 @@
1
+ require 'helper'
2
+
3
+ class TestID3v2Memory < Test::Unit::TestCase
4
+
5
+ N = 1000
6
+
7
+ context "TagLib::ID3v2" do
8
+ setup do
9
+ @file = TagLib::MPEG::File.new("test/data/sample.mp3", false)
10
+ @tag = @file.id3v2_tag
11
+ @apic = @tag.frame_list("APIC").first
12
+ end
13
+
14
+ should "not corrupt memory with FrameList" do
15
+ N.times do
16
+ @tag.frame_list
17
+ end
18
+ end
19
+
20
+ should "not corrupt memory with ByteVector" do
21
+ data = nil
22
+ N.times do
23
+ data = @apic.picture
24
+ end
25
+ N.times do
26
+ @apic.picture = data
27
+ end
28
+ end
29
+
30
+ should "not corrupt memory with StringList" do
31
+ txxx = @tag.frame_list('TXXX').first
32
+ N.times do
33
+ txxx.field_list
34
+ end
35
+ N.times do
36
+ txxx.field_list = ["one", "two", "three"]
37
+ end
38
+ end
39
+
40
+ should "not segfault when tag is deleted along with file" do
41
+ @file = nil
42
+ begin
43
+ N.times do
44
+ GC.start
45
+ @tag.title
46
+ end
47
+ rescue => e
48
+ assert_equal "ObjectPreviouslyDeleted", e.class.to_s
49
+ else
50
+ raise "GC did not delete file, unsure if test was successful."
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,31 @@
1
+ require 'helper'
2
+
3
+ class TestID3v2Tag < Test::Unit::TestCase
4
+ context "The sample.mp3 file" do
5
+ setup do
6
+ read_properties = false
7
+ @file = TagLib::MPEG::File.new("test/data/sample.mp3", read_properties)
8
+ end
9
+
10
+ should "have an ID3v2 tag" do
11
+ assert_not_nil @file.id3v2_tag
12
+ end
13
+
14
+ context "tag" do
15
+ setup do
16
+ @tag = @file.id3v2_tag
17
+ end
18
+
19
+ should "have basic properties" do
20
+ assert_equal 'Dummy Title', @tag.title
21
+ assert_equal 'Dummy Artist', @tag.artist
22
+ assert_equal 'Dummy Album', @tag.album
23
+ assert_equal 'Dummy Comment', @tag.comment
24
+ assert_equal 'Pop', @tag.genre
25
+ assert_equal 2000, @tag.year
26
+ assert_equal 1, @tag.track
27
+ assert_equal false, @tag.empty?
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,42 @@
1
+ require 'helper'
2
+
3
+ class TestID3v2Unicode < Test::Unit::TestCase
4
+ context "The unicode.mp3 file" do
5
+ setup do
6
+ read_properties = false
7
+ @file = TagLib::MPEG::File.new("test/data/unicode.mp3", read_properties)
8
+ end
9
+
10
+ should "have an ID3v2 tag" do
11
+ assert_not_nil @file.id3v2_tag
12
+ end
13
+
14
+ if HAVE_ENCODING
15
+ context "tag" do
16
+ setup do
17
+ @tag = @file.id3v2_tag
18
+ end
19
+
20
+ should "return strings in the right encoding" do
21
+ assert_equal "UTF-8", @tag.title.encoding.to_s
22
+ end
23
+
24
+ should "convert strings to the right encoding" do
25
+ # Unicode Snowman in UTF-16
26
+ utf16_encoded = "\x26\x03"
27
+ utf16_encoded.force_encoding("UTF-16BE")
28
+
29
+ # It should be converted here
30
+ @tag.title = utf16_encoded
31
+
32
+ result = @tag.title
33
+
34
+ # In order for == to work, they have to be in the same
35
+ # encoding
36
+ utf8_encoded = utf16_encoded.encode("UTF-8")
37
+ assert_equal utf8_encoded, result
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end