reorganise 0.0.2 → 0.0.3
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/bin/reorganise +169 -5
- data/lib/reorganise/version.rb +1 -1
- data/reorganise.gemspec +2 -2
- metadata +5 -5
data/bin/reorganise
CHANGED
|
@@ -3,15 +3,179 @@
|
|
|
3
3
|
module Reorganise
|
|
4
4
|
class Reorganise
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
require 'optparse'
|
|
7
|
+
require 'to_regexp'
|
|
8
|
+
require 'fileutils'
|
|
9
|
+
|
|
10
|
+
attr_accessor :options, :matcher, :extensions, :directory, :series_name
|
|
11
|
+
|
|
12
|
+
def initialize(argv)
|
|
13
|
+
|
|
14
|
+
@extensions = [:avi, :mp4, :mkv]
|
|
15
|
+
@options = {}
|
|
16
|
+
@matcher = /(?:S(\d+)x?E(\d+)|(\d{1,2})(\d{2,})|(\d+)x(\d+))/i
|
|
17
|
+
|
|
18
|
+
parse_options!(argv)
|
|
19
|
+
sort!
|
|
20
|
+
|
|
8
21
|
end
|
|
9
22
|
|
|
10
|
-
def
|
|
11
|
-
|
|
23
|
+
def parse_options!(argv)
|
|
24
|
+
optparse = OptionParser.new(argv) do |opts|
|
|
25
|
+
opts.banner = "Usage: rename.rb [options]\n\nCommand options:"
|
|
26
|
+
|
|
27
|
+
@options[:regex] = @matcher
|
|
28
|
+
|
|
29
|
+
opts.on('-i', '--input-dir DIRECTORY', 'Specifies where to look for episodes to rename.') do |dir_name|
|
|
30
|
+
@options[:directory] = dir_name
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
opts.on('-n', '--name NAME', 'What to rename the series to. Title is derived from series if not given.') do |name|
|
|
34
|
+
@options[:series_name] = sanitize_user_string(name)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
@options[:confirm] = false
|
|
38
|
+
opts.on('-c', '--confirm', 'Confirms the go ahead to rename files. Only pretends to rename files to show the effects if not given.') do |regex|
|
|
39
|
+
@options[:confirm] = true
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
opts.on('-r', '--regexp MATCHER', 'Alternative regexp matcher.') do |regex|
|
|
43
|
+
@options[:regex] = regex.to_regexp
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
@options[:verbose] = false
|
|
47
|
+
opts.on('-v', '--verbose', 'Verbose output. Automatically selected for pretend runs.') do |regex|
|
|
48
|
+
@options[:verbose] = true
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
opts.on('-h', '--help', 'Display this to screen.') do
|
|
52
|
+
puts opts
|
|
53
|
+
exit
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
optparse.parse!
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def sort!
|
|
61
|
+
@directory = @options[:directory]
|
|
62
|
+
@series_name = @options[:series_name]
|
|
63
|
+
|
|
64
|
+
if directory.nil? or !Dir.exists?(directory)
|
|
65
|
+
puts "ERROR: Directory '#{directory}' does not exist. Run with -h for more information."
|
|
66
|
+
exit
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
Dir.chdir(directory)
|
|
70
|
+
filenames = Dir.glob("**/*.{#{@extensions.join(",")}}")
|
|
71
|
+
|
|
72
|
+
puts "------------------------------------------------------------------------"
|
|
73
|
+
puts "Finding all files with the following extensions: #{@extensions.join(", ")}"
|
|
74
|
+
puts ""
|
|
75
|
+
puts "Directory: #{directory}"
|
|
76
|
+
puts "Found #{filenames.size} files."
|
|
77
|
+
puts "------------------------------------------------------------------------"
|
|
78
|
+
puts ""
|
|
79
|
+
puts ""
|
|
80
|
+
puts "!!! NOTICE: This is a PRETEND renaming to show what would happen. !!! "
|
|
81
|
+
puts "To confirm the renaming of files, run the command again with -c. e.g. `reorganise -c -d [directory] -n [series name]"
|
|
82
|
+
puts ""
|
|
83
|
+
puts ""
|
|
84
|
+
puts "Starting to rename files using regex #{@options[:regex]}..."
|
|
85
|
+
puts ""
|
|
86
|
+
|
|
87
|
+
filenames.each do |filename|
|
|
88
|
+
if File.file?(filename)
|
|
89
|
+
|
|
90
|
+
if details = parse_filename(filename)
|
|
91
|
+
|
|
92
|
+
old_directory = File.absolute_path(File.dirname(filename))
|
|
93
|
+
|
|
94
|
+
# Check to see if the files were already organised into season folders
|
|
95
|
+
if old_directory.split("/").last.downcase == "season #{details[:season].to_i}"
|
|
96
|
+
target_directory = old_directory
|
|
97
|
+
else
|
|
98
|
+
target_directory = File.join(old_directory, "Season #{details[:season].to_i}")
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
if details[:series_name]
|
|
102
|
+
renamed_file = "#{details[:series_name]} - S#{details[:season]}E#{details[:episode]}#{details[:ext]}"
|
|
103
|
+
else
|
|
104
|
+
renamed_file = "S#{details[:season]}E#{details[:episode]}#{details[:ext]}"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Perform mv if confimed
|
|
108
|
+
if @options[:confirm]
|
|
109
|
+
FileUtils.mkdir_p(target_directory)
|
|
110
|
+
FileUtils.mv(File.join(old_directory, details[:basename]), File.join(target_directory, renamed_file))
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
if @options[:verbose] or !@options[:confirm]
|
|
114
|
+
puts "-: #{File.join(old_directory, details[:basename])}"
|
|
115
|
+
puts "+: #{File.join(target_directory, renamed_file)}"
|
|
116
|
+
puts ""
|
|
117
|
+
end
|
|
118
|
+
else
|
|
119
|
+
puts "ERROR: Skipped file \"#{filename}\" due to invalid file format."
|
|
120
|
+
end
|
|
121
|
+
else
|
|
122
|
+
puts "ERROR: Skipped non-file \"#{filename}\"."
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
puts ""
|
|
128
|
+
puts "Finished renaming #{filenames.size} files."
|
|
129
|
+
|
|
130
|
+
if !@options[:confirm]
|
|
131
|
+
puts ""
|
|
132
|
+
puts "!!! NOTICE: This was a pretend run, nothing was renamed. !!!"
|
|
133
|
+
puts "To confirm the renaming, run this command again with -c"
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def parse_filename(filename)
|
|
138
|
+
basename = File.basename(filename)
|
|
139
|
+
extension = File.extname(filename)
|
|
140
|
+
|
|
141
|
+
parts = basename.gsub(/[-._]/i, " ").strip.split(" ")
|
|
142
|
+
|
|
143
|
+
position = season = episode = -1
|
|
144
|
+
|
|
145
|
+
parts.each_with_index do |v, k|
|
|
146
|
+
if v =~ @matcher
|
|
147
|
+
season = "%02d" % ($1 || $3 || $5).to_i
|
|
148
|
+
episode = "%02d" % ($2 || $4 || $6).to_i
|
|
149
|
+
position = k
|
|
150
|
+
|
|
151
|
+
break if position != -1
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
if position != -1
|
|
156
|
+
# No title if episode numbers are first
|
|
157
|
+
if position == 0
|
|
158
|
+
title = (@series_name) ? @series_name : nil
|
|
159
|
+
else
|
|
160
|
+
title = parts[0..position-1].map{|p| p.capitalize}.join(" ")
|
|
161
|
+
end
|
|
162
|
+
details = {:basename => basename, :ext => extension, :season => season, :episode => episode}
|
|
163
|
+
details[:series_name] = (@series_name.nil?) ? title : @series_name
|
|
164
|
+
details
|
|
165
|
+
else
|
|
166
|
+
false
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def sanitize_user_string(str)
|
|
171
|
+
return false if str.empty?
|
|
172
|
+
str = str.gsub(/[^\s\w.\-]/, '')
|
|
173
|
+
str
|
|
12
174
|
end
|
|
13
175
|
|
|
14
176
|
end
|
|
15
177
|
end
|
|
16
178
|
|
|
17
|
-
Reorganise::Reorganise.new
|
|
179
|
+
Reorganise::Reorganise.new(ARGV)
|
|
180
|
+
|
|
181
|
+
|
data/lib/reorganise/version.rb
CHANGED
data/reorganise.gemspec
CHANGED
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
|
|
|
11
11
|
s.summary = "Sorts and renames your series."
|
|
12
12
|
s.description = "Sorts and renames your series."
|
|
13
13
|
|
|
14
|
-
s.rubyforge_project = "
|
|
14
|
+
s.rubyforge_project = "reorganise"
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
s.files = `git ls-files`.split("\n")
|
|
@@ -19,6 +19,6 @@ Gem::Specification.new do |s|
|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
20
20
|
s.require_paths = ["lib"]
|
|
21
21
|
|
|
22
|
-
s.add_runtime_dependency "
|
|
22
|
+
s.add_runtime_dependency "to_regexp"
|
|
23
23
|
|
|
24
24
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: reorganise
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.3
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -12,8 +12,8 @@ cert_chain: []
|
|
|
12
12
|
date: 2012-01-08 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
|
-
name:
|
|
16
|
-
requirement: &
|
|
15
|
+
name: to_regexp
|
|
16
|
+
requirement: &83562250 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ! '>='
|
|
@@ -21,7 +21,7 @@ dependencies:
|
|
|
21
21
|
version: '0'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *83562250
|
|
25
25
|
description: Sorts and renames your series.
|
|
26
26
|
email:
|
|
27
27
|
- justin.cossutti@gmail.com
|
|
@@ -56,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
56
56
|
- !ruby/object:Gem::Version
|
|
57
57
|
version: '0'
|
|
58
58
|
requirements: []
|
|
59
|
-
rubyforge_project:
|
|
59
|
+
rubyforge_project: reorganise
|
|
60
60
|
rubygems_version: 1.8.10
|
|
61
61
|
signing_key:
|
|
62
62
|
specification_version: 3
|