easytag 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,188 +1,20 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ require 'easytag/attributes/mp4'
4
+
3
5
  module EasyTag::Interfaces
4
6
  class MP4 < Base
5
- # type of TagLib::MP4::Item
6
- module ItemType
7
- STRING = 0 # not part of TagLib::MP4::Item, just for convenience
8
- STRING_LIST = 1
9
- BOOL = 2
10
- INT = 3
11
- INT_PAIR = 4
12
- COVER_ART_LIST = 5
13
- end
14
-
15
- ITEM_LIST_KEY_MAP = {
16
- :aart => 'aART', # Album Artist
17
- :akid => 'akID',
18
- :apid => 'apID', # Apple ID
19
- :atid => 'atID',
20
- :cnid => 'cnID',
21
- :covr => 'covr', # Cover Art
22
- :cpil => 'cpil',
23
- :cprt => 'cprt',
24
- :disk => 'disk', # Disk [num, total]
25
- :geid => 'geID',
26
- :pgap => 'pgap',
27
- :plid => 'plID',
28
- :purd => 'purd', # Purchase Date
29
- :rtng => 'rtng',
30
- :sfid => 'sfID',
31
- :stik => 'stik',
32
- :trkn => 'trkn', # Track [num, total]
33
- :art => '©ART', # Track Artist
34
- :alb => '©alb', # Album
35
- :cmt => '©cmt', # Comments
36
- :day => '©day', # Release Date
37
- # (ex: 2006, 2004-08-10, 2007-11-27T08:00:00Z)
38
- :gen => '©gen', # Genre
39
- :nam => '©nam', # Title
40
- :too => '©too', # Encoder
41
- :soaa => 'soaa', # Sort Order - Album Artist
42
- :soar => 'soar', # Sort Order - Track Artist
43
- }
44
-
45
7
  def initialize(file)
46
8
  @info = TagLib::MP4::File.new(file)
47
- @tag = @info.tag
48
- end
49
-
50
- def title
51
- obj_for_item_key(:nam, ItemType::STRING)
52
- end
53
-
54
- def title_sort_order
55
- obj_for_item_key(:sonm, ItemType::STRING)
56
- end
57
-
58
- def artist
59
- obj_for_item_key(:art, ItemType::STRING)
60
- end
61
-
62
- def artist_sort_order
63
- obj_for_item_key(:soar, ItemType::STRING)
64
- end
65
-
66
- def album_artist
67
- obj_for_item_key(:aart, ItemType::STRING)
68
- end
69
-
70
- def album_artist_sort_order
71
- obj_for_item_key(:soaa, ItemType::STRING)
72
- end
73
-
74
- def album
75
- obj_for_item_key(:alb, ItemType::STRING)
76
- end
77
-
78
- def album_sort_order
79
- obj_for_item_key(:soal, ItemType::STRING)
80
- end
81
-
82
- def genre
83
- obj_for_item_key(:gen, ItemType::STRING)
84
- end
85
-
86
- def comments
87
- obj_for_item_key(:cmt, ItemType::STRING)
88
- end
89
-
90
- # because :day can be anything, including a year, or an exact date,
91
- # we'll let #date do the parsing, and just grab the year from it
92
- def year
93
- date.nil? ? 0 : date.year
94
- end
95
-
96
- def date
97
- return @date unless @date.nil?
98
-
99
- date_str = obj_for_item_key(:day, ItemType::STRING)
100
- @date ||= EasyTag::Utilities.get_datetime(date_str)
101
- end
102
-
103
- def album_art
104
- return @album_art unless @album_art.nil?
105
-
106
- @album_art = []
107
- covers = obj_for_item_key(:covr, ItemType::COVER_ART_LIST) || []
108
- covers.each do |cover|
109
- @album_art << EasyTag::Image.new(cover.data)
110
- end
111
-
112
- @album_art
113
- end
114
-
115
- def apple_id
116
- obj_for_item_key(:apid, ItemType::STRING)
117
- end
118
-
119
- def track_num
120
- obj_for_item_key(:trkn, ItemType::INT_PAIR) || [0, 0]
121
- end
122
-
123
- def disc_num
124
- obj_for_item_key(:disk, ItemType::INT_PAIR) || [0, 0]
125
- end
126
-
127
- def user_info
128
- return @user_info unless @user_info.nil?
129
-
130
- @user_info = {}
131
- @tag.item_list_map.to_a.each do |key, value|
132
- match_data = key.match(/\:com.apple.iTunes\:(.*)/)
133
- if match_data
134
- key = EasyTag::Utilities.normalize_string(match_data[1])
135
- @user_info[key.to_sym] = value.to_string_list[0]
136
- end
137
- end
138
-
139
- @user_info
140
- end
141
-
142
- def disc_subtitle
143
- user_info[:discsubtitle]
144
- end
145
-
146
- def media
147
- user_info[:media]
148
9
  end
149
10
 
150
- def label
151
- user_info[:label]
152
- end
153
-
154
- private
155
- def lookup_item(key)
156
- item_id = ITEM_LIST_KEY_MAP.fetch(key, nil)
157
- @tag.item_list_map.fetch(item_id) unless item_id.nil?
158
- end
159
-
160
- def item_to_obj(item, item_type)
161
- case item_type
162
- when ItemType::STRING
163
- item.to_string_list[0]
164
- when ItemType::STRING_LIST
165
- item.to_string_list
166
- when ItemType::BOOL
167
- item.to_bool
168
- when ItemType::INT
169
- item.to_int
170
- when ItemType::INT_PAIR
171
- item.to_int_pair
172
- when ItemType::COVER_ART_LIST
173
- item.to_cover_art_list
174
- else
175
- nil
11
+ EasyTag::Attributes::MP4_ATTRIB_ARGS.each do |attrib_args|
12
+ attrib = EasyTag::Attributes::MP4Attribute.new(attrib_args)
13
+ define_method(attrib.name) do
14
+ instance_variable_get(attrib.ivar) ||
15
+ instance_variable_set(attrib.ivar, attrib.call(self))
176
16
  end
177
17
  end
178
18
 
179
- def obj_for_item_key(item_key, item_type)
180
- return nil if @tag.nil?
181
-
182
- item = lookup_item(item_key)
183
- o = item_to_obj(item, item_type) unless item.nil?
184
-
185
- Base.obj_or_nil(o)
186
- end
187
19
  end
188
20
  end
@@ -1,7 +1,7 @@
1
1
  module EasyTag
2
2
  class Version
3
3
  MAJOR = 0
4
- MINOR = 2
4
+ MINOR = 3
5
5
  TINY = 0
6
6
  end
7
7
 
@@ -15,11 +15,13 @@ class TestConsistencyMP301 < Test::Unit::TestCase
15
15
  assert_equal('Artist Name Here', @mp3.artist)
16
16
  assert_equal('Album Artist Here', @mp3.album_artist)
17
17
  assert_equal('Album Name Here', @mp3.album)
18
- assert_equal('This is my comment.', @mp3.comments)
18
+ assert_equal('This is my comment.', @mp3.comment)
19
19
  assert_equal('Polka', @mp3.genre)
20
20
  assert_equal(1941, @mp3.year)
21
21
  assert_equal([5, 0], @mp3.track_num)
22
22
  assert_equal([3, 0], @mp3.disc_num)
23
+ assert_equal(false, @mp3.compilation?)
24
+ assert_equal(0, @mp3.bpm)
23
25
  end
24
26
 
25
27
  def test_date
@@ -95,7 +97,7 @@ class TestConsistencyMP302 < Test::Unit::TestCase
95
97
  #[nil, @mp3.album_artist_sort_order],
96
98
  ['Speakerboxxx / The Love Below', @mp3.album],
97
99
  [nil, @mp3.album_sort_order],
98
- [nil, @mp3.comments],
100
+ [[], @mp3.comments],
99
101
  [nil, @mp3.genre],
100
102
  [2003, @mp3.year],
101
103
  [[8, 21], @mp3.track_num],
@@ -103,6 +105,8 @@ class TestConsistencyMP302 < Test::Unit::TestCase
103
105
  ['The Love Below', @mp3.disc_subtitle],
104
106
  ['CD', @mp3.media],
105
107
  ['Arista', @mp3.label],
108
+ [true, @mp3.compilation?],
109
+ [0, @mp3.bpm],
106
110
  ]
107
111
 
108
112
  cases.each do |c|
@@ -157,6 +161,8 @@ class TestConsistency02 < Test::Unit::TestCase
157
161
  :disc_subtitle,
158
162
  :media,
159
163
  :label,
164
+ :compilation?,
165
+ :bpm,
160
166
  ]
161
167
 
162
168
  cases.each do |c|
data/test/test_mp3.rb CHANGED
@@ -10,17 +10,17 @@ class TestID3v1OnlyMP3 < Test::Unit::TestCase
10
10
  end
11
11
 
12
12
  def test_tags
13
- assert_equal('Track Title', @f.title)
14
- assert_equal('Track Artist', @f.artist)
15
- assert_equal('Album Name', @f.album)
16
- assert_equal('this is a comment', @f.comments)
17
- assert_equal('Swing', @f.genre)
18
- assert_equal(1988, @f.year)
19
- assert_equal(1988, @f.date.year)
20
- assert_equal(true, @f.album_art.empty?)
21
- assert_equal(nil, @f.apple_id)
22
- assert_equal([3, 0], @f.track_num)
23
- assert_equal([0, 0], @f.disc_num)
13
+ assert_equal('Track Title', @f.title)
14
+ assert_equal('Track Artist', @f.artist)
15
+ assert_equal('Album Name', @f.album)
16
+ assert_equal(['this is a comment'], @f.comments)
17
+ assert_equal('Swing', @f.genre)
18
+ assert_equal(1988, @f.year)
19
+ assert_equal(1988, @f.date.year)
20
+ assert_equal(true, @f.album_art.empty?)
21
+ assert_equal(nil, @f.apple_id)
22
+ assert_equal([3, 0], @f.track_num)
23
+ assert_equal([0, 0], @f.disc_num)
24
24
 
25
25
  end
26
26
  end
@@ -34,7 +34,7 @@ class TestID3v2OnlyMP3 < Test::Unit::TestCase
34
34
  assert_equal('Track Title', @f.title)
35
35
  assert_equal('Track Artist', @f.artist)
36
36
  assert_equal('Album Name', @f.album)
37
- assert_equal('this is a comment', @f.comments)
37
+ assert_equal('this is a comment', @f.comment)
38
38
  assert_equal('Swing', @f.genre)
39
39
  assert_equal(1988, @f.year)
40
40
  assert_equal(1988, @f.date.year)
@@ -56,7 +56,7 @@ class TestNoTagsMP3 < Test::Unit::TestCase
56
56
  assert_equal(nil, @f.artist)
57
57
  assert_equal(nil, @f.album)
58
58
  assert_equal(nil, @f.album_artist)
59
- assert_equal(nil, @f.comments)
59
+ assert_equal([], @f.comments)
60
60
  assert_equal(nil, @f.genre)
61
61
  assert_equal(0, @f.year)
62
62
  assert_equal(nil, @f.date)
data/test/test_mp4.rb CHANGED
@@ -14,7 +14,7 @@ class TestNoTagsMP4 < Test::Unit::TestCase
14
14
  assert_equal(nil, @f.artist)
15
15
  assert_equal(nil, @f.album)
16
16
  assert_equal(nil, @f.album_artist)
17
- assert_equal(nil, @f.comments)
17
+ assert_equal([], @f.comments)
18
18
  assert_equal(nil, @f.genre)
19
19
  assert_equal(0, @f.year)
20
20
  assert_equal(nil, @f.date)
data/test/test_util.rb CHANGED
@@ -31,6 +31,11 @@ class TestUtilities < Test::Unit::TestCase
31
31
  assert_equal(7, date.day)
32
32
  end
33
33
 
34
+ def test_get_datetime04
35
+ date = EasyTag::Utilities.get_datetime('')
36
+ assert_equal(nil, date)
37
+ end
38
+
34
39
  def test_get_int_pair
35
40
  assert_equal([0, 0], EasyTag::Utilities.get_int_pair(''))
36
41
  assert_equal([0, 0], EasyTag::Utilities.get_int_pair(nil))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easytag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Lucas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-26 00:00:00.000000000 Z
11
+ date: 2013-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: taglib-ruby
@@ -66,8 +66,10 @@ dependencies:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description: |
70
- EasyTag is an abstraction layer to the TagLib audio tagging library. It is designed to provide a simple and consistent API regardless of file format being read.
69
+ description: |2
70
+ EasyTag is an abstraction layer to the TagLib audio tagging library.
71
+ It is designed to provide a simple and consistent API regardless
72
+ of file format being read.
71
73
  email:
72
74
  - chris@chrisjlucas.com
73
75
  executables: []
@@ -81,6 +83,10 @@ files:
81
83
  - Rakefile
82
84
  - easytag.gemspec
83
85
  - lib/easytag.rb
86
+ - lib/easytag/attributes.rb
87
+ - lib/easytag/attributes/base.rb
88
+ - lib/easytag/attributes/mp3.rb
89
+ - lib/easytag/attributes/mp4.rb
84
90
  - lib/easytag/base.rb
85
91
  - lib/easytag/file.rb
86
92
  - lib/easytag/image.rb
@@ -132,4 +138,3 @@ test_files:
132
138
  - test/test_mp3.rb
133
139
  - test/test_mp4.rb
134
140
  - test/test_util.rb
135
- has_rdoc: