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.
@@ -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(release)
10
- regex = Regexp.new(Regexp.escape(release.name), Regexp::IGNORECASE)
11
- response = Nestful.get("http://www.google.com/search", :params => { :q => release.name, :num => 100 })
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 OrlydbMatcher
17
- def self.match(release)
18
- regex = Regexp.new(Regexp.escape(release.name), Regexp::IGNORECASE)
19
- response = Nestful.get("http://orlydb.com", :params => { :q => release.search_string })
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 rename(directory_string)
26
+ def auto_rename(directory_string)
27
27
  each_release(directory_string) do |release|
28
- unless release.name.downcase?
29
- heading(release, :green) { info "Skipping. Release name seems to be OK." }
30
- next
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
- [OrlydbMatcher, GoogleMatcher].each do |matcher|
35
- matches = matcher.match(release)
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 "hide_valid", "Do not display valid releases"
10
- opt "move_invalid_to", "Move INVALID releases to specified folder", :type => :string
11
- opt "move_valid_to", "Move VALID releases to specified folder", :type => :string
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("move_invalid_to")
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("move_valid_to")
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["hide_valid"] or not valid_target_directory.nil?
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)
@@ -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/rename'
9
+ require 'scene_toolkit/cli/auto_rename'
10
10
  require 'scene_toolkit/cli/verify'
11
11
 
12
12
  module SceneToolkit
@@ -2,4 +2,8 @@ class String
2
2
  def downcase?
3
3
  self == self.downcase
4
4
  end
5
+
6
+ def to_search_string
7
+ self.gsub(/[^A-Za-z0-9]+/, " ").gsub(/\s+/, " ")
8
+ end
5
9
  end
@@ -2,16 +2,12 @@ require 'active_support/concern'
2
2
 
3
3
  module SceneToolkit
4
4
  class Release
5
- module Rename
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
@@ -5,6 +5,10 @@ module SceneToolkit
5
5
  module Helpers
6
6
  extend ActiveSupport::Concern
7
7
 
8
+ def files
9
+ Dir.glob(File.join(Regexp.escape(@path), "*"))
10
+ end
11
+
8
12
  included do
9
13
  has_files_with_extension :mp3, :sfv, :nfo, :m3u
10
14
  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 =~ /^([A-Z0-9\-_.()&]+)\-(\d{4}|\d{3}x|\d{2}xx)\-([A-Z0-9_]+)$/i
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
- @errors[:playlist] << "File #{filename} not found" unless File.exist?(File.join(@path, filename))
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/rename'
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/required_files'
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 Rename
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::RequiredFiles
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 files
30
- Dir.glob(File.join(@path, "*"))
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
@@ -1,3 +1,3 @@
1
1
  module SceneToolkit
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
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
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-09 00:00:00.000000000 +02:00
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: &2153745240 !ruby/object:Gem::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: *2153745240
25
+ version_requirements: *2155260360
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: i18n
28
- requirement: &2153744820 !ruby/object:Gem::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: *2153744820
36
+ version_requirements: *2155259940
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: colored
39
- requirement: &2153744360 !ruby/object:Gem::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: *2153744360
47
+ version_requirements: *2155259480
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: optitron
50
- requirement: &2153743940 !ruby/object:Gem::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: *2153743940
58
+ version_requirements: *2155259060
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: nestful
61
- requirement: &2153743520 !ruby/object:Gem::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: *2153743520
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