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.
@@ -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