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