X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2Furi_utilities.rb;fp=src%2Furi_utilities.rb;h=61d57af63ea29d84b03ef70b65dfebcbf34e6e32;hb=9390083b114048a6782454a37f799733707ee5dc;hp=0000000000000000000000000000000000000000;hpb=00f5e6f475d07afa862c8f33854d8ed52185ea81;p=dead%2Fwhatever-dl.git diff --git a/src/uri_utilities.rb b/src/uri_utilities.rb new file mode 100644 index 0000000..61d57af --- /dev/null +++ b/src/uri_utilities.rb @@ -0,0 +1,74 @@ +# +# 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 . + # 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