scene-toolkit 0.2.4 → 0.2.5
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/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
|