scene-toolkit 0.1.6 → 0.1.7
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/Rakefile +8 -7
- data/VERSION +1 -1
- data/bin/scene-toolkit +1 -19
- data/lib/scene_toolkit.rb +6 -7
- data/lib/scene_toolkit/cli.rb +123 -107
- data/lib/scene_toolkit/ext.rb +1 -3
- data/lib/scene_toolkit/ext/hash.rb +10 -5
- data/lib/scene_toolkit/release.rb +89 -88
- metadata +17 -24
- data/.gitignore +0 -4
data/Rakefile
CHANGED
@@ -1,18 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require 'rubygems'
|
2
3
|
require 'rake'
|
3
4
|
|
4
5
|
begin
|
5
6
|
require 'jeweler'
|
6
7
|
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name
|
8
|
-
gem.summary
|
8
|
+
gem.name = "scene-toolkit"
|
9
|
+
gem.summary = %Q{Tool to assist scene MP3 library maintenance}
|
9
10
|
gem.description = %Q{Tool to assist scene MP3 library maintenance}
|
10
|
-
gem.email
|
11
|
-
gem.homepage
|
12
|
-
gem.authors
|
13
|
-
gem.add_dependency "
|
14
|
-
gem.add_dependency "activesupport", "~> 2.3.5"
|
11
|
+
gem.email = "knoopx@gmail.com"
|
12
|
+
gem.homepage = "http://github.com/knoopx/scene-toolkit"
|
13
|
+
gem.authors = ["Víctor Martínez"]
|
14
|
+
gem.add_dependency "activesupport", "~> 3.0.0"
|
15
15
|
gem.add_dependency "rainbow", "~> 1.1"
|
16
|
+
gem.add_dependency "optitron", "~> 0.2.2"
|
16
17
|
end
|
17
18
|
Jeweler::GemcutterTasks.new
|
18
19
|
rescue LoadError
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.7
|
data/bin/scene-toolkit
CHANGED
@@ -4,22 +4,4 @@ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
|
4
4
|
|
5
5
|
require 'scene_toolkit'
|
6
6
|
|
7
|
-
|
8
|
-
help
|
9
|
-
cmd "verify", "Verify library or release. Executes all validations if none specified" do
|
10
|
-
arg "directory", "The root directory to verify"
|
11
|
-
opt "name", "Validate release name"
|
12
|
-
opt "required-files", "Validate inclusion of required files"
|
13
|
-
opt "playlist", "Validate playlist against existing files"
|
14
|
-
opt "checksum", "Validate release CRC-32 checksum"
|
15
|
-
opt "hide-valid", "Do not display valid releases"
|
16
|
-
opt "move-invalid-to", "Move INVALID releases to specified folder", :type => :string
|
17
|
-
opt "move-valid-to", "Move VALID releases to specified folder", :type => :string
|
18
|
-
end
|
19
|
-
|
20
|
-
cmd "repair", "Repair releases" do
|
21
|
-
arg "directory", "The root directory to repair"
|
22
|
-
opt "playlist", "Repair wrong playlist or generate missing ones"
|
23
|
-
opt "force", "Force the modification of existing files"
|
24
|
-
end
|
25
|
-
end
|
7
|
+
SceneToolkit::CLI.dispatch
|
data/lib/scene_toolkit.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
gem "activesupport", "~>
|
2
|
-
require 'active_support'
|
1
|
+
gem "activesupport", "~> 3.0.0"
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
require 'active_support/all'
|
4
|
+
|
5
|
+
require 'scene_toolkit/ext/hash'
|
6
|
+
require 'scene_toolkit/release'
|
7
|
+
require 'scene_toolkit/cli'
|
data/lib/scene_toolkit/cli.rb
CHANGED
@@ -1,152 +1,168 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
4
|
|
3
5
|
gem 'rainbow', "~> 1.1"
|
4
|
-
gem "optitron", "~> 0.
|
6
|
+
gem "optitron", "~> 0.2.2"
|
5
7
|
|
6
8
|
require 'optitron'
|
7
9
|
require 'rainbow'
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
puts
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
11
|
+
module SceneToolkit
|
12
|
+
class CLI < Optitron::CLI
|
13
|
+
desc "Repair releases"
|
14
|
+
opt "playlist", "Repair wrong playlist or generate missing ones"
|
15
|
+
opt "force", "Force the modification of existing files"
|
16
|
+
|
17
|
+
def repair(directory_string)
|
18
|
+
params.underscore_and_symbolize_keys!
|
19
|
+
|
20
|
+
each_release(directory_string) do |release|
|
21
|
+
if params[:playlist]
|
22
|
+
unless release.valid_playlist?
|
23
|
+
puts release.name.foreground(:red)
|
24
|
+
puts release.path
|
25
|
+
print_errors(release)
|
26
|
+
|
27
|
+
candidates = release.files.select { |f| %w(.nfo .m3u .sfv).include?(File.extname(f).downcase) }.group_by { |f| File.basename(f, '.*') }
|
28
|
+
if candidates.none?
|
29
|
+
puts " ✕ Unable to guess playlist filename".foreground(:red)
|
30
|
+
next
|
31
|
+
end
|
27
32
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
playlist_filename = [candidates.max { |k, v| v.size }.first, ".m3u"].join
|
34
|
+
|
35
|
+
playlist_path = File.join(release.path, playlist_filename)
|
36
|
+
if File.exist?(playlist_path) and not params[:force]
|
37
|
+
puts " ✕ Playlist #{playlist_filename} already exists. Use --force to replace it.".foreground(:red)
|
38
|
+
else
|
39
|
+
puts " ■ Generating new playlist: #{playlist_filename}".foreground(:yellow)
|
40
|
+
File.open(playlist_path, "w") do |playlist_file|
|
41
|
+
release.mp3_files.map { |f| File.basename(f) }.each do |mp3_file|
|
42
|
+
playlist_file.puts mp3_file
|
43
|
+
end
|
36
44
|
end
|
37
45
|
end
|
46
|
+
puts
|
38
47
|
end
|
39
|
-
puts
|
40
48
|
end
|
41
49
|
end
|
42
50
|
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def verify(directory, opts)
|
46
|
-
opts.underscore_and_symbolize_keys!
|
47
|
-
validations = []
|
48
|
-
SceneToolkit::Release::VALIDATIONS.each do |validation|
|
49
|
-
validations << validation if opts.delete(validation).eql?(true)
|
50
|
-
end
|
51
51
|
|
52
|
-
if
|
53
|
-
|
54
|
-
|
52
|
+
desc "Verify library or release. Executes all validations if none specified"
|
53
|
+
opt "name", "Validate release name"
|
54
|
+
opt "required-files", "Validate inclusion of required files"
|
55
|
+
opt "playlist", "Validate playlist against existing files"
|
56
|
+
opt "checksum", "Validate release CRC-32 checksum"
|
57
|
+
opt "hide-valid", "Do not display valid releases"
|
58
|
+
opt "move-invalid-to", "Move INVALID releases to specified folder", :type => :string
|
59
|
+
opt "move-valid-to", "Move VALID releases to specified folder", :type => :string
|
60
|
+
|
61
|
+
def verify(directory_string)
|
62
|
+
params.underscore_and_symbolize_keys!
|
63
|
+
validations = []
|
64
|
+
SceneToolkit::Release::VALIDATIONS.each do |validation|
|
65
|
+
validations << validation if params.delete(validation).eql?(true)
|
66
|
+
end
|
55
67
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
68
|
+
if validations.none?
|
69
|
+
validations = SceneToolkit::Release::VALIDATIONS
|
70
|
+
end
|
60
71
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
72
|
+
invalid_target_directory = params.delete(:move_invalid_to)
|
73
|
+
unless invalid_target_directory.nil?
|
74
|
+
raise ArgumentError.new("#{invalid_target_directory} does not exist") unless File.directory?(invalid_target_directory)
|
75
|
+
end
|
65
76
|
|
66
|
-
|
67
|
-
|
68
|
-
|
77
|
+
valid_target_directory = params.delete(:move_valid_to)
|
78
|
+
unless valid_target_directory.nil?
|
79
|
+
raise ArgumentError.new("#{invalid_target_directory} does not exist") unless File.directory?(valid_target_directory)
|
80
|
+
end
|
69
81
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
82
|
+
release_count = 0
|
83
|
+
valid_releases = 0
|
84
|
+
invalid_releases = 0
|
85
|
+
|
86
|
+
each_release(directory_string) do |release|
|
87
|
+
release_count += 1
|
88
|
+
if release.valid?(validations)
|
89
|
+
valid_releases += 1
|
90
|
+
if not params[:hide_valid] or not valid_target_directory.nil?
|
91
|
+
puts release.name.foreground(:green)
|
92
|
+
puts release.path
|
93
|
+
print_errors(release)
|
94
|
+
print_warnings(release)
|
95
|
+
unless valid_target_directory.nil?
|
96
|
+
move_release(release, valid_target_directory)
|
97
|
+
end
|
98
|
+
puts
|
99
|
+
end
|
100
|
+
else
|
101
|
+
invalid_releases += 1
|
102
|
+
puts release.name.foreground(:red)
|
76
103
|
puts release.path
|
77
104
|
print_errors(release)
|
78
105
|
print_warnings(release)
|
79
|
-
unless
|
80
|
-
move_release(release,
|
106
|
+
unless invalid_target_directory.nil?
|
107
|
+
move_release(release, invalid_target_directory)
|
81
108
|
end
|
82
109
|
puts
|
83
110
|
end
|
84
|
-
else
|
85
|
-
invalid_releases += 1
|
86
|
-
puts release.name.foreground(:red)
|
87
|
-
puts release.path
|
88
|
-
print_errors(release)
|
89
|
-
print_warnings(release)
|
90
|
-
unless invalid_target_directory.nil?
|
91
|
-
move_release(release, invalid_target_directory)
|
92
|
-
end
|
93
|
-
puts
|
94
111
|
end
|
95
|
-
end
|
96
112
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
113
|
+
puts
|
114
|
+
puts "#{valid_releases} of #{release_count} releases valid".foreground(:yellow)
|
115
|
+
puts "#{invalid_releases} of #{release_count} releases invalid".foreground(:yellow)
|
116
|
+
end
|
101
117
|
|
102
|
-
|
118
|
+
protected
|
103
119
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
120
|
+
def print_errors(release)
|
121
|
+
release.errors.each do |validation, errors|
|
122
|
+
errors.each do |error|
|
123
|
+
puts " ✕ [#{validation.to_s.humanize}] #{error}".foreground(:red)
|
124
|
+
end
|
108
125
|
end
|
109
126
|
end
|
110
|
-
end
|
111
127
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
128
|
+
def print_warnings(release)
|
129
|
+
release.warnings.each do |validation, warnings|
|
130
|
+
warnings.each do |warning|
|
131
|
+
puts " ✕ [#{validation.to_s.humanize}] #{warning}".foreground(:yellow)
|
132
|
+
end
|
116
133
|
end
|
117
134
|
end
|
118
|
-
end
|
119
135
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
136
|
+
def move_release(release, destination)
|
137
|
+
target_dir = File.join(destination, release.name)
|
138
|
+
puts " ■ Moving release to #{target_dir}".foreground(:yellow)
|
139
|
+
|
140
|
+
if File.directory?(target_dir)
|
141
|
+
puts " ✕ Target directory already exists. Skipping.".foreground(:red)
|
142
|
+
else
|
143
|
+
begin
|
144
|
+
FileUtils.mv(release.path, target_dir)
|
145
|
+
rescue => e
|
146
|
+
puts e.message.foreground(:red)
|
147
|
+
end
|
131
148
|
end
|
132
149
|
end
|
133
|
-
end
|
134
150
|
|
135
|
-
|
136
|
-
|
137
|
-
|
151
|
+
def each_release(source, &block)
|
152
|
+
raise ArgumentError unless block_given?
|
153
|
+
raise ArgumentError("#{source} is not a directory") unless File.directory?(source)
|
138
154
|
|
139
|
-
|
155
|
+
releases = []
|
140
156
|
|
141
|
-
|
142
|
-
|
157
|
+
Dir.glob(File.join(source, "**", "*.mp3")).each do |file|
|
158
|
+
release_path = File.expand_path(File.dirname(file))
|
143
159
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
160
|
+
unless releases.include?(release_path)
|
161
|
+
release = SceneToolkit::Release.new(release_path)
|
162
|
+
releases << release_path
|
163
|
+
yield(release)
|
164
|
+
end
|
148
165
|
end
|
149
166
|
end
|
150
167
|
end
|
151
|
-
|
152
168
|
end
|
data/lib/scene_toolkit/ext.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
-
module SceneToolkit
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
module SceneToolkit
|
2
|
+
module Ext
|
3
|
+
module Hash
|
4
|
+
def underscore_and_symbolize_keys!
|
5
|
+
result = self.dup
|
6
|
+
self.each_key do |k|
|
7
|
+
result[k.underscore] = self[k]
|
8
|
+
end
|
9
|
+
result.symbolize_keys!
|
10
|
+
end
|
5
11
|
end
|
6
|
-
self.symbolize_keys!
|
7
12
|
end
|
8
13
|
end
|
9
14
|
|
@@ -1,118 +1,119 @@
|
|
1
1
|
require 'digest/md5'
|
2
2
|
require 'zlib'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
def valid?(validations = VALIDATIONS)
|
19
|
-
@errors, @warnings = {}, {}
|
20
|
-
validations.each do |validation|
|
21
|
-
send("valid_#{validation}?")
|
4
|
+
module SceneToolkit
|
5
|
+
class Release
|
6
|
+
REQUIRED_FILES = [:sfv, :nfo, :m3u]
|
7
|
+
VALIDATIONS = [:name, :required_files, :playlist, :checksum]
|
8
|
+
|
9
|
+
attr_accessor :name, :path, :uid
|
10
|
+
attr_accessor :errors, :warnings
|
11
|
+
|
12
|
+
def initialize(path)
|
13
|
+
@path = path
|
14
|
+
@name = File.basename(path)
|
15
|
+
@uid = Digest::MD5.hexdigest(@name.downcase.gsub(/[^A-Z0-9]/i, ' ').gsub(/\s+/, ' '))
|
16
|
+
@errors, @warnings = {}, {}
|
22
17
|
end
|
23
|
-
@errors.sum { |validation, errors| errors.size }.zero?
|
24
|
-
end
|
25
18
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
@
|
19
|
+
def valid?(validations = VALIDATIONS)
|
20
|
+
@errors, @warnings = {}, {}
|
21
|
+
validations.each do |validation|
|
22
|
+
send("valid_#{validation}?")
|
23
|
+
end
|
24
|
+
@errors.sum { |validation, errors| errors.size }.zero?
|
32
25
|
end
|
33
|
-
@warnings[:required_files].empty?
|
34
|
-
end
|
35
26
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
next if filename.blank? or filename.start_with?("#") or filename.start_with?(";")
|
43
|
-
@errors[:playlist] << "File #{filename} not found" unless File.exist?(File.join(@path, filename))
|
44
|
-
end
|
27
|
+
def valid_required_files?
|
28
|
+
@errors[:required_files], @warnings[:required_files] = [], []
|
29
|
+
REQUIRED_FILES.each do |ext|
|
30
|
+
file_count = send("#{ext}_files")
|
31
|
+
@errors[:required_files] << "No *.#{ext} files found." if file_count.none?
|
32
|
+
@warnings[:required_files] << "Multiple *.#{ext} files found." if file_count.size > 1
|
45
33
|
end
|
46
|
-
|
47
|
-
@errors[:playlist] << "No *.m3u files found"
|
34
|
+
@warnings[:required_files].empty?
|
48
35
|
end
|
49
|
-
@errors[:playlist].empty?
|
50
|
-
end
|
51
|
-
|
52
|
-
def valid_checksum?
|
53
|
-
@errors[:checksum], @warnings[:checksum] = [], []
|
54
36
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
37
|
+
def valid_playlist?
|
38
|
+
@errors[:playlist], @warnings[:playlist] = [], []
|
39
|
+
if m3u_files.any?
|
40
|
+
m3u_files.each do |playlist|
|
41
|
+
File.read(playlist).split(/[\r\n]+/).each do |filename|
|
42
|
+
filename.strip!
|
43
|
+
next if filename.blank? or filename.start_with?("#") or filename.start_with?(";")
|
44
|
+
@errors[:playlist] << "File #{filename} not found" unless File.exist?(File.join(@path, filename))
|
45
|
+
end
|
60
46
|
end
|
47
|
+
else
|
48
|
+
@errors[:playlist] << "No *.m3u files found"
|
49
|
+
end
|
50
|
+
@errors[:playlist].empty?
|
51
|
+
end
|
61
52
|
|
62
|
-
|
63
|
-
|
64
|
-
line.strip!
|
53
|
+
def valid_checksum?
|
54
|
+
@errors[:checksum], @warnings[:checksum] = [], []
|
65
55
|
|
66
|
-
|
67
|
-
|
56
|
+
if sfv_files.any?
|
57
|
+
sfv_files.each do |sfv|
|
58
|
+
files_to_check = files.inject({}) do |collection, file|
|
59
|
+
collection[File.basename(file).downcase] = File.expand_path(file)
|
60
|
+
collection
|
68
61
|
end
|
69
62
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
63
|
+
matched_something = false
|
64
|
+
File.read(sfv).split(/[\r\n]+/).each do |line|
|
65
|
+
line.strip!
|
66
|
+
|
67
|
+
if (/(generated|raped)/i =~ line and not /MorGoTH/i =~ line)
|
68
|
+
@warnings[:checksum] << "Possibly tampered SFV: #{line.strip}"
|
69
|
+
end
|
75
70
|
|
76
|
-
if
|
77
|
-
|
78
|
-
|
71
|
+
if match = /^(.+?)\s+([\dA-Fa-f]{8})$/.match(line)
|
72
|
+
matched_something = true
|
73
|
+
filename, checksum = match.captures
|
74
|
+
filename.strip!
|
75
|
+
filename.downcase!
|
76
|
+
|
77
|
+
if files_to_check.has_key?(filename)
|
78
|
+
unless Zlib.crc32(File.read(files_to_check[filename])).eql?(checksum.hex)
|
79
|
+
@errors[:checksum] << "File #{filename} is corrupted"
|
80
|
+
end
|
81
|
+
else
|
82
|
+
@errors[:checksum] << "File #{filename} not found"
|
79
83
|
end
|
80
|
-
else
|
81
|
-
@errors[:checksum] << "File #{filename} not found"
|
82
84
|
end
|
83
85
|
end
|
86
|
+
@warnings[:checksum] << "No files to verify found" unless matched_something
|
84
87
|
end
|
85
|
-
|
88
|
+
else
|
89
|
+
@errors[:checksum] << "No *.sfv files found"
|
86
90
|
end
|
87
|
-
|
88
|
-
@errors[:checksum] << "No *.sfv files found"
|
91
|
+
@errors[:checksum].empty?
|
89
92
|
end
|
90
|
-
@errors[:checksum].empty?
|
91
|
-
end
|
92
93
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
94
|
+
def valid_name?
|
95
|
+
@errors[:name], @warnings[:name] = [], []
|
96
|
+
@errors[:name] << "Release name is not a valid scene release name" unless @name =~ /^([A-Z0-9\-_.()&]+)\-(\d{4}|\d{3}x|\d{2}xx)\-([A-Z0-9_]+)$/i
|
97
|
+
@errors[:name] << "Release name is lowercased" if @name.eql?(@name.downcase)
|
98
|
+
@errors[:name] << "Release name is uppercased" if @name.eql?(@name.upcase)
|
99
|
+
@errors[:name].empty?
|
100
|
+
end
|
100
101
|
|
101
|
-
|
102
|
-
|
103
|
-
|
102
|
+
def files
|
103
|
+
Dir.glob(File.join(@path, "*"))
|
104
|
+
end
|
104
105
|
|
105
|
-
|
106
|
-
|
106
|
+
class << self
|
107
|
+
protected
|
107
108
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
109
|
+
def has_files_with_extension(*exts)
|
110
|
+
exts.each do |ext|
|
111
|
+
define_method "#{ext}_files" do
|
112
|
+
files.select { |f| File.extname(f).downcase.eql?(".#{ext}") }
|
113
|
+
end
|
112
114
|
end
|
113
115
|
end
|
114
116
|
end
|
117
|
+
has_files_with_extension :mp3, :sfv, :nfo, :m3u
|
115
118
|
end
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scene-toolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 23
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
8
|
+
- 7
|
9
|
+
version: 0.1.7
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- "V\xC3\xADctor Mart\xC3\xADnez"
|
@@ -15,54 +14,51 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2010-
|
17
|
+
date: 2010-12-31 00:00:00 +01:00
|
19
18
|
default_executable: scene-toolkit
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
21
|
+
name: activesupport
|
23
22
|
prerelease: false
|
24
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
24
|
none: false
|
26
25
|
requirements:
|
27
26
|
- - ~>
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 13
|
30
28
|
segments:
|
29
|
+
- 3
|
31
30
|
- 0
|
32
31
|
- 0
|
33
|
-
|
34
|
-
version: 0.0.9
|
32
|
+
version: 3.0.0
|
35
33
|
type: :runtime
|
36
34
|
version_requirements: *id001
|
37
35
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
36
|
+
name: rainbow
|
39
37
|
prerelease: false
|
40
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
39
|
none: false
|
42
40
|
requirements:
|
43
41
|
- - ~>
|
44
42
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 9
|
46
43
|
segments:
|
47
|
-
-
|
48
|
-
-
|
49
|
-
|
50
|
-
version: 2.3.5
|
44
|
+
- 1
|
45
|
+
- 1
|
46
|
+
version: "1.1"
|
51
47
|
type: :runtime
|
52
48
|
version_requirements: *id002
|
53
49
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
50
|
+
name: optitron
|
55
51
|
prerelease: false
|
56
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
53
|
none: false
|
58
54
|
requirements:
|
59
55
|
- - ~>
|
60
56
|
- !ruby/object:Gem::Version
|
61
|
-
hash: 13
|
62
57
|
segments:
|
63
|
-
-
|
64
|
-
-
|
65
|
-
|
58
|
+
- 0
|
59
|
+
- 2
|
60
|
+
- 2
|
61
|
+
version: 0.2.2
|
66
62
|
type: :runtime
|
67
63
|
version_requirements: *id003
|
68
64
|
description: Tool to assist scene MP3 library maintenance
|
@@ -75,7 +71,6 @@ extra_rdoc_files:
|
|
75
71
|
- LICENSE
|
76
72
|
- README.rdoc
|
77
73
|
files:
|
78
|
-
- .gitignore
|
79
74
|
- LICENSE
|
80
75
|
- README.rdoc
|
81
76
|
- Rakefile
|
@@ -91,8 +86,8 @@ homepage: http://github.com/knoopx/scene-toolkit
|
|
91
86
|
licenses: []
|
92
87
|
|
93
88
|
post_install_message:
|
94
|
-
rdoc_options:
|
95
|
-
|
89
|
+
rdoc_options: []
|
90
|
+
|
96
91
|
require_paths:
|
97
92
|
- lib
|
98
93
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -100,7 +95,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
100
95
|
requirements:
|
101
96
|
- - ">="
|
102
97
|
- !ruby/object:Gem::Version
|
103
|
-
hash: 3
|
104
98
|
segments:
|
105
99
|
- 0
|
106
100
|
version: "0"
|
@@ -109,7 +103,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
103
|
requirements:
|
110
104
|
- - ">="
|
111
105
|
- !ruby/object:Gem::Version
|
112
|
-
hash: 3
|
113
106
|
segments:
|
114
107
|
- 0
|
115
108
|
version: "0"
|
data/.gitignore
DELETED