tvshow_renamer 0.4.1 → 0.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/README.md +9 -7
- data/bin/tvshow_renamer +1 -1
- data/lib/tvshow_renamer.rb +1 -0
- data/lib/tvshow_renamer/cli.rb +0 -39
- data/lib/tvshow_renamer/renamer.rb +15 -12
- data/lib/tvshow_renamer/runner.rb +52 -0
- data/lib/tvshow_renamer/tvshow_file.rb +11 -9
- data/lib/tvshow_renamer/version.rb +1 -1
- data/test/test_tvshow_renamer.rb +8 -5
- metadata +3 -2
data/README.md
CHANGED
|
@@ -33,13 +33,15 @@ You can specify many files to rename.
|
|
|
33
33
|
|
|
34
34
|
### Options
|
|
35
35
|
* `-n TVSHOW_NAME` or `--name TVSHOW_NAME`
|
|
36
|
-
This option
|
|
37
|
-
|
|
38
|
-
* `-l FILENAME` or `--log FILENAME`
|
|
39
|
-
This option make the utility create a file inside the same directory as the renamed files containing the old and new names of the files. It can be useful to keep the episode or version names.
|
|
36
|
+
This option defines the TV show name used to rename the files. If the option is not present, the name will be asked first.
|
|
40
37
|
|
|
38
|
+
* `-f FORMAT` or `--format FORMAT`
|
|
39
|
+
This option defines the format for the new filenames.
|
|
40
|
+
`$n` will be substitued by the TV show name, `$s` by the season number, `$e` by the episode number.
|
|
41
|
+
The default format is : `$n - $sx$e`.
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
* `-l FILENAME` or `--log FILENAME`
|
|
44
|
+
This option makes the utility create a file inside the same directory as the renamed files containing the old and new names of the files. It can be useful to keep the episode or version names.
|
|
44
45
|
|
|
45
|
-
*
|
|
46
|
+
* `-r` or `--recursive`
|
|
47
|
+
If any directory is passed as parameter, this option makes the utility look recursively inside directories for files to rename.
|
data/bin/tvshow_renamer
CHANGED
data/lib/tvshow_renamer.rb
CHANGED
data/lib/tvshow_renamer/cli.rb
CHANGED
|
@@ -1,44 +1,5 @@
|
|
|
1
|
-
require 'optparse'
|
|
2
|
-
|
|
3
1
|
module TVShowRenamer
|
|
4
2
|
class CLI
|
|
5
|
-
def self.start
|
|
6
|
-
options = {cli: true}
|
|
7
|
-
opts = OptionParser.new do |opts|
|
|
8
|
-
opts.banner = "Usage: tvshow_renamer [options] file|directory ..."
|
|
9
|
-
|
|
10
|
-
opts.on("-n", "--name TVSHOW_NAME", "Log all renames to FILENAME, inside the TV show files directory") do |tvshow_name|
|
|
11
|
-
options[:tvshow_name] = tvshow_name
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
opts.on("-l", "--log FILENAME", "Log all renames to FILENAME, inside the TV show files directory") do |log_file|
|
|
15
|
-
options[:log_file] = log_file
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
opts.on_tail("-h", "--help", "Show this message") do
|
|
19
|
-
puts opts
|
|
20
|
-
exit
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
opts.on_tail("--version", "Show version") do
|
|
24
|
-
puts TVShowRenamer::VERSION
|
|
25
|
-
exit
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
opts.parse!
|
|
29
|
-
|
|
30
|
-
if ARGV.empty?
|
|
31
|
-
puts opts
|
|
32
|
-
else
|
|
33
|
-
tvshow_name = if options[:tvshow_name]
|
|
34
|
-
options.delete(:tvshow_name)
|
|
35
|
-
else
|
|
36
|
-
self.prompt 'Please enter the name of the TV Show for these files : '
|
|
37
|
-
end
|
|
38
|
-
Renamer.new(tvshow_name, options).rename(ARGV)
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
3
|
def self.prompt(prompt)
|
|
43
4
|
print prompt
|
|
44
5
|
$stdout.flush
|
|
@@ -3,13 +3,10 @@ require 'fileutils'
|
|
|
3
3
|
|
|
4
4
|
module TVShowRenamer
|
|
5
5
|
class Renamer
|
|
6
|
-
attr_accessor :tvshow_name
|
|
7
|
-
|
|
8
6
|
EXTENSIONS = %w( .mkv .avi .mp4 .srt )
|
|
9
7
|
NUMBER_REGEX = /\A\d+\z/
|
|
10
8
|
|
|
11
|
-
def initialize(
|
|
12
|
-
@tvshow_name = tvshow_name
|
|
9
|
+
def initialize(options = {})
|
|
13
10
|
@options = options
|
|
14
11
|
end
|
|
15
12
|
|
|
@@ -29,14 +26,14 @@ module TVShowRenamer
|
|
|
29
26
|
|
|
30
27
|
def rename_dir(dirname)
|
|
31
28
|
puts "Renaming files in directory \"#{dirname}\""
|
|
32
|
-
Dir.glob(dirname + '/**').each do |filename|
|
|
29
|
+
Dir.glob(dirname + (@options[:recursive] ? '/**/*' : '/**')).each do |filename|
|
|
33
30
|
rename_file(filename)
|
|
34
31
|
end
|
|
35
32
|
end
|
|
36
33
|
|
|
37
34
|
def rename_file(filename)
|
|
38
35
|
renamed = false
|
|
39
|
-
@tvfile = TVShowFile.new @
|
|
36
|
+
@tvfile = TVShowFile.new @options, File.expand_path(filename)
|
|
40
37
|
|
|
41
38
|
if EXTENSIONS.include?(@tvfile.extname.downcase)
|
|
42
39
|
@tvfile.detect_season_and_episode
|
|
@@ -112,20 +109,26 @@ module TVShowRenamer
|
|
|
112
109
|
puts "Menu"
|
|
113
110
|
puts "----"
|
|
114
111
|
puts "1. Change TV Show name"
|
|
115
|
-
puts "2. Change format
|
|
112
|
+
puts "2. Change format"
|
|
116
113
|
puts "q. Quit menu"
|
|
117
114
|
puts "----"
|
|
118
115
|
quit = false
|
|
119
116
|
until quit
|
|
120
117
|
case CLI.prompt("Choice : ")
|
|
121
118
|
when '1'
|
|
122
|
-
new_tvshow_name = CLI.prompt_edit_value("TV Show Name", @
|
|
123
|
-
if new_tvshow_name != @tvshow_name
|
|
124
|
-
@tvshow_name =
|
|
125
|
-
|
|
119
|
+
new_tvshow_name = CLI.prompt_edit_value("TV Show Name", @options[:tvshow_name])
|
|
120
|
+
if new_tvshow_name != @options[:tvshow_name]
|
|
121
|
+
@options[:tvshow_name] = new_tvshow_name
|
|
122
|
+
@tvfile.options_modified
|
|
123
|
+
puts "TV Show Name is now #{new_tvshow_name}."
|
|
126
124
|
end
|
|
127
125
|
when '2'
|
|
128
|
-
|
|
126
|
+
new_format = CLI.prompt_edit_value("Format - $n : TV show name, $s : Season, $e : Episode", @options[:format])
|
|
127
|
+
if new_format != @options[:format]
|
|
128
|
+
@options[:format] = new_format
|
|
129
|
+
@tvfile.options_modified
|
|
130
|
+
puts "Format is now #{new_format}."
|
|
131
|
+
end
|
|
129
132
|
when 'q'
|
|
130
133
|
quit = true
|
|
131
134
|
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require 'optparse'
|
|
2
|
+
|
|
3
|
+
module TVShowRenamer
|
|
4
|
+
class Runner
|
|
5
|
+
def self.start
|
|
6
|
+
options = {}
|
|
7
|
+
options[:format] = "$n - $sx$e"
|
|
8
|
+
|
|
9
|
+
opts = OptionParser.new do |opts|
|
|
10
|
+
opts.banner = "Usage: tvshow_renamer [options] file|directory ..."
|
|
11
|
+
|
|
12
|
+
opts.on("-n", "--name TVSHOW_NAME", "Define the TV show name used to rename the files") do |tvshow_name|
|
|
13
|
+
options[:tvshow_name] = tvshow_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
opts.on("-f", "--format FORMAT",
|
|
17
|
+
"Define the format for the new filenames - Default : \"$n - $sx$e\"",
|
|
18
|
+
"$n will be substitued by the TV show name, $s by the season number, $e by the episode number") do |format|
|
|
19
|
+
options[:format] = format
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
opts.on("-l", "--log FILENAME", "Log all renames to FILENAME, inside the TV show files directory") do |log_file|
|
|
23
|
+
options[:log_file] = log_file
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
opts.on("-r", "--recursive", "If passed a directory, look recursively inside it for files to rename") do |recursive|
|
|
27
|
+
options[:recursive] = recursive
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
opts.separator ""
|
|
31
|
+
|
|
32
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
|
33
|
+
puts opts
|
|
34
|
+
exit
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
opts.on_tail("--version", "Show version") do
|
|
38
|
+
puts TVShowRenamer::VERSION
|
|
39
|
+
exit
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
opts.parse!
|
|
43
|
+
|
|
44
|
+
if ARGV.empty?
|
|
45
|
+
puts opts
|
|
46
|
+
else
|
|
47
|
+
options[:tvshow_name] ||= CLI.prompt 'Please enter the name of the TV Show for these files : '
|
|
48
|
+
Renamer.new(options).rename(ARGV)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
module TVShowRenamer
|
|
2
2
|
class TVShowFile
|
|
3
|
-
attr_reader :
|
|
3
|
+
attr_reader :filename, :season, :episode, :detected_season, :detected_episode
|
|
4
4
|
|
|
5
|
-
def initialize(
|
|
6
|
-
@
|
|
5
|
+
def initialize(options = {}, filename = nil)
|
|
6
|
+
@options = options
|
|
7
7
|
@filename = filename
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
# Custom setters
|
|
11
11
|
|
|
12
|
-
def tvshow_name=(tvshow_name)
|
|
13
|
-
@tvshow_name = tvshow_name
|
|
14
|
-
@new_basename = @new_filename = nil
|
|
15
|
-
end
|
|
16
|
-
|
|
17
12
|
def season=(season)
|
|
18
13
|
@season = season
|
|
19
14
|
@new_basename = @new_filename = nil
|
|
@@ -40,7 +35,10 @@ module TVShowRenamer
|
|
|
40
35
|
|
|
41
36
|
def new_basename
|
|
42
37
|
unless @new_basename
|
|
43
|
-
@new_basename =
|
|
38
|
+
@new_basename = @options[:format].gsub('$n', @options[:tvshow_name])
|
|
39
|
+
.gsub('$s', '%02i' % @season)
|
|
40
|
+
.gsub('$e', '%02i' % @episode)
|
|
41
|
+
.concat(extname)
|
|
44
42
|
@new_filename = nil
|
|
45
43
|
end
|
|
46
44
|
@new_basename
|
|
@@ -52,6 +50,10 @@ module TVShowRenamer
|
|
|
52
50
|
|
|
53
51
|
# Active methods
|
|
54
52
|
|
|
53
|
+
def options_modified
|
|
54
|
+
@new_basename = @new_filename = nil
|
|
55
|
+
end
|
|
56
|
+
|
|
55
57
|
def detect_season_and_episode
|
|
56
58
|
regex = /(?<season>\d{1,2})(e|x|\.)?(?<episode>\d{2,})/i
|
|
57
59
|
match = regex.match basename
|
data/test/test_tvshow_renamer.rb
CHANGED
|
@@ -2,9 +2,11 @@ require 'test/unit'
|
|
|
2
2
|
require 'tvshow_renamer'
|
|
3
3
|
|
|
4
4
|
class TVShowRenamerTest < Test::Unit::TestCase
|
|
5
|
+
FORMAT = '$n - $sx$e'
|
|
5
6
|
TVSHOW_NAME = 'Famous Show'
|
|
6
7
|
|
|
7
8
|
def test_detect_season_and_episode
|
|
9
|
+
options = {:format => FORMAT, :tvshow_name => TVSHOW_NAME}
|
|
8
10
|
{
|
|
9
11
|
'FamousShow.S05E01.DVDRip.XviD-BLAH.avi' => [5, 1],
|
|
10
12
|
'FamousShow.12x03.DVDRip.XviD-BLAH.avi' => [12,3],
|
|
@@ -13,7 +15,7 @@ class TVShowRenamerTest < Test::Unit::TestCase
|
|
|
13
15
|
'Famous.Show.03.04.avi' => [3, 4],
|
|
14
16
|
'Famous-Show.04x00.srt' => [4, 0],
|
|
15
17
|
}.each do |k,v|
|
|
16
|
-
tvfile = TVShowRenamer::TVShowFile.new(
|
|
18
|
+
tvfile = TVShowRenamer::TVShowFile.new(options, k)
|
|
17
19
|
tvfile.detect_season_and_episode
|
|
18
20
|
|
|
19
21
|
assert_equal v, [tvfile.season, tvfile.episode]
|
|
@@ -21,13 +23,14 @@ class TVShowRenamerTest < Test::Unit::TestCase
|
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
def test_new_basename
|
|
24
|
-
|
|
26
|
+
options = {:format => FORMAT, :tvshow_name => TVSHOW_NAME}
|
|
27
|
+
tvfile = TVShowRenamer::TVShowFile.new(options, 'test.mkv')
|
|
25
28
|
tvfile.season = 1
|
|
26
|
-
|
|
27
29
|
tvfile.episode = 2
|
|
28
30
|
assert_equal 'Famous Show - 01x02.mkv', tvfile.new_basename
|
|
29
31
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
options[:format] = '$n$s$e'
|
|
33
|
+
tvfile.options_modified
|
|
34
|
+
assert_equal 'Famous Show0102.mkv', tvfile.new_basename
|
|
32
35
|
end
|
|
33
36
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tvshow_renamer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: '0.5'
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2012-11-
|
|
12
|
+
date: 2012-11-27 00:00:00.000000000 Z
|
|
13
13
|
dependencies: []
|
|
14
14
|
description: Utility to rename TV Show files to a correct format
|
|
15
15
|
email: francois@fklingler.com
|
|
@@ -23,6 +23,7 @@ files:
|
|
|
23
23
|
- Rakefile
|
|
24
24
|
- lib/tvshow_renamer/cli.rb
|
|
25
25
|
- lib/tvshow_renamer/renamer.rb
|
|
26
|
+
- lib/tvshow_renamer/runner.rb
|
|
26
27
|
- lib/tvshow_renamer/tvshow_file.rb
|
|
27
28
|
- lib/tvshow_renamer/version.rb
|
|
28
29
|
- lib/tvshow_renamer.rb
|