taglib-ruby 0.4.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/.yardopts +9 -0
  2. data/CHANGES.md +53 -0
  3. data/Gemfile +4 -0
  4. data/Guardfile +8 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +87 -0
  7. data/Rakefile +29 -0
  8. data/docs/default/fulldoc/html/css/common.css +1 -0
  9. data/docs/taglib/base.rb +202 -0
  10. data/docs/taglib/id3v1.rb +5 -0
  11. data/docs/taglib/id3v2.rb +444 -0
  12. data/docs/taglib/mpeg.rb +120 -0
  13. data/docs/taglib/ogg.rb +77 -0
  14. data/docs/taglib/vorbis.rb +62 -0
  15. data/ext/extconf_common.rb +29 -0
  16. data/ext/taglib_base/extconf.rb +4 -0
  17. data/ext/taglib_base/includes.i +115 -0
  18. data/ext/taglib_base/taglib_base.i +139 -0
  19. data/ext/taglib_base/taglib_base_wrap.cxx +5153 -0
  20. data/ext/taglib_id3v1/extconf.rb +4 -0
  21. data/ext/taglib_id3v1/taglib_id3v1.i +11 -0
  22. data/ext/taglib_id3v1/taglib_id3v1_wrap.cxx +3110 -0
  23. data/ext/taglib_id3v2/extconf.rb +4 -0
  24. data/ext/taglib_id3v2/relativevolumeframe.i +35 -0
  25. data/ext/taglib_id3v2/taglib_id3v2.i +112 -0
  26. data/ext/taglib_id3v2/taglib_id3v2_wrap.cxx +9033 -0
  27. data/ext/taglib_mpeg/extconf.rb +4 -0
  28. data/ext/taglib_mpeg/taglib_mpeg.i +75 -0
  29. data/ext/taglib_mpeg/taglib_mpeg_wrap.cxx +4726 -0
  30. data/ext/taglib_ogg/extconf.rb +4 -0
  31. data/ext/taglib_ogg/taglib_ogg.i +36 -0
  32. data/ext/taglib_ogg/taglib_ogg_wrap.cxx +3631 -0
  33. data/ext/taglib_vorbis/extconf.rb +4 -0
  34. data/ext/taglib_vorbis/taglib_vorbis.i +48 -0
  35. data/ext/taglib_vorbis/taglib_vorbis_wrap.cxx +3083 -0
  36. data/ext/valgrind-suppressions.txt +170 -0
  37. data/ext/win.cmake +5 -0
  38. data/lib/libtag.dll +0 -0
  39. data/lib/taglib.rb +14 -0
  40. data/lib/taglib/base.rb +19 -0
  41. data/lib/taglib/id3v1.rb +1 -0
  42. data/lib/taglib/id3v2.rb +20 -0
  43. data/lib/taglib/mpeg.rb +7 -0
  44. data/lib/taglib/ogg.rb +1 -0
  45. data/lib/taglib/version.rb +10 -0
  46. data/lib/taglib/vorbis.rb +7 -0
  47. data/lib/taglib_base.so +0 -0
  48. data/lib/taglib_id3v1.so +0 -0
  49. data/lib/taglib_id3v2.so +0 -0
  50. data/lib/taglib_mpeg.so +0 -0
  51. data/lib/taglib_ogg.so +0 -0
  52. data/lib/taglib_vorbis.so +0 -0
  53. data/taglib-ruby.gemspec +122 -0
  54. data/tasks/docs_coverage.rake +26 -0
  55. data/tasks/ext.rake +81 -0
  56. data/tasks/gemspec_check.rake +19 -0
  57. data/tasks/swig.rake +43 -0
  58. data/test/data/Makefile +15 -0
  59. data/test/data/add-relative-volume.cpp +40 -0
  60. data/test/data/crash.mp3 +0 -0
  61. data/test/data/globe_east_540.jpg +0 -0
  62. data/test/data/id3v1-create.cpp +31 -0
  63. data/test/data/id3v1.mp3 +0 -0
  64. data/test/data/relative-volume.mp3 +0 -0
  65. data/test/data/sample.mp3 +0 -0
  66. data/test/data/unicode.mp3 +0 -0
  67. data/test/data/vorbis-create.cpp +42 -0
  68. data/test/data/vorbis.oga +0 -0
  69. data/test/fileref_open_test.rb +32 -0
  70. data/test/fileref_properties_test.rb +21 -0
  71. data/test/fileref_write_test.rb +62 -0
  72. data/test/helper.rb +10 -0
  73. data/test/id3v1_tag_test.rb +36 -0
  74. data/test/id3v2_frames_test.rb +115 -0
  75. data/test/id3v2_memory_test.rb +87 -0
  76. data/test/id3v2_relative_volume_test.rb +62 -0
  77. data/test/id3v2_tag_test.rb +59 -0
  78. data/test/id3v2_unicode_test.rb +47 -0
  79. data/test/id3v2_write_test.rb +100 -0
  80. data/test/mpeg_file_test.rb +76 -0
  81. data/test/tag_test.rb +21 -0
  82. data/test/unicode_filename_test.rb +29 -0
  83. data/test/vorbis_file_test.rb +54 -0
  84. data/test/vorbis_tag_test.rb +79 -0
  85. metadata +191 -0
data/.yardopts ADDED
@@ -0,0 +1,9 @@
1
+ --markup markdown
2
+ --markup-provider redcarpet
3
+ --charset UTF-8
4
+ --template-path docs
5
+ docs/**/*.rb
6
+ -
7
+ README.md
8
+ CHANGES.md
9
+ LICENSE.txt
data/CHANGES.md ADDED
@@ -0,0 +1,53 @@
1
+ Changes in Releases of taglib-ruby
2
+ ==================================
3
+
4
+ ## 0.4.0 (2012-03-18)
5
+
6
+ * Pre-compiled binary gem for Windows (Ruby 1.9) with TagLib 1.7.1
7
+ * Unicode filename support on Windows
8
+ * Add `open` class method to `FileRef` and `File` classes (use it
9
+ instead of `new` and `close`):
10
+
11
+ ```ruby
12
+ title = TagLib::FileRef.open("file.mp3") do |file|
13
+ tag = file.tag
14
+ tag.title
15
+ end
16
+ ```
17
+
18
+ ## 0.3.1 (2012-01-22)
19
+
20
+ * Fix ObjectPreviouslyDeleted exception after calling
21
+ TagLib::ID3v2::Tag#add_frame (#8)
22
+ * Make installation under MacPorts work out of the box (#7)
23
+
24
+ ## 0.3.0 (2012-01-02)
25
+
26
+ * Add support for Ogg Vorbis
27
+ * Add support for ID3v1 (#2)
28
+ * Add #close to File classes for explicitly releasing resources
29
+ * Fix compilation on Windows
30
+
31
+ ## 0.2.1 (2011-11-05)
32
+
33
+ * Fix compilation error due to missing typedef on some systems (#5)
34
+
35
+ ## 0.2.0 (2011-10-22)
36
+
37
+ * API documentation
38
+ * Add support for:
39
+ * TagLib::AudioProperties and TagLib::MPEG::Properties (#4)
40
+ * TagLib::ID3v2::RelativeVolumeFrame
41
+
42
+ ## 0.1.1 (2011-09-17)
43
+
44
+ * Add installation instructions and clean up description
45
+
46
+ ## 0.1.0 (2011-09-17)
47
+
48
+ * Initial release
49
+ * Coverage of the following API:
50
+ * TagLib::FileRef
51
+ * TagLib::MPEG::File
52
+ * TagLib::ID3v2::Tag
53
+ * TagLib::ID3v2::Frame and subclasses
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Use dependencies from .gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,8 @@
1
+ # Guardfile for tests
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :test do
5
+ watch(%r{^lib/(.+)\.so$}) { "test" }
6
+ watch('test/test_helper.rb') { "test" }
7
+ watch(%r{^test/.+_test\.rb$})
8
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2010-2012 Robin Stocker
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,87 @@
1
+ taglib-ruby
2
+ ===========
3
+
4
+ Ruby interface for the [TagLib C++ library][taglib].
5
+
6
+ In contrast to other libraries, this one wraps the full C++ API, not
7
+ only the minimal C API. This means that all tag data can be accessed,
8
+ e.g. cover art of ID3v2 or custom fields of Ogg Vorbis comments.
9
+
10
+ taglib-ruby is work in progress, but the following is already available:
11
+
12
+ * Reading/writing common tag data of all formats that TagLib supports
13
+ * Reading/writing ID3v1 and ID3v2 including ID3v2.4 and Unicode
14
+ * Reading/writing Ogg Vorbis comments
15
+ * Reading audio properties (e.g. bitrate) of the above formats
16
+
17
+ Some things are still left to do (contributors very welcome):
18
+
19
+ * More coverage of the library
20
+
21
+ [![Build status][travis-img]][travis-link]
22
+
23
+ [![flattr this project][flattr-img]][flattr-link]
24
+
25
+ Installation
26
+ ------------
27
+
28
+ Before you install the gem, make sure to have [taglib][taglib] installed
29
+ with header files (and a C++ compiler of course):
30
+
31
+ * Debian/Ubuntu: `sudo apt-get install libtag1-dev`
32
+ * Fedora/RHEL: `sudo yum install taglib-devel`
33
+ * Brew: `brew install taglib`
34
+ * MacPorts: `sudo port install taglib`
35
+
36
+ Then do:
37
+
38
+ gem install taglib-ruby
39
+
40
+ Usage
41
+ -----
42
+
43
+ Complete API documentation can be found here:
44
+
45
+ http://rubydoc.info/gems/taglib-ruby/frames
46
+
47
+ Begin with the {TagLib} namespace.
48
+
49
+ Release Notes
50
+ -------------
51
+
52
+ See {file:CHANGES.md}.
53
+
54
+ Contributing
55
+ ------------
56
+
57
+ * Check out the latest master to make sure the feature hasn't been
58
+ implemented or the bug hasn't been fixed yet
59
+ * Check out the issue tracker to make sure someone already hasn't
60
+ requested it and/or contributed it
61
+ * Fork the project
62
+ * Start a feature/bugfix branch
63
+ * Commit and push until you are happy with your contribution
64
+ * Make sure to add tests for it. This is important so I don't break it
65
+ in a future version unintentionally.
66
+ * Please try not to mess with the Rakefile, version, or history. If you
67
+ want to have your own version, or is otherwise necessary, that is
68
+ fine, but please isolate to its own commit so I can cherry-pick around
69
+ it.
70
+
71
+ License
72
+ -------
73
+
74
+ Copyright (c) 2010-2012 Robin Stocker.
75
+
76
+ taglib-ruby is distributed under the MIT License,
77
+ see LICENSE.txt for details.
78
+
79
+ In the binary gem for Windows, a compiled [TagLib][taglib] is bundled as
80
+ a DLL. TagLib is distributed under the GNU Lesser General Public License
81
+ version 2.1 (LGPL) and Mozilla Public License (MPL).
82
+
83
+ [taglib]: http://developer.kde.org/~wheeler/taglib.html
84
+ [travis-img]: https://secure.travis-ci.org/robinst/taglib-ruby.png
85
+ [travis-link]: http://travis-ci.org/robinst/taglib-ruby
86
+ [flattr-img]: http://api.flattr.com/button/flattr-badge-large.png
87
+ [flattr-link]: https://flattr.com/submit/auto?user_id=robinst&url=https://github.com/robinst/taglib-ruby&title=taglib-ruby&tags=github&category=software
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ require 'bundler/gem_tasks'
4
+ begin
5
+ Bundler.setup(:default, :development)
6
+ rescue Bundler::BundlerError => e
7
+ $stderr.puts e.message
8
+ $stderr.puts "Run `bundle install` to install missing gems"
9
+ exit e.status_code
10
+ end
11
+
12
+ require 'rake/testtask'
13
+ Rake::TestTask.new(:test) do |test|
14
+ test.libs << 'test'
15
+ test.pattern = 'test/**/*_test.rb'
16
+ end
17
+
18
+ task :default => [:compile, :test]
19
+
20
+ require 'yard'
21
+ YARD::Rake::YardocTask.new do |t|
22
+ version = TagLib::Version::STRING
23
+ t.options = ['--title', "taglib-ruby #{version}"]
24
+ end
25
+
26
+ # Change to Bundler::GemHelper.gemspec when it's released
27
+ $gemspec = Bundler.load_gemspec('taglib-ruby.gemspec')
28
+
29
+ FileList['tasks/**/*.rake'].each { |task| import task }
@@ -0,0 +1 @@
1
+ .showSource { display: none; }
@@ -0,0 +1,202 @@
1
+ # This is the top-level module of taglib-ruby.
2
+ #
3
+ # Where to find what:
4
+ #
5
+ # * Reading/writing basic tag and audio properties without having to
6
+ # know the tagging format: {TagLib::FileRef}
7
+ # * Reading properties of MPEG files: {TagLib::MPEG::File}
8
+ # * Reading/writing ID3v2 tags: {TagLib::MPEG::File} and
9
+ # {TagLib::ID3v2::Tag}
10
+ # * Reading/writing Ogg Vorbis tags: {TagLib::Ogg::Vorbis::File}.
11
+ #
12
+ # ## String Encodings
13
+ #
14
+ # Sometimes, it is necessary to specify which encoding should be used to
15
+ # store strings in tags. For this, the following constants are defined:
16
+ #
17
+ # * `TagLib::String::Latin1`
18
+ # * `TagLib::String::UTF16`
19
+ # * `TagLib::String::UTF16BE`
20
+ # * `TagLib::String::UTF8`
21
+ # * `TagLib::String::UTF16LE`
22
+ #
23
+ # For ID3v2 frames, you can also set a default text encoding globally
24
+ # using the {TagLib::ID3v2::FrameFactory}.
25
+ module TagLib
26
+
27
+ # This class allows to read basic tagging and audio properties from
28
+ # files, without having to know what the file type is. Thus, it works
29
+ # for all tagging formats that taglib supports, but only provides a
30
+ # minimal API.
31
+ #
32
+ # Should you need more, use the file type specific classes, see
33
+ # subclasses of {TagLib::File}.
34
+ #
35
+ # @example Reading tags
36
+ # TagLib::FileRef.open("foo.flac") do |file|
37
+ # tag = file.tag
38
+ # puts tag.artist
39
+ # puts tag.title
40
+ # end
41
+ #
42
+ # @example Reading audio properties
43
+ # TagLib::FileRef.open("bar.oga") do |file|
44
+ # prop = file.audio_properties
45
+ # puts prop.length
46
+ # puts prop.bitrate
47
+ # end
48
+ #
49
+ class FileRef
50
+
51
+ # Creates a new file and passes it to the provided block,
52
+ # closing the file automatically at the end of the block.
53
+ #
54
+ # Note that after the block is done, the file is closed and
55
+ # all memory is released for objects read from the file
56
+ # (basically everything from the `TagLib` namespace).
57
+ #
58
+ # Using `open` is preferable to using `new` and then
59
+ # manually `close`.
60
+ #
61
+ # @example Reading a title
62
+ # title = TagLib::FileRef.open("file.oga") do |file|
63
+ # tag = file.tag
64
+ # tag.title
65
+ # end
66
+ #
67
+ # @param (see #initialize)
68
+ # @yield [file] the {FileRef} object, as obtained by {#initialize}
69
+ # @return the return value of the block
70
+ #
71
+ # @since 0.4.0
72
+ def self.open(filename, read_audio_properties=true,
73
+ audio_properties_style=TagLib::AudioProperties::Average)
74
+ end
75
+
76
+ # Create a FileRef from a file name.
77
+ #
78
+ # @param [String] filename
79
+ # @param [Boolean] read_audio_properties
80
+ # true if audio properties should be read
81
+ # @param [TagLib::AudioProperties constants] audio_properties_style
82
+ # how accurately the audio properties should be read, e.g.
83
+ # {TagLib::AudioProperties::Average}
84
+ def initialize(filename, read_audio_properties=true,
85
+ audio_properties_style=TagLib::AudioProperties::Average)
86
+ end
87
+
88
+ # @return [TagLib::AudioProperties] the audio properties
89
+ def audio_properties
90
+ end
91
+
92
+ # @return [Boolean] if the file is null (i.e. it could not be read)
93
+ def null?
94
+ end
95
+
96
+ # Saves the file
97
+ #
98
+ # @return [Boolean] whether saving was successful
99
+ def save
100
+ end
101
+
102
+ # @return [TagLib::Tag] the tag
103
+ def tag
104
+ end
105
+
106
+ # Closes the file and releases all objects that were read from the
107
+ # file.
108
+ #
109
+ # @see TagLib::File#close
110
+ #
111
+ # @return [void]
112
+ def close
113
+ end
114
+ end
115
+
116
+ # @abstract Base class for files, see subclasses.
117
+ class File
118
+ # Closes the file and releases all objects that were read from the
119
+ # file (basically everything from the TagLib namespace).
120
+ #
121
+ # After this method has been called, no other methods on this object
122
+ # may be called. So it's a good idea to always use it like this:
123
+ #
124
+ # file = TagLib::MPEG::File.new("file.mp3")
125
+ # # ...
126
+ # file.close
127
+ # file = nil
128
+ #
129
+ # This method should always be called as soon as you're finished
130
+ # with a file. Otherwise the file will only be closed when GC is
131
+ # run, which may be much later. On Windows, this is especially
132
+ # important as the file is locked until it is closed.
133
+ #
134
+ # As a better alternative to this, use the `open` class method:
135
+ #
136
+ # TagLib::MPEG::File.open("file.mp3") do |file|
137
+ # # ...
138
+ # end
139
+ #
140
+ # @return [void]
141
+ def close
142
+ end
143
+ end
144
+
145
+ # @abstract Base class for tags.
146
+ #
147
+ # This is a unified view which provides basic tag information, which
148
+ # is common in all tag formats. See subclasses for functionality that
149
+ # goes beyond this interface.
150
+ class Tag
151
+ # @return [String] the album
152
+ # @return [nil] if not present
153
+ attr_accessor :album
154
+
155
+ # @return [String] the artist/interpret
156
+ # @return [nil] if not present
157
+ attr_accessor :artist
158
+
159
+ # @return [String] the comment
160
+ # @return [nil] if not present
161
+ attr_accessor :comment
162
+
163
+ # @return [String] the genre
164
+ # @return [nil] if not present
165
+ attr_accessor :genre
166
+
167
+ # @return [String] the title
168
+ # @return [nil] if not present
169
+ attr_accessor :title
170
+
171
+ # @return [Integer] the track number
172
+ # @return [0] if not present
173
+ attr_accessor :track
174
+
175
+ # @return [Integer] the year
176
+ # @return [0] if not present
177
+ attr_accessor :year
178
+
179
+ # @return [Boolean]
180
+ def empty?; end
181
+ end
182
+
183
+ # @abstract Base class for audio properties.
184
+ class AudioProperties
185
+
186
+ Fast = 0
187
+ Average = 1
188
+ Accurate = 2
189
+
190
+ # @return [Integer] length of the file in seconds
191
+ attr_reader :length
192
+
193
+ # @return [Integer] bit rate in kb/s (kilobit per second)
194
+ attr_reader :bitrate
195
+
196
+ # @return [Integer] sample rate in Hz
197
+ attr_reader :sample_rate
198
+
199
+ # @return [Integer] number of channels
200
+ attr_reader :channels
201
+ end
202
+ end
@@ -0,0 +1,5 @@
1
+ module TagLib::ID3v1
2
+ # An ID3v1 tag.
3
+ class Tag < TagLib::Tag
4
+ end
5
+ end
@@ -0,0 +1,444 @@
1
+ module TagLib::ID3v2
2
+ # An ID3v2 tag. A tag consists of a list of frames, identified by IDs.
3
+ #
4
+ # ## Encoding
5
+ #
6
+ # By default, taglib stores ID3v2 text frames as ISO-8859-1 (Latin-1) if the
7
+ # text contains only characters that are available in that encoding. If
8
+ # not (e.g. with Cyrillic, Chinese, Japanese), it prints a warning and
9
+ # stores the text as UTF-8.
10
+ #
11
+ # When you already know that you want to store the text as UTF-8, you can
12
+ # change the default text encoding:
13
+ #
14
+ # frame_factory = TagLib::ID3v2::FrameFactory.instance
15
+ # frame_factory.default_text_encoding = TagLib::String::UTF8
16
+ #
17
+ # Another option is using the frame API directly:
18
+ #
19
+ # title = tag.frame_list('TIT2').first
20
+ # title.text = "Joga"
21
+ # title.text_encoding = TagLib::String::UTF8
22
+ #
23
+ # @example Read ID3v2 frames from a file
24
+ # TagLib::MPEG::File.new("wake_up.mp3") do |file|
25
+ # tag = file.id3v2_tag
26
+ #
27
+ # # Read basic attributes
28
+ # tag.title #=> "Wake Up"
29
+ # tag.artist #=> "Arcade Fire"
30
+ # tag.track #=> 7
31
+ #
32
+ # # Access all frames
33
+ # tag.frame_list.size #=> 13
34
+ #
35
+ # # Track frame
36
+ # track = tag.frame_list('TRCK').first
37
+ # track.to_s #=> "7/10"
38
+ #
39
+ # # Attached picture frame
40
+ # cover = tag.frame_list('APIC').first
41
+ # cover.mime_type #=> "image/jpeg"
42
+ # cover.picture #=> "\xFF\xD8\xFF\xE0\x00\x10JFIF..."
43
+ # end
44
+ #
45
+ # @example Add frames and save file
46
+ # TagLib::MPEG::File.new("joga.mp3") do |file|
47
+ # tag = file.id3v2_tag
48
+ #
49
+ # # Write basic attributes
50
+ # tag.artist = "Björk"
51
+ # tag.title = "Jóga"
52
+ #
53
+ # # Add attached picture frame
54
+ # apic = TagLib::ID3v2::AttachedPictureFrame.new
55
+ # apic.mime_type = "image/jpeg"
56
+ # apic.description = "Cover"
57
+ # apic.type = TagLib::ID3v2::AttachedPictureFrame::FrontCover
58
+ # apic.picture = File.open("cover.jpg", 'rb'){ |f| f.read }
59
+ #
60
+ # tag.add_frame(apic)
61
+ #
62
+ # file.save
63
+ # end
64
+ class Tag < TagLib::Tag
65
+ # Get a list of frames. Note that the frames returned are subclasses
66
+ # of {TagLib::ID3v2::Frame}, depending on the frame ID.
67
+ #
68
+ # @overload frame_list()
69
+ # Returns all frames.
70
+ #
71
+ # @overload frame_list(frame_id)
72
+ # Returns frames matching ID.
73
+ #
74
+ # @param [String] frame_id Specify this parameter to get only the
75
+ # frames matching a frame ID (e.g. "TIT2").
76
+ #
77
+ # @return [Array<TagLib::ID3v2::Frame>]
78
+ def frame_list
79
+ end
80
+
81
+ # Add a frame to the tag.
82
+ #
83
+ # @param [Frame] frame
84
+ # @return [void]
85
+ def add_frame(frame)
86
+ end
87
+
88
+ # Remove the passed frame from the tag.
89
+ #
90
+ # **Note:** You can and shall not call any methods on the frame
91
+ # object after you have passed it to this method, because the
92
+ # underlying C++ object has been deleted.
93
+ #
94
+ # @param [Frame] frame to remove
95
+ # @return [void]
96
+ def remove_frame(frame)
97
+ end
98
+
99
+ # Remove all frames with the specified ID from the tag.
100
+ #
101
+ # **Note:** If you have obtained any frame objects with the same ID
102
+ # from the tag before calling this method, you should not touch them
103
+ # anymore. The reason is that the C++ objects may have been deleted.
104
+ #
105
+ # @param [String] id
106
+ # @return [void]
107
+ def remove_frames(id)
108
+ end
109
+ end
110
+
111
+ # Frame factory for ID3v2 frames. Useful for setting the default text
112
+ # encoding.
113
+ class FrameFactory
114
+ # @return [FrameFactory] the default frame factory
115
+ def self.instance
116
+ end
117
+
118
+ # Get/set the default text encoding for new ID3v2 frames. See the
119
+ # section _String Encodings_ in {TagLib}.
120
+ #
121
+ # @return [TagLib::String constant] default text encoding
122
+ attr_accessor :default_text_encoding
123
+ end
124
+
125
+ # The base class for all ID3v2 frames.
126
+ #
127
+ # In ID3v2 all frames are identified by a {#frame_id frame ID}, such
128
+ # as `TIT2` or `APIC`. The data in the frames is different depending
129
+ # on the frame type, which is why there is a subclass for each type.
130
+ #
131
+ # The most common frame type is the text identification frame. All
132
+ # frame IDs of this type begin with `T`, for example `TALB` for the
133
+ # album. See {TextIdentificationFrame}.
134
+ #
135
+ # Then there are the URL link frames, which begin with `W`, see
136
+ # {UrlLinkFrame}.
137
+ #
138
+ # Finally, there are some specialized frame types and their
139
+ # corresponding classes:
140
+ #
141
+ # * `APIC`: {AttachedPictureFrame}
142
+ # * `COMM`: {CommentsFrame}
143
+ # * `GEOB`: {GeneralEncapsulatedObjectFrame}
144
+ # * `POPM`: {PopularimeterFrame}
145
+ # * `PRIV`: {PrivateFrame}
146
+ # * `RVAD`: {RelativeVolumeFrame}
147
+ # * `TXXX`: {UserTextIdentificationFrame}
148
+ # * `UFID`: {UniqueFileIdentifierFrame}
149
+ # * `USLT`: {UnsynchronizedLyricsFrame}
150
+ # * `WXXX`: {UserUrlLinkFrame}
151
+ #
152
+ class Frame
153
+ # @return [String] frame ID
154
+ attr_reader :frame_id
155
+
156
+ # @return [String] a subclass-specific string representation
157
+ def to_string
158
+ end
159
+ end
160
+
161
+ # Attached picture frame (`APIC`), e.g. for cover art.
162
+ #
163
+ # The constants in this class are used for the {#type} attribute.
164
+ class AttachedPictureFrame < Frame
165
+ # Other
166
+ Other = 0x00
167
+ # 32x32 file icon (PNG only)
168
+ FileIcon = 0x01
169
+ OtherFileIcon = 0x02
170
+ FrontCover = 0x03
171
+ BackCover = 0x04
172
+ LeafletPage = 0x05
173
+ Media = 0x06
174
+ LeadArtist = 0x07
175
+ Artist = 0x08
176
+ Conductor = 0x09
177
+ Band = 0x0A
178
+ Composer = 0x0B
179
+ Lyricist = 0x0C
180
+ RecordingLocation = 0x0D
181
+ DuringRecording = 0x0E
182
+ DuringPerformance = 0x0F
183
+ MovieScreenCapture = 0x10
184
+ ColouredFish = 0x11
185
+ Illustration = 0x12
186
+ BandLogo = 0x13
187
+ PublisherLogo = 0x14
188
+
189
+ def initialize()
190
+ end
191
+
192
+ # @return [String]
193
+ attr_accessor :description
194
+
195
+ # MIME type (e.g. `"image/png"`)
196
+ # @return [String]
197
+ attr_accessor :mime_type
198
+
199
+ # {include:GeneralEncapsulatedObjectFrame#object}
200
+ #
201
+ # @return [binary String]
202
+ attr_accessor :picture
203
+
204
+ # {include:TextIdentificationFrame#text_encoding}
205
+ #
206
+ # @return [TagLib::String constant]
207
+ attr_accessor :text_encoding
208
+
209
+ # Type of the attached picture, see constants.
210
+ # @return [AttachedPictureFrame constant]
211
+ attr_accessor :type
212
+ end
213
+
214
+ # Comments frame (`COMM`) for full text information that doesn't fit in
215
+ # any other frame.
216
+ class CommentsFrame < Frame
217
+ # @return [String] content description, which together with language
218
+ # should be unique per tag
219
+ attr_accessor :description
220
+
221
+ # @return [String] alpha-3 language code of text (ISO-639-2),
222
+ # e.g. "eng"
223
+ attr_accessor :language
224
+
225
+ # @return [String] the actual comment text
226
+ attr_accessor :text
227
+
228
+ # {include:TextIdentificationFrame#text_encoding}
229
+ #
230
+ # @return [TagLib::String constant]
231
+ attr_accessor :text_encoding
232
+ end
233
+
234
+ # General encapsulated object frame (`GEOB`).
235
+ class GeneralEncapsulatedObjectFrame < Frame
236
+ # @return [String] content description
237
+ attr_accessor :description
238
+
239
+ # @return [String] file name
240
+ attr_accessor :file_name
241
+
242
+ # @return [String] MIME type
243
+ attr_accessor :mime_type
244
+
245
+ # Binary data string.
246
+ #
247
+ # Be sure to use a binary string when setting this attribute. In
248
+ # Ruby 1.9, this means reading from a file with `"b"` mode to get a
249
+ # string with encoding `BINARY` / `ASCII-8BIT`.
250
+ #
251
+ # @return [binary String]
252
+ attr_accessor :object
253
+
254
+ # {include:TextIdentificationFrame#text_encoding}
255
+ #
256
+ # @return [String]
257
+ attr_accessor :text_encoding
258
+ end
259
+
260
+ # Popularimeter frame (`POPM`).
261
+ class PopularimeterFrame < Frame
262
+ # @return [Integer] play counter
263
+ attr_accessor :counter
264
+
265
+ # @return [String] e-mail address
266
+ attr_accessor :email
267
+
268
+ # @return [Integer] rating
269
+ attr_accessor :rating
270
+ end
271
+
272
+ # Private frame (`PRIV`).
273
+ class PrivateFrame < Frame
274
+ # {include:GeneralEncapsulatedObjectFrame#object}
275
+ #
276
+ # @return [binary String]
277
+ attr_accessor :data
278
+
279
+ # @return [String] owner identifier
280
+ attr_accessor :owner
281
+ end
282
+
283
+ # Relative volume adjustment frame (`RVAD` or `RVA2`).
284
+ class RelativeVolumeFrame < Frame
285
+ Other = 0x00
286
+ MasterVolume = 0x01
287
+ FrontRight = 0x02
288
+ FrontLeft = 0x03
289
+ BackRight = 0x04
290
+ BackLeft = 0x05
291
+ FrontCentre = 0x06
292
+ BackCentre = 0x07
293
+ Subwoofer = 0x08
294
+
295
+ # @return [Array<TagLib::ID3v2::RelativeVolumeFrame constant>]
296
+ # the channel types for which volume adjustment information is
297
+ # stored in this frame
298
+ def channels
299
+ end
300
+
301
+ # @return [String] relative volume identification
302
+ attr_accessor :identification
303
+
304
+ # Returns peak volume for channel type.
305
+ #
306
+ # @param [TagLib::ID3v2::RelativeVolumeFrame constant] type
307
+ # @return [TagLib::ID3v2::PeakVolume]
308
+ def peak_volume(type=TagLib::ID3v2::RelativeVolumeFrame::MasterVolume)
309
+ end
310
+
311
+ # Sets peak volume for channel type.
312
+ #
313
+ # @param [TagLib::ID3v2::PeakVolume] peak peak volume
314
+ # @param [TagLib::ID3v2::RelativeVolumeFrame constant] type
315
+ # @return [void]
316
+ def set_peak_volume(peak, type=TagLib::ID3v2::RelativeVolumeFrame::MasterVolume)
317
+ end
318
+
319
+ # Returns volume adjustment in decibels for a specific channel type.
320
+ # Internally, this is stored as an index, see
321
+ # {#volume_adjustment_index}.
322
+ #
323
+ # @param [TagLib::ID3v2::RelativeVolumeFrame constant] type
324
+ # @return [Float]
325
+ def volume_adjustment(type=TagLib::ID3v2::RelativeVolumeFrame::MasterVolume)
326
+ end
327
+
328
+ # Sets volume adjustment in decibels for a specific channel type.
329
+ # Internally, this is stored as an index, see
330
+ # {#set_volume_adjustment_index}.
331
+ #
332
+ # @param [Float] adjustment
333
+ # @param [TagLib::ID3v2::RelativeVolumeFrame constant] type
334
+ # @return [void]
335
+ def set_volume_adjustment(adjustment, type=TagLib::ID3v2::RelativeVolumeFrame::MasterVolume)
336
+ end
337
+
338
+ # Returns volume adjustment index for a specific channel type. When
339
+ # dividing the index by 512, it corresponds to the volume adjustment
340
+ # in decibel.
341
+ #
342
+ # @param [TagLib::ID3v2::RelativeVolumeFrame constant] type
343
+ # @return [Integer]
344
+ def volume_adjustment_index(type=TagLib::ID3v2::RelativeVolumeFrame::MasterVolume)
345
+ end
346
+
347
+ # Sets volume adjustment index for a specific channel type. When
348
+ # dividing the index by 512, it corresponds to the volume adjustment
349
+ # in decibel.
350
+ #
351
+ # @param [Integer] index
352
+ # @param [TagLib::ID3v2::RelativeVolumeFrame constant] type
353
+ # @return [void]
354
+ def set_volume_adjustment_index(index, type=TagLib::ID3v2::RelativeVolumeFrame::MasterVolume)
355
+ end
356
+ end
357
+
358
+ # Peak volume used for {RelativeVolumeFrame}. The two attributes of
359
+ # this class must always read/written together, as they are used to
360
+ # describe one concept, the peak volume number.
361
+ #
362
+ # Note that due to how SWIG works, this is not a nested class of
363
+ # RelativeVolumeFrame as in taglib. That doesn't affect its usage
364
+ # though.
365
+ class PeakVolume
366
+ # @return [Integer] the number of bits of the {#peak_volume} that
367
+ # represent the peak volume (0 to 255)
368
+ attr_accessor :bits_representing_peak
369
+
370
+ # @return [binary String] the (byte-padded) bits used for the peak
371
+ # volume
372
+ attr_accessor :peak_volume
373
+ end
374
+
375
+ # Text identification frame (`T???`).
376
+ class TextIdentificationFrame < Frame
377
+ # Encoding for storing the text in the tag, e.g.
378
+ # `TagLib::String::UTF8`. See the section _String Encodings_ in
379
+ # {TagLib}.
380
+ #
381
+ # @return [TagLib::String constant]
382
+ attr_accessor :text_encoding
383
+
384
+ # @return [Array<String>] list of text strings in this frame
385
+ attr_accessor :field_list
386
+
387
+ # @param [String] text simple text to set
388
+ attr_writer :text
389
+ end
390
+
391
+ # User text identification frame (`TXXX`).
392
+ class UserTextIdentificationFrame < TextIdentificationFrame
393
+ # @return [String] description of content
394
+ attr_accessor :description
395
+ end
396
+
397
+ # Unique file identifier frame (`UFID`).
398
+ class UniqueFileIdentifierFrame < Frame
399
+ # @return [String] identifier
400
+ attr_accessor :identifier
401
+
402
+ # @return [String] owner
403
+ attr_accessor :owner
404
+ end
405
+
406
+ # Unsynchronized lyrics frame (`USLT`).
407
+ class UnsynchronizedLyricsFrame < Frame
408
+ # @return [String] frame description
409
+ attr_accessor :description
410
+
411
+ # @return [String] alpha-3 language code of text (ISO-639-2),
412
+ # e.g. "eng"
413
+ attr_accessor :language
414
+
415
+ # @return [String] text
416
+ attr_accessor :text
417
+
418
+ # {include:TextIdentificationFrame#text_encoding}
419
+ #
420
+ # @return [String]
421
+ attr_accessor :text_encoding
422
+ end
423
+
424
+ # URL link frame (`W???`), e.g. `WOAR` for "official artist/performer
425
+ # webpage".
426
+ class UrlLinkFrame < Frame
427
+ # @param [String] text simple text to set
428
+ attr_writer :text
429
+
430
+ # @param [String] URL
431
+ attr_accessor :url
432
+ end
433
+
434
+ # User URL link frame (`WXXX`).
435
+ class UserUrlLinkFrame < UrlLinkFrame
436
+ # @return [String] description
437
+ attr_accessor :description
438
+
439
+ # {include:TextIdentificationFrame#text_encoding}
440
+ #
441
+ # @return [String]
442
+ attr_accessor :text_encoding
443
+ end
444
+ end