id3dit 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 50dd9d679398dbd0314f2c761339fb3ec38b2ffa
4
+ data.tar.gz: cb33c5b19ce5172a5e6819a7db8272e5490f4716
5
+ SHA512:
6
+ metadata.gz: 7eab5ec485e60608920f1bcb7cfcad7dddf237971d05f7096cf943a06562b3757fa11c5ddda8b8e211da6305e8c65d3fccfbef09a4794527f223cb79b9bca4d6
7
+ data.tar.gz: d163cce4367256a93a9b114fc2a0e688694c88d9e645023b012236f5c5860252474a0f78f78a21a5333c2780e95153662b849b91a31f864d2c0872ec529c79d0
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ CHANGELOG-*.txt
2
+ .setup
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+
2
+ source 'https://rubygems.org'
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,24 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ id3dit (1.1.0)
5
+ highline (~> 1.7)
6
+ id3lib-ruby (~> 0.6)
7
+ rainbow (~> 2.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ highline (1.7.8)
13
+ id3lib-ruby (0.6.0)
14
+ rainbow (2.0.0)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ bundler (~> 1.10)
21
+ id3dit!
22
+
23
+ BUNDLED WITH
24
+ 1.10.2
data/Makefile ADDED
@@ -0,0 +1,50 @@
1
+
2
+ MV = mv -nv
3
+ RM = rm -rf
4
+ MKDIR = mkdir -p
5
+ BUNDLER = bundle
6
+ GEM_NAME = id3dit
7
+ GEMSPEC_FILE = $(GEM_NAME).gemspec
8
+
9
+
10
+ .PHONY: all
11
+ all: setup
12
+
13
+ .PHONY: setup
14
+ setup: .setup
15
+
16
+ .setup:
17
+ $(BUNDLER) install
18
+ touch $@
19
+
20
+ .PHONY: install
21
+ install:
22
+ gem_file=$$(gem build $(GEMSPEC_FILE) | grep 'File:' | tail -1 | awk '{ print $$2 }'); \
23
+ sudo gem install $$gem_file; \
24
+ $(RM) $$gem_file
25
+
26
+ .PHONY: uninstall
27
+ uninstall:
28
+ sudo gem uninstall $(GEM_NAME)
29
+
30
+ .PHONY: update
31
+ update:
32
+ $(BUNDLER) update
33
+
34
+ .PHONY: clean
35
+ clean:
36
+ $(RM) .setup
37
+ $(RM) Gemfile.lock
38
+
39
+ .PHONY: release
40
+ release: | releases
41
+ set -e; \
42
+ gem_file=$$(gem build $(GEMSPEC_FILE) | grep 'File:' | tail -1 | awk '{ print $$2 }'); \
43
+ dst="releases/$$gem_file"; \
44
+ [ ! -f $$dst ]; \
45
+ $(MV) $$gem_file releases; \
46
+ gem push $$dst; \
47
+ echo 'done'
48
+
49
+ releases:
50
+ $(MKDIR) $@
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # ID3dit
2
+
3
+ [ID3](https://en.wikipedia.org/wiki/ID3) tags editor for the command line written in Ruby.
4
+
5
+ ![](examples/id3dit_20151116_143921.png)
6
+
7
+ ![](examples/id3dit_20151116_144224.png)
8
+
9
+ ## Install
10
+
11
+ The preferred method of installation is via RubyGems.org:
12
+ <https://rubygems.org/gems/id3dit>
13
+
14
+ gem install id3dit
15
+
16
+ or via `Gemfile`:
17
+
18
+ gem 'id3dit', '~>1.1'
19
+
20
+ ## Usage
21
+
22
+ Video: <https://asciinema.org/a/a3tt619cc1r529av8skskgz5w>
23
+
24
+ ### Print Help
25
+
26
+ id3dit -h
27
+
28
+ ### Interactive Mode
29
+
30
+ id3dit FILES...
31
+
32
+ ### Set Tag
33
+
34
+ id3dit --artist STRING FILES...
35
+
36
+ ### Remove All Tags
37
+
38
+ id3dit --remove-all FILES...
39
+
40
+ ### Remove a Tag
41
+
42
+ id3dit --remove-comment FILES...
43
+
44
+ ### Examples
45
+
46
+ - `id3dit my_music.mp3`
47
+ - `id3dit track01.mp3 track02.mp3`
48
+ - `id3dit --artist EAV track01.mp3`
49
+ - `id3dit --artist AC/DC *.mp3`
50
+ - `id3dit --year 1987 --bpm 180 track01.mp3`
51
+ - `id3dit --remove-all track01.mp3`
52
+ - `id3dit --remove-comment track01.mp3 track02.mp3`
53
+ - `id3dit --remove-disc --remove-track track01.mp3 track02.mp3`
54
+
55
+ ## License
56
+ Copyright (C) 2015 Christian Mayer <http://fox21.at>
57
+
58
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
59
+
60
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
data/bin/id3dit ADDED
@@ -0,0 +1,279 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: UTF-8
3
+
4
+ require 'bundler/setup'
5
+ require 'id3lib'
6
+ require 'highline/import'
7
+ require 'rainbow'
8
+ require 'id3dit'
9
+
10
+
11
+ options = {
12
+ :interactive => true,
13
+ }
14
+ opts = OptionParser.new do |opts|
15
+ opts.banner = 'Usage: id3dit [OPTIONS...] FILES...'
16
+ opts.separator('')
17
+ opts.separator('Options:')
18
+
19
+ ID3dit::USED_TAGS.each do |tag_name, tag|
20
+ opts.on("--#{tag_name} STRING", "Set new value for '#{tag_name}' tag. (#{tag[:id]})") do |v|
21
+ options[:interactive] = false
22
+ options["set_tag_#{tag_name}"] = v
23
+ end
24
+ end
25
+
26
+ opts.on('-r', '--remove-all', 'Remove all tags.') do |v|
27
+ options[:interactive] = false
28
+ options['remove_all_tags'] = true
29
+ end
30
+ ID3dit::USED_TAGS.each do |tag_name, tag|
31
+ opts.on("--remove-#{tag_name}", "Remove '#{tag_name}' tag. (#{tag[:id]})") do |v|
32
+ options[:interactive] = false
33
+ options["remove_tag_#{tag_name}"] = v
34
+ end
35
+ end
36
+
37
+ opts.on_tail('--version', 'Show version.') do
38
+ puts "ID3dit #{ID3dit::VERSION}"
39
+ puts ID3dit::HOMEPAGE
40
+ exit
41
+ end
42
+
43
+ opts.on_tail('-h', '--help', 'Show this message.') do
44
+ puts opts
45
+ exit 3
46
+ end
47
+ end
48
+
49
+ opts.parse(ARGV)
50
+
51
+ files = []
52
+ ARGV.each do |arg|
53
+ if File.exist?(arg)
54
+ files << arg
55
+ end
56
+ end
57
+
58
+ if files.count == 0
59
+ opts.parse(['-h'])
60
+ end
61
+
62
+ if options[:interactive]
63
+ puts "ID3dit #{ID3dit::VERSION}"
64
+
65
+ tags = ID3dit::Tags.new(files.map{ |file| ID3Lib::Tag.new(file) })
66
+
67
+ actions = ['i']
68
+ while true
69
+ case actions.pop
70
+ when 'i'
71
+ puts
72
+ if files.count >= 2
73
+ puts "#{files.count} songs selected."
74
+ else
75
+ puts "File '#{files.first}'."
76
+ end
77
+
78
+ puts
79
+ if tags.are_set?
80
+ tags.are_set.each do |tag_name, tag_infos|
81
+ printf "%15s ", tag_name
82
+ if tag_infos[:is_mixed]
83
+ print '< Mixed >'
84
+ else
85
+ print "'" + Rainbow(tag_infos[:old_value]).bright + "'"
86
+ end
87
+ if tag_infos[:has_changed]
88
+ if tag_infos[:is_removed]
89
+ print " => remove"
90
+ else
91
+ print " => '#{tag_infos[:new_value]}'"
92
+ end
93
+ end
94
+ puts
95
+ end
96
+ else
97
+ puts 'File(s) contain no ID3 tags.'
98
+ end
99
+ when 'e'
100
+ puts
101
+ puts 'Type new value for tags.'
102
+ puts '- Leave blank for unchanged.'
103
+ puts '- Leave input prematurely with "#".'
104
+ puts
105
+
106
+ has_set_tags = false
107
+ pre_break = false
108
+ tags.are_for_edit.each do |tag_name, tag_infos|
109
+ has_set_tags = true
110
+
111
+ printf "%15s ", tag_name
112
+ if tag_infos[:is_mixed]
113
+ print '< Mixed >'
114
+ else
115
+ print "'" + Rainbow(tag_infos[:new_value].nil? ? tag_infos[:old_value] : tag_infos[:new_value]).bright + "'"
116
+ end
117
+
118
+ print ' >'
119
+ new_val = ask('').strip
120
+ if new_val != ''
121
+ if new_val == '#'
122
+ pre_break = true
123
+ puts 'Break.'
124
+ break
125
+ end
126
+ printf "%15s '%s'\n", "New #{tag_name}", new_val
127
+ tags[tag_name] = new_val
128
+ end
129
+ end
130
+
131
+ show_unset_tags = false
132
+ if has_set_tags
133
+ if !pre_break
134
+ puts
135
+ res = ask('Edit more tags? [yN] ').strip.downcase
136
+ if res == 'y'
137
+ show_unset_tags = true
138
+ end
139
+ end
140
+ else
141
+ show_unset_tags = true
142
+ end
143
+
144
+ if show_unset_tags
145
+ puts
146
+ tags.are_for_further_edit.each do |tag_name, tag_infos|
147
+ printf "%15s '' >", tag_name
148
+ new_val = ask('').strip
149
+ if new_val != ''
150
+ if new_val == '#'
151
+ pre_break = true
152
+ puts 'Break.'
153
+ break
154
+ end
155
+ printf "%15s '%s'\n", "New #{tag_name}", new_val
156
+ tags[tag_name] = new_val
157
+ end
158
+ end
159
+ end
160
+ when 'r'
161
+ puts
162
+ puts 'Remove tags.'
163
+ puts '- Default is no on non-empty fields.'
164
+ puts '- Leave input prematurely with "#".'
165
+ puts
166
+
167
+ tags.are_for_remove.each do |tag_name, tag_infos|
168
+ printf "%15s ", tag_name
169
+ if tag_infos[:is_mixed]
170
+ print '< Mixed >'
171
+ else
172
+ print "'" + Rainbow(tag_infos[:new_value].nil? ? tag_infos[:old_value] : tag_infos[:new_value]).bright + "'"
173
+ end
174
+
175
+ print ' ['
176
+ default_v = 'n'
177
+ if !tag_infos[:old_value].nil? && tag_infos[:old_value] != '' ||
178
+ !tag_infos[:new_value].nil? && tag_infos[:new_value] != '' ||
179
+ tag_infos[:is_mixed]
180
+ print 'yN'
181
+ else
182
+ print 'Yn'
183
+ default_v = 'y'
184
+ end
185
+ print '#]? '
186
+
187
+ res = ask('').strip.downcase
188
+ if res == ''
189
+ res = default_v
190
+ end
191
+ if res == 'y' || res == 'r'
192
+ printf "%15s\n", "Remove #{tag_name}"
193
+ tags.delete(tag_name)
194
+ elsif res == '#'
195
+ puts 'Break.'
196
+ break
197
+ end
198
+ end
199
+ when 'x'
200
+ actions << 'q'
201
+ actions << 'w'
202
+ when 'w'
203
+ puts
204
+
205
+ changes = tags.have_changed
206
+ if changes.count > 0
207
+ puts "Write #{changes.count} change(s)."
208
+ files.each do |file|
209
+ puts "Write file '#{file}'."
210
+
211
+ tag = ID3Lib::Tag.new(file)
212
+ changes.each do |tag_name, tag_infos|
213
+ if tag_infos[:is_removed]
214
+ used_tag = ID3dit::USED_TAGS[tag_name]
215
+ tag.delete_if{ |frame| frame[:id] == used_tag[:id] }
216
+ else
217
+ tag.send("#{tag_name}=", tag_infos[:new_value])
218
+ end
219
+ end
220
+ tag.update!
221
+ end
222
+
223
+ tags.update
224
+ else
225
+ puts 'Nothing has changed, no file(s) written.'
226
+ end
227
+ when 'q'
228
+ puts 'Quitting.'
229
+ break
230
+ when '?'
231
+ puts
232
+ puts 'i - show all tags.'
233
+ puts 'e - edit all tags.'
234
+ puts 'r - remove tags.'
235
+ puts 'x - same as wq.'
236
+ puts 'w - write - after edit, apply changes to the files.'
237
+ puts 'q - quit without saving.'
238
+ puts '? - print help.'
239
+ else
240
+ puts "WARNING: invalid input. Type '?' for help."
241
+ end
242
+
243
+ next if actions.count > 0
244
+
245
+ puts
246
+ actions << ask('[ierxwq?] '){ |q|
247
+ q.character = true
248
+ }.downcase
249
+ end
250
+ else
251
+ files.each do |file|
252
+ puts "Check file '#{file}'."
253
+
254
+ changed = false
255
+ tag = ID3Lib::Tag.new(file)
256
+ options.select{ |tag_name, tag_value| /^set_tag_/.match(tag_name) }.each do |tag_name, tag_value|
257
+ name = tag_name.sub(/^set_tag_/, '')
258
+ tag.send("#{name}=", tag_value)
259
+ changed = true
260
+ end
261
+ if options.has_key?('remove_all_tags')
262
+ tag.delete_if{ true }
263
+ changed = true
264
+ else
265
+ options.select{ |tag_name, tag_value| /^remove_tag_/.match(tag_name) }.each do |tag_name, tag_value|
266
+ name = tag_name.sub(/^remove_tag_/, '')
267
+ used_tag = ID3dit::USED_TAGS[name.to_sym]
268
+ count = tag.count
269
+ tag.delete_if{ |frame| frame[:id] == used_tag[:id] }
270
+
271
+ changed = true if tag.count < count
272
+ end
273
+ end
274
+ if changed
275
+ puts "Write file '#{file}'."
276
+ tag.update!
277
+ end
278
+ end
279
+ end
Binary file
Binary file
data/id3dit.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # coding: UTF-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'id3dit/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'id3dit'
10
+ spec.version = ID3dit::VERSION
11
+ spec.date = ID3dit::DATE
12
+ spec.author = 'Christian Mayer'
13
+ spec.email = 'christian@fox21.at'
14
+
15
+ spec.summary = %q{ID3 Tags Editor}
16
+ spec.description = %q{ID3 tags editor for the command line written in Ruby.}
17
+ spec.homepage = ID3dit::HOMEPAGE
18
+ spec.license = 'GPL-3.0'
19
+
20
+ spec.files = `git ls-files -z`.split("\x0").reject{ |f| f.match(%r{^(test|spec|features)/}) }
21
+ spec.bindir = 'bin'
22
+ spec.executables = ['id3dit']
23
+ spec.require_paths = ['lib']
24
+ spec.required_ruby_version = '>=2.2.0'
25
+
26
+ spec.add_development_dependency 'bundler', '~>1.10'
27
+
28
+ spec.add_dependency 'id3lib-ruby', '~>0.6'
29
+ spec.add_dependency 'highline', '~>1.7'
30
+ spec.add_dependency 'rainbow', '~>2.0'
31
+ end
@@ -0,0 +1,10 @@
1
+ {
2
+ "folders":[
3
+ {
4
+ "path": ".",
5
+ "name": "ID3dit",
6
+ "folder_exclude_patterns": [ ],
7
+ "file_exclude_patterns": [ ]
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,125 @@
1
+
2
+ require 'id3dit/version'
3
+
4
+ module ID3dit
5
+
6
+ class Tags < Hash
7
+ attr_accessor :raw
8
+
9
+ def initialize(tags)
10
+ @raw = USED_TAGS.map{ |tag_name, tag|
11
+ [tag_name, {
12
+ :old_value => nil,
13
+ :new_value => nil,
14
+ :has_init => false,
15
+ :is_mixed => false,
16
+ :is_removed => false,
17
+ :has_changed => false,
18
+ }] }.to_h
19
+
20
+ tags.each do |tag|
21
+ @raw.each do |tag_name, tag_infos|
22
+ field = tag.send(tag_name)
23
+
24
+ if tag_infos[:has_init]
25
+ if !tag_infos[:is_mixed]
26
+ if field != tag_infos[:old_value]
27
+ tag_infos[:is_mixed] = true
28
+ tag_infos[:old_value] = nil
29
+ tag_infos[:new_value] = nil
30
+ end
31
+ end
32
+ else
33
+ tag_infos[:has_init] = true
34
+ tag_infos[:old_value] = field
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def [](key)
41
+ @raw[key]
42
+ end
43
+
44
+ def []=(key, val)
45
+ tag = @raw[key]
46
+ tag[:has_changed] = true
47
+ tag[:has_init] = true
48
+ tag[:is_removed] = false
49
+ tag[:new_value] = val
50
+ end
51
+
52
+ def delete(key)
53
+ tag = @raw[key]
54
+ tag[:has_changed] = true
55
+ tag[:is_removed] = true
56
+ end
57
+
58
+ def are_inited
59
+ @raw.select{ |tag_name, tag_infos| tag_infos[:has_init] }
60
+ end
61
+
62
+ def have_changed
63
+ are_inited.select{ |tag_name, tag_infos| tag_infos[:has_changed] }
64
+ end
65
+
66
+ def are_unchanged
67
+ are_inited.select{ |tag_name, tag_infos| !tag_infos[:has_changed] }
68
+ end
69
+
70
+ def have_no_old_value
71
+ are_unchanged.select{ |tag_name, tag_infos| tag_infos[:old_value].nil? }
72
+ end
73
+
74
+ def are_set
75
+ are_inited.select{ |tag_name, tag_infos|
76
+ !tag_infos[:old_value].nil? ||
77
+ !tag_infos[:new_value].nil? ||
78
+ tag_infos[:is_mixed] ||
79
+ tag_infos[:has_changed]
80
+ }
81
+ end
82
+
83
+ def are_set?
84
+ are_set.count > 0
85
+ end
86
+
87
+ def are_not_removed
88
+ are_inited.select{ |tag_name, tag_infos| !tag_infos[:is_removed] }
89
+ end
90
+
91
+ def are_for_edit
92
+ are_not_removed.select{ |tag_name, tag_infos|
93
+ !tag_infos[:old_value].nil? ||
94
+ tag_infos[:has_changed] ||
95
+ tag_infos[:is_mixed]
96
+ }
97
+ end
98
+
99
+ def are_for_further_edit
100
+ have_no_old_value.select{ |tag_name, tag_infos| !tag_infos[:is_mixed] }
101
+ end
102
+
103
+ def are_for_remove
104
+ are_not_removed.select{ |tag_name, tag_infos|
105
+ !tag_infos[:old_value].nil? ||
106
+ !tag_infos[:new_value].nil? ||
107
+ tag_infos[:is_mixed]
108
+ }
109
+ end
110
+
111
+ def update
112
+ have_changed.each do |tag_name, tag_infos|
113
+ # Set tag infos to default.
114
+ tag_infos[:old_value] = tag_infos[:is_removed] ? nil : tag_infos[:new_value]
115
+ tag_infos[:new_value] = nil
116
+ # tag_infos[:has_init] = false
117
+ tag_infos[:is_mixed] = false
118
+ tag_infos[:is_removed] = false
119
+ tag_infos[:has_changed] = false
120
+ end
121
+ end
122
+
123
+ end
124
+
125
+ end
@@ -0,0 +1,20 @@
1
+
2
+ module ID3dit
3
+ VERSION = '1.1.0'
4
+ DATE = '2015-12-07'
5
+ HOMEPAGE = 'https://github.com/TheFox/id3dit'
6
+ USED_TAGS = {
7
+ :title => {:id => :TIT2},
8
+ :artist => {:id => :TPE1},
9
+ :composer => {:id => :TCOM},
10
+ :year => {:id => :TYER},
11
+ :genre => {:id => :TCON},
12
+ :bpm => {:id => :TBPM},
13
+ :grouping => {:id => :TIT1},
14
+ :comment => {:id => :COMM},
15
+ :album => {:id => :TALB},
16
+ :band => {:id => :TPE2},
17
+ :disc => {:id => :TPOS},
18
+ :track => {:id => :TRCK},
19
+ }
20
+ end
data/lib/id3dit.rb ADDED
@@ -0,0 +1,3 @@
1
+
2
+ require 'id3dit/version'
3
+ require 'id3dit/tags'
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: id3dit
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Christian Mayer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: id3lib-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: highline
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rainbow
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
69
+ description: ID3 tags editor for the command line written in Ruby.
70
+ email: christian@fox21.at
71
+ executables:
72
+ - id3dit
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - Gemfile.lock
79
+ - Makefile
80
+ - README.md
81
+ - bin/id3dit
82
+ - examples/id3dit_20151116_143921.png
83
+ - examples/id3dit_20151116_144224.png
84
+ - id3dit.gemspec
85
+ - id3dit.sublime-project
86
+ - lib/id3dit.rb
87
+ - lib/id3dit/tags.rb
88
+ - lib/id3dit/version.rb
89
+ homepage: https://github.com/TheFox/id3dit
90
+ licenses:
91
+ - GPL-3.0
92
+ metadata: {}
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: 2.2.0
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project:
109
+ rubygems_version: 2.4.7
110
+ signing_key:
111
+ specification_version: 4
112
+ summary: ID3 Tags Editor
113
+ test_files: []
114
+ has_rdoc: