--- /dev/null
+#
+# Copyright Michael Orlitzky
+#
+# http://michael.orlitzky.com/
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# http://www.fsf.org/licensing/licenses/gpl.html
+#
+
+require 'open-uri'
+require 'vendor/ruby-progressbar/progressbar'
+
+# Just a couple of convenience methods for URIs.
+# These could be monkey-patched in, but with only
+# a few methods, that'd be asking (unnecessarily)
+# for trouble.
+class UriUtilities
+
+ # Get the filename portion of a given URI.
+ # Return nil if there is no filename portion.
+ def get_filename(uri)
+ return uri.path.split('/').last
+ end
+
+
+ # Download the given URI object to <outfile_name>.
+ # Should use the progress_proc parameter to show
+ # a progress bar using the Ruby/ProgressBar library.
+ def download_with_progress_bar(uri, outfile_name)
+ # We wrap the whole thing in a begin/rescue so that
+ # we can clean up afterwards in case of an error.
+ begin
+ open(outfile_name, 'wb') do |outfile|
+ pbar = nil
+ uri.open(:content_length_proc => lambda {|content_length|
+ if content_length && (0 < content_length)
+ pbar = ProgressBar.new("Download", content_length)
+ pbar.instance_eval { @bar_mark = '=' }
+ pbar.file_transfer_mode
+ end
+ },
+ :progress_proc => lambda {|size|
+ pbar.set(size) if pbar
+ }) do |video_file|
+ outfile.write(video_file.read)
+ end
+ end
+
+ # Toss out an empty line to get rid of the progress bar.
+ # Normally, it would remain on the shell's "current" line.
+ puts ''
+
+ rescue Errno::EACCES => e
+ # Don't delete the file if it's unwritable.
+ raise(e)
+ rescue => e
+ # Here we get rid of the output file if there was an error.
+ # We test File.exists? first since the first line, the open()
+ # call, could theoretically fail.
+ File.delete(outfile_name) if File.exists?(outfile_name)
+ raise(e)
+ end
+ end
+
+end