Often when I work with ExpanDrive the files I am working on correspond to some website that I own. When I’m mounted with ExpanDrive each file is accessible via “my hard drive” in the mounted volume and, more importantly, from a web URL! I found myself repeatedly opening up my browser and manually typing the URL for files that I just uploaded or edited. This was error prone, especially if some of the characters needed encoding. So, I spent some time to write up a Ruby script that can read ExpanDrive’s preferences, build the file’s “web URL,” and open it in your default browser.

Simple to Use
I followed along with ExpanDrive’s previous command line tool named expan and named my script expanurl. Given no arguments it will open the current directory via its web URL, or you can give a list of files and each will be opened at their web URLs. Its usage is pretty straightforward but there is a single catch: the server setting in an ExpanDrive Drive may not be a true one-to-one mapping with the web server’s address.
For example: I provide holly.cs.rit.edu as the server value for one of my personal ExpanDrive drives. However, when I view files on that server (inside the public_html directory) they have a much different looking URL: http://www.cs.rit.edu/~jjp1820/. The result? The script simply keeps its own mapping of ExpanDrive server values to their associated web page prefixes. When you use expanurl on a Drive you have never used it on before the script will prompt you for that mapping, store the value, and never ask again.
Here it is in action. I have removed all stored mappings so I can demonstrate what it would be like using expanurl for the first time. Here I use it on my BogoJoker ExpanDrive drive:

Notice that in the prompt it tells you:
- the server that the ExpanDrive volume is linked to and the one you will be providing a web url prefix for
- an example of a web url prefix (useful)
- where the mappings are stored in case you need to edit them later
The script is available on GitHub, so feel free to contribute and improve. Here is a link to the always current version, and here is a snapshot of the current version at the time of writing:
require 'uri'
require 'yaml'
def err(msg)
puts msg
exit 1
end
class UrlMap
MAP_PATH = File.expand_path('~/.expanurl')
def initialize
@hash = load
end
def load
if File.exists?(MAP_PATH)
YAML::load_file( File.expand_path(MAP_PATH) )
else
Hash.new
end
end
def add_mapping(server, mapto)
@hash[server] = mapto
File.open(MAP_PATH, 'w') do |file|
file.write(@hash.to_yaml)
end
end
def is_mapping?(server)
@hash.has_key?(server)
end
def get_mapping(server)
@hash[server]
end
def path
MAP_PATH
end
end
mapping = UrlMap.new
url_prefix = nil
server = nil
volume = nil
pwd = `pwd`
match = pwd.match(/^\/Volumes\/([^\/]+)/)
if match.nil?
err("Not inside an ExpanDrive Volume")
elsif !pwd.match(/\/public_html\/?/)
err("Not inside a public_html directory.")
else
volume = match[1]
defaults = `defaults read com.magnetk.ExpanDrive Drives`
defaults.gsub!(/\n/, '')
props = defaults.match(/\{[^\}]+driveName\s+=\s+#{volume}[^\}]+server\s+=\s+"([^"]+)"[^\}]+\}/)
if props
server = props[1]
else
err("This Volume (#{volume}) is not an ExpanDrive Volume")
end
end
if mapping.is_mapping?(server)
url_prefix = mapping.get_mapping(server)
else
puts
puts "This is the first time you've used expanurl for #{volume}"
puts "Please Provide us with a mapping for #{server}"
puts "Mappings are stored in #{mapping.path}"
puts "Example: http://bogojoker.com/"
print ">> "
url_prefix = gets.chomp
url_prefix += '/' unless url_prefix.match(/\/$/)
mapping.add_mapping(server, url_prefix)
puts
puts "Server: #{server}"
puts "Maps to: #{url_prefix}"
puts
end
subpath = pwd.match(/public_html\/?(.*)/)[1]
subpath += '/' unless subpath.length.zero? || subpath.match(/\/$/)
url_prefix += subpath
if ARGV.size == 0
`open #{url_prefix}`
else
ARGV.each do |filename|
`open #{url_prefix}#{URI.escape(filename)}`
end
end
How it Works
The Ruby Script grabs the current working directory using `pwd` and checks to make sure you’re in an ExpanDrive volume. ExpanDrive volume’s are dynamically generated by parsing the ExpanDrive preferences thanks to their foresight to make them accessible via the `defaults` command. So if you’re in an ExpanDrive volume and inside a public_html directory expanurl will then use its mapping to open a uri encoded web url in your default browser with the `open` command.
The mappings are stored in a hidden YAML file in your home directory (~/.expanurl). This style of storing preferences is just like dozens of other command line applications and scripts. YAML is just a lightweight textual data format popular with Ruby, similar to JSON and XML. Its so simple that you could edit the file yourself if you wanted/needed to. For instance here is what is in mine, just two simple key/value pairs:

The Future
Its just that simple. Being a Ruby Script you can call this from GUI applications, anything with built-in shell access, etc. It should play friendly with your usual Unix tools. I will likely make this script more and more robust if others find it useful, so I’d be happy to hear some feedback.
Cheers.