bvwack 0.0.3 → 0.0.4
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/lib/bvwack/bvwack_version.rb +1 -1
- data/lib/bvwack/convert.rb +2 -2
- data/pkg/bvwack-0.0.3/README.md +25 -0
- data/pkg/bvwack-0.0.3/Rakefile +7 -0
- data/pkg/bvwack-0.0.3/bin/bvwack +3 -0
- data/pkg/bvwack-0.0.3/bvwack.gemspec +19 -0
- data/pkg/bvwack-0.0.3/lib/bvwack/bvwack_version.rb +3 -0
- data/pkg/bvwack-0.0.3/lib/bvwack/convert.rb +248 -0
- data/pkg/bvwack-0.0.3/lib/bvwack.rb +1 -0
- data/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/README.md +25 -0
- data/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/Rakefile +7 -0
- data/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bin/bvwack +3 -0
- data/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bvwack.gemspec +19 -0
- data/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/bvwack_version.rb +3 -0
- data/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/convert.rb +252 -0
- data/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack.rb +1 -0
- data/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2.gem +0 -0
- data/pkg/bvwack-0.0.3.gem +0 -0
- metadata +18 -2
data/lib/bvwack/convert.rb
CHANGED
|
@@ -143,7 +143,7 @@ def clean_up(options)
|
|
|
143
143
|
if options[:base_dir]
|
|
144
144
|
clean_dir = "#{options[:base_dir]}/bvwack-back"
|
|
145
145
|
else
|
|
146
|
-
clean_dir =
|
|
146
|
+
clean_dir = DEFAULT_CLEAN_BASE_DIR
|
|
147
147
|
end
|
|
148
148
|
if @to_clean.length > 0
|
|
149
149
|
key = @to_clean.pop
|
|
@@ -159,7 +159,7 @@ def dry_clean_up(options)
|
|
|
159
159
|
if options[:base_dir]
|
|
160
160
|
clean_dir = "#{options[:base_dir]}/bvwack-back"
|
|
161
161
|
else
|
|
162
|
-
clean_dir =
|
|
162
|
+
clean_dir = DEFAULT_CLEAN_BASE_DIR
|
|
163
163
|
end
|
|
164
164
|
if @to_clean.length > 0
|
|
165
165
|
key = @to_clean.pop
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# bvwack - Bulk Convert video files
|
|
2
|
+
|
|
3
|
+
Author:: Robie Lutsey
|
|
4
|
+
|
|
5
|
+
Copyright:: Copyright (c) 2012 by Robie Lutsey
|
|
6
|
+
License:: Distributed under the Apache License
|
|
7
|
+
|
|
8
|
+
bvwack (sounds like bivouc) is a dead simple tool for converting logs of video files.
|
|
9
|
+
Currently it supports .avi and .mkv --> iPad compatible .mp4.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
gem install bvwack
|
|
14
|
+
|
|
15
|
+
## Use
|
|
16
|
+
|
|
17
|
+
bvwack -[wc] < -n # -b base-dir >
|
|
18
|
+
|
|
19
|
+
For more help:
|
|
20
|
+
|
|
21
|
+
bvwack --help
|
|
22
|
+
|
|
23
|
+
## Developing for `bvwack`
|
|
24
|
+
|
|
25
|
+
TODO
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
$LOAD_PATH.push File.expand_path("../lib/bvwack", __FILE__)
|
|
2
|
+
require "bvwack_version"
|
|
3
|
+
|
|
4
|
+
Gem::Specification.new do |s|
|
|
5
|
+
s.name = "bvwack"
|
|
6
|
+
s.version = BVWack::VERSION
|
|
7
|
+
s.platform = Gem::Platform::RUBY
|
|
8
|
+
s.authors = ["Robie Lutsey"]
|
|
9
|
+
s.email = ["robie 0x55D in dec at gmail dit com"]
|
|
10
|
+
s.homepage = ""
|
|
11
|
+
s.summary = %q{bvwack will wack it's way your pile of unconverted video files.'}
|
|
12
|
+
s.description = %q{Super simple utility to help you convert all your videos to iPad ready files.}
|
|
13
|
+
s.requirements = ['ffmpeg and a libx264-slow.ffpreset (possibly in your ~/.ffmpeg/ directory.) Google is your friend.']
|
|
14
|
+
s.rubyforge_project = "bvwack"
|
|
15
|
+
s.required_ruby_version = '>=1.9'
|
|
16
|
+
s.files = Dir['**/**']
|
|
17
|
+
s.executables = ["bvwack"]
|
|
18
|
+
s.has_rdoc = false
|
|
19
|
+
end
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
require 'optparse'
|
|
2
|
+
|
|
3
|
+
DEFAULT_CONVERT_BASE_DIR = "#{ENV['PWD']}"
|
|
4
|
+
DEFAULT_CLEAN_BASE_DIR = "#{ENV['PWD']}/bvwack-back"
|
|
5
|
+
FFMPEG_OPTS = "-acodec aac -ac 2 -ab 160k -s 1024x768 -vcodec libx264 -vpre slow -vpre iPod640 -vb 1200k -f mp4 -threads 2 -strict experimental"
|
|
6
|
+
help_text = "
|
|
7
|
+
Usage: bvwack <options>
|
|
8
|
+
|
|
9
|
+
Default action is equivalent to bvwack -n 2
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
-b BASE_DIR, --base-dir BASE_DIR Set BASE_DIR instead of /Volumes/thundar/media/video
|
|
13
|
+
-d, --dry-run Do a dry run. Prints proposed commands to STDOUT.
|
|
14
|
+
-c, --clean-up Instead of converting, move all converted files to /Volumes/thundar/media/converted/[old-path]
|
|
15
|
+
-n #, --num-files # Number of videos to batch.
|
|
16
|
+
-l, --list_converted Lists files that have been converted but not cleaned. Useful for vierifying successful conversion.
|
|
17
|
+
|
|
18
|
+
Notes: By default this will not work for you. You must change DEFAULT_CONVERT_BASE_DIR
|
|
19
|
+
and DEFAULT_CLEAN_BASE_DIR to something that exists on your system. Do not let
|
|
20
|
+
the clean dir be a subdirectory of base dir or you'll be sad. I have set the
|
|
21
|
+
FFMPEG options to use only 2 threads. This allows me to use my laptop while
|
|
22
|
+
converting things. If you just want to hog through video try setting -threads 0
|
|
23
|
+
in FFMPEG_OPTS. Currently this only works on UNIX-like systems.
|
|
24
|
+
|
|
25
|
+
Requirements: ffmpeg and a libx264-slow.ffpreset (possibly in your ~/.ffmpeg/ directory or in your Cellar if you use brew.) Google is your friend.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
bvwack -dw Shows proposed commands for 2 videos
|
|
29
|
+
bvwack -w -b somedir/anotherdir -n 5 Converts 5 videos under somedir/anotherdir
|
|
30
|
+
bvwack -c -n 10 Moves 10 already converted mkv or avi files to /Volumes/thundar/medai/converted/[od-path]"
|
|
31
|
+
|
|
32
|
+
@converted_files = { }
|
|
33
|
+
@not_converted_files = { }
|
|
34
|
+
@to_convert = []
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
options = { }
|
|
38
|
+
option_parser = OptionParser.new do |opts|
|
|
39
|
+
opts.on("-d", "--dry-run") do
|
|
40
|
+
options[:dry_run] = true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
opts.on("-b BASE_DIR", "--base-dir BASE_DIR") do |base_dir|
|
|
44
|
+
options[:base_dir] = base_dir
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
opts.on("-c", "--clean-up") do
|
|
48
|
+
options[:clean_up] = true
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
opts.on("-n NUM_FILES", "--num-files NUM_FILES", Integer) do |num_files|
|
|
52
|
+
options[:num_files] = num_files
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
opts.on("-h", "--help") do
|
|
56
|
+
options[:help] = true
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
opts.on("-l", "--list-converted") do
|
|
60
|
+
options[:list_converted] = true
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
opts.on("-w", "--wack") do
|
|
64
|
+
options[:wack] = true
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def echo_base_dirs(options)
|
|
69
|
+
if options[:base_dir]
|
|
70
|
+
puts "\nOperating in #{ options[:base_dir]}"
|
|
71
|
+
puts "I will create #{ options[:base_dir]}/bvwack-back to store converted files if you use clean-up.\n\n"
|
|
72
|
+
else
|
|
73
|
+
puts "\nOperating in #{DEFAULT_CONVERT_BASE_DIR}"
|
|
74
|
+
puts "I will create #{ DEFAULT_CLEAN_BASE_DIR} to store converted files if you use clean-up.\n\n"
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def convert(path_to_file)
|
|
79
|
+
if path_to_file.class == String
|
|
80
|
+
`ffmpeg -i "#{path_to_file}" #{FFMPEG_OPTS} "#{path_to_file.gsub(/mkv$|avi$/, "ipad.mp4")}"`
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def dry_run(path_to_file)
|
|
85
|
+
if path_to_file.class == String
|
|
86
|
+
puts "ffmpeg -i #{path_to_file} #{FFMPEG_OPTS} #{path_to_file.gsub(/mkv$|avi$/, "ipad.mp4")}\n\n"
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def get_files(args)
|
|
92
|
+
if args[0]
|
|
93
|
+
args.each do |path|
|
|
94
|
+
if File.file?(path)
|
|
95
|
+
@paths << path
|
|
96
|
+
else
|
|
97
|
+
puts "#{path} is not a real file. Skipping. Try single-quoting the path if it is spacey or ugly."
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
else
|
|
101
|
+
puts "Specify the file(s) to convert: ./media/dir/dir/file1.mkv <'./media/dir/dir name/file(2).avi'>"
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def get_all_files(options)
|
|
107
|
+
if options[:base_dir]
|
|
108
|
+
base_dir = options[:base_dir]
|
|
109
|
+
else
|
|
110
|
+
base_dir = DEFAULT_CONVERT_BASE_DIR
|
|
111
|
+
end
|
|
112
|
+
Dir.chdir(base_dir)
|
|
113
|
+
converted_files = Dir.glob(File.join("**", "*ipad.mp4"))
|
|
114
|
+
converted_files.each do |i|
|
|
115
|
+
if i.include?("bvwack-back")
|
|
116
|
+
next
|
|
117
|
+
else
|
|
118
|
+
@converted_files[File.basename(i, ".ipad.mp4")] = i
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
not_converted_files = Dir.glob(File.join("**", "*.{mkv,avi}"))
|
|
123
|
+
not_converted_files.each do |i|
|
|
124
|
+
if i.include?("bvwack-back")
|
|
125
|
+
next
|
|
126
|
+
else
|
|
127
|
+
if File.basename(i).split(".").last == "mkv"
|
|
128
|
+
@not_converted_files[File.basename(i, ".mkv")] = i
|
|
129
|
+
elsif File.basename(i).split(".").last == "avi"
|
|
130
|
+
@not_converted_files[File.basename(i, ".avi")] = i
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def get_unconverted_files(converted_files, not_converted_files)
|
|
137
|
+
(not_converted_files.keys - converted_files.keys).each do |key|
|
|
138
|
+
@to_convert << @not_converted_files[key]
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def clean_up(options)
|
|
143
|
+
if options[:base_dir]
|
|
144
|
+
clean_dir = "#{options[:base_dir]}/bvwack-back"
|
|
145
|
+
else
|
|
146
|
+
clean_dir = DEFAULT_CONVERT_BASE_DIR
|
|
147
|
+
end
|
|
148
|
+
if @to_clean.length > 0
|
|
149
|
+
key = @to_clean.pop
|
|
150
|
+
filename = @not_converted_files[key]
|
|
151
|
+
dirname = File.dirname(@not_converted_files[key])
|
|
152
|
+
`mkdir -p "#{clean_dir}/#{dirname}" && mv "#{filename}" "#{clean_dir}/#{filename}"`
|
|
153
|
+
#else
|
|
154
|
+
# puts "No more files to clean. Hooray!"
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def dry_clean_up(options)
|
|
159
|
+
if options[:base_dir]
|
|
160
|
+
clean_dir = "#{options[:base_dir]}/bvwack-back"
|
|
161
|
+
else
|
|
162
|
+
clean_dir = DEFAULT_CONVERT_BASE_DIR
|
|
163
|
+
end
|
|
164
|
+
if @to_clean.length > 0
|
|
165
|
+
key = @to_clean.pop
|
|
166
|
+
filename = @not_converted_files[key]
|
|
167
|
+
dirname = File.dirname(@not_converted_files[key])
|
|
168
|
+
puts %Q{mkdir -p "#{clean_dir}/#{dirname}" && mv "#{filename}" "#{clean_dir}/#{filename}"\n\n}
|
|
169
|
+
#else
|
|
170
|
+
# puts "No more files to clean. Hooray!"
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def list_converted
|
|
175
|
+
begin
|
|
176
|
+
while @to_clean
|
|
177
|
+
key = @to_clean.pop
|
|
178
|
+
converted_filename = @converted_files[key]
|
|
179
|
+
old_filename = @not_converted_files[key]
|
|
180
|
+
dirname = File.dirname(@not_converted_files[key])
|
|
181
|
+
puts "\nConverted file:\n"
|
|
182
|
+
puts %Q{In Directory "#{dirname}"}
|
|
183
|
+
p `ls -lh "#{converted_filename}"`
|
|
184
|
+
p `ls -lh "#{old_filename}"`
|
|
185
|
+
puts %Q{To test run: open "#{converted_filename}"}
|
|
186
|
+
puts "\n\n"
|
|
187
|
+
end
|
|
188
|
+
rescue
|
|
189
|
+
puts("\nNothing to list")
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
option_parser.parse!
|
|
194
|
+
puts options.inspect
|
|
195
|
+
|
|
196
|
+
if options[:num_files]
|
|
197
|
+
limit = (options[:num_files] - 1).to_i
|
|
198
|
+
else
|
|
199
|
+
limit = 2
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
case
|
|
203
|
+
when options[:wack] == TRUE && options[:clean_up] == TRUE
|
|
204
|
+
puts("Error! -w (--wack) and -c (--clean-up) cannot be used simultaneously.")
|
|
205
|
+
when options[:list_converted] == TRUE
|
|
206
|
+
get_all_files(options)
|
|
207
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
208
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
209
|
+
list_converted
|
|
210
|
+
when options[:dry_run] == TRUE && options[:clean_up] == TRUE
|
|
211
|
+
get_all_files(options)
|
|
212
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
213
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
214
|
+
echo_base_dirs(options)
|
|
215
|
+
(0..limit).each do
|
|
216
|
+
dry_clean_up(options)
|
|
217
|
+
end
|
|
218
|
+
when options[:clean_up] == TRUE
|
|
219
|
+
get_all_files(options)
|
|
220
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
221
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
222
|
+
echo_base_dirs(options)
|
|
223
|
+
(0..limit).each do
|
|
224
|
+
#puts "I would have run clean_up"
|
|
225
|
+
clean_up(options)
|
|
226
|
+
end
|
|
227
|
+
when options[:dry_run] == TRUE && options[:wack] == TRUE
|
|
228
|
+
get_all_files(options)
|
|
229
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
230
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
231
|
+
echo_base_dirs(options)
|
|
232
|
+
(0..limit).each do |i|
|
|
233
|
+
file = @to_convert[i]
|
|
234
|
+
dry_run(file)
|
|
235
|
+
end
|
|
236
|
+
when options[:wack] == TRUE
|
|
237
|
+
get_all_files(options)
|
|
238
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
239
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
240
|
+
echo_base_dirs(options)
|
|
241
|
+
(0..limit).each do |i|
|
|
242
|
+
file = @to_convert[i]
|
|
243
|
+
#puts "I would have run convert(file)"
|
|
244
|
+
convert(file)
|
|
245
|
+
end
|
|
246
|
+
else
|
|
247
|
+
puts help_text
|
|
248
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require "bvwack/convert"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# bvwack - Bulk Convert video files
|
|
2
|
+
|
|
3
|
+
Author:: Robie Lutsey
|
|
4
|
+
|
|
5
|
+
Copyright:: Copyright (c) 2012 by Robie Lutsey
|
|
6
|
+
License:: Distributed under the Apache License
|
|
7
|
+
|
|
8
|
+
bvwack (sounds like bivouc) is a dead simple tool for converting logs of video files.
|
|
9
|
+
Currently it supports .avi and .mkv --> iPad compatible .mp4.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
gem install bvwack
|
|
14
|
+
|
|
15
|
+
## Use
|
|
16
|
+
|
|
17
|
+
bvwack -[wc] < -n # -b base-dir >
|
|
18
|
+
|
|
19
|
+
For more help:
|
|
20
|
+
|
|
21
|
+
bvwack --help
|
|
22
|
+
|
|
23
|
+
## Developing for `bvwack`
|
|
24
|
+
|
|
25
|
+
TODO
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
$LOAD_PATH.push File.expand_path("../lib/bvwack", __FILE__)
|
|
2
|
+
require "bvwack_version"
|
|
3
|
+
|
|
4
|
+
Gem::Specification.new do |s|
|
|
5
|
+
s.name = "bvwack"
|
|
6
|
+
s.version = BVWack::VERSION
|
|
7
|
+
s.platform = Gem::Platform::RUBY
|
|
8
|
+
s.authors = ["Robie Lutsey"]
|
|
9
|
+
s.email = ["robie 0x55D in dec at gmail dit com"]
|
|
10
|
+
s.homepage = ""
|
|
11
|
+
s.summary = %q{bvwack will wack it's way your pile of unconverted video files.'}
|
|
12
|
+
s.description = %q{Super simple utility to help you convert all your videos to iPad ready files.}
|
|
13
|
+
s.requirements = ['ffmpeg and a libx264-slow.ffpreset (possibly in your ~/.ffmpeg/ directory.) Google is your friend.']
|
|
14
|
+
s.rubyforge_project = "bvwack"
|
|
15
|
+
s.required_ruby_version = '>=1.9'
|
|
16
|
+
s.files = Dir['**/**']
|
|
17
|
+
s.executables = ["bvwack"]
|
|
18
|
+
s.has_rdoc = false
|
|
19
|
+
end
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
require 'optparse'
|
|
2
|
+
|
|
3
|
+
DEFAULT_CONVERT_BASE_DIR = "#{ENV['PWD']}"
|
|
4
|
+
DEFAULT_CLEAN_BASE_DIR = "#{ENV['PWD']}/bvwack-back"
|
|
5
|
+
FFMPEG_OPTS = "-acodec aac -ac 2 -ab 160k -s 1024x768 -vcodec libx264 -vpre slow -vpre iPod640 -vb 1200k -f mp4 -threads 2 -strict experimental"
|
|
6
|
+
help_text = "
|
|
7
|
+
Usage: bvwack <options>
|
|
8
|
+
|
|
9
|
+
Default action is equivalent to bvwack -n 2
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
-b BASE_DIR, --base-dir BASE_DIR Set BASE_DIR instead of /Volumes/thundar/media/video
|
|
13
|
+
-d, --dry-run Do a dry run. Prints proposed commands to STDOUT.
|
|
14
|
+
-c, --clean-up Instead of converting, move all converted files to /Volumes/thundar/media/converted/[old-path]
|
|
15
|
+
-n #, --num-files # Number of videos to batch.
|
|
16
|
+
-l, --list_converted Lists files that have been converted but not cleaned. Useful for vierifying successful conversion.
|
|
17
|
+
|
|
18
|
+
Notes: By default this will not work for you. You must change DEFAULT_CONVERT_BASE_DIR
|
|
19
|
+
and DEFAULT_CLEAN_BASE_DIR to something that exists on your system. Do not let
|
|
20
|
+
the clean dir be a subdirectory of base dir or you'll be sad. I have set the
|
|
21
|
+
FFMPEG options to use only 2 threads. This allows me to use my laptop while
|
|
22
|
+
converting things. If you just want to hog through video try setting -threads 0
|
|
23
|
+
in FFMPEG_OPTS. Currently this only works on UNIX-like systems.
|
|
24
|
+
|
|
25
|
+
Requirements: ffmpeg and a libx264-slow.ffpreset (possibly in your ~/.ffmpeg/ directory or in your Cellar if you use brew.) Google is your friend.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
bvwack -dw Shows proposed commands for 2 videos
|
|
29
|
+
bvwack -w -b somedir/anotherdir -n 5 Converts 5 videos under somedir/anotherdir
|
|
30
|
+
bvwack -c -n 10 Moves 10 already converted mkv or avi files to /Volumes/thundar/medai/converted/[od-path]"
|
|
31
|
+
|
|
32
|
+
@converted_files = { }
|
|
33
|
+
@not_converted_files = { }
|
|
34
|
+
@to_convert = []
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
options = { }
|
|
38
|
+
option_parser = OptionParser.new do |opts|
|
|
39
|
+
opts.on("-d", "--dry-run") do
|
|
40
|
+
options[:dry_run] = true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
opts.on("-b BASE_DIR", "--base-dir BASE_DIR") do |base_dir|
|
|
44
|
+
options[:base_dir] = base_dir
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
opts.on("-c", "--clean-up") do
|
|
48
|
+
options[:clean_up] = true
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
opts.on("-n NUM_FILES", "--num-files NUM_FILES", Integer) do |num_files|
|
|
52
|
+
options[:num_files] = num_files
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
opts.on("-h", "--help") do
|
|
56
|
+
options[:help] = true
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
opts.on("-l", "--list-converted") do
|
|
60
|
+
options[:list_converted] = true
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
opts.on("-w", "--wack") do
|
|
64
|
+
options[:wack] = true
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def echo_base_dirs(options)
|
|
69
|
+
if options[:base_dir]
|
|
70
|
+
puts "\nOperating in #{ options[:base_dir]}"
|
|
71
|
+
puts "I will create #{ options[:base_dir]}/bvwack-back to store converted files if you use clean-up.\n\n"
|
|
72
|
+
else
|
|
73
|
+
puts "\nOperating in #{DEFAULT_CONVERT_BASE_DIR}"
|
|
74
|
+
puts "I will create #{ DEFAULT_CLEAN_BASE_DIR} to store converted files if you use clean-up.\n\n"
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def convert(path_to_file)
|
|
79
|
+
if path_to_file.class == String
|
|
80
|
+
`ffmpeg -i "#{path_to_file}" #{FFMPEG_OPTS} "#{path_to_file.gsub(/mkv$|avi$/, "ipad.mp4")}"`
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def dry_run(path_to_file)
|
|
85
|
+
if path_to_file.class == String
|
|
86
|
+
puts "ffmpeg -i #{path_to_file} #{FFMPEG_OPTS} #{path_to_file.gsub(/mkv$|avi$/, "ipad.mp4")}\n\n"
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def get_files(args)
|
|
92
|
+
if args[0]
|
|
93
|
+
args.each do |path|
|
|
94
|
+
if File.file?(path)
|
|
95
|
+
@paths << path
|
|
96
|
+
else
|
|
97
|
+
puts "#{path} is not a real file. Skipping. Try single-quoting the path if it is spacey or ugly."
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
else
|
|
101
|
+
puts "Specify the file(s) to convert: ./media/dir/dir/file1.mkv <'./media/dir/dir name/file(2).avi'>"
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def get_all_files(options)
|
|
107
|
+
if options[:base_dir]
|
|
108
|
+
base_dir = options[:base_dir]
|
|
109
|
+
else
|
|
110
|
+
base_dir = DEFAULT_CONVERT_BASE_DIR
|
|
111
|
+
end
|
|
112
|
+
Dir.chdir(base_dir)
|
|
113
|
+
converted_files = Dir.glob(File.join("**", "*ipad.mp4"))
|
|
114
|
+
converted_files.each do |i|
|
|
115
|
+
if i.include?("bvwack-back")
|
|
116
|
+
next
|
|
117
|
+
else
|
|
118
|
+
@converted_files[File.basename(i, ".ipad.mp4")] = i
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
not_converted_files = Dir.glob(File.join("**", "*.{mkv,avi}"))
|
|
123
|
+
not_converted_files.each do |i|
|
|
124
|
+
if i.include?("bvwack-back")
|
|
125
|
+
next
|
|
126
|
+
else
|
|
127
|
+
if File.basename(i).split(".").last == "mkv"
|
|
128
|
+
@not_converted_files[File.basename(i, ".mkv")] = i
|
|
129
|
+
elsif File.basename(i).split(".").last == "avi"
|
|
130
|
+
@not_converted_files[File.basename(i, ".avi")] = i
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def get_unconverted_files(converted_files, not_converted_files)
|
|
137
|
+
(not_converted_files.keys - converted_files.keys).each do |key|
|
|
138
|
+
@to_convert << @not_converted_files[key]
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def clean_up(options)
|
|
143
|
+
if options[:base_dir]
|
|
144
|
+
clean_dir = "#{options[:base_dir]}/bvwack-back"
|
|
145
|
+
else
|
|
146
|
+
clean_dir = DEFAULT_CONVERT_BASE_DIR
|
|
147
|
+
end
|
|
148
|
+
if @to_clean.length > 0
|
|
149
|
+
key = @to_clean.pop
|
|
150
|
+
filename = @not_converted_files[key]
|
|
151
|
+
dirname = File.dirname(@not_converted_files[key])
|
|
152
|
+
`mkdir -p "#{clean_dir}/#{dirname}" && mv "#{filename}" "#{clean_dir}/#{filename}"`
|
|
153
|
+
#else
|
|
154
|
+
# puts "No more files to clean. Hooray!"
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def dry_clean_up(options)
|
|
159
|
+
if options[:base_dir]
|
|
160
|
+
clean_dir = "#{options[:base_dir]}/bvwack-back"
|
|
161
|
+
else
|
|
162
|
+
clean_dir = DEFAULT_CONVERT_BASE_DIR
|
|
163
|
+
end
|
|
164
|
+
if @to_clean.length > 0
|
|
165
|
+
key = @to_clean.pop
|
|
166
|
+
filename = @not_converted_files[key]
|
|
167
|
+
dirname = File.dirname(@not_converted_files[key])
|
|
168
|
+
print "\n\ndirname: "
|
|
169
|
+
p dirname
|
|
170
|
+
print "\n\nclean_dir: "
|
|
171
|
+
p clean_dir
|
|
172
|
+
puts %Q{mkdir -p "#{clean_dir}/#{dirname}" && mv "#{filename}" "#{clean_dir}/#{filename}"\n\n}
|
|
173
|
+
#else
|
|
174
|
+
# puts "No more files to clean. Hooray!"
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def list_converted
|
|
179
|
+
begin
|
|
180
|
+
while @to_clean
|
|
181
|
+
key = @to_clean.pop
|
|
182
|
+
converted_filename = @converted_files[key]
|
|
183
|
+
old_filename = @not_converted_files[key]
|
|
184
|
+
dirname = File.dirname(@not_converted_files[key])
|
|
185
|
+
puts "\nConverted file:\n"
|
|
186
|
+
puts %Q{In Directory "#{dirname}"}
|
|
187
|
+
p `ls -lh "#{converted_filename}"`
|
|
188
|
+
p `ls -lh "#{old_filename}"`
|
|
189
|
+
puts %Q{To test run: open "#{converted_filename}"}
|
|
190
|
+
puts "\n\n"
|
|
191
|
+
end
|
|
192
|
+
rescue
|
|
193
|
+
puts("\nNothing to list")
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
option_parser.parse!
|
|
198
|
+
puts options.inspect
|
|
199
|
+
|
|
200
|
+
if options[:num_files]
|
|
201
|
+
limit = (options[:num_files] - 1).to_i
|
|
202
|
+
else
|
|
203
|
+
limit = 2
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
case
|
|
207
|
+
when options[:wack] == TRUE && options[:clean_up] == TRUE
|
|
208
|
+
puts("Error! -w (--wack) and -c (--clean-up) cannot be used simultaneously.")
|
|
209
|
+
when options[:list_converted] == TRUE
|
|
210
|
+
get_all_files(options)
|
|
211
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
212
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
213
|
+
list_converted
|
|
214
|
+
when options[:dry_run] == TRUE && options[:clean_up] == TRUE
|
|
215
|
+
get_all_files(options)
|
|
216
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
217
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
218
|
+
echo_base_dirs(options)
|
|
219
|
+
(0..limit).each do
|
|
220
|
+
dry_clean_up(options)
|
|
221
|
+
end
|
|
222
|
+
when options[:clean_up] == TRUE
|
|
223
|
+
get_all_files(options)
|
|
224
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
225
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
226
|
+
echo_base_dirs(options)
|
|
227
|
+
(0..limit).each do
|
|
228
|
+
#puts "I would have run clean_up"
|
|
229
|
+
clean_up(options)
|
|
230
|
+
end
|
|
231
|
+
when options[:dry_run] == TRUE && options[:wack] == TRUE
|
|
232
|
+
get_all_files(options)
|
|
233
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
234
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
235
|
+
echo_base_dirs(options)
|
|
236
|
+
(0..limit).each do |i|
|
|
237
|
+
file = @to_convert[i]
|
|
238
|
+
dry_run(file)
|
|
239
|
+
end
|
|
240
|
+
when options[:wack] == TRUE
|
|
241
|
+
get_all_files(options)
|
|
242
|
+
get_unconverted_files(@converted_files, @not_converted_files)
|
|
243
|
+
@to_clean = @not_converted_files.keys & @converted_files.keys
|
|
244
|
+
echo_base_dirs(options)
|
|
245
|
+
(0..limit).each do |i|
|
|
246
|
+
file = @to_convert[i]
|
|
247
|
+
#puts "I would have run convert(file)"
|
|
248
|
+
convert(file)
|
|
249
|
+
end
|
|
250
|
+
else
|
|
251
|
+
puts help_text
|
|
252
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require "bvwack/convert"
|
|
Binary file
|
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bvwack
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.4
|
|
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-02-
|
|
12
|
+
date: 2012-02-22 00:00:00.000000000 Z
|
|
13
13
|
dependencies: []
|
|
14
14
|
description: Super simple utility to help you convert all your videos to iPad ready
|
|
15
15
|
files.
|
|
@@ -33,6 +33,22 @@ files:
|
|
|
33
33
|
- pkg/bvwack-0.0.2/Rakefile
|
|
34
34
|
- pkg/bvwack-0.0.2/README.md
|
|
35
35
|
- pkg/bvwack-0.0.2.gem
|
|
36
|
+
- pkg/bvwack-0.0.3/bin/bvwack
|
|
37
|
+
- pkg/bvwack-0.0.3/bvwack.gemspec
|
|
38
|
+
- pkg/bvwack-0.0.3/lib/bvwack/bvwack_version.rb
|
|
39
|
+
- pkg/bvwack-0.0.3/lib/bvwack/convert.rb
|
|
40
|
+
- pkg/bvwack-0.0.3/lib/bvwack.rb
|
|
41
|
+
- pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bin/bvwack
|
|
42
|
+
- pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bvwack.gemspec
|
|
43
|
+
- pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/bvwack_version.rb
|
|
44
|
+
- pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/convert.rb
|
|
45
|
+
- pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack.rb
|
|
46
|
+
- pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/Rakefile
|
|
47
|
+
- pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/README.md
|
|
48
|
+
- pkg/bvwack-0.0.3/pkg/bvwack-0.0.2.gem
|
|
49
|
+
- pkg/bvwack-0.0.3/Rakefile
|
|
50
|
+
- pkg/bvwack-0.0.3/README.md
|
|
51
|
+
- pkg/bvwack-0.0.3.gem
|
|
36
52
|
- Rakefile
|
|
37
53
|
- README.md
|
|
38
54
|
homepage: ''
|