id3lib-ruby 0.4.1 → 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.
- data/CHANGES +13 -0
- data/INSTALL +57 -0
- data/README +3 -12
- data/Rakefile +13 -10
- data/ext/generate_info.rb +64 -51
- data/ext/id3lib_api.i +10 -9
- data/ext/id3lib_api_wrap.cxx +90 -54
- data/lib/id3lib.rb +10 -3
- data/lib/id3lib/info.rb +41 -37
- data/test/test_writing.rb +1 -0
- metadata +6 -4
data/CHANGES
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
= id3lib-ruby changes
|
2
2
|
|
3
|
+
=== 0.5.0 (2006-12-16)
|
4
|
+
|
5
|
+
* Warn when encountering nil field instead of raising exception (bug 6446).
|
6
|
+
* Corrected allowed fields - they are now generated from id3lib's source.
|
7
|
+
* Renamed :id field to :identifier because of confusion with frame ID.
|
8
|
+
* Added INSTALL document for installation instructions.
|
9
|
+
* Fixed memory leak in extension, where iterator was never released.
|
10
|
+
According to tests, there is no memory leak anymore.
|
11
|
+
* Added two patches for id3lib in mswin32 gem:
|
12
|
+
* unicode16: fixes Unicode writing bug
|
13
|
+
* convert_i-leak: fixes memory leak in Unicode conversion function
|
14
|
+
* Updated to SWIG 1.3.31.
|
15
|
+
|
3
16
|
=== 0.4.1 (r53)
|
4
17
|
|
5
18
|
* Added :description to the allowed fields of :TXXX frames (patch 5484).
|
data/INSTALL
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
= id3lib-ruby installation instructions
|
2
|
+
|
3
|
+
== Binary package (Windows)
|
4
|
+
|
5
|
+
There are precompiled binary gems available for Windows, so the installation
|
6
|
+
is as simple as typing the following and selecting the newest mswin32 gem:
|
7
|
+
|
8
|
+
gem install id3lib-ruby
|
9
|
+
|
10
|
+
== Source package
|
11
|
+
|
12
|
+
For other systems, there is a RubyGems package or a compressed archive.
|
13
|
+
|
14
|
+
=== Prerequisites
|
15
|
+
|
16
|
+
Before installing id3lib-ruby, you need to install the underlying id3lib
|
17
|
+
library and, depending on your system, set CONFIGURE_ARGS.
|
18
|
+
|
19
|
+
==== Debian
|
20
|
+
|
21
|
+
Install libid3-dev and be sure to have ruby1.8-dev installed, otherwise you
|
22
|
+
won't be able to build Ruby extensions.
|
23
|
+
|
24
|
+
sudo aptitude install libid3-dev
|
25
|
+
|
26
|
+
==== Gentoo
|
27
|
+
|
28
|
+
sudo emerge -n id3lib
|
29
|
+
|
30
|
+
==== OS X with Fink
|
31
|
+
|
32
|
+
Install id3lib4-dev:
|
33
|
+
|
34
|
+
sudo apt-get install id3lib4-dev
|
35
|
+
|
36
|
+
Fink puts the library and header files in /sw. In order to enable the
|
37
|
+
id3lib-ruby install program to find them, do:
|
38
|
+
|
39
|
+
export CONFIGURE_ARGS="--with-opt-dir=/sw"
|
40
|
+
|
41
|
+
==== Manual compilation
|
42
|
+
|
43
|
+
Download, compile and install id3lib. When installing in /usr/local, you
|
44
|
+
have to set CONFIGURE_ARGS:
|
45
|
+
|
46
|
+
export CONFIGURE_ARGS="--with-opt-dir=/usr/local"
|
47
|
+
|
48
|
+
=== Installing id3lib-ruby
|
49
|
+
|
50
|
+
Now you're ready to install id3lib-ruby. If you use RubyGems, run the
|
51
|
+
following and select the newest version marked "ruby":
|
52
|
+
|
53
|
+
sudo gem install id3lib-ruby
|
54
|
+
|
55
|
+
Or if you install from the archive, unpack it and do:
|
56
|
+
|
57
|
+
sudo ruby setup.rb
|
data/README
CHANGED
@@ -21,23 +21,14 @@ See TODO for planned features.
|
|
21
21
|
The CHANGES file contains a list of changes between versions.
|
22
22
|
|
23
23
|
|
24
|
-
== Online Information
|
25
|
-
|
26
|
-
The home of id3lib-ruby is http://id3lib-ruby.rubyforge.org
|
27
|
-
|
28
|
-
|
29
24
|
== Installation
|
30
25
|
|
31
|
-
|
32
|
-
commands, unless you use the Windows binary gem.
|
33
|
-
|
34
|
-
Installation through RubyGems:
|
26
|
+
See INSTALL.
|
35
27
|
|
36
|
-
gem install id3lib-ruby
|
37
28
|
|
38
|
-
|
29
|
+
== Online Information
|
39
30
|
|
40
|
-
|
31
|
+
The home of id3lib-ruby is http://id3lib-ruby.rubyforge.org
|
41
32
|
|
42
33
|
|
43
34
|
== Usage
|
data/Rakefile
CHANGED
@@ -10,8 +10,6 @@ require 'rake/testtask'
|
|
10
10
|
require 'rake/rdoctask'
|
11
11
|
|
12
12
|
|
13
|
-
PKG_VERSION = '0.4.1'
|
14
|
-
|
15
13
|
FILES_COMMON = FileList[
|
16
14
|
'lib/**/*.rb',
|
17
15
|
'test/test_*.rb',
|
@@ -21,6 +19,10 @@ FILES_COMMON = FileList[
|
|
21
19
|
'*.rb'
|
22
20
|
]
|
23
21
|
|
22
|
+
FILES_DOC = FileList[
|
23
|
+
'README', 'INSTALL', 'TODO', 'CHANGES'
|
24
|
+
]
|
25
|
+
|
24
26
|
FILES_EXT = FileList[
|
25
27
|
'ext/*.rb',
|
26
28
|
'ext/*.cxx',
|
@@ -56,8 +58,8 @@ Rake::RDocTask.new :rdoc do |rdoc|
|
|
56
58
|
rdoc.rdoc_dir = 'doc'
|
57
59
|
rdoc.title = 'id3lib-ruby'
|
58
60
|
rdoc.options = RDOC_OPTS
|
61
|
+
rdoc.rdoc_files.include(FILES_DOC)
|
59
62
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
60
|
-
rdoc.rdoc_files.include('README', 'TODO', 'CHANGES')
|
61
63
|
end
|
62
64
|
task :doc => [:rdoc]
|
63
65
|
|
@@ -65,7 +67,7 @@ task :doc => [:rdoc]
|
|
65
67
|
if defined? Gem
|
66
68
|
spec = Gem::Specification.new do |s|
|
67
69
|
s.name = 'id3lib-ruby'
|
68
|
-
s.version =
|
70
|
+
s.version = File.read('lib/id3lib.rb')[/VERSION = '(.*)'/, 1]
|
69
71
|
s.summary =
|
70
72
|
'id3lib-ruby provides a Ruby interface to the id3lib C++ library for ' +
|
71
73
|
'easily editing ID3 tags (v1 and v2) like with pyid3lib.'
|
@@ -74,7 +76,7 @@ if defined? Gem
|
|
74
76
|
s.extensions = ['ext/extconf.rb']
|
75
77
|
s.test_files = FileList['test/test_*.rb']
|
76
78
|
s.has_rdoc = true
|
77
|
-
s.extra_rdoc_files =
|
79
|
+
s.extra_rdoc_files = FILES_DOC
|
78
80
|
s.rdoc_options = RDOC_OPTS
|
79
81
|
s.author = 'Robin Stocker'
|
80
82
|
s.email = 'robinstocker@rubyforge.org'
|
@@ -95,9 +97,9 @@ if defined? Gem
|
|
95
97
|
|
96
98
|
desc "Build mswin32 gem."
|
97
99
|
task :gem_mswin32 => [:ext_mswin32] do
|
98
|
-
Gem::Builder.new(spec_mswin32).build
|
99
|
-
|
100
|
-
mv
|
100
|
+
gemfile = Gem::Builder.new(spec_mswin32).build
|
101
|
+
mkpath "pkg"
|
102
|
+
mv gemfile, "pkg/"
|
101
103
|
end
|
102
104
|
|
103
105
|
end # defined? Gem
|
@@ -105,7 +107,7 @@ end # defined? Gem
|
|
105
107
|
|
106
108
|
task :web => [:web_doc] do
|
107
109
|
puts "# Now execute the following:"
|
108
|
-
puts "scp web
|
110
|
+
puts "scp web/index.html web/logo.png web/red.css robinstocker@rubyforge.org:/var/www/gforge-projects/id3lib-ruby/"
|
109
111
|
puts "scp -r web/doc robinstocker@rubyforge.org:/var/www/gforge-projects/id3lib-ruby/"
|
110
112
|
end
|
111
113
|
|
@@ -115,10 +117,11 @@ Rake::RDocTask.new :web_doc do |rdoc|
|
|
115
117
|
rdoc.title = 'id3lib-ruby'
|
116
118
|
rdoc.options = RDOC_OPTS.clone
|
117
119
|
rdoc.options << '--main' << 'ID3Lib::Tag'
|
118
|
-
rdoc.rdoc_files.include(
|
120
|
+
rdoc.rdoc_files.include(FILES_DOC)
|
119
121
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
120
122
|
end
|
121
123
|
|
124
|
+
desc "Generate syntax-highlighted HTML of usage.rb."
|
122
125
|
task :usage_html do
|
123
126
|
require 'syntax/convertors/html'
|
124
127
|
convertor = Syntax::Convertors::HTML.for_syntax('ruby')
|
data/ext/generate_info.rb
CHANGED
@@ -1,71 +1,84 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
1
3
|
require 'enumerator'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
|
7
|
+
id3lib_dir = Pathname.new(ARGV.first || '/home/robin/tmp/id3lib-3.8.3')
|
8
|
+
|
9
|
+
globals_file = File.read(id3lib_dir + 'include/id3/globals.h')
|
10
|
+
field_file = File.read(id3lib_dir + 'src/field.cpp')
|
11
|
+
|
12
|
+
def field_symbol(enum_name)
|
13
|
+
f = enum_name[/ID3FN_(.*)/, 1].downcase
|
14
|
+
if f == 'id'
|
15
|
+
:identifier
|
16
|
+
else
|
17
|
+
f.to_sym
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
field_groups = {}
|
23
|
+
allowed_fields = {}
|
2
24
|
|
3
|
-
|
25
|
+
field_file.scan(/ID3_FieldDef (\w+)[^\{]+\{(.+?)\};/m) do |group, body|
|
26
|
+
fields = []
|
27
|
+
body.scan(/\{\W+(\w+)/) do |field_name, _|
|
28
|
+
next if field_name == "ID3FN_NOFIELD"
|
29
|
+
fields << field_name
|
30
|
+
end
|
31
|
+
fields.uniq!
|
32
|
+
fields.map!{ |f| field_symbol(f) }
|
33
|
+
field_groups[group] = fields
|
34
|
+
end
|
35
|
+
|
36
|
+
field_file.scan(/ID3_FrameDef ID3_FrameDefs[^\{]+\{(.+?)\};/m) do |body, _|
|
37
|
+
body.each_line do |line|
|
38
|
+
values = line.split(/\s*,\s*/)
|
39
|
+
next unless values.size > 1
|
40
|
+
frame = values[2].delete('"')
|
41
|
+
group = values[5]
|
42
|
+
next if frame.empty?
|
43
|
+
allowed_fields[frame.to_sym] = field_groups[group]
|
44
|
+
end
|
45
|
+
end
|
4
46
|
|
5
|
-
data = IO.read(file)
|
6
47
|
|
7
|
-
|
8
|
-
|
9
|
-
|
48
|
+
field_info = []
|
49
|
+
frame_info = []
|
50
|
+
genre_info = []
|
10
51
|
|
11
|
-
|
52
|
+
globals_file.scan(/ID3_ENUM\((\w+)\)\s+\{\s+(.+?)\s+\}/m) do |name, enum|
|
12
53
|
case name
|
13
54
|
when 'ID3_FieldID'
|
14
55
|
id = 0
|
15
56
|
enum.scan(/([^\s,]+)(?: = (\d+),|,)\s*\/\*\*< ([^*]+)\s+\*\//m) do |field, newid, description|
|
16
57
|
id = newid.to_i if newid
|
17
|
-
|
18
|
-
field
|
19
|
-
|
58
|
+
|
59
|
+
field = field_symbol(field)
|
60
|
+
field_info << [id, field, description]
|
61
|
+
|
20
62
|
id += 1
|
21
63
|
end
|
22
64
|
when 'ID3_FrameID'
|
23
65
|
id = 0
|
24
66
|
enum.scan(/\/\* (\S+) \*\/ [^\s,]+(?: = (\d+),|,)\s*\/\*\*< ([^*]+)\s+\*\//m) do |frame, newid, description|
|
25
67
|
id = newid.to_i if newid
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
possible_fields =
|
32
|
-
case frame
|
33
|
-
when :____ : []
|
34
|
-
when :AENC : [:owner, :data]
|
35
|
-
when :APIC : [:textenc, :mimetype, :picturetype, :description, :data]
|
36
|
-
when :ASPI, :COMR, :EQUA, :ETCO, :LINK,
|
37
|
-
:MCDI, :MLLT, :OWNE, :POSS, :RBUF,
|
38
|
-
:RVA2, :RVAD, :RVRB, :SEEK
|
39
|
-
[:data]
|
40
|
-
when :COMM : [:textenc, :language, :description, :text]
|
41
|
-
when :ENCR : [:owner, :id, :data]
|
42
|
-
when :EQU2 : [:id, :text]
|
43
|
-
when :GEOB : [:textenc, :mimetype, :filename, :description, :data]
|
44
|
-
when :GRID : [:owner, :id, :data]
|
45
|
-
when :IPLS : [:textenc, :text]
|
46
|
-
when :PRIV : [:owner, :data]
|
47
|
-
when :PCNT : [:counter]
|
48
|
-
when :POPM : [:email, :rating, :counter]
|
49
|
-
when :SIGN : [:id, :data]
|
50
|
-
when :SYLT : [:textenc, :language, :timestampformat, :contenttype, :description, :data]
|
51
|
-
when :SYTC : [:timestampformat, :data]
|
52
|
-
when :UFID : [:owner, :data]
|
53
|
-
when :USER : [:textenc, :language, :text]
|
54
|
-
when :USLT : [:textenc, :language, :description, :text]
|
55
|
-
when :WCOM, :WCOP, :WOAF, :WOAR, :WOAS, :WORS, :WPAY, :WPUB : [:text]
|
56
|
-
when :WXXX : [:textenc, :description, :url]
|
57
|
-
else [:textenc, :text]
|
58
|
-
end
|
59
|
-
frames << [id, frame, description, possible_fields]
|
68
|
+
frame = (frame == '????') ? :____ : frame.to_sym
|
69
|
+
|
70
|
+
fields = allowed_fields[frame] || []
|
71
|
+
|
72
|
+
frame_info << [id, frame, description, fields]
|
60
73
|
id += 1
|
61
74
|
end
|
62
75
|
end
|
63
76
|
end
|
64
77
|
|
65
|
-
|
78
|
+
globals_file.scan(/(ID3_v1_genre_description).+?\{(.+?)\}/m) do |name, list|
|
66
79
|
id = 0
|
67
|
-
list.scan(/"(
|
68
|
-
|
80
|
+
list.scan(/"([^"]+)"/) do |genre|
|
81
|
+
genre_info << genre.first
|
69
82
|
id += 1
|
70
83
|
end
|
71
84
|
end
|
@@ -76,7 +89,7 @@ def indent level, text
|
|
76
89
|
end
|
77
90
|
|
78
91
|
indent 4, "Frames = ["
|
79
|
-
|
92
|
+
frame_info.each do |f|
|
80
93
|
comment = case f[1]
|
81
94
|
when :____ : "# Special frames"
|
82
95
|
when :TALB : "# Text information frames"
|
@@ -89,25 +102,25 @@ end
|
|
89
102
|
indent 4, "]"
|
90
103
|
|
91
104
|
indent 4, "FramesByID = {"
|
92
|
-
|
105
|
+
frame_info.each do |f|
|
93
106
|
indent 6, f[1].inspect + " => Frames[" + f[0].to_s + "],"
|
94
107
|
end
|
95
108
|
indent 4, "}"
|
96
109
|
|
97
110
|
indent 4, "Fields = ["
|
98
|
-
|
111
|
+
field_info.each do |f|
|
99
112
|
indent 6, f.inspect + ","
|
100
113
|
end
|
101
114
|
indent 4, "]"
|
102
115
|
|
103
116
|
indent 4, "FieldsByID = {"
|
104
|
-
|
117
|
+
field_info.each do |f|
|
105
118
|
indent 6, f[1].inspect.ljust(16) + " => Fields[" + f[0].to_s + "],"
|
106
119
|
end
|
107
120
|
indent 4, "}"
|
108
121
|
|
109
122
|
indent 4, "Genres = ["
|
110
|
-
|
123
|
+
genre_info.each_slice(4) do |gs|
|
111
124
|
indent 6, "# Winamp extensions" if gs.first == "Folk"
|
112
125
|
indent 6, gs.map{ |g| g.inspect }.join(", ") + ","
|
113
126
|
end
|
data/ext/id3lib_api.i
CHANGED
@@ -54,17 +54,18 @@ public:
|
|
54
54
|
%rename (find) Find;
|
55
55
|
ID3_Frame * Find(ID3_FrameID name) const;
|
56
56
|
|
57
|
-
%rename (
|
57
|
+
%rename (create_iterator) CreateIterator;
|
58
|
+
%newobject CreateIterator;
|
58
59
|
ID3_Tag::Iterator * CreateIterator();
|
60
|
+
};
|
59
61
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
}
|
62
|
+
%rename (Tag_Iterator) ID3_Tag::Iterator;
|
63
|
+
class ID3_Tag::Iterator
|
64
|
+
{
|
65
|
+
public:
|
66
|
+
|
67
|
+
%rename (get_next) GetNext;
|
68
|
+
virtual ID3_Frame * GetNext() = 0;
|
68
69
|
};
|
69
70
|
|
70
71
|
|
data/ext/id3lib_api_wrap.cxx
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/* ----------------------------------------------------------------------------
|
2
2
|
* This file was automatically generated by SWIG (http://www.swig.org).
|
3
|
-
* Version 1.3.
|
3
|
+
* Version 1.3.31
|
4
4
|
*
|
5
5
|
* This file is not intended to be easily readable and contains a number of
|
6
6
|
* coding conventions designed to improve portability and efficiency. Do not make
|
@@ -119,7 +119,7 @@ private:
|
|
119
119
|
#endif
|
120
120
|
|
121
121
|
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
|
122
|
-
#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER)
|
122
|
+
#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
|
123
123
|
# define _CRT_SECURE_NO_DEPRECATE
|
124
124
|
#endif
|
125
125
|
|
@@ -216,7 +216,7 @@ private:
|
|
216
216
|
#endif
|
217
217
|
|
218
218
|
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
|
219
|
-
#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER)
|
219
|
+
#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
|
220
220
|
# define _CRT_SECURE_NO_DEPRECATE
|
221
221
|
#endif
|
222
222
|
|
@@ -229,7 +229,7 @@ private:
|
|
229
229
|
|
230
230
|
/* This should only be incremented when either the layout of swig_type_info changes,
|
231
231
|
or for whatever reason, the runtime changes incompatibly */
|
232
|
-
#define SWIG_RUNTIME_VERSION "
|
232
|
+
#define SWIG_RUNTIME_VERSION "3"
|
233
233
|
|
234
234
|
/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
|
235
235
|
#ifdef SWIG_TYPE_TABLE
|
@@ -828,6 +828,21 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
|
|
828
828
|
#endif
|
829
829
|
#endif
|
830
830
|
|
831
|
+
/* RSTRING_LEN, etc are new in Ruby 1.9, but ->ptr and ->len no longer work */
|
832
|
+
/* Define these for older versions so we can just write code the new way */
|
833
|
+
#ifndef RSTRING_LEN
|
834
|
+
# define RSTRING_LEN(x) RSTRING(x)->len
|
835
|
+
#endif
|
836
|
+
#ifndef RSTRING_PTR
|
837
|
+
# define RSTRING_PTR(x) RSTRING(x)->ptr
|
838
|
+
#endif
|
839
|
+
#ifndef RARRAY_LEN
|
840
|
+
# define RARRAY_LEN(x) RARRAY(x)->len
|
841
|
+
#endif
|
842
|
+
#ifndef RARRAY_PTR
|
843
|
+
# define RARRAY_PTR(x) RARRAY(x)->ptr
|
844
|
+
#endif
|
845
|
+
|
831
846
|
/*
|
832
847
|
* Need to be very careful about how these macros are defined, especially
|
833
848
|
* when compiling C++ code or C code with an ANSI C compiler.
|
@@ -871,10 +886,10 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
|
|
871
886
|
#define StringValue(s) RB_STRING_VALUE(s)
|
872
887
|
#endif
|
873
888
|
#ifndef StringValuePtr
|
874
|
-
#define StringValuePtr(s)
|
889
|
+
#define StringValuePtr(s) RSTRING_PTR(RB_STRING_VALUE(s))
|
875
890
|
#endif
|
876
891
|
#ifndef StringValueLen
|
877
|
-
#define StringValueLen(s)
|
892
|
+
#define StringValueLen(s) RSTRING_LEN(RB_STRING_VALUE(s))
|
878
893
|
#endif
|
879
894
|
#ifndef SafeStringValue
|
880
895
|
#define SafeStringValue(v) do {\
|
@@ -1303,7 +1318,7 @@ SWIG_Ruby_NewPointerObj(void *ptr, swig_type_info *type, int flags)
|
|
1303
1318
|
downcast methods. */
|
1304
1319
|
if (obj != Qnil) {
|
1305
1320
|
VALUE value = rb_iv_get(obj, "__swigtype__");
|
1306
|
-
char* type_name =
|
1321
|
+
char* type_name = RSTRING_PTR(value);
|
1307
1322
|
|
1308
1323
|
if (strcmp(type->name, type_name) == 0) {
|
1309
1324
|
return obj;
|
@@ -1544,7 +1559,8 @@ static swig_module_info swig_module = {swig_types, 6, 0, 0, 0, 0};
|
|
1544
1559
|
|
1545
1560
|
static VALUE mAPI;
|
1546
1561
|
|
1547
|
-
#define SWIGVERSION
|
1562
|
+
#define SWIGVERSION 0x010331
|
1563
|
+
#define SWIG_VERSION SWIGVERSION
|
1548
1564
|
|
1549
1565
|
|
1550
1566
|
#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a))
|
@@ -1558,7 +1574,7 @@ static VALUE mAPI;
|
|
1558
1574
|
|
1559
1575
|
|
1560
1576
|
SWIGINTERN swig_type_info*
|
1561
|
-
SWIG_pchar_descriptor()
|
1577
|
+
SWIG_pchar_descriptor(void)
|
1562
1578
|
{
|
1563
1579
|
static int init = 0;
|
1564
1580
|
static swig_type_info* info = 0;
|
@@ -1579,7 +1595,7 @@ SWIG_AsCharPtrAndSize(VALUE obj, char** cptr, size_t* psize, int *alloc)
|
|
1579
1595
|
|
1580
1596
|
char *cstr = STR2CSTR(obj);
|
1581
1597
|
|
1582
|
-
size_t size =
|
1598
|
+
size_t size = RSTRING_LEN(obj) + 1;
|
1583
1599
|
if (cptr) {
|
1584
1600
|
if (alloc) {
|
1585
1601
|
if (*alloc == SWIG_NEWOBJ) {
|
@@ -1794,9 +1810,6 @@ SWIG_AsVal_bool (VALUE obj, bool *val)
|
|
1794
1810
|
return SWIG_TypeError;
|
1795
1811
|
}
|
1796
1812
|
|
1797
|
-
SWIGINTERN ID3_Frame *ID3_Tag_iterator_next_frame(ID3_Tag *self,ID3_Tag::Iterator *iterator){
|
1798
|
-
return iterator->GetNext();
|
1799
|
-
}
|
1800
1813
|
|
1801
1814
|
SWIGINTERNINLINE VALUE
|
1802
1815
|
SWIG_From_int (int value)
|
@@ -1863,7 +1876,7 @@ _wrap_new_Tag__SWIG_0(int argc, VALUE *argv, VALUE self) {
|
|
1863
1876
|
if (!SWIG_IsOK(res1)) {
|
1864
1877
|
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ID3_Tag" "', argument " "1"" of type '" "char const *""'");
|
1865
1878
|
}
|
1866
|
-
arg1 = buf1;
|
1879
|
+
arg1 = reinterpret_cast< char * >(buf1);
|
1867
1880
|
result = (ID3_Tag *)new ID3_Tag((char const *)arg1);DATA_PTR(self) = result;
|
1868
1881
|
|
1869
1882
|
if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
|
@@ -1998,7 +2011,7 @@ _wrap_Tag_link__SWIG_0(int argc, VALUE *argv, VALUE self) {
|
|
1998
2011
|
if (!SWIG_IsOK(res2)) {
|
1999
2012
|
SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Link" "', argument " "2"" of type '" "char const *""'");
|
2000
2013
|
}
|
2001
|
-
arg2 = buf2;
|
2014
|
+
arg2 = reinterpret_cast< char * >(buf2);
|
2002
2015
|
ecode3 = SWIG_AsVal_unsigned_SS_int(argv[1], &val3);
|
2003
2016
|
if (!SWIG_IsOK(ecode3)) {
|
2004
2017
|
SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Link" "', argument " "3"" of type '" "flags_t""'");
|
@@ -2038,7 +2051,7 @@ _wrap_Tag_link__SWIG_1(int argc, VALUE *argv, VALUE self) {
|
|
2038
2051
|
if (!SWIG_IsOK(res2)) {
|
2039
2052
|
SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Link" "', argument " "2"" of type '" "char const *""'");
|
2040
2053
|
}
|
2041
|
-
arg2 = buf2;
|
2054
|
+
arg2 = reinterpret_cast< char * >(buf2);
|
2042
2055
|
result = (arg1)->Link((char const *)arg2);
|
2043
2056
|
vresult = SWIG_From_size_t(static_cast< size_t >(result));
|
2044
2057
|
if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
|
@@ -2394,7 +2407,7 @@ _wrap_Tag_get_filename(int argc, VALUE *argv, VALUE self) {
|
|
2394
2407
|
}
|
2395
2408
|
arg1 = reinterpret_cast< ID3_Tag * >(argp1);
|
2396
2409
|
result = (char *)((ID3_Tag const *)arg1)->GetFileName();
|
2397
|
-
vresult = SWIG_FromCharPtr(result);
|
2410
|
+
vresult = SWIG_FromCharPtr((const char *)result);
|
2398
2411
|
return vresult;
|
2399
2412
|
fail:
|
2400
2413
|
return Qnil;
|
@@ -2490,7 +2503,7 @@ fail:
|
|
2490
2503
|
|
2491
2504
|
|
2492
2505
|
SWIGINTERN VALUE
|
2493
|
-
|
2506
|
+
_wrap_Tag_create_iterator(int argc, VALUE *argv, VALUE self) {
|
2494
2507
|
ID3_Tag *arg1 = (ID3_Tag *) 0 ;
|
2495
2508
|
ID3_Tag::Iterator *result = 0 ;
|
2496
2509
|
void *argp1 = 0 ;
|
@@ -2506,38 +2519,32 @@ _wrap_Tag_iterator_new(int argc, VALUE *argv, VALUE self) {
|
|
2506
2519
|
}
|
2507
2520
|
arg1 = reinterpret_cast< ID3_Tag * >(argp1);
|
2508
2521
|
result = (ID3_Tag::Iterator *)(arg1)->CreateIterator();
|
2509
|
-
vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ID3_Tag__Iterator,
|
2522
|
+
vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ID3_Tag__Iterator, SWIG_POINTER_OWN | 0 );
|
2510
2523
|
return vresult;
|
2511
2524
|
fail:
|
2512
2525
|
return Qnil;
|
2513
2526
|
}
|
2514
2527
|
|
2515
2528
|
|
2529
|
+
swig_class cTag_Iterator;
|
2530
|
+
|
2516
2531
|
SWIGINTERN VALUE
|
2517
|
-
|
2518
|
-
ID3_Tag *arg1 = (ID3_Tag *) 0 ;
|
2519
|
-
ID3_Tag::Iterator *arg2 = (ID3_Tag::Iterator *) 0 ;
|
2532
|
+
_wrap_Tag_Iterator_get_next(int argc, VALUE *argv, VALUE self) {
|
2533
|
+
ID3_Tag::Iterator *arg1 = (ID3_Tag::Iterator *) 0 ;
|
2520
2534
|
ID3_Frame *result = 0 ;
|
2521
2535
|
void *argp1 = 0 ;
|
2522
2536
|
int res1 = 0 ;
|
2523
|
-
void *argp2 = 0 ;
|
2524
|
-
int res2 = 0 ;
|
2525
2537
|
VALUE vresult = Qnil;
|
2526
2538
|
|
2527
|
-
if ((argc <
|
2528
|
-
rb_raise(rb_eArgError, "wrong # of arguments(%d for
|
2539
|
+
if ((argc < 0) || (argc > 0)) {
|
2540
|
+
rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
|
2529
2541
|
}
|
2530
|
-
res1 = SWIG_ConvertPtr(self, &argp1,
|
2542
|
+
res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_ID3_Tag__Iterator, 0 | 0 );
|
2531
2543
|
if (!SWIG_IsOK(res1)) {
|
2532
|
-
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "
|
2544
|
+
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GetNext" "', argument " "1"" of type '" "ID3_Tag::Iterator *""'");
|
2533
2545
|
}
|
2534
|
-
arg1 = reinterpret_cast< ID3_Tag * >(argp1);
|
2535
|
-
|
2536
|
-
if (!SWIG_IsOK(res2)) {
|
2537
|
-
SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "iterator_next_frame" "', argument " "2"" of type '" "ID3_Tag::Iterator *""'");
|
2538
|
-
}
|
2539
|
-
arg2 = reinterpret_cast< ID3_Tag::Iterator * >(argp2);
|
2540
|
-
result = (ID3_Frame *)ID3_Tag_iterator_next_frame(arg1,arg2);
|
2546
|
+
arg1 = reinterpret_cast< ID3_Tag::Iterator * >(argp1);
|
2547
|
+
result = (ID3_Frame *)(arg1)->GetNext();
|
2541
2548
|
vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ID3_Frame, 0 | 0 );
|
2542
2549
|
return vresult;
|
2543
2550
|
fail:
|
@@ -2545,6 +2552,11 @@ fail:
|
|
2545
2552
|
}
|
2546
2553
|
|
2547
2554
|
|
2555
|
+
SWIGINTERN void
|
2556
|
+
free_ID3_Tag_Iterator(ID3_Tag::Iterator *arg1) {
|
2557
|
+
delete arg1;
|
2558
|
+
}
|
2559
|
+
|
2548
2560
|
swig_class cFrame;
|
2549
2561
|
|
2550
2562
|
SWIGINTERN VALUE
|
@@ -2784,7 +2796,7 @@ _wrap_Field_get_ascii(int argc, VALUE *argv, VALUE self) {
|
|
2784
2796
|
}
|
2785
2797
|
arg1 = reinterpret_cast< ID3_Field * >(argp1);
|
2786
2798
|
result = (char *)((ID3_Field const *)arg1)->GetRawText();
|
2787
|
-
vresult = SWIG_FromCharPtr(result);
|
2799
|
+
vresult = SWIG_FromCharPtr((const char *)result);
|
2788
2800
|
return vresult;
|
2789
2801
|
fail:
|
2790
2802
|
return Qnil;
|
@@ -2924,7 +2936,7 @@ _wrap_Field_set_ascii(int argc, VALUE *argv, VALUE self) {
|
|
2924
2936
|
if (!SWIG_IsOK(res2)) {
|
2925
2937
|
SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Set" "', argument " "2"" of type '" "char const *""'");
|
2926
2938
|
}
|
2927
|
-
arg2 = buf2;
|
2939
|
+
arg2 = reinterpret_cast< char * >(buf2);
|
2928
2940
|
result = (arg1)->Set((char const *)arg2);
|
2929
2941
|
vresult = SWIG_From_size_t(static_cast< size_t >(result));
|
2930
2942
|
if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
|
@@ -3039,7 +3051,7 @@ static swig_cast_info *swig_cast_initial[] = {
|
|
3039
3051
|
* structures together.
|
3040
3052
|
*
|
3041
3053
|
* The generated swig_type_info structures are assigned staticly to an initial
|
3042
|
-
* array. We just loop
|
3054
|
+
* array. We just loop through that array, and handle each type individually.
|
3043
3055
|
* First we lookup if this type has been already loaded, and if so, use the
|
3044
3056
|
* loaded structure instead of the generated one. Then we have to fill in the
|
3045
3057
|
* cast linked list. The cast data is initially stored in something like a
|
@@ -3077,32 +3089,49 @@ extern "C" {
|
|
3077
3089
|
#define SWIGRUNTIME_DEBUG
|
3078
3090
|
#endif
|
3079
3091
|
|
3092
|
+
|
3080
3093
|
SWIGRUNTIME void
|
3081
3094
|
SWIG_InitializeModule(void *clientdata) {
|
3082
3095
|
size_t i;
|
3083
|
-
swig_module_info *module_head;
|
3084
|
-
|
3096
|
+
swig_module_info *module_head, *iter;
|
3097
|
+
int found;
|
3085
3098
|
|
3086
3099
|
clientdata = clientdata;
|
3087
3100
|
|
3088
|
-
if
|
3089
|
-
|
3090
|
-
|
3091
|
-
|
3092
|
-
|
3093
|
-
|
3101
|
+
/* check to see if the circular list has been setup, if not, set it up */
|
3102
|
+
if (swig_module.next==0) {
|
3103
|
+
/* Initialize the swig_module */
|
3104
|
+
swig_module.type_initial = swig_type_initial;
|
3105
|
+
swig_module.cast_initial = swig_cast_initial;
|
3106
|
+
swig_module.next = &swig_module;
|
3107
|
+
}
|
3094
3108
|
|
3095
3109
|
/* Try and load any already created modules */
|
3096
3110
|
module_head = SWIG_GetModule(clientdata);
|
3097
|
-
if (module_head) {
|
3111
|
+
if (!module_head) {
|
3112
|
+
/* This is the first module loaded for this interpreter */
|
3113
|
+
/* so set the swig module into the interpreter */
|
3114
|
+
SWIG_SetModule(clientdata, &swig_module);
|
3115
|
+
module_head = &swig_module;
|
3116
|
+
} else {
|
3117
|
+
/* the interpreter has loaded a SWIG module, but has it loaded this one? */
|
3118
|
+
found=0;
|
3119
|
+
iter=module_head;
|
3120
|
+
do {
|
3121
|
+
if (iter==&swig_module) {
|
3122
|
+
found=1;
|
3123
|
+
break;
|
3124
|
+
}
|
3125
|
+
iter=iter->next;
|
3126
|
+
} while (iter!= module_head);
|
3127
|
+
|
3128
|
+
/* if the is found in the list, then all is done and we may leave */
|
3129
|
+
if (found) return;
|
3130
|
+
/* otherwise we must add out module into the list */
|
3098
3131
|
swig_module.next = module_head->next;
|
3099
3132
|
module_head->next = &swig_module;
|
3100
|
-
} else {
|
3101
|
-
/* This is the first module loaded */
|
3102
|
-
swig_module.next = &swig_module;
|
3103
|
-
SWIG_SetModule(clientdata, &swig_module);
|
3104
3133
|
}
|
3105
|
-
|
3134
|
+
|
3106
3135
|
/* Now work on filling in swig_module.types */
|
3107
3136
|
#ifdef SWIGRUNTIME_DEBUG
|
3108
3137
|
printf("SWIG_InitializeModule: size %d\n", swig_module.size);
|
@@ -3269,12 +3298,19 @@ SWIGEXPORT void Init_id3lib_api(void) {
|
|
3269
3298
|
rb_define_method(cTag.klass, "set_padding", VALUEFUNC(_wrap_Tag_set_padding), -1);
|
3270
3299
|
rb_define_method(cTag.klass, "size", VALUEFUNC(_wrap_Tag_size), -1);
|
3271
3300
|
rb_define_method(cTag.klass, "find", VALUEFUNC(_wrap_Tag_find), -1);
|
3272
|
-
rb_define_method(cTag.klass, "
|
3273
|
-
rb_define_method(cTag.klass, "iterator_next_frame", VALUEFUNC(_wrap_Tag_iterator_next_frame), -1);
|
3301
|
+
rb_define_method(cTag.klass, "create_iterator", VALUEFUNC(_wrap_Tag_create_iterator), -1);
|
3274
3302
|
cTag.mark = 0;
|
3275
3303
|
cTag.destroy = (void (*)(void *)) free_ID3_Tag;
|
3276
3304
|
cTag.trackObjects = 0;
|
3277
3305
|
|
3306
|
+
cTag_Iterator.klass = rb_define_class_under(mAPI, "Tag_Iterator", rb_cObject);
|
3307
|
+
SWIG_TypeClientData(SWIGTYPE_p_ID3_Tag__Iterator, (void *) &cTag_Iterator);
|
3308
|
+
rb_undef_alloc_func(cTag_Iterator.klass);
|
3309
|
+
rb_define_method(cTag_Iterator.klass, "get_next", VALUEFUNC(_wrap_Tag_Iterator_get_next), -1);
|
3310
|
+
cTag_Iterator.mark = 0;
|
3311
|
+
cTag_Iterator.destroy = (void (*)(void *)) free_ID3_Tag_Iterator;
|
3312
|
+
cTag_Iterator.trackObjects = 0;
|
3313
|
+
|
3278
3314
|
cFrame.klass = rb_define_class_under(mAPI, "Frame", rb_cObject);
|
3279
3315
|
SWIG_TypeClientData(SWIGTYPE_p_ID3_Frame, (void *) &cFrame);
|
3280
3316
|
rb_define_alloc_func(cFrame.klass, _wrap_Frame_allocate);
|
data/lib/id3lib.rb
CHANGED
@@ -9,6 +9,7 @@ require 'id3lib/accessors'
|
|
9
9
|
# Have a look at ID3Lib::Tag for an introduction on how to use this library.
|
10
10
|
#
|
11
11
|
module ID3Lib
|
12
|
+
VERSION = '0.5.0'
|
12
13
|
|
13
14
|
# ID3 version 1. All V constants can be used with the methods
|
14
15
|
# new, update! or strip! of ID3Lib::Tag.
|
@@ -33,7 +34,7 @@ module ID3Lib
|
|
33
34
|
#
|
34
35
|
# === Example of use
|
35
36
|
#
|
36
|
-
# tag = ID3Lib::Tag.
|
37
|
+
# tag = ID3Lib::Tag.new('shy_boy.mp3')
|
37
38
|
#
|
38
39
|
# # Remove comments
|
39
40
|
# tag.delete_if{ |frame| frame[:id] == :COMM }
|
@@ -314,8 +315,8 @@ module ID3Lib
|
|
314
315
|
private
|
315
316
|
|
316
317
|
def read_frames
|
317
|
-
iterator = @tag.
|
318
|
-
while libframe =
|
318
|
+
iterator = @tag.create_iterator
|
319
|
+
while libframe = iterator.get_next
|
319
320
|
self << Frame.read(libframe)
|
320
321
|
end
|
321
322
|
end
|
@@ -332,6 +333,11 @@ module ID3Lib
|
|
332
333
|
|
333
334
|
info[FIELDS].each do |field_id|
|
334
335
|
libfield = field(libframe, field_id)
|
336
|
+
unless libfield
|
337
|
+
warn "id3lib-ruby: Invalid field #{field_id.inspect} in " \
|
338
|
+
"#{frame[:id].inspect}, please report this as a bug."
|
339
|
+
next
|
340
|
+
end
|
335
341
|
frame[field_id] =
|
336
342
|
case Info::FieldType[libfield.get_type]
|
337
343
|
when :integer
|
@@ -363,6 +369,7 @@ module ID3Lib
|
|
363
369
|
end
|
364
370
|
|
365
371
|
libfield = field(libframe, field_id)
|
372
|
+
next unless libfield
|
366
373
|
case Info::FieldType[libfield.get_type]
|
367
374
|
when :integer
|
368
375
|
libfield.set_integer(value)
|
data/lib/id3lib/info.rb
CHANGED
@@ -57,25 +57,29 @@ module ID3Lib
|
|
57
57
|
|
58
58
|
#
|
59
59
|
# Please note that these frames are not fully supported by id3lib:
|
60
|
-
# AENC,
|
61
|
-
# OWNE, POSS, RBUF,
|
60
|
+
# AENC, COMR, EQUA, ETCO, MCDI, MLLT,
|
61
|
+
# OWNE, POSS, RBUF, RVAD, RVRB, SYTC
|
62
|
+
# And these are not supported at all (segfault on usage):
|
63
|
+
# ASPI, EQU2, RVA2, SEEK, SIGN, TDEN,
|
64
|
+
# TDOR, TDRC, TDRL, TDTG, TIPL, TMCL,
|
65
|
+
# TMOO, TPRO, TSOA, TSOP, TSOT, TSST
|
62
66
|
#
|
63
67
|
Frames = [
|
64
68
|
# Special frames
|
65
69
|
[0, :____, "No known frame", []],
|
66
|
-
[1, :AENC, "Audio encryption", [:
|
67
|
-
[2, :APIC, "Attached picture", [:textenc, :mimetype, :picturetype, :description, :data]],
|
68
|
-
[3, :ASPI, "Audio seek point index", [
|
70
|
+
[1, :AENC, "Audio encryption", [:data]],
|
71
|
+
[2, :APIC, "Attached picture", [:textenc, :imageformat, :mimetype, :picturetype, :description, :data]],
|
72
|
+
[3, :ASPI, "Audio seek point index", []],
|
69
73
|
[4, :COMM, "Comments", [:textenc, :language, :description, :text]],
|
70
74
|
[5, :COMR, "Commercial frame", [:data]],
|
71
|
-
[6, :ENCR, "Encryption method registration", [:owner, :
|
72
|
-
[7, :EQU2, "Equalisation (2)", [
|
75
|
+
[6, :ENCR, "Encryption method registration", [:owner, :identifier, :data]],
|
76
|
+
[7, :EQU2, "Equalisation (2)", []],
|
73
77
|
[8, :EQUA, "Equalization", [:data]],
|
74
78
|
[9, :ETCO, "Event timing codes", [:data]],
|
75
79
|
[10, :GEOB, "General encapsulated object", [:textenc, :mimetype, :filename, :description, :data]],
|
76
|
-
[11, :GRID, "Group identification registration", [:owner, :
|
80
|
+
[11, :GRID, "Group identification registration", [:owner, :identifier, :data]],
|
77
81
|
[12, :IPLS, "Involved people list", [:textenc, :text]],
|
78
|
-
[13, :LINK, "Linked information", [:
|
82
|
+
[13, :LINK, "Linked information", [:identifier, :url, :text]],
|
79
83
|
[14, :MCDI, "Music CD identifier", [:data]],
|
80
84
|
[15, :MLLT, "MPEG location lookup table", [:data]],
|
81
85
|
[16, :OWNE, "Ownership frame", [:data]],
|
@@ -84,13 +88,13 @@ module ID3Lib
|
|
84
88
|
[19, :POPM, "Popularimeter", [:email, :rating, :counter]],
|
85
89
|
[20, :POSS, "Position synchronisation frame", [:data]],
|
86
90
|
[21, :RBUF, "Recommended buffer size", [:data]],
|
87
|
-
[22, :RVA2, "Relative volume adjustment (2)", [
|
91
|
+
[22, :RVA2, "Relative volume adjustment (2)", []],
|
88
92
|
[23, :RVAD, "Relative volume adjustment", [:data]],
|
89
93
|
[24, :RVRB, "Reverb", [:data]],
|
90
|
-
[25, :SEEK, "Seek frame", [
|
91
|
-
[26, :SIGN, "Signature frame", [
|
94
|
+
[25, :SEEK, "Seek frame", []],
|
95
|
+
[26, :SIGN, "Signature frame", []],
|
92
96
|
[27, :SYLT, "Synchronized lyric/text", [:textenc, :language, :timestampformat, :contenttype, :description, :data]],
|
93
|
-
[28, :SYTC, "Synchronized tempo codes", [:
|
97
|
+
[28, :SYTC, "Synchronized tempo codes", [:data]],
|
94
98
|
# Text information frames
|
95
99
|
[29, :TALB, "Album/Movie/Show title", [:textenc, :text]],
|
96
100
|
[30, :TBPM, "BPM (beats per minute)", [:textenc, :text]],
|
@@ -98,13 +102,13 @@ module ID3Lib
|
|
98
102
|
[32, :TCON, "Content type", [:textenc, :text]],
|
99
103
|
[33, :TCOP, "Copyright message", [:textenc, :text]],
|
100
104
|
[34, :TDAT, "Date", [:textenc, :text]],
|
101
|
-
[35, :TDEN, "Encoding time", [
|
105
|
+
[35, :TDEN, "Encoding time", []],
|
102
106
|
[36, :TDLY, "Playlist delay", [:textenc, :text]],
|
103
|
-
[37, :TDOR, "Original release time", [
|
104
|
-
[38, :TDRC, "Recording time", [
|
105
|
-
[39, :TDRL, "Release time", [
|
106
|
-
[40, :TDTG, "Tagging time", [
|
107
|
-
[41, :TIPL, "Involved people list", [
|
107
|
+
[37, :TDOR, "Original release time", []],
|
108
|
+
[38, :TDRC, "Recording time", []],
|
109
|
+
[39, :TDRL, "Release time", []],
|
110
|
+
[40, :TDTG, "Tagging time", []],
|
111
|
+
[41, :TIPL, "Involved people list", []],
|
108
112
|
[42, :TENC, "Encoded by", [:textenc, :text]],
|
109
113
|
[43, :TEXT, "Lyricist/Text writer", [:textenc, :text]],
|
110
114
|
[44, :TFLT, "File type", [:textenc, :text]],
|
@@ -115,9 +119,9 @@ module ID3Lib
|
|
115
119
|
[49, :TKEY, "Initial key", [:textenc, :text]],
|
116
120
|
[50, :TLAN, "Language(s)", [:textenc, :text]],
|
117
121
|
[51, :TLEN, "Length", [:textenc, :text]],
|
118
|
-
[52, :TMCL, "Musician credits list", [
|
122
|
+
[52, :TMCL, "Musician credits list", []],
|
119
123
|
[53, :TMED, "Media type", [:textenc, :text]],
|
120
|
-
[54, :TMOO, "Mood", [
|
124
|
+
[54, :TMOO, "Mood", []],
|
121
125
|
[55, :TOAL, "Original album/movie/show title", [:textenc, :text]],
|
122
126
|
[56, :TOFN, "Original filename", [:textenc, :text]],
|
123
127
|
[57, :TOLY, "Original lyricist(s)/text writer(s)", [:textenc, :text]],
|
@@ -129,19 +133,19 @@ module ID3Lib
|
|
129
133
|
[63, :TPE3, "Conductor/performer refinement", [:textenc, :text]],
|
130
134
|
[64, :TPE4, "Interpreted, remixed, or otherwise modified by", [:textenc, :text]],
|
131
135
|
[65, :TPOS, "Part of a set", [:textenc, :text]],
|
132
|
-
[66, :TPRO, "Produced notice", [
|
136
|
+
[66, :TPRO, "Produced notice", []],
|
133
137
|
[67, :TPUB, "Publisher", [:textenc, :text]],
|
134
138
|
[68, :TRCK, "Track number/Position in set", [:textenc, :text]],
|
135
139
|
[69, :TRDA, "Recording dates", [:textenc, :text]],
|
136
140
|
[70, :TRSN, "Internet radio station name", [:textenc, :text]],
|
137
141
|
[71, :TRSO, "Internet radio station owner", [:textenc, :text]],
|
138
142
|
[72, :TSIZ, "Size", [:textenc, :text]],
|
139
|
-
[73, :TSOA, "Album sort order", [
|
140
|
-
[74, :TSOP, "Performer sort order", [
|
141
|
-
[75, :TSOT, "Title sort order", [
|
143
|
+
[73, :TSOA, "Album sort order", []],
|
144
|
+
[74, :TSOP, "Performer sort order", []],
|
145
|
+
[75, :TSOT, "Title sort order", []],
|
142
146
|
[76, :TSRC, "ISRC (international standard recording code)", [:textenc, :text]],
|
143
147
|
[77, :TSSE, "Software/Hardware and settings used for encoding", [:textenc, :text]],
|
144
|
-
[78, :TSST, "Set subtitle", [
|
148
|
+
[78, :TSST, "Set subtitle", []],
|
145
149
|
[79, :TXXX, "User defined text information", [:textenc, :description, :text]],
|
146
150
|
[80, :TYER, "Year", [:textenc, :text]],
|
147
151
|
# Special frames again
|
@@ -149,15 +153,15 @@ module ID3Lib
|
|
149
153
|
[82, :USER, "Terms of use", [:textenc, :language, :text]],
|
150
154
|
[83, :USLT, "Unsynchronized lyric/text transcription", [:textenc, :language, :description, :text]],
|
151
155
|
# URL link frames
|
152
|
-
[84, :WCOM, "Commercial information", [:
|
153
|
-
[85, :WCOP, "Copyright/Legal infromation", [:
|
154
|
-
[86, :WOAF, "Official audio file webpage", [:
|
155
|
-
[87, :WOAR, "Official artist/performer webpage", [:
|
156
|
-
[88, :WOAS, "Official audio source webpage", [:
|
157
|
-
[89, :WORS, "Official internet radio station homepage", [:
|
158
|
-
[90, :WPAY, "Payment", [:
|
159
|
-
[91, :WPUB, "Official publisher webpage", [:
|
160
|
-
[92, :WXXX, "User defined URL link", [:textenc, :description, :url]]
|
156
|
+
[84, :WCOM, "Commercial information", [:url]],
|
157
|
+
[85, :WCOP, "Copyright/Legal infromation", [:url]],
|
158
|
+
[86, :WOAF, "Official audio file webpage", [:url]],
|
159
|
+
[87, :WOAR, "Official artist/performer webpage", [:url]],
|
160
|
+
[88, :WOAS, "Official audio source webpage", [:url]],
|
161
|
+
[89, :WORS, "Official internet radio station homepage", [:url]],
|
162
|
+
[90, :WPAY, "Payment", [:url]],
|
163
|
+
[91, :WPUB, "Official publisher webpage", [:url]],
|
164
|
+
[92, :WXXX, "User defined URL link", [:textenc, :description, :url]]
|
161
165
|
]
|
162
166
|
|
163
167
|
FramesByID = {
|
@@ -272,7 +276,7 @@ module ID3Lib
|
|
272
276
|
[12, :imageformat, "Image format field"],
|
273
277
|
[13, :mimetype, "Mimetype field"],
|
274
278
|
[14, :counter, "Counter field"],
|
275
|
-
[15, :
|
279
|
+
[15, :identifier, "Identifier/Symbol field"],
|
276
280
|
[16, :volumeadj, "Volume adjustment field"],
|
277
281
|
[17, :numbits, "Number of bits field"],
|
278
282
|
[18, :volchgright, "Volume chage on the right channel"],
|
@@ -299,7 +303,7 @@ module ID3Lib
|
|
299
303
|
:imageformat => Fields[12],
|
300
304
|
:mimetype => Fields[13],
|
301
305
|
:counter => Fields[14],
|
302
|
-
:
|
306
|
+
:identifier => Fields[15],
|
303
307
|
:volumeadj => Fields[16],
|
304
308
|
:numbits => Fields[17],
|
305
309
|
:volchgright => Fields[18],
|
data/test/test_writing.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: id3lib-ruby
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.5.0
|
7
|
+
date: 2006-12-16 00:00:00 +01:00
|
8
8
|
summary: id3lib-ruby provides a Ruby interface to the id3lib C++ library for easily editing ID3 tags (v1 and v2) like with pyid3lib.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -47,8 +47,9 @@ files:
|
|
47
47
|
- ext/id3lib_api.i
|
48
48
|
- ext/Rakefile
|
49
49
|
- README
|
50
|
-
-
|
50
|
+
- INSTALL
|
51
51
|
- TODO
|
52
|
+
- CHANGES
|
52
53
|
test_files:
|
53
54
|
- test/test_unicode.rb
|
54
55
|
- test/test_writing.rb
|
@@ -60,8 +61,9 @@ rdoc_options:
|
|
60
61
|
- README
|
61
62
|
extra_rdoc_files:
|
62
63
|
- README
|
63
|
-
-
|
64
|
+
- INSTALL
|
64
65
|
- TODO
|
66
|
+
- CHANGES
|
65
67
|
executables: []
|
66
68
|
|
67
69
|
extensions:
|