tvshow_renamer 0.2.1 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
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.
@@ -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
- filename = File.expand_path(filename)
38
- extension = File.extname(filename)
37
+ renamed = false
38
+ tvfile = TVShowFile.new @tvshow_name, File.expand_path(filename)
39
39
 
40
- if EXTENSIONS.include?(extension.downcase)
41
- dirname = File.dirname(filename)
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
- season = detected_season
46
- episode = detected_episode
47
-
48
- rename_ok = false
49
- until rename_ok
50
- new_basename = format_filename(@tvshow_name, season, episode, extension)
51
- print "Rename \"#{basename}\" to \"#{new_basename}\" ? (yneh) "
52
- $stdout.flush
53
- rename_value = $stdin.gets.chomp.strip
54
- case rename_value.downcase
55
- when 'y'
56
- new_filename = File.join(dirname, new_basename)
57
- if File.exists?(new_filename)
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 log_rename(dirname, basename, new_basename)
91
- if @options[:log_file]
92
- File.open(File.join(dirname, @options[:log_file]), 'a') do |file|
93
- file.puts "\"#{basename}\" => \"#{new_basename}\"\n"
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 get_season_and_episode(basename)
99
- regex = /(?<season>\d{1,2})(e|x|\.)?(?<episode>\d{2,})/i
100
- match = regex.match basename
101
- [match[:season].to_i, match[:episode].to_i]
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 format_filename(tvshow_name, season, episode, extension)
105
- "#{tvshow_name} - %02ix%02i#{extension}" % [season, episode]
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 edit_value(prompt, value)
109
- ok = false
110
- until ok
111
- print "#{prompt} (#{value}) : "
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
@@ -1,3 +1,3 @@
1
1
  module TVShowRenamer
2
- Version = VERSION = '0.2.1'
2
+ Version = VERSION = '0.3'
3
3
  end
@@ -1,3 +1,4 @@
1
1
  require 'tvshow_renamer/cli'
2
2
  require 'tvshow_renamer/renamer'
3
+ require 'tvshow_renamer/tvshow_file'
3
4
  require 'tvshow_renamer/version'
@@ -4,11 +4,7 @@ require 'tvshow_renamer'
4
4
  class TVShowRenamerTest < Test::Unit::TestCase
5
5
  TVSHOW_NAME = 'Famous Show'
6
6
 
7
- def setup
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
- assert_equal v, @renamer.get_season_and_episode(k)
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 test_format_filename
25
- assert_equal 'Famous Show - 01x02.mkv',
26
- @renamer.format_filename(TVSHOW_NAME, 1, 2, '.mkv')
27
- assert_equal 'Famous Show - 01x101.mkv',
28
- @renamer.format_filename(TVSHOW_NAME, 1, 101, '.mkv')
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.2.1
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