scene-toolkit 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/scene_toolkit/cli/{rename.rb → auto_rename.rb} +16 -13
- data/lib/scene_toolkit/cli/helpers.rb +1 -1
- data/lib/scene_toolkit/cli/verify.rb +8 -7
- data/lib/scene_toolkit/cli.rb +1 -1
- data/lib/scene_toolkit/ext.rb +4 -0
- data/lib/scene_toolkit/release/{rename.rb → auto_rename.rb} +1 -5
- data/lib/scene_toolkit/release/helpers.rb +4 -0
- data/lib/scene_toolkit/release/validations/checksum.rb +2 -1
- data/lib/scene_toolkit/release/validations/files.rb +23 -0
- data/lib/scene_toolkit/release/validations/name.rb +4 -2
- data/lib/scene_toolkit/release/validations/playlist.rb +12 -4
- data/lib/scene_toolkit/release/validations.rb +2 -2
- data/lib/scene_toolkit/release.rb +7 -6
- data/lib/scene_toolkit.rb +1 -1
- metadata +15 -15
- data/lib/scene_toolkit/release/validations/required_files.rb +0 -23
@@ -6,33 +6,36 @@ require 'scene_toolkit/ext'
|
|
6
6
|
module SceneToolkit
|
7
7
|
class CLI < Optitron::CLI
|
8
8
|
class GoogleMatcher
|
9
|
-
def self.match(
|
10
|
-
regex = Regexp.new(Regexp.escape(
|
11
|
-
response = Nestful.get("http://www.google.com/search", :params => { :q =>
|
9
|
+
def self.match(name)
|
10
|
+
regex = Regexp.new(Regexp.escape(name), Regexp::IGNORECASE)
|
11
|
+
response = Nestful.get("http://www.google.com/search", :params => { :q => name, :num => 100 })
|
12
12
|
response.scan(regex).uniq.reject(&:downcase?)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
class
|
17
|
-
def self.match(
|
18
|
-
regex = Regexp.new(Regexp.escape(
|
19
|
-
response = Nestful.get("http://orlydb.com", :params => { :q =>
|
16
|
+
class OrlyDbMatcher
|
17
|
+
def self.match(name)
|
18
|
+
regex = Regexp.new(Regexp.escape(name), Regexp::IGNORECASE)
|
19
|
+
response = Nestful.get("http://orlydb.com", :params => { :q => name.to_search_string })
|
20
20
|
response.scan(regex).uniq.reject(&:downcase?)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
desc "Repair release names"
|
25
25
|
|
26
|
-
def
|
26
|
+
def auto_rename(directory_string)
|
27
27
|
each_release(directory_string) do |release|
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
next if release.valid_name? and not release.name.downcase?
|
29
|
+
|
30
|
+
if release.valid_name?
|
31
|
+
release_name = release.name
|
32
|
+
else
|
33
|
+
release_name = release.heuristic_name
|
31
34
|
end
|
32
35
|
|
33
36
|
match = nil
|
34
|
-
[
|
35
|
-
matches = matcher.match(
|
37
|
+
[OrlyDbMatcher, GoogleMatcher].each do |matcher|
|
38
|
+
matches = matcher.match(release_name)
|
36
39
|
if matches.one?
|
37
40
|
match = matches.first
|
38
41
|
break
|
@@ -60,7 +60,7 @@ module SceneToolkit
|
|
60
60
|
|
61
61
|
releases = []
|
62
62
|
|
63
|
-
Dir.glob(File.join(source, "**", "*.mp3")).each do |file|
|
63
|
+
Dir.glob(File.join(Regexp.escape(source), "**", "*.mp3")).each do |file|
|
64
64
|
release_path = File.expand_path(File.dirname(file))
|
65
65
|
|
66
66
|
unless releases.include?(release_path)
|
@@ -6,9 +6,10 @@ module SceneToolkit
|
|
6
6
|
class CLI < Optitron::CLI
|
7
7
|
desc "Verify library or release. Executes all validations if none specified"
|
8
8
|
SceneToolkit::Release.available_validations.each { |name, desc| opt name, desc }
|
9
|
-
opt "
|
10
|
-
opt "
|
11
|
-
opt "
|
9
|
+
opt "hide-valid", "Do not display valid releases results"
|
10
|
+
opt "ignore-filename-case", "Ignore case when validating SFV/M3U filenames"
|
11
|
+
opt "move-invalid-to", "Move INVALID releases to specified folder", :type => :string
|
12
|
+
opt "move-valid-to", "Move VALID releases to specified folder", :type => :string
|
12
13
|
|
13
14
|
def verify(directory_string)
|
14
15
|
validations_to_exec = []
|
@@ -20,12 +21,12 @@ module SceneToolkit
|
|
20
21
|
validations_to_exec = SceneToolkit::Release::available_validations.keys
|
21
22
|
end
|
22
23
|
|
23
|
-
invalid_target_directory = params.delete("
|
24
|
+
invalid_target_directory = params.delete("move-invalid-to")
|
24
25
|
unless invalid_target_directory.nil?
|
25
26
|
raise ArgumentError.new("#{invalid_target_directory} does not exist") unless File.directory?(invalid_target_directory)
|
26
27
|
end
|
27
28
|
|
28
|
-
valid_target_directory = params.delete("
|
29
|
+
valid_target_directory = params.delete("move-valid-to")
|
29
30
|
unless valid_target_directory.nil?
|
30
31
|
raise ArgumentError.new("#{invalid_target_directory} does not exist") unless File.directory?(valid_target_directory)
|
31
32
|
end
|
@@ -36,9 +37,9 @@ module SceneToolkit
|
|
36
37
|
|
37
38
|
each_release(directory_string) do |release|
|
38
39
|
release_count += 1
|
39
|
-
if release.valid?(validations_to_exec)
|
40
|
+
if release.valid?(validations_to_exec, :case_sensitive => !params["ignore-filename-case"])
|
40
41
|
valid_releases += 1
|
41
|
-
if not params["
|
42
|
+
if not params["hide-valid"] or not valid_target_directory.nil?
|
42
43
|
heading(release, :green) do
|
43
44
|
print_errors(release)
|
44
45
|
print_warnings(release)
|
data/lib/scene_toolkit/cli.rb
CHANGED
@@ -6,7 +6,7 @@ require 'colored'
|
|
6
6
|
require 'scene_toolkit/release'
|
7
7
|
require 'scene_toolkit/cli/helpers'
|
8
8
|
require 'scene_toolkit/cli/playlists'
|
9
|
-
require 'scene_toolkit/cli/
|
9
|
+
require 'scene_toolkit/cli/auto_rename'
|
10
10
|
require 'scene_toolkit/cli/verify'
|
11
11
|
|
12
12
|
module SceneToolkit
|
data/lib/scene_toolkit/ext.rb
CHANGED
@@ -2,16 +2,12 @@ require 'active_support/concern'
|
|
2
2
|
|
3
3
|
module SceneToolkit
|
4
4
|
class Release
|
5
|
-
module
|
5
|
+
module AutoRename
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
def rename!(new_name)
|
9
9
|
File.rename(@path, File.join(File.dirname(@path), new_name))
|
10
10
|
end
|
11
|
-
|
12
|
-
def search_string
|
13
|
-
@name.gsub(/[^A-Za-z0-9]+/, " ").gsub(/\s+/, " ")
|
14
|
-
end
|
15
11
|
end
|
16
12
|
end
|
17
13
|
end
|
@@ -8,7 +8,7 @@ module SceneToolkit
|
|
8
8
|
base.register_validation(:checksum, "Validate release CRC-32 checksum")
|
9
9
|
end
|
10
10
|
|
11
|
-
def valid_checksum?
|
11
|
+
def valid_checksum?(params = {})
|
12
12
|
@errors[:checksum], @warnings[:checksum] = [], []
|
13
13
|
if sfv_files.any?
|
14
14
|
sfv_files.each do |sfv|
|
@@ -44,6 +44,7 @@ module SceneToolkit
|
|
44
44
|
matched_something = true
|
45
45
|
filename, checksum = match.captures
|
46
46
|
filename.strip!
|
47
|
+
next if filename.blank? or filename.start_with?("#") or filename.start_with?(";")
|
47
48
|
filename.downcase!
|
48
49
|
|
49
50
|
if files_to_check.has_key?(filename)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module SceneToolkit
|
2
|
+
class Release
|
3
|
+
module Validations
|
4
|
+
module Files
|
5
|
+
REQUIRED_FILES = [:sfv, :nfo, :m3u]
|
6
|
+
|
7
|
+
def self.included(base)
|
8
|
+
base.register_validation(:files, "Validate inclusion of required files")
|
9
|
+
end
|
10
|
+
|
11
|
+
def valid_files?(params = {})
|
12
|
+
@errors[:files], @warnings[:files] = [], []
|
13
|
+
REQUIRED_FILES.each do |ext|
|
14
|
+
file_count = send("#{ext}_files")
|
15
|
+
@errors[:files] << "No *.#{ext} files found." if file_count.none?
|
16
|
+
@warnings[:files] << "Multiple *.#{ext} files found." if file_count.size > 1
|
17
|
+
end
|
18
|
+
@warnings[:files].empty?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -2,14 +2,16 @@ module SceneToolkit
|
|
2
2
|
class Release
|
3
3
|
module Validations
|
4
4
|
module Name
|
5
|
+
REGEXP = /^([A-Z0-9\-_.()&]+)\-(\d{4}|\d{3}x|\d{2}xx)\-([A-Z0-9_]+)$/i
|
6
|
+
|
5
7
|
def self.included(base)
|
6
8
|
base.register_validation(:name, "Validate release name")
|
7
9
|
end
|
8
10
|
|
9
|
-
def valid_name?
|
11
|
+
def valid_name?(params = {})
|
10
12
|
@errors[:name], @warnings[:name] = [], []
|
11
13
|
|
12
|
-
@errors[:name] << "Release name is not a valid scene release name" unless @name =~
|
14
|
+
@errors[:name] << "Release name is not a valid scene release name" unless @name =~ REGEXP
|
13
15
|
@errors[:name] << "Release name is lowercased" if @name.eql?(@name.downcase)
|
14
16
|
@errors[:name] << "Release name is uppercased" if @name.eql?(@name.upcase)
|
15
17
|
@errors[:name].empty?
|
@@ -6,12 +6,12 @@ module SceneToolkit
|
|
6
6
|
base.register_validation(:playlist, "Validate playlist against existing files")
|
7
7
|
end
|
8
8
|
|
9
|
-
def valid_playlist?
|
9
|
+
def valid_playlist?(params = {})
|
10
10
|
@errors[:playlist], @warnings[:playlist] = [], []
|
11
11
|
if m3u_files.any?
|
12
12
|
m3u_files.each do |playlist|
|
13
13
|
begin
|
14
|
-
validate_playlist(playlist)
|
14
|
+
validate_playlist(playlist, params[:case_sensitive])
|
15
15
|
rescue => e
|
16
16
|
@errors[:playlist] << e.message
|
17
17
|
end
|
@@ -25,13 +25,21 @@ module SceneToolkit
|
|
25
25
|
|
26
26
|
protected
|
27
27
|
|
28
|
-
def validate_playlist(playlist)
|
28
|
+
def validate_playlist(playlist, case_sensitive = true)
|
29
29
|
File.read(playlist, :mode => "rb").split(/[\r\n]+/).each do |filename|
|
30
30
|
filename.strip!
|
31
31
|
next if filename.blank? or filename.start_with?("#") or filename.start_with?(";")
|
32
|
-
|
32
|
+
if case_sensitive
|
33
|
+
file_not_found(filename) unless File.exist?(File.join(@path, filename))
|
34
|
+
else
|
35
|
+
file_not_found(filename) unless files.select { |file| file.downcase == File.join(@path, filename).downcase }.any?
|
36
|
+
end
|
33
37
|
end
|
34
38
|
end
|
39
|
+
|
40
|
+
def file_not_found(filename)
|
41
|
+
@errors[:playlist] << "File #{filename} not found"
|
42
|
+
end
|
35
43
|
end
|
36
44
|
end
|
37
45
|
end
|
@@ -6,10 +6,10 @@ module SceneToolkit
|
|
6
6
|
module Validations
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
9
|
-
def valid?(validations_to_exec = @available_validations)
|
9
|
+
def valid?(validations_to_exec = @available_validations, params = { })
|
10
10
|
@errors, @warnings = { }, { }
|
11
11
|
validations_to_exec.each do |name|
|
12
|
-
send("valid_#{name}?")
|
12
|
+
send("valid_#{name}?", params)
|
13
13
|
end
|
14
14
|
@errors.values.sum { |errors| errors.size }.zero?
|
15
15
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'scene_toolkit/release/helpers'
|
2
|
-
require 'scene_toolkit/release/
|
2
|
+
require 'scene_toolkit/release/auto_rename'
|
3
3
|
require 'scene_toolkit/release/validations'
|
4
4
|
require 'scene_toolkit/release/validations/checksum'
|
5
5
|
require 'scene_toolkit/release/validations/name'
|
6
6
|
require 'scene_toolkit/release/validations/playlist'
|
7
|
-
require 'scene_toolkit/release/validations/
|
7
|
+
require 'scene_toolkit/release/validations/files'
|
8
8
|
|
9
9
|
module SceneToolkit
|
10
10
|
class Release
|
@@ -12,13 +12,13 @@ module SceneToolkit
|
|
12
12
|
attr_accessor :errors, :warnings
|
13
13
|
|
14
14
|
include Validations
|
15
|
-
include
|
15
|
+
include AutoRename
|
16
16
|
include Helpers
|
17
17
|
|
18
18
|
include Validations::Checksum
|
19
19
|
include Validations::Name
|
20
20
|
include Validations::Playlist
|
21
|
-
include Validations::
|
21
|
+
include Validations::Files
|
22
22
|
|
23
23
|
def initialize(path)
|
24
24
|
@path = File.expand_path(path)
|
@@ -26,8 +26,9 @@ module SceneToolkit
|
|
26
26
|
@errors, @warnings = { }, { }
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
|
29
|
+
def heuristic_name
|
30
|
+
candidates = (m3u_files + nfo_files + sfv_files).map { |f| File.basename(f, ".*") }
|
31
|
+
candidates.group_by { |name| name }.max { |a, b| a.last.size <=> b.last.size }.first.gsub(/^\d+[-_]/, "")
|
31
32
|
end
|
32
33
|
end
|
33
34
|
end
|
data/lib/scene_toolkit.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scene-toolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-07-
|
12
|
+
date: 2011-07-11 00:00:00.000000000 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
17
|
-
requirement: &
|
17
|
+
requirement: &2155260360 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 3.0.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2155260360
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: i18n
|
28
|
-
requirement: &
|
28
|
+
requirement: &2155259940 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2155259940
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: colored
|
39
|
-
requirement: &
|
39
|
+
requirement: &2155259480 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2155259480
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: optitron
|
50
|
-
requirement: &
|
50
|
+
requirement: &2155259060 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *2155259060
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: nestful
|
61
|
-
requirement: &
|
61
|
+
requirement: &2155258640 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
version: '0'
|
67
67
|
type: :runtime
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *2155258640
|
70
70
|
description: Tool to assist scene MP3 library maintenance
|
71
71
|
email:
|
72
72
|
- knoopx@gmail.com
|
@@ -85,19 +85,19 @@ files:
|
|
85
85
|
- bin/scene-toolkit
|
86
86
|
- lib/scene_toolkit.rb
|
87
87
|
- lib/scene_toolkit/cli.rb
|
88
|
+
- lib/scene_toolkit/cli/auto_rename.rb
|
88
89
|
- lib/scene_toolkit/cli/helpers.rb
|
89
90
|
- lib/scene_toolkit/cli/playlists.rb
|
90
|
-
- lib/scene_toolkit/cli/rename.rb
|
91
91
|
- lib/scene_toolkit/cli/verify.rb
|
92
92
|
- lib/scene_toolkit/ext.rb
|
93
93
|
- lib/scene_toolkit/release.rb
|
94
|
+
- lib/scene_toolkit/release/auto_rename.rb
|
94
95
|
- lib/scene_toolkit/release/helpers.rb
|
95
|
-
- lib/scene_toolkit/release/rename.rb
|
96
96
|
- lib/scene_toolkit/release/validations.rb
|
97
97
|
- lib/scene_toolkit/release/validations/checksum.rb
|
98
|
+
- lib/scene_toolkit/release/validations/files.rb
|
98
99
|
- lib/scene_toolkit/release/validations/name.rb
|
99
100
|
- lib/scene_toolkit/release/validations/playlist.rb
|
100
|
-
- lib/scene_toolkit/release/validations/required_files.rb
|
101
101
|
- scene-toolkit.gemspec
|
102
102
|
has_rdoc: true
|
103
103
|
homepage: http://github.com/knoopx/scene-toolkit
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module SceneToolkit
|
2
|
-
class Release
|
3
|
-
module Validations
|
4
|
-
module RequiredFiles
|
5
|
-
REQUIRED_FILES = [:sfv, :nfo, :m3u]
|
6
|
-
|
7
|
-
def self.included(base)
|
8
|
-
base.register_validation(:required_files, "Validate inclusion of required files")
|
9
|
-
end
|
10
|
-
|
11
|
-
def valid_required_files?
|
12
|
-
@errors[:required_files], @warnings[:required_files] = [], []
|
13
|
-
REQUIRED_FILES.each do |ext|
|
14
|
-
file_count = send("#{ext}_files")
|
15
|
-
@errors[:required_files] << "No *.#{ext} files found." if file_count.none?
|
16
|
-
@warnings[:required_files] << "Multiple *.#{ext} files found." if file_count.size > 1
|
17
|
-
end
|
18
|
-
@warnings[:required_files].empty?
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|