bvwack 0.0.1

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/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "rake/gempackagetask"
2
+
3
+ spec = eval(File.read('bvwack.gemspec'))
4
+
5
+ Rake::GemPackageTask.new(spec) do |pkg|
6
+
7
+ end
data/bin/bvwack ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'bvwack'
data/bvwack.gemspec ADDED
@@ -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,3 @@
1
+ module BVWack
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,216 @@
1
+ require 'optparse'
2
+
3
+ DEFAULT_CONVERT_BASE_DIR = "/Volumes/thundar/media/video"
4
+ DEFAULT_CLEAN_BASE_DIR = "/Volumes/thundar/media/converted"
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.
24
+
25
+ Examples:
26
+ bvwack -dw Shows proposed commands for 2 videos
27
+ bvwack -w -b somedir/anotherdir -n 5 Converts 5 videos under somedir/anotherdir
28
+ bvwack -c -n 10 Moves 10 already converted mkv or avi files to /Volumes/thundar/medai/converted/[od-path]"
29
+
30
+ options = { }
31
+ option_parser = OptionParser.new do |opts|
32
+ opts.on("-d", "--dry-run") do
33
+ options[:dry_run] = true
34
+ end
35
+
36
+ opts.on("-b BASE_DIR", "--base-dir BASE_DIR") do |base_dir|
37
+ options[:base_dir] = base_dir
38
+ end
39
+
40
+ opts.on("-c", "--clean-up") do
41
+ options[:clean_up] = true
42
+ end
43
+
44
+ opts.on("-n NUM_FILES", "--num-files NUM_FILES", Integer) do |num_files|
45
+ options[:num_files] = num_files
46
+ end
47
+
48
+ opts.on("-h", "--help") do
49
+ options[:help] = true
50
+ end
51
+
52
+ opts.on("-l", "--list-converted") do
53
+ options[:list_converted] = true
54
+ end
55
+
56
+ opts.on("-w", "--wack") do
57
+ options[:wack] = true
58
+ end
59
+ end
60
+
61
+ def convert(path_to_file)
62
+ `ffmpeg -i #{path_to_file} #{FFMPEG_OPTS} #{path_to_file.gsub(/mkv$|avi$/, "ipad.mp4")}`
63
+ end
64
+
65
+ def dry_run(path_to_file)
66
+ puts "ffmpeg -i #{path_to_file} #{FFMPEG_OPTS} #{path_to_file.gsub(/mkv$|avi$/, "ipad.mp4")}\n\n"
67
+ end
68
+
69
+
70
+ def get_files(args)
71
+ if args[0]
72
+ args.each do |path|
73
+ if File.file?(path)
74
+ @paths << path
75
+ else
76
+ puts "#{path} is not a real file. Skipping. Try single-quoting the path if it is spacey or ugly."
77
+ end
78
+ end
79
+ else
80
+ puts "Specify the file(s) to convert: ./media/dir/dir/file1.mkv <'./media/dir/dir name/file(2).avi'>"
81
+ end
82
+ end
83
+
84
+ @converted_files = { }
85
+ @not_converted_files = { }
86
+
87
+ def get_all_files(base_dir = DEFAULT_CONVERT_BASE_DIR)
88
+ Dir.chdir(base_dir)
89
+ converted_files = Dir.glob(File.join("**", "*ipad.mp4"))
90
+ converted_files.each do |i|
91
+ @converted_files[File.basename(i, ".ipad.mp4")] = i
92
+ end
93
+ not_converted_files = Dir.glob(File.join("**", "*.{mkv,avi}"))
94
+ not_converted_files.each do |i|
95
+ if File.basename(i).split(".").last == "mkv"
96
+ @not_converted_files[File.basename(i, ".mkv")] = i
97
+ elsif File.basename(i).split(".").last == "avi"
98
+ @not_converted_files[File.basename(i, ".avi")] = i
99
+ end
100
+ end
101
+ end
102
+
103
+ @to_convert = []
104
+
105
+ def get_unconverted_files(converted_files, not_converted_files)
106
+ (not_converted_files.keys - converted_files.keys).each do |key|
107
+ @to_convert << @not_converted_files[key]
108
+ end
109
+ end
110
+
111
+ def clean_up
112
+ if @to_clean.length > 0
113
+ key = @to_clean.pop
114
+ filename = @not_converted_files[key]
115
+ dirname = File.dirname(@not_converted_files[key])
116
+ #puts %Q{mkdir -p "/Volumes/thundar/media/video/converted/#{dirname}" && mv "#{filename}" "/Volumes/thundar/media/video/converted/#{filename}"}
117
+ #puts "This would mv #{@converted_files[key]} /Volumes/thundar/media/video/converted/#{@converted_files[key]}"
118
+ `mkdir -p "#{DEFAULT_CLEAN_BASE_DIR}/#{dirname}" && mv "#{filename}" "#{DEFAULT_CLEAN_BASE_DIR}/#{filename}"`
119
+ else
120
+ puts "No more files to clean. Hooray!"
121
+ end
122
+ end
123
+
124
+ def dry_clean_up
125
+ if @to_clean.length > 0
126
+ key = @to_clean.pop
127
+ filename = @not_converted_files[key]
128
+ dirname = File.dirname(@not_converted_files[key])
129
+ puts %Q{mkdir -p "#{DEFAULT_CLEAN_BASE_DIR}/#{dirname}" && mv "#{filename}" "#{DEFAULT_CLEAN_BASE_DIR}/#{filename}"\n\n}
130
+ else
131
+ puts "No more files to clean. Hooray!"
132
+ end
133
+ end
134
+
135
+ def list_converted
136
+ while @to_clean
137
+ #if @to_clean.length > 0
138
+ key = @to_clean.pop
139
+ converted_filename = @converted_files[key]
140
+ old_filename = @not_converted_files[key]
141
+ dirname = File.dirname(@not_converted_files[key])
142
+ puts "Converted file:\n"
143
+ puts "in Directory #{dirname}"
144
+ p `ls -lh #{converted_filename}`
145
+ p `ls -lh #{old_filename}`
146
+ puts %Q{To test run: open "#{converted_filename}"}
147
+ puts "\n\n"
148
+ #end
149
+ end
150
+ end
151
+
152
+
153
+ option_parser.parse!
154
+ puts options.inspect
155
+ if options[:base_dir]
156
+ basedir = options[:base_dir]
157
+ get_all_files(basedir)
158
+ else
159
+ get_all_files
160
+ end
161
+
162
+ get_unconverted_files(@converted_files, @not_converted_files)
163
+ @to_clean = @not_converted_files.keys & @converted_files.keys
164
+
165
+ if options[:num_files]
166
+ limit = (options[:num_files] - 1).to_i
167
+ else
168
+ limit = 2
169
+ end
170
+
171
+ case
172
+ when options[:wack] == TRUE && options[:clean_up] == TRUE
173
+ puts("Error! -w (--wack) and -c (--clean-up) cannot be used simultaneously.")
174
+ when options[:list_converted] == TRUE
175
+ list_converted
176
+ when options[:dry_run] == TRUE && options[:clean_up] == TRUE
177
+ (0..limit).each do
178
+ dry_clean_up
179
+ end
180
+ when options[:clean_up] == TRUE
181
+ (0..limit).each do
182
+ puts "I would have run clean_up"
183
+ #clean_up
184
+ end
185
+ when options[:dry_run] == TRUE && options[:wack] == TRUE
186
+ (0..limit).each do |i|
187
+ file = @to_convert[i]
188
+ dry_run(file)
189
+ end
190
+ when options[:wack] == TRUE
191
+ (0..limit).each do |i|
192
+ file = @to_convert[i]
193
+ puts "I would have run convert(file)"
194
+ #convert(file)
195
+ end
196
+ else
197
+ puts help_text
198
+ end
199
+
200
+ =begin
201
+ (0..limit).each do |i|
202
+ file = @to_convert[i]
203
+ if options[:dry_run] == TRUE
204
+
205
+ else
206
+ if options[:clean_up] == TRUE
207
+ puts "I would have run clean_up"
208
+ #clean_up
209
+ else
210
+ puts "I would have run convert(file)"
211
+ #convert(file)
212
+ end
213
+ end
214
+ end
215
+ end
216
+ =end
data/lib/bvwack.rb ADDED
@@ -0,0 +1 @@
1
+ require "bvwack/convert"
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bvwack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Robie Lutsey
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-21 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Super simple utility to help you convert all your videos to iPad ready
15
+ files.
16
+ email:
17
+ - robie 0x55D in dec at gmail dit com
18
+ executables:
19
+ - bvwack
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - bin/bvwack
24
+ - bvwack.gemspec
25
+ - lib/bvwack/bvwack_version.rb
26
+ - lib/bvwack/convert.rb
27
+ - lib/bvwack.rb
28
+ - Rakefile
29
+ homepage: ''
30
+ licenses: []
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '1.9'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ requirements:
48
+ - ffmpeg and a libx264-slow.ffpreset (possibly in your ~/.ffmpeg/ directory.) Google
49
+ is your friend.
50
+ rubyforge_project: bvwack
51
+ rubygems_version: 1.8.10
52
+ signing_key:
53
+ specification_version: 3
54
+ summary: bvwack will wack it's way your pile of unconverted video files.'
55
+ test_files: []