bvwack 0.0.4 → 0.0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/bvwack.gemspec +1 -1
  2. data/lib/bvwack/actionator.rb +30 -0
  3. data/lib/bvwack/bvwack_version.rb +1 -1
  4. data/lib/bvwack/cleaner.rb +22 -0
  5. data/lib/bvwack/constants.rb +5 -0
  6. data/lib/bvwack/drycleaner.rb +21 -0
  7. data/lib/bvwack/drywacker.rb +11 -0
  8. data/lib/bvwack/echobasedirs.rb +16 -0
  9. data/lib/bvwack/filelistgetter.rb +53 -0
  10. data/lib/bvwack/help.rb +33 -0
  11. data/lib/bvwack/limiter.rb +16 -0
  12. data/lib/bvwack/lister.rb +26 -0
  13. data/lib/bvwack/options.rb +42 -0
  14. data/lib/bvwack/runner.rb +30 -0
  15. data/lib/bvwack/wacker.rb +12 -0
  16. data/lib/bvwack.rb +23 -1
  17. data/pkg/{bvwack-0.0.2 → bvwack-0.0.4}/README.md +0 -0
  18. data/pkg/{bvwack-0.0.2 → bvwack-0.0.4}/Rakefile +0 -0
  19. data/pkg/{bvwack-0.0.2 → bvwack-0.0.4}/bin/bvwack +0 -0
  20. data/pkg/{bvwack-0.0.2 → bvwack-0.0.4}/bvwack.gemspec +0 -0
  21. data/pkg/bvwack-0.0.4/lib/bvwack/bvwack_version.rb +3 -0
  22. data/{lib → pkg/bvwack-0.0.4/lib}/bvwack/convert.rb +0 -0
  23. data/pkg/{bvwack-0.0.2 → bvwack-0.0.4}/lib/bvwack.rb +0 -0
  24. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/README.md +25 -0
  25. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/Rakefile +7 -0
  26. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/bin/bvwack +3 -0
  27. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/bvwack.gemspec +19 -0
  28. data/pkg/{bvwack-0.0.2 → bvwack-0.0.4/pkg/bvwack-0.0.2}/lib/bvwack/bvwack_version.rb +0 -0
  29. data/pkg/{bvwack-0.0.2 → bvwack-0.0.4/pkg/bvwack-0.0.2}/lib/bvwack/convert.rb +0 -0
  30. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/lib/bvwack.rb +1 -0
  31. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2.gem +0 -0
  32. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/README.md +25 -0
  33. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/Rakefile +7 -0
  34. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/bin/bvwack +3 -0
  35. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/bvwack.gemspec +19 -0
  36. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/lib/bvwack/bvwack_version.rb +3 -0
  37. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/lib/bvwack/convert.rb +248 -0
  38. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/lib/bvwack.rb +1 -0
  39. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/README.md +25 -0
  40. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/Rakefile +7 -0
  41. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bin/bvwack +3 -0
  42. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bvwack.gemspec +19 -0
  43. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/bvwack_version.rb +3 -0
  44. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/convert.rb +252 -0
  45. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack.rb +1 -0
  46. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2.gem +0 -0
  47. data/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3.gem +0 -0
  48. data/pkg/bvwack-0.0.4.gem +0 -0
  49. data/pkg/bvwack-0.0.5/README.md +25 -0
  50. data/pkg/bvwack-0.0.5/Rakefile +7 -0
  51. data/pkg/bvwack-0.0.5/bin/bvwack +3 -0
  52. data/pkg/bvwack-0.0.5/bvwack.gemspec +19 -0
  53. data/pkg/bvwack-0.0.5/lib/bvwack/actionator.rb +30 -0
  54. data/pkg/bvwack-0.0.5/lib/bvwack/bvwack_version.rb +3 -0
  55. data/pkg/bvwack-0.0.5/lib/bvwack/cleaner.rb +22 -0
  56. data/pkg/bvwack-0.0.5/lib/bvwack/constants.rb +5 -0
  57. data/pkg/bvwack-0.0.5/lib/bvwack/drycleaner.rb +21 -0
  58. data/pkg/bvwack-0.0.5/lib/bvwack/drywacker.rb +11 -0
  59. data/pkg/bvwack-0.0.5/lib/bvwack/echobasedirs.rb +16 -0
  60. data/pkg/bvwack-0.0.5/lib/bvwack/filelistgetter.rb +53 -0
  61. data/pkg/bvwack-0.0.5/lib/bvwack/help.rb +33 -0
  62. data/pkg/bvwack-0.0.5/lib/bvwack/limiter.rb +16 -0
  63. data/pkg/bvwack-0.0.5/lib/bvwack/lister.rb +26 -0
  64. data/pkg/bvwack-0.0.5/lib/bvwack/options.rb +42 -0
  65. data/pkg/bvwack-0.0.5/lib/bvwack/runner.rb +30 -0
  66. data/pkg/bvwack-0.0.5/lib/bvwack/wacker.rb +12 -0
  67. data/pkg/bvwack-0.0.5/lib/bvwack.rb +23 -0
  68. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.2.gem +0 -0
  69. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/README.md +25 -0
  70. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/Rakefile +7 -0
  71. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/bin/bvwack +3 -0
  72. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/bvwack.gemspec +19 -0
  73. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/lib/bvwack/bvwack_version.rb +3 -0
  74. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/lib/bvwack/convert.rb +248 -0
  75. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/lib/bvwack.rb +1 -0
  76. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/README.md +25 -0
  77. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/Rakefile +7 -0
  78. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bin/bvwack +3 -0
  79. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bvwack.gemspec +19 -0
  80. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/bvwack_version.rb +3 -0
  81. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/convert.rb +252 -0
  82. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack.rb +1 -0
  83. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2.gem +0 -0
  84. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.3.gem +0 -0
  85. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/README.md +25 -0
  86. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/Rakefile +7 -0
  87. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/bin/bvwack +3 -0
  88. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/bvwack.gemspec +19 -0
  89. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/lib/bvwack/bvwack_version.rb +3 -0
  90. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/lib/bvwack/convert.rb +248 -0
  91. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/lib/bvwack.rb +1 -0
  92. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/README.md +25 -0
  93. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/Rakefile +7 -0
  94. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/bin/bvwack +3 -0
  95. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/bvwack.gemspec +19 -0
  96. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/lib/bvwack/bvwack_version.rb +3 -0
  97. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/lib/bvwack/convert.rb +252 -0
  98. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2/lib/bvwack.rb +1 -0
  99. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.2.gem +0 -0
  100. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/README.md +25 -0
  101. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/Rakefile +7 -0
  102. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/bin/bvwack +3 -0
  103. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/bvwack.gemspec +19 -0
  104. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/lib/bvwack/bvwack_version.rb +3 -0
  105. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/lib/bvwack/convert.rb +248 -0
  106. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/lib/bvwack.rb +1 -0
  107. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/README.md +25 -0
  108. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/Rakefile +7 -0
  109. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bin/bvwack +3 -0
  110. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/bvwack.gemspec +19 -0
  111. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/bvwack_version.rb +3 -0
  112. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack/convert.rb +252 -0
  113. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2/lib/bvwack.rb +1 -0
  114. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3/pkg/bvwack-0.0.2.gem +0 -0
  115. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4/pkg/bvwack-0.0.3.gem +0 -0
  116. data/pkg/bvwack-0.0.5/pkg/bvwack-0.0.4.gem +0 -0
  117. data/pkg/bvwack-0.0.5.gem +0 -0
  118. metadata +117 -11
@@ -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,7 @@
1
+ require "rake/gempackagetask"
2
+
3
+ spec = eval(File.read('bvwack.gemspec'))
4
+
5
+ Rake::GemPackageTask.new(spec) do |pkg|
6
+
7
+ end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'bvwack'
@@ -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.2'
3
+ 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
@@ -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,7 @@
1
+ require "rake/gempackagetask"
2
+
3
+ spec = eval(File.read('bvwack.gemspec'))
4
+
5
+ Rake::GemPackageTask.new(spec) do |pkg|
6
+
7
+ end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'bvwack'
@@ -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['bin/**/**', 'lib/**/**', 'pkg/**/**', '*']
17
+ s.executables = ["bvwack"]
18
+ s.has_rdoc = false
19
+ end
@@ -0,0 +1,30 @@
1
+ class Actionator
2
+ def initialize(options, to_clean_list, converted_file_list, not_converted_list, to_convert_list, iteration_limit)
3
+ @options = options
4
+ @to_clean_list = to_clean_list
5
+ @converted_files_list = converted_file_list
6
+ @not_converted_list = not_converted_list
7
+ @to_convert_list = to_convert_list
8
+ @iteration_limit = iteration_limit
9
+ end
10
+
11
+ def actionate
12
+ case
13
+ when @options[:wack] == TRUE && @options[:clean_up] == TRUE
14
+ puts("Error! -w (--wack) and -c (--clean-up) cannot be used simultaneously.")
15
+ when @options[:list_converted] == TRUE
16
+ Lister.new(@to_clean_list, @converted_file_list, @not_converted_list).list_converted
17
+ when @options[:dry_run] == TRUE && @options[:clean_up] == TRUE
18
+ Runner.new(:dry_clean_up, @options, @iteration_limit, @to_clean_list, @not_converted_list, @to_convert_list).run
19
+ when @options[:clean_up] == TRUE
20
+ Runner.new(:clean_up, @options, @iteration_limit, @to_clean_list, @not_converted_list, @to_convert_list).run
21
+ when @options[:dry_run] == TRUE && @options[:wack] == TRUE
22
+ Runner.new(:dry_wack, @options, @iteration_limit, @to_clean_list, @not_converted_list, @to_convert_list).run
23
+ when @options[:wack] == TRUE
24
+ Runner.new(:wack, @options, @iteration_limit, @to_clean_list, @not_converted_list, @to_convert_list).run
25
+ else
26
+ man = Help.new
27
+ man.be_helpful
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module BVWack
2
+ VERSION = '0.0.5'
3
+ end