scene-toolkit 0.1.3 → 0.1.4
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 +3 -3
- data/VERSION +1 -1
- data/bin/scene-toolkit +3 -6
- data/lib/scene_toolkit/cache/releases.rb +12 -1
- data/lib/scene_toolkit/cli.rb +22 -19
- data/lib/scene_toolkit/release.rb +35 -16
- metadata +10 -10
data/Rakefile
CHANGED
@@ -10,9 +10,9 @@ begin
|
|
10
10
|
gem.email = "knoopx@gmail.com"
|
11
11
|
gem.homepage = "http://github.com/knoopx/scene-toolkit"
|
12
12
|
gem.authors = ["Víctor Martínez"]
|
13
|
-
gem.add_dependency "optitron", "
|
14
|
-
gem.add_dependency "activesupport", "
|
15
|
-
gem.add_dependency "rainbow", "
|
13
|
+
gem.add_dependency "optitron", "~> 0.0.9"
|
14
|
+
gem.add_dependency "activesupport", "~> 2.3.5"
|
15
|
+
gem.add_dependency "rainbow", "~> 1.1"
|
16
16
|
end
|
17
17
|
Jeweler::GemcutterTasks.new
|
18
18
|
rescue LoadError
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.4
|
data/bin/scene-toolkit
CHANGED
@@ -1,20 +1,17 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
1
|
+
#!/usr/bin/env ruby -rubygems
|
2
2
|
|
3
3
|
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
4
4
|
|
5
|
-
require 'rubygems'
|
6
|
-
require 'optitron'
|
7
5
|
require 'scene_toolkit'
|
8
6
|
|
9
|
-
|
10
7
|
Optitron.dispatch(SceneToolkit::CLI.new) do
|
11
|
-
|
12
8
|
cmd "verify", "Verify library or release. Executes all validations if none specified" do
|
13
9
|
arg "directory", "The root directory to verify"
|
14
10
|
opt "name", "Validate release name"
|
15
11
|
opt "required-files", "Validate inclusion of required files"
|
12
|
+
opt "playlist", "Validate playlist against existing files"
|
16
13
|
opt "checksum", "Validate release CRC-32 checksum"
|
17
|
-
opt "
|
14
|
+
opt "hide-valid", "Do not display valid releases"
|
18
15
|
opt "flush-cache", "Flush file modification cache"
|
19
16
|
opt "move-invalid-to", "Move INVALID releases to specified folder", :type => :string
|
20
17
|
opt "move-valid-to", "Move VALID releases to specified folder", :type => :string
|
@@ -27,7 +27,17 @@ class SceneToolkit::Cache::Releases
|
|
27
27
|
def errors(release, validations = SceneToolkit::Release::VALIDATIONS)
|
28
28
|
@cache.transaction(true) do
|
29
29
|
if @cache[@cache_key].has_key?(release.path)
|
30
|
-
@cache[@cache_key][release.path][:errors].reject{ |validation, errors| not validations.include?(validation) }
|
30
|
+
@cache[@cache_key][release.path][:errors].reject { |validation, errors| not validations.include?(validation) }
|
31
|
+
else
|
32
|
+
raise RuntimeError.new("Release not catched")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def warnings(release, validations = SceneToolkit::Release::VALIDATIONS)
|
38
|
+
@cache.transaction(true) do
|
39
|
+
if @cache[@cache_key].has_key?(release.path)
|
40
|
+
@cache[@cache_key][release.path][:warnings].reject { |validation, warnings| not validations.include?(validation) }
|
31
41
|
else
|
32
42
|
raise RuntimeError.new("Release not catched")
|
33
43
|
end
|
@@ -56,6 +66,7 @@ class SceneToolkit::Cache::Releases
|
|
56
66
|
@cache.transaction do
|
57
67
|
@cache[@cache_key][release.path] = {}
|
58
68
|
@cache[@cache_key][release.path][:errors] = release.errors
|
69
|
+
@cache[@cache_key][release.path][:warnings] = release.warnings
|
59
70
|
@cache[@cache_key][release.path][:files] = Dir.glob(File.join(release.path, "*")).inject({}) do |collection, f|
|
60
71
|
collection[File.basename(f)] = File.stat(f).mtime
|
61
72
|
collection
|
data/lib/scene_toolkit/cli.rb
CHANGED
@@ -1,4 +1,9 @@
|
|
1
1
|
require 'fileutils'
|
2
|
+
|
3
|
+
gem 'rainbow', "~> 1.1"
|
4
|
+
gem "optitron", "~> 0.0.9"
|
5
|
+
|
6
|
+
require 'optitron'
|
2
7
|
require 'rainbow'
|
3
8
|
|
4
9
|
class SceneToolkit::CLI
|
@@ -43,33 +48,31 @@ class SceneToolkit::CLI
|
|
43
48
|
|
44
49
|
if release.valid?(validations)
|
45
50
|
valid_releases += 1
|
46
|
-
|
47
|
-
|
48
|
-
puts release.path
|
49
|
-
puts
|
50
|
-
end
|
51
|
-
|
52
|
-
unless valid_target_directory.nil?
|
53
|
-
move_release(release, valid_target_directory)
|
54
|
-
end
|
51
|
+
puts release.name.foreground(:green) unless opts[:hide_valid]
|
52
|
+
move_release(release, valid_target_directory) unless valid_target_directory.nil?
|
55
53
|
else
|
56
54
|
invalid_releases += 1
|
57
55
|
puts release.name.foreground(:red)
|
58
|
-
|
59
|
-
|
60
|
-
errors.each do |error|
|
61
|
-
puts " - #{error}"
|
62
|
-
end
|
63
|
-
end
|
56
|
+
move_release(release, invalid_target_directory) unless invalid_target_directory.nil?
|
57
|
+
end
|
64
58
|
|
65
|
-
|
59
|
+
puts release.path
|
66
60
|
|
67
|
-
|
68
|
-
|
61
|
+
puts "#{release.errors.values.sum(&:count)} errors"
|
62
|
+
release.errors.each do |validation, errors|
|
63
|
+
errors.each do |error|
|
64
|
+
puts " - #{error}".foreground(:red)
|
69
65
|
end
|
66
|
+
end
|
70
67
|
|
71
|
-
|
68
|
+
puts "#{release.warnings.values.sum(&:count)} warnings"
|
69
|
+
release.warnings.each do |validation, warnings|
|
70
|
+
warnings.each do |warning|
|
71
|
+
puts " - #{warning}".foreground(:yellow)
|
72
|
+
end
|
72
73
|
end
|
74
|
+
|
75
|
+
puts
|
73
76
|
end
|
74
77
|
|
75
78
|
puts "#{valid_releases} of #{release_count} releases valid".foreground(:yellow)
|
@@ -3,21 +3,21 @@ require 'zlib'
|
|
3
3
|
|
4
4
|
class SceneToolkit::Release
|
5
5
|
REQUIRED_FILES = [:sfv, :nfo, :m3u]
|
6
|
-
VALIDATIONS = [:name, :required_files, :checksum]
|
6
|
+
VALIDATIONS = [:name, :required_files, :playlist, :checksum]
|
7
7
|
|
8
8
|
attr_accessor :name, :path, :uid
|
9
|
-
attr_accessor :errors
|
9
|
+
attr_accessor :errors, :warnings
|
10
10
|
|
11
11
|
def initialize(path, cache)
|
12
12
|
@cache = cache
|
13
13
|
@path = path
|
14
14
|
@name = File.basename(path)
|
15
15
|
@uid = Digest::MD5.hexdigest(@name.downcase.gsub(/[^A-Z0-9]/i, ' ').gsub(/\s+/, ' '))
|
16
|
-
@errors = {}
|
16
|
+
@errors, @warnings = {}, {}
|
17
17
|
end
|
18
18
|
|
19
19
|
def valid?(validations = VALIDATIONS)
|
20
|
-
@errors = {}
|
20
|
+
@errors, @warnings = {}, {}
|
21
21
|
|
22
22
|
if @cache.releases.modified?(self)
|
23
23
|
# if release was modified, invalidate all cached validations
|
@@ -34,26 +34,45 @@ class SceneToolkit::Release
|
|
34
34
|
else
|
35
35
|
@errors.merge!(validation_errors)
|
36
36
|
end
|
37
|
+
|
38
|
+
validation_warnings = @cache.releases.warnings(self, [validation])
|
39
|
+
if validation_warnings.nil?
|
40
|
+
# execute validation if release was catched but this particular validation was not executed
|
41
|
+
send("valid_#{validation}?")
|
42
|
+
else
|
43
|
+
@warnings.merge!(validation_warnings)
|
44
|
+
end
|
37
45
|
end
|
38
46
|
end
|
39
|
-
|
40
|
-
@cache.releases.store(self)
|
41
47
|
|
48
|
+
@cache.releases.store(self)
|
42
49
|
@errors.sum { |validation, errors| errors.size }.zero?
|
43
50
|
end
|
44
51
|
|
45
52
|
def valid_required_files?
|
46
|
-
@errors[:required_files] = []
|
53
|
+
@errors[:required_files], @warnings[:required_files] = [], []
|
47
54
|
REQUIRED_FILES.each do |ext|
|
48
55
|
file_count = send("#{ext}_files")
|
49
56
|
@errors[:required_files] << "No #{ext} found." if file_count.none?
|
50
|
-
@
|
57
|
+
@warnings[:required_files] << "Multiple #{ext} found." if file_count.size > 1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def valid_playlist?
|
62
|
+
@errors[:playlist], @warnings[:playlist] = [], []
|
63
|
+
playlist = m3u_files.first
|
64
|
+
|
65
|
+
unless playlist.nil?
|
66
|
+
File.read(m3u_files.first).split(/[\r\n]+/).each do |track|
|
67
|
+
next if track.blank? or track.start_with?("#")
|
68
|
+
@errors[:playlist] << "File not found #{track}" unless File.exist?(File.join(@path, track))
|
69
|
+
end
|
51
70
|
end
|
52
71
|
end
|
53
72
|
|
54
73
|
def valid_checksum?
|
55
|
-
@errors[:checksum] = []
|
56
|
-
|
74
|
+
@errors[:checksum], @warnings[:checksum] = [], []
|
75
|
+
|
57
76
|
sfv_file = sfv_files.first
|
58
77
|
|
59
78
|
return if sfv_file.nil?
|
@@ -67,9 +86,9 @@ class SceneToolkit::Release
|
|
67
86
|
matched_something = false
|
68
87
|
|
69
88
|
File.read(sfv_file).split(/[\r\n]+/).each do |line|
|
70
|
-
|
71
|
-
|
72
|
-
|
89
|
+
if (/(generated|raped)/i =~ line and not /MorGoTH/i =~ line)
|
90
|
+
@warnings[:checksum] << "Possibly tampered SFV: #{line.strip}"
|
91
|
+
end
|
73
92
|
|
74
93
|
if match = /^(.+?)\s+([\dA-Fa-f]{8})$/.match(line)
|
75
94
|
filename, checksum = match.captures
|
@@ -86,7 +105,7 @@ class SceneToolkit::Release
|
|
86
105
|
end
|
87
106
|
|
88
107
|
def valid_name?
|
89
|
-
@errors[:name] = []
|
108
|
+
@errors[:name], @warnings[:name] = [], []
|
90
109
|
@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
|
91
110
|
@errors[:name] << "Release name is lowercased" if @name.eql?(@name.downcase)
|
92
111
|
@errors[:name] << "Release name is uppercased" if @name.eql?(@name.upcase)
|
@@ -95,10 +114,10 @@ class SceneToolkit::Release
|
|
95
114
|
def files
|
96
115
|
Dir.glob(File.join(@path, "*"))
|
97
116
|
end
|
98
|
-
|
117
|
+
|
99
118
|
class << self
|
100
119
|
protected
|
101
|
-
|
120
|
+
|
102
121
|
def has_files_with_extension(*exts)
|
103
122
|
exts.each do |ext|
|
104
123
|
define_method "#{ext}_files" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scene-toolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 4
|
10
|
+
version: 0.1.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "V\xC3\xADctor Mart\xC3\xADnez"
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-23 00:00:00 +02:00
|
19
19
|
default_executable: scene-toolkit
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -24,14 +24,14 @@ dependencies:
|
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
29
|
+
hash: 13
|
30
30
|
segments:
|
31
31
|
- 0
|
32
32
|
- 0
|
33
|
-
-
|
34
|
-
version: 0.0.
|
33
|
+
- 9
|
34
|
+
version: 0.0.9
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
hash: 9
|
46
46
|
segments:
|
@@ -56,7 +56,7 @@ dependencies:
|
|
56
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
hash: 13
|
62
62
|
segments:
|