easytag 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -0
- data/README.md +1 -1
- data/easytag.gemspec +1 -1
- data/lib/easytag/attributes/base.rb +68 -28
- data/lib/easytag/attributes/mp3.rb +231 -7
- data/lib/easytag/attributes/mp4.rb +205 -13
- data/lib/easytag/base.rb +3 -3
- data/lib/easytag/interfaces/base.rb +12 -9
- data/lib/easytag/interfaces/mp3.rb +4 -9
- data/lib/easytag/interfaces/mp4.rb +4 -10
- data/lib/easytag/util.rb +33 -3
- data/lib/easytag/version.rb +2 -2
- data/test/test_consistency.rb +48 -7
- data/test/test_mp3.rb +37 -8
- data/test/test_mp4.rb +28 -6
- data/test/test_util.rb +17 -2
- metadata +3 -3
@@ -13,7 +13,6 @@ module EasyTag::Attributes
|
|
13
13
|
end
|
14
14
|
|
15
15
|
class MP4Attribute < BaseAttribute
|
16
|
-
attr_reader :name, :ivar
|
17
16
|
|
18
17
|
def initialize(args)
|
19
18
|
super(args)
|
@@ -64,13 +63,15 @@ module EasyTag::Attributes
|
|
64
63
|
|
65
64
|
def read_user_info(iface)
|
66
65
|
kv_hash = {}
|
67
|
-
iface.info.tag.item_list_map.to_a.each do |key,
|
66
|
+
iface.info.tag.item_list_map.to_a.each do |key, item|
|
68
67
|
match_data = key.match(/\:com.apple.iTunes\:(.*)/)
|
69
68
|
if match_data
|
70
69
|
key = match_data[1]
|
71
70
|
key = Utilities.normalize_string(key) if @options[:normalize]
|
72
71
|
key = key.to_sym if @options[:to_sym]
|
73
|
-
|
72
|
+
|
73
|
+
values = item.to_string_list
|
74
|
+
kv_hash[key] = values.count > 1 ? values : values.first
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
@@ -87,6 +88,7 @@ module EasyTag::Attributes
|
|
87
88
|
:name => :title,
|
88
89
|
:item_ids => ['©nam'],
|
89
90
|
:handler => :read_first_item,
|
91
|
+
:type => Type::STRING,
|
90
92
|
},
|
91
93
|
|
92
94
|
# title_sort_order
|
@@ -94,6 +96,7 @@ module EasyTag::Attributes
|
|
94
96
|
:name => :title_sort_order,
|
95
97
|
:item_ids => ['sonm'],
|
96
98
|
:handler => :read_first_item,
|
99
|
+
:type => Type::STRING,
|
97
100
|
},
|
98
101
|
|
99
102
|
# artist
|
@@ -101,6 +104,7 @@ module EasyTag::Attributes
|
|
101
104
|
:name => :artist,
|
102
105
|
:item_ids => ['©ART'],
|
103
106
|
:handler => :read_first_item,
|
107
|
+
:type => Type::STRING,
|
104
108
|
},
|
105
109
|
|
106
110
|
# artist_sort_order
|
@@ -108,6 +112,7 @@ module EasyTag::Attributes
|
|
108
112
|
:name => :artist_sort_order,
|
109
113
|
:item_ids => ['soar'],
|
110
114
|
:handler => :read_first_item,
|
115
|
+
:type => Type::STRING,
|
111
116
|
},
|
112
117
|
|
113
118
|
# album_artist
|
@@ -115,6 +120,7 @@ module EasyTag::Attributes
|
|
115
120
|
:name => :album_artist,
|
116
121
|
:item_ids => ['aART'],
|
117
122
|
:handler => :read_first_item,
|
123
|
+
:type => Type::STRING,
|
118
124
|
},
|
119
125
|
|
120
126
|
# album_artist_sort_order
|
@@ -122,6 +128,7 @@ module EasyTag::Attributes
|
|
122
128
|
:name => :album_artist_sort_order,
|
123
129
|
:item_ids => ['soaa'],
|
124
130
|
:handler => :read_first_item,
|
131
|
+
:type => Type::STRING,
|
125
132
|
},
|
126
133
|
|
127
134
|
# album
|
@@ -129,6 +136,7 @@ module EasyTag::Attributes
|
|
129
136
|
:name => :album,
|
130
137
|
:item_ids => ['©alb'],
|
131
138
|
:handler => :read_first_item,
|
139
|
+
:type => Type::STRING,
|
132
140
|
},
|
133
141
|
|
134
142
|
# album_sort_order
|
@@ -136,6 +144,7 @@ module EasyTag::Attributes
|
|
136
144
|
:name => :album_sort_order,
|
137
145
|
:item_ids => ['soal'],
|
138
146
|
:handler => :read_first_item,
|
147
|
+
:type => Type::STRING,
|
139
148
|
},
|
140
149
|
|
141
150
|
# genre
|
@@ -143,6 +152,7 @@ module EasyTag::Attributes
|
|
143
152
|
:name => :genre,
|
144
153
|
:item_ids => ['©gen'],
|
145
154
|
:handler => :read_first_item,
|
155
|
+
:type => Type::STRING,
|
146
156
|
},
|
147
157
|
|
148
158
|
# comments
|
@@ -157,7 +167,8 @@ module EasyTag::Attributes
|
|
157
167
|
# comment
|
158
168
|
{
|
159
169
|
:name => :comment,
|
160
|
-
:handler => lambda { |iface| iface.comments.first }
|
170
|
+
:handler => lambda { |iface| iface.comments.first },
|
171
|
+
:type => Type::STRING,
|
161
172
|
},
|
162
173
|
|
163
174
|
# lyrics
|
@@ -165,6 +176,7 @@ module EasyTag::Attributes
|
|
165
176
|
:name => :lyrics,
|
166
177
|
:item_ids => ['©lyr'],
|
167
178
|
:handler => :read_first_item,
|
179
|
+
:type => Type::STRING,
|
168
180
|
},
|
169
181
|
|
170
182
|
# date
|
@@ -173,12 +185,13 @@ module EasyTag::Attributes
|
|
173
185
|
:item_ids => ['©day'],
|
174
186
|
:handler => :read_first_item,
|
175
187
|
:type => Type::DATETIME,
|
188
|
+
:default => nil,
|
176
189
|
},
|
177
190
|
|
178
191
|
# year
|
179
192
|
{
|
180
|
-
:name
|
181
|
-
:handler
|
193
|
+
:name => :year,
|
194
|
+
:handler => lambda { |iface| iface.date.nil? ? 0 : iface.date.year }
|
182
195
|
},
|
183
196
|
|
184
197
|
# apple_id
|
@@ -186,6 +199,7 @@ module EasyTag::Attributes
|
|
186
199
|
:name => :apple_id,
|
187
200
|
:item_ids => ['apid'],
|
188
201
|
:handler => :read_first_item,
|
202
|
+
:type => Type::STRING,
|
189
203
|
},
|
190
204
|
|
191
205
|
# encoded_by
|
@@ -193,6 +207,7 @@ module EasyTag::Attributes
|
|
193
207
|
:name => :encoded_by,
|
194
208
|
:item_ids => ['©enc'],
|
195
209
|
:handler => :read_first_item,
|
210
|
+
:type => Type::STRING,
|
196
211
|
},
|
197
212
|
|
198
213
|
# encoder_settings
|
@@ -200,6 +215,7 @@ module EasyTag::Attributes
|
|
200
215
|
:name => :encoder_settings,
|
201
216
|
:item_ids => ['©too'],
|
202
217
|
:handler => :read_first_item,
|
218
|
+
:type => Type::STRING,
|
203
219
|
},
|
204
220
|
|
205
221
|
# group
|
@@ -207,6 +223,7 @@ module EasyTag::Attributes
|
|
207
223
|
:name => :group,
|
208
224
|
:item_ids => ['©grp'],
|
209
225
|
:handler => :read_first_item,
|
226
|
+
:type => Type::STRING,
|
210
227
|
},
|
211
228
|
|
212
229
|
# compilation?
|
@@ -214,8 +231,8 @@ module EasyTag::Attributes
|
|
214
231
|
:name => :compilation?,
|
215
232
|
:item_ids => ['cpil'],
|
216
233
|
:handler => :read_first_item,
|
234
|
+
:type => Type::BOOLEAN,
|
217
235
|
:item_type => ItemType::BOOL,
|
218
|
-
:default => false,
|
219
236
|
},
|
220
237
|
|
221
238
|
# bpm
|
@@ -227,11 +244,21 @@ module EasyTag::Attributes
|
|
227
244
|
:default => 0,
|
228
245
|
},
|
229
246
|
|
247
|
+
# mood
|
248
|
+
{
|
249
|
+
:name => :mood,
|
250
|
+
:item_ids => ['mood'],
|
251
|
+
:handler => :read_first_item,
|
252
|
+
:item_type => ItemType::STRING,
|
253
|
+
:type => Type::STRING,
|
254
|
+
},
|
255
|
+
|
230
256
|
# copyright
|
231
257
|
{
|
232
258
|
:name => :copyright,
|
233
259
|
:item_ids => ['cprt'],
|
234
260
|
:handler => :read_first_item,
|
261
|
+
:type => Type::STRING,
|
235
262
|
},
|
236
263
|
|
237
264
|
# track_num
|
@@ -266,44 +293,209 @@ module EasyTag::Attributes
|
|
266
293
|
:name => :user_info,
|
267
294
|
:handler => :read_user_info,
|
268
295
|
:default => {},
|
296
|
+
},
|
297
|
+
|
298
|
+
# user_info_normalized
|
299
|
+
{
|
300
|
+
:name => :user_info_normalized,
|
301
|
+
:handler => :read_user_info,
|
302
|
+
:default => {},
|
269
303
|
:options => {:normalize => true, :to_sym => true},
|
270
304
|
},
|
271
305
|
|
272
306
|
# subtitle
|
273
307
|
{
|
274
308
|
:name => :subtitle,
|
275
|
-
:handler =>
|
309
|
+
:handler => :user_info_lookup,
|
310
|
+
:handler_opts => {:key => :subtitle},
|
311
|
+
:type => Type::STRING,
|
276
312
|
},
|
277
313
|
|
278
314
|
# disc_subtitle
|
279
315
|
{
|
280
316
|
:name => :disc_subtitle,
|
281
|
-
:handler =>
|
317
|
+
:handler => :user_info_lookup,
|
318
|
+
:handler_opts => {:key => :discsubtitle},
|
319
|
+
:type => Type::STRING,
|
282
320
|
},
|
283
321
|
|
284
322
|
# media
|
285
323
|
{
|
286
324
|
:name => :media,
|
287
|
-
:handler =>
|
325
|
+
:handler => :user_info_lookup,
|
326
|
+
:handler_opts => {:key => :media},
|
327
|
+
:type => Type::STRING,
|
288
328
|
},
|
289
329
|
|
290
330
|
# label
|
291
331
|
{
|
292
332
|
:name => :label,
|
293
|
-
:handler =>
|
333
|
+
:handler => :user_info_lookup,
|
334
|
+
:handler_opts => {:key => :label},
|
335
|
+
:type => Type::STRING,
|
294
336
|
},
|
295
337
|
|
296
338
|
# composer
|
297
339
|
{
|
298
340
|
:name => :composer,
|
299
|
-
:handler =>
|
341
|
+
:handler => :user_info_lookup,
|
342
|
+
:handler_opts => {:key => :composer},
|
343
|
+
:type => Type::STRING,
|
344
|
+
},
|
345
|
+
|
346
|
+
# conductor
|
347
|
+
{
|
348
|
+
:name => :conductor,
|
349
|
+
:handler => :user_info_lookup,
|
350
|
+
:handler_opts => {:key => :conductor},
|
351
|
+
:type => Type::STRING,
|
352
|
+
},
|
353
|
+
|
354
|
+
# remixer
|
355
|
+
{
|
356
|
+
:name => :remixer,
|
357
|
+
:handler => :user_info_lookup,
|
358
|
+
:handler_opts => {:key => :remixer},
|
359
|
+
:type => Type::STRING,
|
300
360
|
},
|
301
361
|
|
302
362
|
# lyricist
|
303
363
|
{
|
304
364
|
:name => :lyricist,
|
305
|
-
:handler =>
|
365
|
+
:handler => :user_info_lookup,
|
366
|
+
:handler_opts => {:key => :lyricist},
|
367
|
+
:type => Type::STRING,
|
368
|
+
},
|
369
|
+
|
370
|
+
# asin
|
371
|
+
{
|
372
|
+
:name => :asin,
|
373
|
+
:handler => :user_info_lookup,
|
374
|
+
:handler_opts => {:key => :asin},
|
375
|
+
:type => Type::STRING,
|
376
|
+
},
|
377
|
+
|
378
|
+
#
|
379
|
+
# MusicBrainz Attributes
|
380
|
+
#
|
381
|
+
|
382
|
+
# musicbrainz_track_id
|
383
|
+
{
|
384
|
+
:name => :musicbrainz_track_id,
|
385
|
+
:handler => :user_info_lookup,
|
386
|
+
:handler_opts => {:key => :musicbrainz_track_id},
|
387
|
+
:type => Type::STRING,
|
388
|
+
},
|
389
|
+
|
390
|
+
# musicbrainz_album_artist_id
|
391
|
+
{
|
392
|
+
:name => :musicbrainz_album_artist_id,
|
393
|
+
:handler => :user_info_lookup,
|
394
|
+
:handler_opts => {:key => :musicbrainz_album_artist_id},
|
395
|
+
:type => Type::STRING,
|
396
|
+
},
|
397
|
+
|
398
|
+
# musicbrainz_artist_id
|
399
|
+
{
|
400
|
+
:name => :musicbrainz_artist_id,
|
401
|
+
:handler => :user_info_lookup,
|
402
|
+
:handler_opts => {:key => :musicbrainz_artist_id},
|
403
|
+
:type => Type::LIST,
|
404
|
+
},
|
405
|
+
|
406
|
+
# musicbrainz_album_id
|
407
|
+
{
|
408
|
+
:name => :musicbrainz_album_id,
|
409
|
+
:handler => :user_info_lookup,
|
410
|
+
:handler_opts => {:key => :musicbrainz_album_id},
|
411
|
+
:type => Type::STRING,
|
412
|
+
},
|
413
|
+
|
414
|
+
# musicbrainz_album_status
|
415
|
+
{
|
416
|
+
:name => :musicbrainz_album_status,
|
417
|
+
:handler => :user_info_lookup,
|
418
|
+
:handler_opts => {:key => :musicbrainz_album_status},
|
419
|
+
:type => Type::STRING,
|
420
|
+
},
|
421
|
+
|
422
|
+
# musicbrainz_album_type
|
423
|
+
{
|
424
|
+
:name => :musicbrainz_album_type,
|
425
|
+
:handler => :user_info_lookup,
|
426
|
+
:handler_opts => {:key => :musicbrainz_album_type},
|
427
|
+
:type => Type::LIST,
|
306
428
|
},
|
307
429
|
|
430
|
+
|
431
|
+
# musicbrainz_release_group_id
|
432
|
+
{
|
433
|
+
:name => :musicbrainz_release_group_id,
|
434
|
+
:handler => :user_info_lookup,
|
435
|
+
:handler_opts => {:key => :musicbrainz_release_group_id},
|
436
|
+
:type => Type::STRING,
|
437
|
+
},
|
438
|
+
|
439
|
+
# musicbrainz_album_release_country
|
440
|
+
{
|
441
|
+
:name => :musicbrainz_album_release_country,
|
442
|
+
:handler => :user_info_lookup,
|
443
|
+
:handler_opts => {:key => :musicbrainz_album_release_country},
|
444
|
+
:type => Type::STRING,
|
445
|
+
},
|
446
|
+
|
447
|
+
#
|
448
|
+
# Audio Properties
|
449
|
+
#
|
450
|
+
|
451
|
+
# length
|
452
|
+
{
|
453
|
+
:name => :length,
|
454
|
+
:aliases => [:duration],
|
455
|
+
:handler => :read_audio_property,
|
456
|
+
:handler_opts => {:key => :length},
|
457
|
+
:type => Type::INT,
|
458
|
+
},
|
459
|
+
|
460
|
+
# bitrate
|
461
|
+
{
|
462
|
+
:name => :bitrate,
|
463
|
+
:handler => :read_audio_property,
|
464
|
+
:handler_opts => {:key => :bitrate},
|
465
|
+
:type => Type::INT,
|
466
|
+
},
|
467
|
+
|
468
|
+
# sample_rate
|
469
|
+
{
|
470
|
+
:name => :sample_rate,
|
471
|
+
:handler => :read_audio_property,
|
472
|
+
:handler_opts => {:key => :sample_rate},
|
473
|
+
:type => Type::INT,
|
474
|
+
},
|
475
|
+
|
476
|
+
# channels
|
477
|
+
{
|
478
|
+
:name => :channels,
|
479
|
+
:handler => :read_audio_property,
|
480
|
+
:handler_opts => {:key => :channels},
|
481
|
+
:type => Type::INT,
|
482
|
+
},
|
483
|
+
|
484
|
+
# bits_per_sample
|
485
|
+
{
|
486
|
+
:name => :bits_per_sample,
|
487
|
+
:handler => :read_audio_property,
|
488
|
+
:handler_opts => {:key => :bits_per_sample},
|
489
|
+
:type => Type::INT,
|
490
|
+
},
|
491
|
+
|
492
|
+
# NOTE: Not supported by ruby-easytag 0.6.0
|
493
|
+
## encrypted?
|
494
|
+
#{
|
495
|
+
#:name => :encrypted?,
|
496
|
+
#:handler => :read_audio_property,
|
497
|
+
#:handler_opts => {:key => :encrypted?},
|
498
|
+
#:type => Type::BOOLEAN,
|
499
|
+
#},
|
308
500
|
]
|
309
501
|
end
|
data/lib/easytag/base.rb
CHANGED
@@ -16,11 +16,11 @@ module EasyTag
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def proxy_getter(m)
|
19
|
-
|
20
|
-
@interface.send(m)
|
21
|
-
else
|
19
|
+
unless @interface.respond_to?(m)
|
22
20
|
warn "#{@interface.class} doesn't support method #{m}"
|
23
21
|
end
|
22
|
+
|
23
|
+
@interface.send(m)
|
24
24
|
end
|
25
25
|
|
26
26
|
# dynamic instance method generation
|
@@ -3,19 +3,22 @@ module EasyTag
|
|
3
3
|
class Base
|
4
4
|
attr_reader :info
|
5
5
|
|
6
|
-
# avoid returing empty objects
|
7
|
-
def self.obj_or_nil(o)
|
8
|
-
if o.class == String
|
9
|
-
ret = o.empty? ? nil : o
|
10
|
-
else
|
11
|
-
o
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
6
|
def close
|
16
7
|
@info.close
|
17
8
|
end
|
18
9
|
|
10
|
+
def self.build_attributes(attrib_class, attrib_args)
|
11
|
+
attrib_args.each do |attrib_args|
|
12
|
+
attrib = attrib_class.new(attrib_args)
|
13
|
+
define_method(attrib.name) do
|
14
|
+
instance_variable_get(attrib.ivar) ||
|
15
|
+
instance_variable_set(attrib.ivar, attrib.call(self))
|
16
|
+
end
|
17
|
+
|
18
|
+
attrib.aliases.each { |a| alias_method a, attrib.name}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
19
22
|
end
|
20
23
|
end
|
21
24
|
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
require 'mp3info'
|
2
|
-
require 'yaml'
|
3
2
|
|
4
3
|
require 'easytag/attributes/mp3'
|
5
4
|
|
6
5
|
module EasyTag::Interfaces
|
7
6
|
|
8
7
|
class MP3 < Base
|
8
|
+
ATTRIB_ARGS = EasyTag::Attributes::MP3_ATTRIB_ARGS
|
9
|
+
ATTRIB_CLASS = EasyTag::Attributes::MP3Attribute
|
10
|
+
|
9
11
|
def initialize(file)
|
10
12
|
@info = TagLib::MPEG::File.new(file)
|
11
13
|
|
@@ -41,13 +43,6 @@ module EasyTag::Interfaces
|
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
|
-
|
45
|
-
attrib = EasyTag::Attributes::MP3Attribute.new(attrib_args)
|
46
|
-
define_method(attrib.name) do
|
47
|
-
instance_variable_get(attrib.ivar) ||
|
48
|
-
instance_variable_set(attrib.ivar, attrib.call(self))
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
46
|
+
self.build_attributes(ATTRIB_CLASS, ATTRIB_ARGS)
|
52
47
|
end
|
53
48
|
end
|