]> gitweb.michael.orlitzky.com - dead/whatever-dl.git/blobdiff - src/uri_utilities.rb
Added independent (non-wget) file downloads via open-uri.
[dead/whatever-dl.git] / src / uri_utilities.rb
diff --git a/src/uri_utilities.rb b/src/uri_utilities.rb
new file mode 100644 (file)
index 0000000..61d57af
--- /dev/null
@@ -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 <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