Grooveshark Desktop

Grooveshark Desktop was my take on a desktop client for Grooveshark. It featured:

  • Bowtie-like miniController with fully customizable themes
  • Media key support
  • Growl notifications
  • reduced pixel waste
  • native Last.fm support
  • miniController, minify, and fullscreen view modes

Grooveshark Desktop recieved over 50,000 downloads, and was even featured on Lifehacker.

search ui screenshot minicontroller screenshot

Grooveshark updated their online app regularly, and the work required to maintain my desktop cleint became overwhelming. I dropped it in favor of spending more time on my studies.

Implementation

My client was implemented as a userscript for the Mac-only site-specific browser application Fluid. To create the seamless double-high menubar, I relied on a specific Fluid feature to totally disable window chrome. I then implemented window-movement as a javascript event handler. The "traffic lights" were also entirely Javascript. I'd like to think that I pioneered the technique of poorly-recreated native UI elements in a thin Webkit wrapper, but really it was all Site-Specific browser programmers. Now thin webapp wrappers are common-place: Facebook Mobile, Rdia, and Spotify are all poorly-disguised webviews masquerading as honest desktop clients

Because Grooveshark Desktop was just a Javascript file and a collection of settings for the Fluid SSB runtime, installation could be a real hassle. A SSB in Fluid consists of several parts:

  • SSB App with its bundle-settings tweaked so that it looks for specially-named files
  • one or more userscripts in ~/Library/Application Support/Fuild/SSBs
  • A regular OS X .plist file in ~/Library/Preferences

I thought an OS X package would be the easiest (and most correct) way for my users to get these pieces into place. Unfortunately, the tools to directly create an OS X package that targets the user's home directory have faded away into obscurity. All the information on the package format I could find was years out of date. I could create packages that targeted /Applications and /Library just fine, but these required administrator passwords and were perceived as intrusive.

I eventually cobbled together a script using the remaining package utils from Xcode 3 from references for Xcode 2 tools and Panther. Took plenty of trial-and-error. The package tools happily build a complaint package to install all the Grooveshark Desktop components into the filesystem root. Then the script unpacks that package, manipulates the auto-generated manifest, flattens the package directories, and the re-compresses everything back into a .pkg file.

The source is still availible online at Github.

How barbaric. "Real" Mac apps are a single bundle that creates default configs on first run. Or they're installed into /Applicaitons by the App Store.