My Recommendation?

I woke up this morning to find that Fredrik had developed yet another excellent and surprising Banshee plugin. This one totally has me hot for playing music. recommendations

That’s right, as you listen to music, the pane below the track list shows recommended/similar music ala Go Fredrik, Go! I have a good feeling there will be much more to come on this one. ;)

The Implemented Window

I am very pleased to report that first Banshee “programming contest” was a success. I received great feedback over the idea, and more importantly, four top-notch submissions. The judging was difficult because each submission was well written and each functioned properly.

So without further ado, I bring you Felipe Almeida Lessa’s winning implementation, now committed to Banshee Subversion (see previous post for checkout details), just as it was submitted.

Felipe's Implementation

This is an excellent implementation, and with just a few tweaks and an extra sprinkle of love, will become the next official Banshee plugin. Many thanks to Felipe and the other submitters.

One of the things that intrigued me was that each submitter mentioned that working with the Banshee code/APIs was easy and enjoyable, or to quote Felipe, “It’s actually quite easy and fun to work with Banshee’s code, it’s very clean…” This leaves me with hope that more people, like you, will take the plunge into the Banshee internals. I hope to get more samples and documentation on the wiki this week to make getting started even easier.

Because this first one worked so well, I would like to do this maybe once a month, so if you have any ideas for a contest or would like to sponsor a small prize, please send me a mail or find me in an applicable channel.

Finally I must mention this: Paul Kuliniewicz, author of “Music Applet” has added Banshee support to the latest release and is calling for testers. Great stuff!

Implement this window, win a prize!

Last night Jorge (aka whiprush) was asking about a Mini-Mode for Banshee. I initially said it would probably be some time before such a feature showed up in Banshee land, but after some quick thought, and realizing once again the full potential of the new player engine core, I said it could be done in a few hours.

Banshee Mini-Mode Mockup

However, I think you should do it, oh dear Banshee enthusiast! So here is our proposal: The above screenshot is a mockup. If you choose to accept the challenge, you are tasked with implementing this design as a Banshee Plugin. I am estimating it can be done in maybe 100-200 lines, and most of that can be little cut-n-paste snippets from the main interface to update the mini-mode interface based on the player engine state, etc. That simply involves listening to the Banshee player engine message bus. There are many reusable Banshee widgets that will be of help.

The Starting Line

I am providing the boilerplate plugin code and build system, and a glade file that you can optionally use. It’s up to you if you want to implement the mockup above or do something totally different. However, your implementation should at least perform all functions shown in the mockup.

Additionally, the plugin needs to integrate with the “View” menu in the main Banshee interface. When this menu item is activated, the main interface is to be hidden, and the Mini Mode interface will be shown. The Mini Mode interface should have a way to reverse this behavior to restore the main interface.

For the Serious

I recommend using Banshee from HEAD to develop against, but a later (0.10.8+) release should suffice. Everyone should start from the banshee-minimode-plugin boilerplate, which can be checked out from Banshee Subversion:

svn co svn://

For all the details and some hints, read the README file. Makes sense, right? Be sure to read this before you get ./ happy!

Also, and this is important: in an effort to attract some new faces, if you have any significant experience with the Banshee codebase, please sit off to the side and twiddle your thumbs :-D

The Finish Line

All submissions should be emailed to me by 3PM EST on Monday, March 27, 2006 (details in the README). We will review the submissions and rate the implementation objectively and the interface design, well, subjectively :) The author of the favorite submission can talk with Jorge, who has offered to provide something that is comparable in value to a CD or DVD (Book, Amazon Wishlist?), or just eternal fanboyism.

The Final Thought

Remember: this idea is all about fun, and I hope it helps folks like you to get your hands a little wet with Banshee code. If you do not agree with or find this idea unappealing, say nothing, and continue living your glorious day: I still love you!

Finally, in the name of “keeping it interesting,” Jorge gets all the credit for the idea, I’m just making it a reality.

More from the Banshee Universe

At around 4 this morning I released Banshee 0.10.9, which encompasses some excellent changes.

I wrote two widgets that work together to make seeking and position reporting easier and more abstracted, which fits in well with the new PlayerEngine layout. The position label now draws a subtle progress bar behind its text when a stream is buffering. Because the seek/position widget is now decoupled from the main UI, I added a “Seek To” dialog that is resizable, if ultra-precision seeking is desired. Seeking is also now performed “live” – releasing the seek slider is not necessary to seek.

Banshee Stream Buffering

In addition to seeking and buffering changes, Banshee will handle metadata extracted from the playing stream and display it in the track info header. This works against the GStreamer 0.10 engine.

Next up was some much needed work on audio CD ripping. Or to be more specific: the combined task of both playing and ripping a CD. Ripping and playing has worked well for quite some time, but one fault has been that playing a CD while ripping has not been easily possible. This has been improved drastically. First, if the disk is playing when a rip is started, playback stops. Next, all tracks on the CD are disabled for playback in the track list. As the tracks are ripped, they become playable again in the track list. Their internal URIs are updated to the ripped copy and will no longer play off the CD directly. To both listen to and rip a CD, one only has to wait for the first track to rip to begin listening to the album sequentially.

Banshee CD Ripping

In the plugin world, work has started on an iRadio plugin, and the Podcasting plugin Mike Urbanski is working on should be available soon. Also, Jon Lech Johansen of MP3tunes has been working on an MP3tunes music locker plugin, which is now available in Banshee Subversion.

Banshee MP3tunes

Finally, in the DAP world, Gabriel Burt has made great progress with generic mass storage support, including landing many FDI patches in HAL CVS. Patrick van Staveren has also started investigating MTP support, which is the successor to NJB. At the moment, device detection and track listing is working.

… of course, more to come soon …

This world is coated in cheese

Last night I released Banshee 0.10.8. I started reworking how the player engines work last Monday. Access to the player engines are now fully abstracted so the interface is entirely passive. This means that plugins can now do anything in terms of playback that the UI has always been able to do. I also modeled the new event/state system after the wonderful message bus idea in GStreamer 0.10.

This is all leading somewhere: the upcoming podcasting, iRadio, and streaming plugins. The player engines will be enhanced to be better suited for streaming (will send buffering messages, etc. so the UI can let the user know what’s going on). To test this, I have added a simple new “Open Location” dialog. You can now listen to a single arbitrary URI. I will also start working on updating stored metadata from metadata found in the stream. That’ll be neat.

The other major new “thing” in 0.10.8 is the Helix playback engine. To allow for 64 bit builds of Banshee with Helix support, I have moved playback out of process. I started a new module, helix-dbus-server, that exports the Helix hxclientkit API over DBus. In Banshee I have implemented a HelixRemote PlayerEngine to act as a client. This will allow for 64 bit builds of Banshee and a 32 bit build of helix-dbus-server. Helix is of course not 64 bit ready.

In other news, I shared my heart-attack fries with Wendy at a party over the weekend. She was delighted to indulge, and I was… simply amazed. Unfortunately, no one else seems to share our enthusiasm.

Heart Attack Fries Heart Attack Fries

On Sunday I countered it all with a long early morning run (it’s been a while) and no food. Today I ate a really awesome salad with homemade dressing.

A week or two ago, I found out that the photo of me eating the Ruby Tuesday’s Ultimate Colossal burger was published on an article about the burger on It was rather hilarious, though I don’t think the author really understood the expression on my face. I need to enter the timed contest.

Ah… time for some Colbert…

Banshee 0.10.7

I’m happy to say Banshee 0.10.7 is out, which finally includes the full GStreamer 0.10 port. I had ported the playback engine a few months ago for 0.10.0, but now the ripper and transcoder are complete.

Also new for this release is Bonjour/mDNSResponder support for DAAP. This means DAAP in Banshee works with both Avahi and Bonjour.

Though I personally find the genre concept absolutely useless, thanks to Oscar Forero, 0.10.7 has genre support in the interface (it’s always been supported behind the scenes).

The last major new feature for 0.10.7 is simple in implementation, but really cool. Behind the scenes is the addition of the IImportSource interface, and four implementations: FolderImportSource, FileImportSource, HomeDirectoryImportSource, and AudioCdSource. The first three implementations were refactored from the import code that was previously in the main interface, and the last implementation was simply extending the existing AudioCdSource to implement IImportSource.

What does this mean? A few things. The first goal was to provide a nicer importing interface with the main goal of allowing a user to easily import an audio CD from an initial popup dialog if the library was empty. It gives the first time user an easy starting point for exploration of the application.

The new Import Dialog

If the dialog is active and no audio CD present, and the user inserts one, then the combo box, like the source list in the main interface is updated to reflect the presence of the CD. The “Import Files/Import Folder” menu options were removed in favor of just “Import Music,” which launches the new import dialog. (Why there’s a need to differentiate between Import Folder and Import Files can be left for another discussion).

It should be relatively trivial to have DapSource implement IImportSource as well. When a DAP is plugged in, “Importing” it could literally mean “copy all the music from this device to my library.”

What’s more interesting however is that plugins can now provide and register their own IImportSources. To demonstrate, I spent a little time this afternoon implementing a BeagleImportSource. It simply queries Beagle for audio files, and adds them to the Banshee library. While it’s still a work in progress, some brave souls may wish to give it a try: svn co svn://

BeagleImportSource in the new import dialog

I’ve been hesitant to support GNOME VFS in the core, but writing a GnomeVfsImportSource would be fairly trivial for anyone who wants to take it on.

Finally, Gabriel Burt and Wade Berrier have been working on mass storage DAP support. Gabriel committed a first pass at it, but the plugin does not yet get installed. The next release may feature it by default.

Update: Thanks again to Gabriel and to Danny Kukawka for helping to get the DAP Probes turned into FDI entries. FDI entries for the 17 probes I received, plus a handful of other devices have landed in HAL HEAD!

2006-03-07  Danny Kukawka 

* fdi/information/10freedesktop/10-usb-music-players.fdi:
  Added several USB mp3 player to fdi file:
  - added patch from Gabriel Burt (gabriel .burt gmail) for 17 new devices
  - applied patches and added new devices from fd.o bugs: 6095, 6102,
    6107, 6130, 6135, 6140, 6148, 6155, 6156, 6160

DAP Probes

In late November, I wrote about Universal DAP Support, where I posted a simple Mono tool that collected data about a Digital Audio Player, which could be used to help create FDI files for HAL.

I received many probes for various devices, including many duplicates. I have not yet found time to start implementing generic USB Mass Storage DAP support in Banshee, but doing so should be fairly simple and straight forward. Implementing a single class should be all that is necessary: Banshee.Dap.DapDevice. If anyone is interested in implementing this, please get in touch with me. If no one steps up to do this, it may be many more months before I can get around to it.

In somewhat of a response to James’ post, Rhythmbox Needs You!, I took about an hour this morning to filter through the probes in my mailbox and have published them. Many thanks to everyone who sent a probe! There’s no sense in them sitting stale in my mailbox for a few more months. And congratulations to Rhythmbox on Generic DAP support!