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 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", ">= 0.0.7"
14
- gem.add_dependency "activesupport", ">= 2.3.5"
15
- gem.add_dependency "rainbow", ">= 1.1"
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.3
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 "display-valid", "Display valid releases too"
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
@@ -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
- if opts[:display_valid]
47
- puts release.name.foreground(:green)
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
- puts release.path
59
- release.errors.each do |validation, errors|
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
- puts
59
+ puts release.path
66
60
 
67
- unless invalid_target_directory.nil?
68
- move_release(release, invalid_target_directory)
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
- puts
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
- @errors[:required_files] << "Multiple #{ext} found." if file_count.size > 1
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
- # if (/(generated|raped)/i =~ line and not /MorGoTH/i =~ line)
71
- # @errors << "Possibly tampered SFV: #{line.strip}"
72
- # end
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: 29
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 3
10
- version: 0.1.3
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-19 00:00:00 +02:00
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: 17
29
+ hash: 13
30
30
  segments:
31
31
  - 0
32
32
  - 0
33
- - 7
34
- version: 0.0.7
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: