Monthly Archives: March 2010

5 Must-have Squeezebox Plugins

I hope that when Everett grows up and remembers about his early childhood, that one of the things he’ll say is “My house was filled with music.”  In other words, I’ve been spending some quality time on paternity leave rocking my Squeezebox.   :-)

One of the coolest things about the Squeezebox is the fact that it’s powered by open-source software with a vibrant ecosystem of third-party plugins that extend its features in all sorts of cool ways.  I’m now closing in on four years of ecstatic Squeezebox ownership, and I just realized I’d never shared the “must have” plugins that really make the Squeezebox really sing.   Here’s a quick rundown on how I’ve achieved open-source digital audio nirvana.

  1. MusicIP.  Even though it’s sort-of-abandonware at this point, MusicIP is still the single most compelling add-on for Squeezebox.  If you’ve used iTunes’ “Genius” feature, it’s sort of like that, except lots smarter.  MusicIP actually generates an acoustic analysis of all of your songs.  Then, given a starting song, artist, album or genre, it can find other songs that actually sound similar, which makes for an amazing way to take a “semi-random walk” through your music collection.  Not only is MusicIP much smarter than iTunes’ misnamed Genius, it’s very configurable, so you can decide how random those mixes are.  (Note: even if you’re not running a Squeezebox, you can still use MusicIP standalone or with iTunes.)   MusicIP has single-handedly revolutionized the way I listen to music, and more than anything else, I think it really unlocks the power of an all-digital music experience.
  2. TrackStat.  Long a favorite of the Squeezebox cognoscenti, I’m a recent adopter of TrackStat, Erland Isaksson’s amazing music statistics plugin.   TrackStat lets you rate your songs–and even better–it auto-rates songs as you play them.  Play something through to completion, and its rating goes up.  Skip it before it gets halfway finished and the rating goes down.  It also keeps track of how often each song gets played.  Over time, it builds up a very rich library of stats about your listening preferences, without you having to lift a finger.   Then, Erland’s companion plugin Dynamic Playlists lets you easily build playlists based on your stats, for example to find your favorite not-recently-played songs.  Good stuff.
  3. NPR Radio.  Makes it one-click easy to get your favorite NPR stations or programs streaming on your Squeezebox.  Now if only KUOW would drop the incredibly repetitive 15-second promo spot they tack onto the beginning of each streaming session, I’d be in internet radio heaven!
  4. Lazy Search Music.  Hey, I’m lazy!  Lazy Search Music makes it way easier to quickly search for music using the Squeezebox’s numeric keypad-based remote control.  Without Lazy Search, Squeezeserver requires multiple button-pushes  to enter each search character.  With Lazy Search, you just press each letter once and it does fuzzy matching, which is much much faster.
  5. FindArt. Lets you find missing cover art for your albums.  It’s not truly a mass search-and-download tool (for that I use a standalone program called Album Art Downloader), but it’s a really handy tool for filling in gaps.

Noted in brief – 3/26/2010

55 hours

Everett Charles Stahl is fast approaching his 55th hour of life, looks like he’ll be spending most of it asleep (as will his tired-but-jubliant Mom).  Here’s what we know so far: Pretty darn cute.  Prefers sleep to suckling.  Good set of lungs, but appears to have some sense of discretion about when to use them.  Strong pooper.

I now understand why so many people say that the greatest day of their life was the day their child was born.  It’s hard to believe that joy this intense can exist.

Onwards, little guy.  I love you.

Technology is not the question or the answer

My friends Tim Walker and Michael Silberman have been doing some thinking about the long-term problems with many of the approaches to date about social change + technology and have popped out a provocative (and very welcome!) manifesto about the need for “web thinking.”

http://www.echoditto.com/insights/webthinking

I was honored to contribute some thoughts on the early drafts, and while I don’t think it’s perfect, the final version is a must-read if you’re serious about changing how change happens.   It’s great to see people engaging in serious, big-picture critical thinking like this.  The conversation’s already going on in the comments.  You should join in.  See you there in five.

More thoughts on automated image optimization for Plone

Last June, I wrote up some initial thoughts about how Plone could to more to help folks with limited experience preparing images for the web.    It got quite a bit of favorable response, but then I went off on sabbatical and haven’t followed up, until now.  I’m more convinced than ever that this is a good idea, and I really want to build some energy and resources around it.

Here’s some updated thinking on what I think could be done, both in core Plone and in a new add-on product, along with a simple wireframe and some implementation notes.

Making core Plone smarter

Plone 4 includes a frequently-requested feature that makes images much smarter: through-the-web configurable image scales.  Previously, these were hard-coded into ATContentTypes.  Now, we have a new “Image Scales” control panel, and site admins can add, edit and remove image scales.  This makes it much easier to provide the image scales site users need, and to eliminate the ones they don’t.  Nice work!

There’s one more change that I think should happen here:

Let’s make the amount of JPEG compression that PIL applies be easily configurable.  Right now, it’s hardcoded into our zope.conf, and it’s really, really high.  When we prep images for the web here at Groundwire, we typically use a compression quality of 60.  I think that it would make a lot of sense to expose this variable through-the-web in the Image Scales control panel configlet.

Rough Spec for an “Image Optimizer” Add-on Product

Ok, now here’s where the cool stuff starts.  Here are my updated thoughts on an add-on product that I think would really make life easier for sites that have lots of poorly-optimized images.

I imagine an “Image Optimization” control panel configlet that will present a UI that allows the user to:

  1. Walk the site catalog, looking for all objects that are Image-ish (i.e. have an image field) and contain images that are in JPEG, PNG or GIF format.
  2. Look at the pixel dimensions and the filesize of each image.
  3. Find images where the “bytes per pixel” (filesize/*(height*width)) is higher than a certain “reasonable” value.  (0.5 bytes per pixel seems about right to me, based on the idea that a 150X150 pixel JPEG image shouldn’t weigh much more than 10kb.  (Obviously, these settings should be user-editable.)
  4. Present the user with a list of “suspiciously large” images, along with their pixel dimensions, filesize, bytes per pixel and a preview.
  5. For images with dimensions that are larger than user-specified value, offer to resize them.
  6. For images that are too “heavy per pixel,” offer to apply more compression (for JPEGs) or convert to JPEG (for GIFs/PNGs)
  7. Apply changes via a separate process (via plone.app.async) with AJAX updates so that Zope doesn’t bog down.
  8. Afterwards, offer to rebuild Plone’s auto-resized images afterwards from this new original.  Purge caches as necessary.

Here’s a wireframe of what I’ve got in mind:

A few more implementation notes/questions:

  • Alec Mitchell recommended using ImageMagick, because it offers much better quality than PIL.   I think this also seems sensible, because it would offer an easy way to spawn the intensive image manipulation work off into a separate process.  An outside-of-Zope processing approach such as plone.app.async is probably worth looking at as a model.
  • Resize, then convert, then compress.
  • JPEGs should be compressed via ImageMagick.
  • PNGs could potentially be compressed by running through OptiPNG.
  • GIF’s can’t be compressed
  • Use AJAX to refresh the screen on scan and as optimization proceeds.  Show optimization results by crossing out weight/dimension/density and replacing with new values.  (Hide unselected images when you hit Optimize.)  Total up savings at the bottom when optimization is complete.
  • Can Plone’s image scale rebuild be run in the background via plone.app.async so we don’t tie up a Zope process?
  • Plone 4 support is required; Plone 3 support would be very nice and would probably greatly increase the value of this product.
  • For extra bonus points, warn the user of unoptimized images right after upload, and offer to fix it “on the spot.”

Somewhat randomly, I also wanted to take note of Kurt Bendl’s useful recipes for limiting the max KB and pixel dimensions of uploaded AT Images and Files.  This might be useful and/or worth exposing in a TTW setting.

Next steps

Doing a mediocre job on this would probably be pretty easy, but it will take some focused effort to really nail the details that will make this sing.  I think this is a project worth raising a little bit of money around, and hiring someone good to really own it.

If your clients would benefit from a tool like this, I encourage you to think about whether you can raise some cash from them for a bounty fund.  I don’t have a hard total in mind just yet, but I’m thinking that $3000-$5000 might be a reasonable range.

I’ve got a couple of people in mind that I’d like to approach as possible developers on this, but if this description strikes a chord with you and you’ve got both the passion and skills, let me know!

This also might make a great Google Summer of Code project, in which case I’d love to supplement that by paying an experienced Plonista to be a strong, hands-on mentor and ensure that the project gets done and done right.  (This worked really well with Martin Aspeli and Timo Stollenwerk on plone.app.discussion!)

I’m willing to PM this and be “the customer” and Groundwire can very likely help seed the bounty fund as well.  Let’s make this happen!