New stuff since last time:
- Switched from MySQL to SQLite (more portable)
- Support FLAC to Ogg transcoding - browsers don't support FLAC for some reason
- Client supports playlists better - can switch between them, and it auto-saves them
- Random and repeat modes
- Fixed some problems with unicode
- Fixed a few AJAX race conditions - sure there's plenty more lurking though
- 'Special' playlists - currently the only special playlist is a dynamic random mode. What this is is a playlist that keeps populated with about 10 random tracks from the one that's playing. It recycles old ones so you have about 20 tracks on there at once. It plays nicely with user interaction too, so you can append new tracks and delete ones you don't like and it should work around you.
Obligatory screenshot of dynamic random mode, not that a screenshot shows much:
it's still a bit ugly.
Because I've switched it to SQLite, it's probably in a state that overly enthusiastic users could try it out, but you're on your own with setting that up for the moment (clue: you need Python and Flask installed, run
python server.py and browse to localhost:5000. The path to your collection is hardcoded in server.py. You'll also need to create an SQlite DB:
sqlite database.db. It should set up the schema automatically.).
There's a fairly major issue with respect to the actual serving of media files and how browsers interpret them. It seems like if they are served as contiguous data via a HTTP200 response, browsers can't seek in the files. Even more problematic, Chrome won't fire the 'onended' event, so we have to poll to try to figure out when a track has finished playing. This is really bad and far from bulletproof; we're relying on the meta-data being correct, which isn't always the case. It also means gapless playback is unobtainable currently.
This is technically a browser issue, but I think the files need to be served via HTTP 206 (partial content), but Flask doesn't support this, so at some stage (pending a test), support for HTTP 206 will probably need to be written into server.py.
There is a bug report, which agrees with me, but it hasn't had any attention.