id3lib-ruby 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +9 -1
- data/README +5 -1
- data/Rakefile +24 -13
- data/TODO +0 -1
- data/lib/id3lib.rb +7 -5
- data/lib/id3lib/info.rb +157 -21
- metadata +35 -34
data/CHANGES
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
= id3lib-ruby changes
|
2
2
|
|
3
|
+
=== 0.3.0 (r29)
|
4
|
+
|
5
|
+
* Added generation of mswin32 binary gem. This means that
|
6
|
+
installing on Windows is a piece of cake. No dependencies, no
|
7
|
+
compiling, just a gem installation.
|
8
|
+
* Changed Info.frame to use hash access instead of find -> faster.
|
9
|
+
|
3
10
|
=== 0.2.1 (r23)
|
4
11
|
|
5
|
-
* Fixed extconf.rb to print a message and abort if id3lib can't be
|
12
|
+
* Fixed extconf.rb to print a message and abort if id3lib can't be
|
13
|
+
found.
|
6
14
|
|
7
15
|
=== 0.2.0 (r21)
|
8
16
|
|
data/README
CHANGED
@@ -15,6 +15,7 @@ The class documentation starts at ID3Lib::Tag.
|
|
15
15
|
* Custom data frames like attached picture (APIC)
|
16
16
|
* Pretty complete coverage of id3lib's features
|
17
17
|
* UTF-16 support
|
18
|
+
* Windows binary gem available
|
18
19
|
|
19
20
|
See TODO for planned features.
|
20
21
|
|
@@ -28,7 +29,10 @@ The home of id3lib-ruby is http://id3lib-ruby.rubyforge.org
|
|
28
29
|
|
29
30
|
== Installation
|
30
31
|
|
31
|
-
|
32
|
+
Note that id3lib has to be installed before running any of the following
|
33
|
+
commands, unless you use the Windows binary gem.
|
34
|
+
|
35
|
+
Installation through RubyGems:
|
32
36
|
|
33
37
|
gem install id3lib-ruby
|
34
38
|
|
data/Rakefile
CHANGED
@@ -10,12 +10,10 @@ require 'rake/testtask'
|
|
10
10
|
require 'rake/rdoctask'
|
11
11
|
|
12
12
|
|
13
|
-
PKG_VERSION = '0.
|
13
|
+
PKG_VERSION = '0.3.0'
|
14
14
|
|
15
|
-
|
15
|
+
PKG_COMMON = FileList[
|
16
16
|
'lib/**/*.rb',
|
17
|
-
'ext/extconf.rb',
|
18
|
-
'ext/*.cxx',
|
19
17
|
'test/test_*.rb',
|
20
18
|
'test/data/*.mp3',
|
21
19
|
'test/data/cover.jpg',
|
@@ -24,16 +22,18 @@ PKG_FILES = FileList[
|
|
24
22
|
]
|
25
23
|
|
26
24
|
|
27
|
-
desc 'Default task is to build extension.'
|
28
|
-
task :default => [:ext]
|
29
|
-
|
30
|
-
|
31
25
|
desc "Build extension."
|
32
26
|
task :ext do
|
33
27
|
sh "cd ext && rake"
|
34
28
|
puts "(end)"
|
35
29
|
end
|
36
30
|
|
31
|
+
desc "Build mswin32 extension."
|
32
|
+
task :ext_mswin32 do
|
33
|
+
sh 'cd ext/mswin32; rake'
|
34
|
+
puts "(end)"
|
35
|
+
end
|
36
|
+
|
37
37
|
|
38
38
|
Rake::TestTask.new do |t|
|
39
39
|
t.libs = ['lib', 'ext']
|
@@ -63,7 +63,7 @@ if defined? Gem
|
|
63
63
|
'id3lib-ruby provides a Ruby interface to the id3lib C++ library for ' +
|
64
64
|
'easily editing ID3 tags (v1 and v2) like with pyid3lib.'
|
65
65
|
s.requirements << 'id3lib C++ library'
|
66
|
-
s.files =
|
66
|
+
s.files = PKG_COMMON + FileList['ext/extconf.rb', 'ext/*.cxx']
|
67
67
|
s.extensions = ['ext/extconf.rb']
|
68
68
|
s.test_files = FileList['test/test_*.rb']
|
69
69
|
s.has_rdoc = true
|
@@ -79,7 +79,21 @@ if defined? Gem
|
|
79
79
|
pkg.need_tar_gz = true
|
80
80
|
pkg.need_zip = true
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
|
+
spec_mswin32 = spec.clone
|
84
|
+
spec_mswin32.files = PKG_COMMON + FileList['ext/mswin32/id3lib_api.so']
|
85
|
+
spec_mswin32.extensions = []
|
86
|
+
spec_mswin32.require_paths = ['lib', 'ext/mswin32']
|
87
|
+
spec_mswin32.platform = Gem::Platform::WIN32
|
88
|
+
|
89
|
+
desc "Build mswin32 gem."
|
90
|
+
task :gem_mswin32 => [:ext_mswin32] do
|
91
|
+
Gem::Builder.new(spec_mswin32).build
|
92
|
+
mkdir_p "pkg"
|
93
|
+
mv "id3lib-ruby-#{PKG_VERSION}-mswin32.gem", "pkg/"
|
94
|
+
end
|
95
|
+
|
96
|
+
end # defined? Gem
|
83
97
|
|
84
98
|
|
85
99
|
task :web => [:web_doc] do
|
@@ -97,12 +111,9 @@ Rake::RDocTask.new :web_doc do |rdoc|
|
|
97
111
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
98
112
|
end
|
99
113
|
|
100
|
-
|
101
114
|
task :usage_html do
|
102
115
|
require 'syntax/convertors/html'
|
103
|
-
|
104
116
|
convertor = Syntax::Convertors::HTML.for_syntax('ruby')
|
105
117
|
html = convertor.convert(File.read('usage.rb'))
|
106
|
-
|
107
118
|
puts html
|
108
119
|
end
|
data/TODO
CHANGED
data/lib/id3lib.rb
CHANGED
@@ -327,7 +327,7 @@ module ID3Lib
|
|
327
327
|
|
328
328
|
def self.read(libframe)
|
329
329
|
frame = {}
|
330
|
-
info = Info.
|
330
|
+
info = Info.frame_num(libframe.num)
|
331
331
|
frame[:id] = info[ID]
|
332
332
|
if info[FIELDS].include?(:textenc)
|
333
333
|
textenc = field(libframe, :textenc).integer
|
@@ -350,16 +350,18 @@ module ID3Lib
|
|
350
350
|
end
|
351
351
|
|
352
352
|
def self.write(frame, libframe)
|
353
|
-
textenc = frame[:textenc]
|
354
|
-
|
353
|
+
if textenc = frame[:textenc]
|
354
|
+
field(libframe, :textenc).set_integer(textenc)
|
355
|
+
end
|
355
356
|
frame.each do |field_id, value|
|
357
|
+
next if field_id == :textenc
|
356
358
|
unless Info.frame(frame[:id])[FIELDS].include?(field_id)
|
357
|
-
#
|
359
|
+
# Ignore invalid fields
|
358
360
|
next
|
359
361
|
end
|
360
|
-
next if field_id == :textenc
|
361
362
|
libfield = field(libframe, field_id)
|
362
363
|
if textenc and textenc > 0
|
364
|
+
# Special treatment for Unicode
|
363
365
|
libfield.set_encoding(textenc)
|
364
366
|
libfield.set_unicode(value)
|
365
367
|
else
|
data/lib/id3lib/info.rb
CHANGED
@@ -55,33 +55,39 @@ module ID3Lib
|
|
55
55
|
#
|
56
56
|
module Info
|
57
57
|
|
58
|
+
#
|
59
|
+
# Please note that these frames are not fully supported by id3lib:
|
60
|
+
# AENC, ASPI, COMR, EQUA, ETCO, LINK, MLLT,
|
61
|
+
# OWNE, POSS, RBUF, RVA2, RVAD, RVRB, SEEK
|
62
|
+
#
|
58
63
|
Frames = [
|
59
64
|
# Special frames
|
60
|
-
[
|
65
|
+
[0, :____, "No known frame", []],
|
66
|
+
[1, :AENC, "Audio encryption", [:owner, :data]],
|
61
67
|
[2, :APIC, "Attached picture", [:textenc, :mimetype, :picturetype, :description, :data]],
|
62
|
-
[3, :ASPI, "Audio seek point index", [:data]],
|
68
|
+
[3, :ASPI, "Audio seek point index", [:data]],
|
63
69
|
[4, :COMM, "Comments", [:textenc, :language, :description, :text]],
|
64
|
-
[5, :COMR, "Commercial frame", [:data]],
|
70
|
+
[5, :COMR, "Commercial frame", [:data]],
|
65
71
|
[6, :ENCR, "Encryption method registration", [:owner, :id, :data]],
|
66
72
|
[7, :EQU2, "Equalisation (2)", [:id, :text]],
|
67
|
-
[8, :EQUA, "Equalization", [:data]],
|
68
|
-
[9, :ETCO, "Event timing codes", [:data]],
|
73
|
+
[8, :EQUA, "Equalization", [:data]],
|
74
|
+
[9, :ETCO, "Event timing codes", [:data]],
|
69
75
|
[10, :GEOB, "General encapsulated object", [:textenc, :mimetype, :filename, :description, :data]],
|
70
76
|
[11, :GRID, "Group identification registration", [:owner, :id, :data]],
|
71
77
|
[12, :IPLS, "Involved people list", [:textenc, :text]],
|
72
|
-
[13, :LINK, "Linked information", [:data]],
|
78
|
+
[13, :LINK, "Linked information", [:data]],
|
73
79
|
[14, :MCDI, "Music CD identifier", [:data]],
|
74
|
-
[15, :MLLT, "MPEG location lookup table", [:data]],
|
75
|
-
[16, :OWNE, "Ownership frame", [:data]],
|
80
|
+
[15, :MLLT, "MPEG location lookup table", [:data]],
|
81
|
+
[16, :OWNE, "Ownership frame", [:data]],
|
76
82
|
[17, :PRIV, "Private frame", [:owner, :data]],
|
77
83
|
[18, :PCNT, "Play counter", [:counter]],
|
78
84
|
[19, :POPM, "Popularimeter", [:email, :rating, :counter]],
|
79
|
-
[20, :POSS, "Position synchronisation frame", [:data]],
|
80
|
-
[21, :RBUF, "Recommended buffer size", [:data]],
|
81
|
-
[22, :RVA2, "Relative volume adjustment (2)", [:data]],
|
82
|
-
[23, :RVAD, "Relative volume adjustment", [:data]],
|
83
|
-
[24, :RVRB, "Reverb", [:data]],
|
84
|
-
[25, :SEEK, "Seek frame", [:data]],
|
85
|
+
[20, :POSS, "Position synchronisation frame", [:data]],
|
86
|
+
[21, :RBUF, "Recommended buffer size", [:data]],
|
87
|
+
[22, :RVA2, "Relative volume adjustment (2)", [:data]],
|
88
|
+
[23, :RVAD, "Relative volume adjustment", [:data]],
|
89
|
+
[24, :RVRB, "Reverb", [:data]],
|
90
|
+
[25, :SEEK, "Seek frame", [:data]],
|
85
91
|
[26, :SIGN, "Signature frame", [:id, :data]],
|
86
92
|
[27, :SYLT, "Synchronized lyric/text", [:textenc, :language, :timestampformat, :contenttype, :description, :data]],
|
87
93
|
[28, :SYTC, "Synchronized tempo codes", [:timestampformat, :data]],
|
@@ -151,8 +157,104 @@ module ID3Lib
|
|
151
157
|
[89, :WORS, "Official internet radio station homepage", [:text]],
|
152
158
|
[90, :WPAY, "Payment", [:text]],
|
153
159
|
[91, :WPUB, "Official publisher webpage", [:text]],
|
154
|
-
[92, :WXXX, "User defined URL link", [:textenc, :description, :url]]
|
160
|
+
[92, :WXXX, "User defined URL link", [:textenc, :description, :url]],
|
155
161
|
]
|
162
|
+
|
163
|
+
FramesByID = {
|
164
|
+
:____ => Frames[0],
|
165
|
+
:AENC => Frames[1],
|
166
|
+
:APIC => Frames[2],
|
167
|
+
:ASPI => Frames[3],
|
168
|
+
:COMM => Frames[4],
|
169
|
+
:COMR => Frames[5],
|
170
|
+
:ENCR => Frames[6],
|
171
|
+
:EQU2 => Frames[7],
|
172
|
+
:EQUA => Frames[8],
|
173
|
+
:ETCO => Frames[9],
|
174
|
+
:GEOB => Frames[10],
|
175
|
+
:GRID => Frames[11],
|
176
|
+
:IPLS => Frames[12],
|
177
|
+
:LINK => Frames[13],
|
178
|
+
:MCDI => Frames[14],
|
179
|
+
:MLLT => Frames[15],
|
180
|
+
:OWNE => Frames[16],
|
181
|
+
:PRIV => Frames[17],
|
182
|
+
:PCNT => Frames[18],
|
183
|
+
:POPM => Frames[19],
|
184
|
+
:POSS => Frames[20],
|
185
|
+
:RBUF => Frames[21],
|
186
|
+
:RVA2 => Frames[22],
|
187
|
+
:RVAD => Frames[23],
|
188
|
+
:RVRB => Frames[24],
|
189
|
+
:SEEK => Frames[25],
|
190
|
+
:SIGN => Frames[26],
|
191
|
+
:SYLT => Frames[27],
|
192
|
+
:SYTC => Frames[28],
|
193
|
+
:TALB => Frames[29],
|
194
|
+
:TBPM => Frames[30],
|
195
|
+
:TCOM => Frames[31],
|
196
|
+
:TCON => Frames[32],
|
197
|
+
:TCOP => Frames[33],
|
198
|
+
:TDAT => Frames[34],
|
199
|
+
:TDEN => Frames[35],
|
200
|
+
:TDLY => Frames[36],
|
201
|
+
:TDOR => Frames[37],
|
202
|
+
:TDRC => Frames[38],
|
203
|
+
:TDRL => Frames[39],
|
204
|
+
:TDTG => Frames[40],
|
205
|
+
:TIPL => Frames[41],
|
206
|
+
:TENC => Frames[42],
|
207
|
+
:TEXT => Frames[43],
|
208
|
+
:TFLT => Frames[44],
|
209
|
+
:TIME => Frames[45],
|
210
|
+
:TIT1 => Frames[46],
|
211
|
+
:TIT2 => Frames[47],
|
212
|
+
:TIT3 => Frames[48],
|
213
|
+
:TKEY => Frames[49],
|
214
|
+
:TLAN => Frames[50],
|
215
|
+
:TLEN => Frames[51],
|
216
|
+
:TMCL => Frames[52],
|
217
|
+
:TMED => Frames[53],
|
218
|
+
:TMOO => Frames[54],
|
219
|
+
:TOAL => Frames[55],
|
220
|
+
:TOFN => Frames[56],
|
221
|
+
:TOLY => Frames[57],
|
222
|
+
:TOPE => Frames[58],
|
223
|
+
:TORY => Frames[59],
|
224
|
+
:TOWN => Frames[60],
|
225
|
+
:TPE1 => Frames[61],
|
226
|
+
:TPE2 => Frames[62],
|
227
|
+
:TPE3 => Frames[63],
|
228
|
+
:TPE4 => Frames[64],
|
229
|
+
:TPOS => Frames[65],
|
230
|
+
:TPRO => Frames[66],
|
231
|
+
:TPUB => Frames[67],
|
232
|
+
:TRCK => Frames[68],
|
233
|
+
:TRDA => Frames[69],
|
234
|
+
:TRSN => Frames[70],
|
235
|
+
:TRSO => Frames[71],
|
236
|
+
:TSIZ => Frames[72],
|
237
|
+
:TSOA => Frames[73],
|
238
|
+
:TSOP => Frames[74],
|
239
|
+
:TSOT => Frames[75],
|
240
|
+
:TSRC => Frames[76],
|
241
|
+
:TSSE => Frames[77],
|
242
|
+
:TSST => Frames[78],
|
243
|
+
:TXXX => Frames[79],
|
244
|
+
:TYER => Frames[80],
|
245
|
+
:UFID => Frames[81],
|
246
|
+
:USER => Frames[82],
|
247
|
+
:USLT => Frames[83],
|
248
|
+
:WCOM => Frames[84],
|
249
|
+
:WCOP => Frames[85],
|
250
|
+
:WOAF => Frames[86],
|
251
|
+
:WOAR => Frames[87],
|
252
|
+
:WOAS => Frames[88],
|
253
|
+
:WORS => Frames[89],
|
254
|
+
:WPAY => Frames[90],
|
255
|
+
:WPUB => Frames[91],
|
256
|
+
:WXXX => Frames[92],
|
257
|
+
}
|
156
258
|
|
157
259
|
Fields = [
|
158
260
|
[0, :nofield, "No field"],
|
@@ -180,7 +282,34 @@ module ID3Lib
|
|
180
282
|
[22, :timestampformat, "SYLT Timestamp Format"],
|
181
283
|
[23, :contenttype, "SYLT content type"]
|
182
284
|
]
|
183
|
-
|
285
|
+
|
286
|
+
FieldsByID = {
|
287
|
+
:nofield => Fields[0],
|
288
|
+
:textenc => Fields[1],
|
289
|
+
:text => Fields[2],
|
290
|
+
:url => Fields[3],
|
291
|
+
:data => Fields[4],
|
292
|
+
:description => Fields[5],
|
293
|
+
:owner => Fields[6],
|
294
|
+
:email => Fields[7],
|
295
|
+
:rating => Fields[8],
|
296
|
+
:filename => Fields[9],
|
297
|
+
:language => Fields[10],
|
298
|
+
:picturetype => Fields[11],
|
299
|
+
:imageformat => Fields[12],
|
300
|
+
:mimetype => Fields[13],
|
301
|
+
:counter => Fields[14],
|
302
|
+
:id => Fields[15],
|
303
|
+
:volumeadj => Fields[16],
|
304
|
+
:numbits => Fields[17],
|
305
|
+
:volchgright => Fields[18],
|
306
|
+
:volchgleft => Fields[19],
|
307
|
+
:peakvolright => Fields[20],
|
308
|
+
:peakvolleft => Fields[21],
|
309
|
+
:timestampformat => Fields[22],
|
310
|
+
:contenttype => Fields[23],
|
311
|
+
}
|
312
|
+
|
184
313
|
FieldType = {
|
185
314
|
0 => :integer,
|
186
315
|
1 => :binary,
|
@@ -225,8 +354,9 @@ module ID3Lib
|
|
225
354
|
"Britpop", "Negerpunk", "Polsk Punk", "Beat",
|
226
355
|
"Christian Gangsta Rap", "Heavy Metal", "Black Metal", "Crossover",
|
227
356
|
"Contemporary Christian", "Christian Rock ", "Merengue", "Salsa",
|
228
|
-
"Trash Metal", "Anime", "JPop", "Synthpop"
|
357
|
+
"Trash Metal", "Anime", "JPop", "Synthpop",
|
229
358
|
]
|
359
|
+
|
230
360
|
|
231
361
|
#
|
232
362
|
# Get information of frame specified by _id_.
|
@@ -234,8 +364,11 @@ module ID3Lib
|
|
234
364
|
# ID3Lib::Info.frame(:TIT2) #=> [47, :TIT2, "Title/songname/content description", [:textenc, :text]]
|
235
365
|
#
|
236
366
|
def self.frame(id)
|
237
|
-
|
238
|
-
|
367
|
+
FramesByID[id]
|
368
|
+
end
|
369
|
+
|
370
|
+
def self.frame_num(num)
|
371
|
+
Frames[num]
|
239
372
|
end
|
240
373
|
|
241
374
|
#
|
@@ -244,8 +377,11 @@ module ID3Lib
|
|
244
377
|
# ID3Lib::Info.field(:text) #=> [2, :text, "Text field"]
|
245
378
|
#
|
246
379
|
def self.field(id)
|
247
|
-
|
248
|
-
|
380
|
+
FieldsByID[id]
|
381
|
+
end
|
382
|
+
|
383
|
+
def self.field_num(num)
|
384
|
+
Fields[num]
|
249
385
|
end
|
250
386
|
|
251
387
|
end
|
metadata
CHANGED
@@ -3,11 +3,11 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: id3lib-ruby
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-05-
|
6
|
+
version: 0.3.0
|
7
|
+
date: 2006-05-28 00:00:00 +02: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
|
11
11
|
email: robinstocker@rubyforge.org
|
12
12
|
homepage: http://id3lib-ruby.rubyforge.org
|
13
13
|
rubyforge_project: id3lib-ruby
|
@@ -18,46 +18,47 @@ bindir: bin
|
|
18
18
|
has_rdoc: true
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
20
|
requirements:
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
version: 0.0.0
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
25
24
|
version:
|
26
25
|
platform: ruby
|
27
26
|
signing_key:
|
28
27
|
cert_chain:
|
29
28
|
authors:
|
30
|
-
|
29
|
+
- Robin Stocker
|
31
30
|
files:
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
31
|
+
- lib/id3lib.rb
|
32
|
+
- lib/id3lib/accessors.rb
|
33
|
+
- lib/id3lib/info.rb
|
34
|
+
- test/test_writing.rb
|
35
|
+
- test/test_reading.rb
|
36
|
+
- test/data/sample.mp3
|
37
|
+
- test/data/unicode.mp3
|
38
|
+
- test/data/cover.jpg
|
39
|
+
- Rakefile
|
40
|
+
- setup.rb
|
41
|
+
- ext/extconf.rb
|
42
|
+
- ext/id3lib_api_wrap.cxx
|
43
|
+
- README
|
44
|
+
- CHANGES
|
45
|
+
- TODO
|
47
46
|
test_files:
|
48
|
-
|
49
|
-
|
47
|
+
- test/test_writing.rb
|
48
|
+
- test/test_reading.rb
|
50
49
|
rdoc_options:
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
- --line-numbers
|
51
|
+
- --main
|
52
|
+
- README
|
54
53
|
extra_rdoc_files:
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
- README
|
55
|
+
- CHANGES
|
56
|
+
- TODO
|
58
57
|
executables: []
|
58
|
+
|
59
59
|
extensions:
|
60
|
-
|
60
|
+
- ext/extconf.rb
|
61
61
|
requirements:
|
62
|
-
|
63
|
-
dependencies: []
|
62
|
+
- id3lib C++ library
|
63
|
+
dependencies: []
|
64
|
+
|