tvshow_renamer 0.2.1 → 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/README.md +16 -0
- data/lib/tvshow_renamer/cli.rb +25 -1
- data/lib/tvshow_renamer/renamer.rb +58 -69
- data/lib/tvshow_renamer/tvshow_file.rb +66 -0
- data/lib/tvshow_renamer/version.rb +1 -1
- data/lib/tvshow_renamer.rb +1 -0
- data/test/test_tvshow_renamer.rb +14 -11
- metadata +2 -1
data/README.md
CHANGED
@@ -3,6 +3,20 @@ tvshow_renamer is a simple command line utility to rename automagically the tv s
|
|
3
3
|
Thanks to [skamlet](https://github.com/skamlet) for his work on [tv-show-renamer](https://github.com/skamlet/tv-show-renamer), the java utility upon which I have based my work.
|
4
4
|
|
5
5
|
|
6
|
+
Example
|
7
|
+
-------
|
8
|
+
|
9
|
+
Files like these ones:
|
10
|
+
|
11
|
+
* FamousShow.S05E01.DVDRip.XviD-BLAH.avi
|
12
|
+
* FamousShow.S05E02.DVDRip.XviD-BLAH.avi
|
13
|
+
|
14
|
+
Will be renamed like this:
|
15
|
+
|
16
|
+
* FamousShow - 05x01.avi
|
17
|
+
* FamousShow - 05x02.avi
|
18
|
+
|
19
|
+
|
6
20
|
Installation
|
7
21
|
------------
|
8
22
|
|
@@ -15,3 +29,5 @@ Usage
|
|
15
29
|
`tvshow_renamer [options] <tvshow_name> file|directory ...`
|
16
30
|
|
17
31
|
You can specify many files to rename.
|
32
|
+
|
33
|
+
The option `-l FILENAME` ou `--log FILENAME` will 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.
|
data/lib/tvshow_renamer/cli.rb
CHANGED
@@ -3,7 +3,7 @@ require 'optparse'
|
|
3
3
|
module TVShowRenamer
|
4
4
|
class CLI
|
5
5
|
def self.start
|
6
|
-
options = {}
|
6
|
+
options = {cli: true}
|
7
7
|
opts = OptionParser.new do |opts|
|
8
8
|
opts.banner = "Usage: tvshow_renamer [options] <tvshow_name> file|directory ..."
|
9
9
|
|
@@ -30,5 +30,29 @@ module TVShowRenamer
|
|
30
30
|
Renamer.new(tvshow_name, options).rename(ARGV)
|
31
31
|
end
|
32
32
|
end
|
33
|
+
|
34
|
+
def self.prompt(prompt)
|
35
|
+
print prompt
|
36
|
+
$stdout.flush
|
37
|
+
$stdin.gets.chomp.strip
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.prompt_edit_value(prompt, value = nil)
|
41
|
+
prompt << " (#{value})" if value
|
42
|
+
prompt << " : "
|
43
|
+
ok = false
|
44
|
+
until ok
|
45
|
+
str = self.prompt prompt
|
46
|
+
if value && str.empty?
|
47
|
+
ok = true
|
48
|
+
else
|
49
|
+
if str =~ /0{1,}/ || str.to_i > 0
|
50
|
+
value = str.to_i
|
51
|
+
ok = true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
value
|
56
|
+
end
|
33
57
|
end
|
34
58
|
end
|
@@ -34,93 +34,82 @@ module TVShowRenamer
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def rename_file(filename)
|
37
|
-
|
38
|
-
|
37
|
+
renamed = false
|
38
|
+
tvfile = TVShowFile.new @tvshow_name, File.expand_path(filename)
|
39
39
|
|
40
|
-
if EXTENSIONS.include?(
|
41
|
-
|
42
|
-
basename = File.basename(filename)
|
43
|
-
detected_season, detected_episode = get_season_and_episode(basename)
|
40
|
+
if EXTENSIONS.include?(tvfile.extname.downcase)
|
41
|
+
tvfile.detect_season_and_episode
|
44
42
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
override_ok = false
|
59
|
-
until override_ok
|
60
|
-
print "File \"#{new_basename}\" already exists. Override ? (yn) "
|
61
|
-
$stdout.flush
|
62
|
-
override_value = $stdin.gets.chomp.strip
|
63
|
-
case override_value
|
64
|
-
when 'y'
|
65
|
-
FileUtils.mv filename, new_filename
|
66
|
-
log_rename dirname, basename, new_basename
|
67
|
-
override_ok = true
|
68
|
-
rename_ok = true
|
69
|
-
when 'n'
|
70
|
-
override_ok = true
|
71
|
-
end
|
72
|
-
end
|
73
|
-
else
|
74
|
-
FileUtils.mv filename, new_filename
|
75
|
-
log_rename dirname, basename, new_basename
|
76
|
-
rename_ok = true
|
43
|
+
if tvfile.detected_season && tvfile.detected_episode
|
44
|
+
renamed = prompt_rename(tvfile)
|
45
|
+
else
|
46
|
+
answered = false
|
47
|
+
until answered
|
48
|
+
case CLI.prompt("No season and episode values have been detected for this file, do you want to rename it ? (yn) ").downcase
|
49
|
+
when 'y'
|
50
|
+
tvfile.season = CLI.prompt_edit_value "Season"
|
51
|
+
tvfile.episode = CLI.prompt_edit_value "Episode"
|
52
|
+
renamed = prompt_rename(tvfile)
|
53
|
+
answered = true
|
54
|
+
when 'n'
|
55
|
+
answered = true
|
77
56
|
end
|
78
|
-
when 'n'
|
79
|
-
rename_ok = true
|
80
|
-
when 'e'
|
81
|
-
season = edit_value "Season", detected_season
|
82
|
-
episode = edit_value "Episode", detected_episode
|
83
|
-
when '?', 'h'
|
84
|
-
puts "y: Yes, n: No, e: Edit"
|
85
57
|
end
|
86
58
|
end
|
87
59
|
end
|
60
|
+
renamed
|
88
61
|
end
|
89
62
|
|
90
|
-
def
|
91
|
-
|
92
|
-
|
93
|
-
|
63
|
+
def prompt_rename(tvfile)
|
64
|
+
renamed = answered = false
|
65
|
+
until answered
|
66
|
+
case CLI.prompt("Rename \"#{tvfile.basename}\" to \"#{tvfile.new_basename}\" ? (yneh) ").downcase
|
67
|
+
when 'y'
|
68
|
+
if File.exists?(tvfile.new_filename)
|
69
|
+
renamed = answered = prompt_override(tvfile)
|
70
|
+
else
|
71
|
+
move_tvshow_file(tvfile)
|
72
|
+
renamed = answered = true
|
73
|
+
end
|
74
|
+
when 'n'
|
75
|
+
answered = true
|
76
|
+
when 'e'
|
77
|
+
tvfile.season = CLI.prompt_edit_value "Season", tvfile.detected_season
|
78
|
+
tvfile.episode = CLI.prompt_edit_value "Episode", tvfile.detected_episode
|
79
|
+
when '?', 'h'
|
80
|
+
puts "y: Yes, n: No, e: Edit"
|
94
81
|
end
|
95
82
|
end
|
83
|
+
renamed
|
96
84
|
end
|
97
85
|
|
98
|
-
def
|
99
|
-
|
100
|
-
|
101
|
-
|
86
|
+
def prompt_override(tvfile)
|
87
|
+
overrided = answered = false
|
88
|
+
until answered
|
89
|
+
case CLI.prompt("File \"#{tvfile.new_basename}\" already exists. Override ? (yn) ").downcase
|
90
|
+
when 'y'
|
91
|
+
move_tvshow_file(tvfile)
|
92
|
+
answered = true
|
93
|
+
overrided = true
|
94
|
+
when 'n'
|
95
|
+
answered = true
|
96
|
+
overrided = false
|
97
|
+
end
|
98
|
+
end
|
99
|
+
overrided
|
102
100
|
end
|
103
101
|
|
104
|
-
def
|
105
|
-
|
102
|
+
def move_tvshow_file(tvfile)
|
103
|
+
FileUtils.mv tvfile.filename, tvfile.new_filename
|
104
|
+
log_rename tvfile
|
106
105
|
end
|
107
106
|
|
108
|
-
def
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
$stdout.flush
|
113
|
-
str = $stdin.gets.chomp.strip
|
114
|
-
if str.empty?
|
115
|
-
ok = true
|
116
|
-
else
|
117
|
-
if str =~ /0{1,}/ || str.to_i > 0
|
118
|
-
value = str.to_i
|
119
|
-
ok = true
|
120
|
-
end
|
107
|
+
def log_rename(tvfile)
|
108
|
+
if @options[:log_file]
|
109
|
+
File.open(File.join(tvfile.dirname, @options[:log_file]), 'a') do |file|
|
110
|
+
file.puts "\"#{tvfile.basename}\" => \"#{tvfile.new_basename}\"\n"
|
121
111
|
end
|
122
112
|
end
|
123
|
-
value
|
124
113
|
end
|
125
114
|
end
|
126
115
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module TVShowRenamer
|
2
|
+
class TVShowFile
|
3
|
+
attr_reader :tvshow_name
|
4
|
+
attr_reader :filename
|
5
|
+
attr_accessor :season
|
6
|
+
attr_accessor :episode
|
7
|
+
attr_reader :detected_season
|
8
|
+
attr_reader :detected_episode
|
9
|
+
|
10
|
+
def initialize(tvshow_name, filename)
|
11
|
+
@tvshow_name = tvshow_name
|
12
|
+
@filename = filename
|
13
|
+
end
|
14
|
+
|
15
|
+
# Custom setters
|
16
|
+
|
17
|
+
def season=(season)
|
18
|
+
@season = season
|
19
|
+
@new_basename = @new_filename = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def episode=(episode)
|
23
|
+
@episode = episode
|
24
|
+
@new_basename = @new_filename = nil
|
25
|
+
end
|
26
|
+
|
27
|
+
# Lazy getters
|
28
|
+
|
29
|
+
def basename
|
30
|
+
@basename ||= File.basename(@filename)
|
31
|
+
end
|
32
|
+
|
33
|
+
def dirname
|
34
|
+
@dirname ||= File.dirname(@filename)
|
35
|
+
end
|
36
|
+
|
37
|
+
def extname
|
38
|
+
@extname ||= File.extname(@filename)
|
39
|
+
end
|
40
|
+
|
41
|
+
def new_basename
|
42
|
+
unless @new_basename
|
43
|
+
@new_basename = "#{@tvshow_name} - %02ix%02i#{extname}" % [@season, @episode]
|
44
|
+
@new_filename = nil
|
45
|
+
end
|
46
|
+
@new_basename
|
47
|
+
end
|
48
|
+
|
49
|
+
def new_filename
|
50
|
+
@new_filename ||= File.join dirname, new_basename
|
51
|
+
end
|
52
|
+
|
53
|
+
# Active methods
|
54
|
+
|
55
|
+
def detect_season_and_episode
|
56
|
+
regex = /(?<season>\d{1,2})(e|x|\.)?(?<episode>\d{2,})/i
|
57
|
+
match = regex.match basename
|
58
|
+
if match && match[:season] && match[:episode]
|
59
|
+
@detected_season = match[:season].to_i
|
60
|
+
send :season=, @detected_season
|
61
|
+
@detected_episode = match[:episode].to_i
|
62
|
+
send :episode=, @detected_episode
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/tvshow_renamer.rb
CHANGED
data/test/test_tvshow_renamer.rb
CHANGED
@@ -4,11 +4,7 @@ require 'tvshow_renamer'
|
|
4
4
|
class TVShowRenamerTest < Test::Unit::TestCase
|
5
5
|
TVSHOW_NAME = 'Famous Show'
|
6
6
|
|
7
|
-
def
|
8
|
-
@renamer = TVShowRenamer::Renamer.new(TVSHOW_NAME)
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_get_season_and_episode
|
7
|
+
def test_detect_season_and_episode
|
12
8
|
{
|
13
9
|
'FamousShow.S05E01.DVDRip.XviD-BLAH.avi' => [5, 1],
|
14
10
|
'FamousShow.12x03.DVDRip.XviD-BLAH.avi' => [12,3],
|
@@ -17,14 +13,21 @@ class TVShowRenamerTest < Test::Unit::TestCase
|
|
17
13
|
'Famous.Show.03.04.avi' => [3, 4],
|
18
14
|
'Famous-Show.04x00.srt' => [4, 0],
|
19
15
|
}.each do |k,v|
|
20
|
-
|
16
|
+
tvfile = TVShowRenamer::TVShowFile.new(TVSHOW_NAME, k)
|
17
|
+
tvfile.detect_season_and_episode
|
18
|
+
|
19
|
+
assert_equal v, [tvfile.season, tvfile.episode]
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
def test_new_basename
|
24
|
+
tvfile = TVShowRenamer::TVShowFile.new(TVSHOW_NAME, 'test.mkv')
|
25
|
+
tvfile.season = 1
|
26
|
+
|
27
|
+
tvfile.episode = 2
|
28
|
+
assert_equal 'Famous Show - 01x02.mkv', tvfile.new_basename
|
29
|
+
|
30
|
+
tvfile.episode = 101
|
31
|
+
assert_equal 'Famous Show - 01x101.mkv', tvfile.new_basename
|
29
32
|
end
|
30
33
|
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.3'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -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/tvshow_file.rb
|
26
27
|
- lib/tvshow_renamer/version.rb
|
27
28
|
- lib/tvshow_renamer.rb
|
28
29
|
- test/test_tvshow_renamer.rb
|