Publishing a folder with Ubuntu One

Ubuntu One has the concept of publishing a file — that is, giving a file in your personal cloud a URL so that anyone can download it, if you tell them the URL — but you can’t currently do that with a whole folder of files. Since that’d be quite a useful thing to be able to do, and it’s not yet supported by U1 itself, I wrote a little script to do it, u1-publish-folder (the script needs you to be on Ubuntu 12.04, which is released next week). Simply do u1-publish-folder /path/to/synced/folder and it’ll give you a URL for the index for that folder; a handy way to get a bunch of files to someone without a U1 account* where they can pick and choose the ones they want (rather than sending them a zip file, or sharing a folder with them).

The way it actually works is to publish all the files in the folder, then create an HTML index file linking to all those published files, then sync and publish the index. So you get a directory listing, like Apache gives you when you browse a folder: List of files in testpublishfolder.

The thing I found nicest about this is working with SyncDaemonTool, the Python U1 controller. Combined with Twisted’s defer.inlineCallbacks stuff, it makes dealing with U1 really easy:

@defer.inlineCallbacks
def dosomething():
    sd = SyncDaemonTool()
    metadata = yield sd.get_metadata("/home/aquarius/Documents/somefile")
    print metadata

Normally, dealing with async stuff is hard, but it’s just dead easy this way; simply throw in a yield and you can write code as if it’s normally synchronous but it’s actually async, so your program doesn’t block while it’s working and you don’t need to invent a zillion “callback” functions (whether they’re anonymous functions or not). I like this.