Posted by Larry Karnowski
Mon, 21 Jul 2008 00:22:00 GMT
Here are some important lessons I learned about accurately copying MP3s (or really any kind of file) from a Linux ext3 filesystem to an external USB hard-drive using FAT32.
When mounting the USB hard drive, be sure to use iocharset=utf8 in your mount options. (To be safest, I put this in my /etc/fstab so I won't forget it.) Otherwise you will have problems creating directories or files that have European or Asian characters in their names. I had some real problems with all the Mexican, Celtic, and Yako Kanno albums I own. Rsync will just flat out refuse to create them without this option. (And forget the Icelandic heavy metal. It's right out.)
Similarly, when mounting, you might want to include the "shortname=mixed" mount option too. Although I personally didn't have a big problem with this, several posts I read online mentioned that rsync might try to upload a file multiple times. The issue is that since FAT32 stores both a short-name (remember the 8.3 names?) and a long-name, the filesystem can get confused occasionally. Again, I didn't see this myself. I used the option, though, with no trouble.
Lastly, don't use the standard "rsync -a" (archive) flag. It tries to maintain user and group ownership, and FAT32 doesn't support either so you get a lot of "chown NO PERMISSION" errors, etc. Basically, you're making rsync do more work than it has to. Similarly, the "-a" option also tries to preserve symlinks which FAT32 doesn't support. I'm not really sure what would happen in that case, probably more warnings. Instead use "rsync -rt" to recurse through each subdirectory and to maintain the file's last modified time. That's about all FAT32 will let you do!
Hope this helps! Keep rockin'!
Tags backup, external, fat32, linux, mp3, rsync, usb, utf8 | 2 comments
Posted by Larry Karnowski
Fri, 07 Mar 2008 14:55:00 GMT
So you want to play MP3s from your web application? The best tool I've found for that is Scott Schill's SoundManager2 Javascript API. It invisibly uses a very small Flash object to play the MP3s, and the whole thing is very scriptable through Javascript. Getting it set up is not difficult, but it's a little bit of a pain -- so I wrote a Rails plugin!
Here's what you do:
Install the Rails plugin like this:
./script/plugin install http://soundmanager2.rubyforge.org/svn/soundmanager2
Then run the generator to get the SoundManager2 files in your app:
./script/generate sound_manager2
You'll notice the following files are created:
public/soundmanager2.swf
public/javascripts/soundmanager2.js
public/javascripts/soundmanager2-jsmin.js
public/javascripts/soundmanager2-rails.js
public/images/SoundManager2/pause-control.gif
public/images/SoundManager2/play-control.gif
Then, to add basic play/stop functionality to your view, add the following to your ERB file:
<%= javascript_include_tag :defaults %>
<%=
sounds = [
["sound1", "http://url/to/sound1.mp3"],
["sound2", url_for(:controller => "sounds", :action => "listen", :id => "2")],
]
%>
<%= initialize_sounds(sounds) %>
<div>Play sound 1: <%= toggle_sound "sound1" %></div>
<div>Play sound 2: <%= toggle_sound "sound2" %></div>
- Or, if you want more functionality, start calling the SoundManager2 Javascript APIs directly.
Here are some screenshots of this plugin in action. Here you're looking at part of a table with MP3s ready to play...

And then here you've clicked on the middle song. Note the MP3 will start playing immediately, even while it's downloading!

Clicking the "pause" button will stop the playback.
Here are the project links:
Oh, and by the way, both the Javascript API and Rails plugins are released with BSD/MIT licenses!
I'm definitely wanting to put more "off-the-shelf" behavior in this plugin, but for now the simple play/stop behavior is all my application needs. If you need something else, or want to send me some patches, please shoot me an email!
Tags mp3, plugin, rails, ruby, rubyforge, soundmanager2 | 2 comments