id3_tags 0.0.1 → 0.0.2

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/bin/id3_tags ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'id3_tags'
5
+ rescue LoadError
6
+ require 'rubygems'
7
+ require 'id3_tags'
8
+ end
9
+
10
+ puts "ID3 from #{ARGV[0]}:"
11
+ puts Id3Tags.read_tags_from ARGV[0]
@@ -0,0 +1,130 @@
1
+ # coding: utf-8
2
+ require 'taglib'
3
+ require 'active_support/core_ext/hash'
4
+
5
+ module Id3Tags
6
+ class M4A
7
+ def read_tags_from(file_path)
8
+ attrs = {}
9
+ TagLib::MP4::File.open(file_path) do |file|
10
+ tag_fields.each do |field, opts|
11
+ value = file.tag.item_list_map.fetch opts[:frame_id]
12
+ assign! attrs, field, value, opts[:type], opts[:default]
13
+ end unless file.tag.nil?
14
+
15
+ audio_properties_fields.each do |field, opts|
16
+ value = file.audio_properties.send opts[:method]
17
+ assign! attrs, field, value, :integer
18
+ end unless file.audio_properties.nil?
19
+ end
20
+ attrs.symbolize_keys
21
+ end
22
+
23
+ def write_tags_to(file_path, attrs = {})
24
+ attrs.symbolize_keys!
25
+
26
+ TagLib::MP4::File.open(file_path) do |file|
27
+ tag_fields.each do |field, opts|
28
+ file.tag.item_list_map.erase opts[:frame_id]
29
+ frame = new_frame_for attrs[field], opts[:frame_id], opts[:type]
30
+ file.tag.item_list_map.insert opts[:frame_id], frame if frame
31
+ end unless file.tag.nil?
32
+
33
+ file.save
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def fields
40
+ {
41
+ album_artist: {on: :tag, frame_id: 'aART', type: :string},
42
+ artist: {on: :tag, frame_id: '©ART', type: :string},
43
+ title: {on: :tag, frame_id: '©nam', type: :string},
44
+ album: {on: :tag, frame_id: '©alb', type: :string},
45
+ comment: {on: :tag, frame_id: '©cmt', type: :string},
46
+ genre: {on: :tag, frame_id: '©gen', type: :string},
47
+ grouping: {on: :tag, frame_id: '©grp', type: :string},
48
+ lyrics: {on: :tag, frame_id: '©lyr', type: :string},
49
+ composer: {on: :tag, frame_id: '©wrt', type: :string},
50
+ year: {on: :tag, frame_id: '©day', type: :string, default: 0},
51
+ disk: {on: :tag, frame_id: 'disk', type: :pair},
52
+ track: {on: :tag, frame_id: 'trkn', type: :pair},
53
+ bpm: {on: :tag, frame_id: 'tmpo', type: :integer},
54
+ compilation: {on: :tag, frame_id: 'cpil', type: :boolean},
55
+ cover_art: {on: :tag, frame_id: 'covr', type: :image},
56
+ bitrate: {on: :audio_properties, method: :bitrate},
57
+ channels: {on: :audio_properties, method: :channels},
58
+ length: {on: :audio_properties, method: :length},
59
+ samplerate: {on: :audio_properties, method: :sample_rate},
60
+ }
61
+ end
62
+
63
+ def assign!(attrs, field, value, type, default = nil)
64
+ case type
65
+ when :string
66
+ attrs[field] = value && value.to_string_list.first
67
+ if default
68
+ if attrs[field]
69
+ attrs[field] = attrs[field].to_i
70
+ else
71
+ attrs[field] = default
72
+ end
73
+ end
74
+ when :integer
75
+ attrs[field] = value && value.to_int
76
+ if attrs[field] == 0 # well... always? or just bpm?
77
+ attrs[field] = nil
78
+ end
79
+ when :boolean
80
+ attrs[field] = value && value.to_bool
81
+ when :pair
82
+ pair = value ? value.to_int_pair : [nil, nil]
83
+ attrs[field] = {number: pair[0], count: pair[1]}
84
+ when :image
85
+ if value
86
+ image = value.to_cover_art_list.first
87
+ data = image.data
88
+ mime_type = case image.format
89
+ when TagLib::MP4::CoverArt::JPEG then 'image/jpeg'
90
+ when TagLib::MP4::CoverArt::PNG then 'image/png'
91
+ end
92
+ else
93
+ data, mime_type = [nil, nil]
94
+ end
95
+ attrs[:cover_art] = {data: data, mime_type: mime_type}
96
+ end
97
+ end
98
+
99
+ def tag_fields
100
+ fields.select{|k,v| v[:on] == :tag}
101
+ end
102
+
103
+ def audio_properties_fields
104
+ fields.select{|k,v| v[:on] == :audio_properties }
105
+ end
106
+
107
+ def new_frame_for(content, frame_id, type)
108
+ return if content.nil?
109
+ case type
110
+ when :string
111
+ TagLib::MP4::Item.from_string_list [content.to_s]
112
+ when :integer
113
+ TagLib::MP4::Item.from_int content.to_i
114
+ when :boolean
115
+ TagLib::MP4::Item.from_bool content
116
+ when :pair
117
+ return unless content.has_key? :number
118
+ TagLib::MP4::Item.from_int_pair content.values_at(:number, :count)
119
+ when :image
120
+ return unless content.has_key? :data
121
+ mime_type = case content[:mime_type]
122
+ when 'image/jpeg' then TagLib::MP4::CoverArt::JPEG
123
+ when 'image/png' then TagLib::MP4::CoverArt::PNG
124
+ end
125
+ cover_art = TagLib::MP4::CoverArt.new mime_type, content[:data]
126
+ TagLib::MP4::Item.from_cover_art_list [cover_art]
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,142 @@
1
+ require 'taglib'
2
+ require 'active_support/core_ext/hash'
3
+
4
+ module Id3Tags
5
+ class MPEG
6
+ def read_tags_from(file_path)
7
+ attrs = {}
8
+ TagLib::MPEG::File.open(file_path) do |file|
9
+ tag_fields.each do |field, opts|
10
+ value = file.tag.send opts[:method]
11
+ assign! attrs, field, value, opts[:type]
12
+ end unless file.tag.nil?
13
+
14
+ audio_properties_fields.each do |field, opts|
15
+ value = file.audio_properties.send opts[:method]
16
+ assign! attrs, field, value, :integer
17
+ end unless file.audio_properties.nil?
18
+
19
+ id3v2_tag_fields.each do |field, opts|
20
+ value = file.id3v2_tag.frame_list(opts[:frame_id]).first
21
+ value = value.to_string if value and opts[:type] != :image
22
+ assign! attrs, field, value, opts[:type]
23
+ end unless file.id3v2_tag.nil?
24
+ end
25
+
26
+ attrs.symbolize_keys
27
+ end
28
+
29
+ def write_tags_to(file_path, attrs = {})
30
+ attrs.symbolize_keys!
31
+
32
+ TagLib::MPEG::File.open(file_path) do |file|
33
+ tag_fields.each do |field, opts|
34
+ file.tag.send "#{opts[:method]}=", (attrs[field] || opts[:default])
35
+ end unless file.tag.nil?
36
+
37
+ id3v2_tag_fields.each do |field, opts|
38
+ file.id3v2_tag.remove_frames opts[:frame_id]
39
+ frame = new_frame_for attrs[field], opts[:frame_id], opts[:type]
40
+ file.id3v2_tag.add_frame frame if frame
41
+ end unless file.id3v2_tag.nil?
42
+
43
+ file.save
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def fields
50
+ {
51
+ title: {on: :tag, method: :title, type: :string},
52
+ album: {on: :tag, method: :album, type: :string},
53
+ artist: {on: :tag, method: :artist, type: :string},
54
+ comment: {on: :tag, method: :comment, type: :string},
55
+ genre: {on: :tag, method: :genre, type: :string},
56
+ year: {on: :tag, method: :year, type: :integer, default: 0},
57
+ bpm: {on: :id3v2_tag, frame_id: 'TBPM', type: :integer},
58
+ lyrics: {on: :id3v2_tag, frame_id: 'USLT', type: :text},
59
+ composer: {on: :id3v2_tag, frame_id: 'TCOM', type: :string},
60
+ grouping: {on: :id3v2_tag, frame_id: 'TIT1', type: :string},
61
+ album_artist: {on: :id3v2_tag, frame_id: 'TPE2', type: :string},
62
+ compilation: {on: :id3v2_tag, frame_id: 'TCMP', type: :boolean},
63
+ track: {on: :id3v2_tag, frame_id: 'TRCK', type: :pair},
64
+ disk: {on: :id3v2_tag, frame_id: 'TPOS', type: :pair},
65
+ cover_art: {on: :id3v2_tag, frame_id: 'APIC', type: :image},
66
+ bitrate: {on: :audio_properties, method: :bitrate},
67
+ channels: {on: :audio_properties, method: :channels},
68
+ length: {on: :audio_properties, method: :length},
69
+ samplerate: {on: :audio_properties, method: :sample_rate},
70
+ }
71
+ end
72
+
73
+ def tag_fields
74
+ fields.select{|k,v| v[:on] == :tag}
75
+ end
76
+
77
+ def audio_properties_fields
78
+ fields.select{|k,v| v[:on] == :audio_properties }
79
+ end
80
+
81
+ def id3v2_tag_fields
82
+ fields.select{|k,v| v[:on] == :id3v2_tag }
83
+ end
84
+
85
+ def assign!(attrs, field, value, type)
86
+ case type
87
+ when :string, :text
88
+ attrs[field] = value && value.to_s
89
+ when :integer
90
+ attrs[field] = value && value.to_i
91
+ when :boolean
92
+ attrs[field] = value.present? && value.eql?('1')
93
+ when :pair
94
+ pair = value ? value.split('/').map(&:to_i) : [nil, nil]
95
+ attrs[field] = {number: pair[0], count: pair[1]}
96
+ when :image
97
+ pair = [value && value.mime_type, value && value.picture].map(&:presence)
98
+ attrs[field] = {mime_type: pair[0], data: pair[1]}
99
+ end
100
+ end
101
+
102
+ def new_frame_for(content, frame_id, type)
103
+ return if content.nil?
104
+ case type
105
+ when :string, :integer
106
+ frame = new_string_frame(frame_id)
107
+ frame.text = content.to_s
108
+ when :text
109
+ frame = new_text_frame(frame_id)
110
+ frame.text = content.to_s
111
+ when :boolean
112
+ return unless content.eql?(true)
113
+ frame = new_string_frame(frame_id)
114
+ frame.text = '1'
115
+ when :pair
116
+ return unless content.has_key? :number
117
+ frame = new_string_frame(frame_id)
118
+ frame.text = content.values_at(:number, :count).compact.join '/'
119
+ when :image
120
+ return unless content.has_key? :data
121
+ frame = new_image_frame(frame_id)
122
+ frame.description = 'Cover'
123
+ frame.type = TagLib::ID3v2::AttachedPictureFrame::FrontCover
124
+ frame.mime_type = content[:mime_type]
125
+ frame.picture = content[:data]
126
+ end
127
+ frame
128
+ end
129
+
130
+ def new_string_frame(frame_id)
131
+ TagLib::ID3v2::TextIdentificationFrame.new frame_id, TagLib::String::UTF8
132
+ end
133
+
134
+ def new_text_frame(frame_id)
135
+ TagLib::ID3v2::UnsynchronizedLyricsFrame.new frame_id
136
+ end
137
+
138
+ def new_image_frame(frame_id)
139
+ TagLib::ID3v2::AttachedPictureFrame.new frame_id
140
+ end
141
+ end
142
+ end
@@ -1,3 +1,3 @@
1
1
  module Id3Tags
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/lib/id3_tags.rb CHANGED
@@ -1,51 +1,37 @@
1
- require 'taglib'
2
- require 'active_support/core_ext/hash'
1
+ require 'mimemagic'
2
+ require 'id3_tags/mp3'
3
+ require 'id3_tags/m4a'
3
4
 
4
- # Provides two methods to read and write ID3 metadata from an MP3 file
5
+ # Provides two methods to read and write ID3 metadata from an MP3 or M4A file
5
6
  module Id3Tags
6
7
 
7
8
  # Returns a Hash of ID3 attributes stored in the file located at +file_path+.
8
9
  #
9
- # @param [String] file_path Local path to an MP3 file
10
+ # @param [String] file_path Local path to an MP3 or M4A file
10
11
  # @return [Hash] the ID3 attributes stored in the file
11
12
  #
12
13
  # @example Read tags from an MP3 full of metadata
13
14
  # Id3Tags.read_tags_from("all_id3.mp3")
14
15
  #
15
- # # => {title: "Sample track", album: "Sample album", artist: Sample
16
- # artist", :comment=>"Sample comments", genre: "Sample Genre",
17
- # year: 1979, bitrate: 128, channels: 2, length: 38, samplerate:
18
- # 44100, bpm: 110, lyrics: "Sample lyrics line 1\rand line 2",
19
- # composer: "Sample composer", grouping: "Sample group",
20
- # album_artist: "Sample album artist", compilation: true, track:
21
- # {number: 3, count: 12}, disk: {number: 1, count: 2}, cover_art:
22
- # {mime_type: "image/png", data: "\x89PNG\r\n\x1A[...]"}}
16
+ # # => {title: "Sample track", album: "Sample album", artist: Sample
17
+ # artist", :comment=>"Sample comments", genre: "Sample Genre",
18
+ # year: 1979, bitrate: 128, channels: 2, length: 38, samplerate:
19
+ # 44100, bpm: 110, lyrics: "Sample lyrics line 1\rand line 2",
20
+ # composer: "Sample composer", grouping: "Sample group",
21
+ # album_artist: "Sample album artist", compilation: true, track:
22
+ # {number: 3, count: 12}, disk: {number: 1, count: 2}, cover_art:
23
+ # {mime_type: "image/png", data: "\x89PNG\r\n\x1A[...]"}}
23
24
  def self.read_tags_from(file_path)
24
- attrs = {}
25
- TagLib::MPEG::File.open(file_path) do |file|
26
- tag_fields.each do |field, opts|
27
- value = file.tag.send opts[:method]
28
- assign! attrs, field, value, opts[:type]
29
- end unless file.tag.nil?
30
-
31
- audio_properties_fields.each do |field, opts|
32
- value = file.audio_properties.send opts[:method]
33
- assign! attrs, field, value, opts[:type]
34
- end unless file.audio_properties.nil?
35
-
36
- id3v2_tag_fields.each do |field, opts|
37
- value = file.id3v2_tag.frame_list(opts[:frame_id]).first
38
- value = value.to_string if value and opts[:type] != :image
39
- assign! attrs, field, value, opts[:type]
40
- end unless file.id3v2_tag.nil?
25
+ case mime_type_of(file_path)
26
+ when 'audio/mpeg' then MPEG.new.read_tags_from(file_path)
27
+ when 'audio/mp4' then M4A.new.read_tags_from(file_path)
28
+ else {}
41
29
  end
42
-
43
- attrs.symbolize_keys
44
30
  end
45
31
 
46
32
  # Stores the +attrs+ Hash of ID3 attributes into the file at +file_path+.
47
33
  #
48
- # @param [String] file_path Local path to an MP3 file
34
+ # @param [String] file_path Local path to an MP3 or M4A file
49
35
  # @param [Hash] attrs the ID3 attributes stored in the file
50
36
  # @return [Boolean] true (the file gets changed)
51
37
  #
@@ -59,124 +45,27 @@ module Id3Tags
59
45
  # track: {number: 3, count: 12}, disk: {number: 1, count: 2},
60
46
  # cover_art: {mime_type: "image/png", data: "\x89PNG\r\n\x1A[...]"}}
61
47
  #
62
- # # => true
48
+ # # => true
63
49
  def self.write_tags_to(file_path, attrs = {})
64
- attrs.symbolize_keys!
65
-
66
- TagLib::MPEG::File.open(file_path) do |file|
67
- tag_fields.each do |field, opts|
68
- file.tag.send "#{opts[:method]}=", (attrs[field] || opts[:default])
69
- end unless file.tag.nil?
70
-
71
- id3v2_tag_fields.each do |field, opts|
72
- file.id3v2_tag.remove_frames opts[:frame_id]
73
- frame = new_frame_for attrs[field], opts[:frame_id], opts[:type]
74
- file.id3v2_tag.add_frame frame if frame
75
- end unless file.id3v2_tag.nil?
76
-
77
- file.save
50
+ case mime_type_of(file_path)
51
+ when 'audio/mpeg' then MPEG.new.write_tags_to(file_path, attrs)
52
+ when 'audio/mp4' then M4A.new.write_tags_to(file_path, attrs)
53
+ else false
78
54
  end
79
55
  end
80
56
 
81
- # @private
82
- def self.fields
83
- {
84
- title: {on: :tag, method: :title, type: :string},
85
- album: {on: :tag, method: :album, type: :string},
86
- artist: {on: :tag, method: :artist, type: :string},
87
- comment: {on: :tag, method: :comment, type: :string},
88
- genre: {on: :tag, method: :genre, type: :string},
89
- year: {on: :tag, method: :year, type: :integer, default: 0},
90
- bitrate: {on: :audio_properties, method: :bitrate, type: :integer},
91
- channels: {on: :audio_properties, method: :channels, type: :integer},
92
- length: {on: :audio_properties, method: :length, type: :integer},
93
- samplerate: {on: :audio_properties, method: :sample_rate, type: :integer},
94
- bpm: {on: :id3v2_tag, frame_id: 'TBPM', type: :integer},
95
- lyrics: {on: :id3v2_tag, frame_id: 'USLT', type: :text},
96
- composer: {on: :id3v2_tag, frame_id: 'TCOM', type: :string},
97
- grouping: {on: :id3v2_tag, frame_id: 'TIT1', type: :string},
98
- album_artist:{on: :id3v2_tag, frame_id: 'TPE2', type: :string},
99
- compilation: {on: :id3v2_tag, frame_id: 'TCMP', type: :boolean},
100
- track: {on: :id3v2_tag, frame_id: 'TRCK', type: :pair},
101
- disk: {on: :id3v2_tag, frame_id: 'TPOS', type: :pair},
102
- cover_art: {on: :id3v2_tag, frame_id: 'APIC', type: :image},
103
- }
104
- end
105
-
106
- # @private
107
- def self.tag_fields
108
- fields.select{|k,v| v[:on] == :tag}
109
- end
110
-
111
- # @private
112
- def self.audio_properties_fields
113
- fields.select{|k,v| v[:on] == :audio_properties }
114
- end
115
-
116
- # @private
117
- def self.id3v2_tag_fields
118
- fields.select{|k,v| v[:on] == :id3v2_tag }
119
- end
120
-
121
- # @private
122
- def self.assign!(attrs, field, value, type)
123
- case type
124
- when :string, :text
125
- attrs[field] = value && value.to_s
126
- when :integer
127
- attrs[field] = value && value.to_i
128
- when :boolean
129
- attrs[field] = value.present? && value.eql?('1')
130
- when :pair
131
- pair = value ? value.split('/').map(&:to_i) : [nil, nil]
132
- attrs[field] = {number: pair[0], count: pair[1]}
133
- when :image
134
- pair = [value && value.mime_type, value && value.picture].map(&:presence)
135
- attrs[field] = {mime_type: pair[0], data: pair[1]}
136
- end
137
- end
138
-
139
- # @private
140
- def self.new_frame_for(content, frame_id, type)
141
- return if content.nil?
142
- case type
143
- when :string, :integer
144
- frame = new_string_frame(frame_id)
145
- frame.text = content.to_s
146
- when :text
147
- frame = new_text_frame(frame_id)
148
- frame.text = content.to_s
149
- when :boolean
150
- return unless content.eql?(true)
151
- frame = new_string_frame(frame_id)
152
- frame.text = '1'
153
- when :pair
154
- return unless content.has_key? :number
155
- frame = new_string_frame(frame_id)
156
- frame.text = content.values_at(:number, :count).compact.join '/'
157
- when :image
158
- return unless content.has_key? :data
159
- frame = new_image_frame(frame_id)
160
- frame.description = 'Cover'
161
- frame.type = TagLib::ID3v2::AttachedPictureFrame::FrontCover
162
- frame.mime_type = content[:mime_type]
163
- frame.picture = content[:data]
164
- end
165
- frame
166
- end
167
-
168
- # @private
169
- def self.new_string_frame(frame_id)
170
- TagLib::ID3v2::TextIdentificationFrame.new frame_id, TagLib::String::UTF8
171
- end
172
-
173
- # @private
174
- def self.new_text_frame(frame_id)
175
- TagLib::ID3v2::UnsynchronizedLyricsFrame.new frame_id
176
- end
177
-
178
- # @private
179
- def self.new_image_frame(frame_id)
180
- TagLib::ID3v2::AttachedPictureFrame.new frame_id
57
+ # Returns the MIME type of the file located at +file_path+.
58
+ #
59
+ # @param [String] file_path Local path to a file
60
+ # @return [String] the MIME type of the file
61
+ #
62
+ # @example Return the MIME type of an M4A file with a wrong '.mp3' extension
63
+ # Id3Tags.mime_type_of("this_is_an_m4a.mp3")
64
+ #
65
+ # # => "audio/mpeg"
66
+ def self.mime_type_of(file_path)
67
+ mime_type = MimeMagic.by_magic File.open(file_path)
68
+ mime_type ||= MimeMagic.by_path file_path
69
+ mime_type &&= mime_type.type
181
70
  end
182
71
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: id3_tags
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-14 00:00:00.000000000 Z
12
+ date: 2013-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: taglib-ruby
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: mimemagic
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: bundler
48
64
  requirement: !ruby/object:Gem::Requirement
@@ -126,43 +142,18 @@ dependencies:
126
142
  description: Read and write ID3 metadata from/to MP3 files
127
143
  email:
128
144
  - claudio@topspinmedia.com
129
- executables: []
145
+ executables:
146
+ - id3_tags
130
147
  extensions: []
131
148
  extra_rdoc_files: []
132
149
  files:
133
- - .gitignore
134
- - .rspec
135
- - Gemfile
136
- - HISTORY.md
150
+ - bin/id3_tags
151
+ - lib/id3_tags/m4a.rb
152
+ - lib/id3_tags/mp3.rb
153
+ - lib/id3_tags/version.rb
154
+ - lib/id3_tags.rb
137
155
  - MIT-LICENSE
138
156
  - README.md
139
- - Rakefile
140
- - TODO.md
141
- - doc/Id3Tags.html
142
- - doc/_index.html
143
- - doc/class_list.html
144
- - doc/css/common.css
145
- - doc/css/full_list.css
146
- - doc/css/style.css
147
- - doc/file.README.html
148
- - doc/file_list.html
149
- - doc/frames.html
150
- - doc/index.html
151
- - doc/js/app.js
152
- - doc/js/full_list.js
153
- - doc/js/jquery.js
154
- - doc/method_list.html
155
- - doc/top-level-namespace.html
156
- - id3_tags.gemspec
157
- - lib/id3_tags.rb
158
- - lib/id3_tags/version.rb
159
- - spec/assets/all_id3.mp3
160
- - spec/assets/black_pixel.png
161
- - spec/assets/no_id3.mp3
162
- - spec/helpers/duplicate_file_helper.rb
163
- - spec/lib/idempotency_spec.rb
164
- - spec/lib/read_id3_tags_spec.rb
165
- - spec/lib/write_id3_tags_spec.rb
166
157
  homepage: https://github.com/topspin/id3_tags
167
158
  licenses:
168
159
  - MIT
@@ -178,7 +169,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
178
169
  version: '0'
179
170
  segments:
180
171
  - 0
181
- hash: -1313956793775071095
172
+ hash: -2869380124724698312
182
173
  required_rubygems_version: !ruby/object:Gem::Requirement
183
174
  none: false
184
175
  requirements:
@@ -187,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
178
  version: '0'
188
179
  segments:
189
180
  - 0
190
- hash: -1313956793775071095
181
+ hash: -2869380124724698312
191
182
  requirements: []
192
183
  rubyforge_project:
193
184
  rubygems_version: 1.8.23
@@ -196,12 +187,5 @@ specification_version: 3
196
187
  summary: ! 'Id3Tags provides two methods: * read_tags_from, which reads an MP3 file
197
188
  and returns a Hash of metadata * write_tags_to, which writes a Hash of metadata
198
189
  into an MP3 file'
199
- test_files:
200
- - spec/assets/all_id3.mp3
201
- - spec/assets/black_pixel.png
202
- - spec/assets/no_id3.mp3
203
- - spec/helpers/duplicate_file_helper.rb
204
- - spec/lib/idempotency_spec.rb
205
- - spec/lib/read_id3_tags_spec.rb
206
- - spec/lib/write_id3_tags_spec.rb
190
+ test_files: []
207
191
  has_rdoc:
data/.gitignore DELETED
@@ -1,16 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- lib/bundler/man
11
- pkg
12
- rdoc
13
- spec/reports
14
- test/tmp
15
- test/version_tmp
16
- tmp
data/.rspec DELETED
@@ -1 +0,0 @@
1
- --color
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- source 'http://rubygems.org'
2
-
3
- # Declare your gem's dependencies in id3_tags.gemspec.
4
- # Bundler will treat runtime dependencies like base dependencies, and
5
- # development dependencies will be added by default to the :development group.
6
- gemspec
data/HISTORY.md DELETED
@@ -1 +0,0 @@
1
- v0.0.1 - 2013/06/13 Implements `read_tags_from` and `write_tags_to`
data/Rakefile DELETED
@@ -1,12 +0,0 @@
1
- require 'bundler/gem_tasks'
2
-
3
- require 'rspec/core/rake_task'
4
- RSpec::Core::RakeTask.new(:spec)
5
- task default: :spec
6
-
7
- require 'yard'
8
-
9
- YARD::Rake::YardocTask.new do |t|
10
- t.files = ['lib/**/*.rb']
11
- t.options = ['--no-private']
12
- end
data/TODO.md DELETED
@@ -1,2 +0,0 @@
1
- * Add support for M4A
2
- * Add support for multiple cover arts