﻿MusicBox - an MP3/OGG Player for the ROX Desktop
by Ken Hayber

027
30-July-2006
- Allow GTK theme to set the toolbar icons (edit musicbox.py if you want to use my icons)

026
4-Dec-2005
- Add native(?) alsa support via pyalsaaudio module
- Realize that pyalsaaudio doesn't play as well as libao and primarily use it for volume
control if pyao is installed :( (at least we don't depend on oss anymore)
- Fix for endian issues with ossaudiodevice, pyalsaaudio and linuxaudiodevice
- Refactor all decoders and output drivers in preparation for AAC support.
- Fix for not specifying device parameter to Player init method.

025
16-Oct-2005
- Fix (?) for string translation (Chinese, etc) for ID3 tags that were not latin1.
- Included Chinese translations properly (missing .gmo files)

024
24-Sep-2005
- Fixes for changed mime-types in shared-mime-info version 0.16
- Fixes for flac support for version 1.1.2
- Misc fixes for ppc/ppc64
- New Chinese translation

023
23-Feb-2005
- Fix bug when adding songs via DnD or command line, does not play.  Index is set wrong.  (reported by Cyrille Mars)

19-Feb-2005
022
- Add Album Cover Art display (supports .DirIcon and
		[.folder|folder|Folder|.album|album|Album|.cover|cover|Cover].[png|jpg]
- Fixed sorting in playlist
- Fixed the save box
- Changed from old Choices system to new basedir system (using hayber.us domain)

14-Jan-2005
021
- Add Wav and Flac support (Flac support is not complete - no tag info is supported,
  seeking during playback does not work)
- Reworked player code for modularity to support the above.
- Filters are back!  And they _really_ work this time.
- Requires PyGTK/GTK 2.4 now :(
- MenuKey patch from Rds for those with evil(Windows) keyboards.

** Note: flac support depends on the pyflac module which you probably don't have.  I included
a copy in the 'flac' directory, but you must build it first.  Just type make in that
folder.  If you have this (e.g. Debian users?) just delete or rename this folder. **

26-Oct-2004
020
- Add support for editing options without starting player
	(in case things are really hosed)
- Add popup message if player cannot find file when asked to play.
- When loading songs and shuffle is on use next() instead of play() so first
	song is random.
- Added Mini toolbar buttons option.
- Use python optparse module in AppRun to make remote control easier.

	usage: AppRun [options]
	options:
	  -h, --help     show this help message and exit
	  --options      display options dialog without running application
	  -l, --load     replace the current playlist with listed songs and start
					 playing
	  -e, --enqueue  add listed songs to the playlist, do not start playing
	  -p, --play     start playing the current song
	  --pause        pause playing
	  --stop         stop playing
	  --next         skip to the next song and start playing.
	  --prev         play the previous song


17-Oct-2004
019
- Tried to stop using threads since many people seem to have problems there,
but only managed to reduce thread use to one (the main player thread).  Without
threads playback was too jumpy.
- Add suggested/requested UI changes:
	* Configurable toolbar like the Filer has (any buttons can be hidden)
	* Show/Hide for toolbar, volume, seek-bar (for minimalists)
	* Toggle for word wrap of text area (just in case you don't like word wrap)
- Tried to fix seek bar (clicking in 'page' area always jumps backwards!) but it
seems to be a Gtk issue (at least as of 2.4.9)
- All new client server mechanism using xsoap.py that I wrote a while back.  This
is based on ROX-Filer's client/server mechanism, but without the XML part.
- Extras folder with tiny little AppDirs to remote control MusicBox
(thanks to Nils-Erik Svangård for the idea and original effort)
- Control for elapsed vs remaining time.

22-May-2004
018
- More user feedback changes;
  * Text display (main window) font settings (Title and others)
  * Text and main display background color settings
  * Proper wordwrap and resizing of text in main display.
  * Fixed repeat bug (always did repeat even if setting was off)
  * Fixed save playlist to xml bug introduced in 016
- Time display now shows elapsed/total instead of just remaining.

13-May-2004
017
- Due to user feedback, changed how Drag and Drop works.
  * Main Window defaults to replacing the current playlist.
  * Playlist Window defaults to appending to the current playlist.
  * Ctrl pressed when dropping on either Window always appends.
  * Shift pressed when dropping on either Window always replaces.
  * When replacing always play after the load completes.
  * At startup with no args or rpc input, don't play.  Otherwise always play.
- Replaced rpc call load_args() with load_songs() and add_songs().  The first
one always replaces, the second one always appends.

13-May-2004
016
- Changed menu to use new Action menu system of ROX-Lib2
- Fixed alignment of text in main window
- Volume and Progress bars have finer stepping now
- Playback thread is created at startup and reused.  Previoulsy each song started a new
thread.  This caused race conditions and occasional lockups.
- Playback now uses a queue to send songs from the main window to the Player.  Avoids
race conditions and lockups.
- Playlist now uses a GtkListModel for its storage.  This avoids needing a separate
structure for the playlist and PlaylistUI.  It also means that the Main Window and
PlaylistUI remain syncronized.  (e.g. Sorting now works properly!)
- Show song title and remaining time in Iconified mode.
- Prevent multiple Playlist windows.
- Make Back/Prev button 'Really' work like a browser.  I mean it this time!
- Went back to the old behavior for importing audio support libs.  Sometimes we would
fail to import something we needed.
- Make sure we send 'pause' state to main window.
- Shuffle cache was never using the value from the Options dialog.  Fixed.
- Initial Playlist window size and column widths fixed to show all info.  Still resizeable.
- Removed Filters (until I can use Gtk 2.4's ListModel.filter_new() feature.  Needs PyGtk 2.4)
- Added DnD to the Playlist! (using XMLrpc to send the info and commands to the main window)

And last, but certainly not least...(OK, maybe it is least.)
- A New (SVG) Icon!!!! (I made it myself.  I are a Artist.)

09-Apr-2004
015
- Oops! Last release broke OGG playback.  For some reason using a buffer larger than 512 bytes
causes lots of ugly distortion.  I forced it to 256 and it seems OK on my system.

09-Apr-2004
014
MusicBox changes:
- Changed version numbering.  I like the simple serial number better than the dot notation.
- Removed the gtkexceptionhook.py thing in favor of a simple rox.report_exception() call.
- Moved the genre list into a separate file to make it easier to share with other apps.
- Updated findrox.py, again :)
- Applied two patches from Eric Gillespie (don't use ':' as separator in DnD paths
and allow relative paths in m3u files)
- Set window borders to 0 to look better in WMs with no window borders.
- When iconized show title and remaining time in title (icon caption)
- Word wrap song title, artist, album in display window
- Refactor player.py a bit and improve error handling.
- Make ossaudiodev the default playback device (instead of ao)
- Update volume control widget if someone else changes PCM volume.
- DnD of directories and playlists does not change your default Library.
Playlist changes:
- Add initial track sorting code (slow!)
- The Prev button now works like a browser Back button.
- Fix long-standing Unicode vs Ansi support in id3 tags.
- Add support for Extended Attributes as song tags
(user.Title, user.Artist, user.Album, user.Genre, user.Track)
Playlist UI changes:
- Remove Type column
- Sort by Track (really sorts by Album, then by Track which is what you would expect)

05-Jan-2004
0.0.13
- Fixed a couple of bugs with crashing on empty playlists.
- Disable controls when no songs in playlist.
- Added InfoWin.
- New French translation from Sébastien Person

20-Dec-2003
0.0.12
- PlaylistUI is nearing completion.  It is useable now and stays synced with the main
	window.
- Finally worked out how I wanted the library vs on-demand playing to work.  Now you can
	easily just play a few songs, or you can save a large list for fast loading (in xml)
- Added xmlrpc to prevent multiple instances and pass commands from the outside.  So now
	if you are aready playing and you launch a new .mp3 file, it just replaces the list
	and starts playing.  Could add XMMS-style remote control with this too.
- Added savebox to the save menu so you can save full or filtered playlists to xml for
	fast loading.
- Added pyid3lib support (optional) for ID3v2 tag support.  Needs separate installation.
	see http://pyid3lib.sourceforge.net and http://id3lib.sourceforge.net
	(Note: due to these changes, loading a big list of songs takes considerably longer
	it seems.  However, now you can at least see the song count as it is loading, you
	can safely start playing while the list is still loading, and you can save the list
	with tag info to xml for fast loading later.  Did I mention the fast loading part?)
- New findrox.py for 0install support.


09-Dec-2003
0.0.11
- Preview Release of next version.  Looking for feedback.
- UI redesign (main window is like Gnome CD player, playlist window is a popup)
- Code refactoring.  Trying for a MVC design (UI->Playlist->Player->libraries(ID3/MAD/OGG)
- Playlist main store is an array now instead of a dictionary.  The dict is what caused
	the default 'sort order' to be other than your directory layout.
- Take advantage of Python 2.3 (currently only ossaudiodev support to enable the volume control)
- Fix: last version slowed down the playlist loading due to enabling the Artist column
	for sorting before the list was filled.  Man does that slow things down!
- New feature: Volume control if you are using Python 2.3 and OSS (or alsa oss emulation)
- New feature: The current playlist can be saved with all the tag info in an XML file
	called Library.xml in your Choices/MusicBox dir.  If this file exists then it will
	be loaded by default when starting.  This greatly speeds up load times for large
	collections.  I'm toying with the idea of making this file iTunes compatible. (I have
	an iBook and and iPod so there is incentive there for me)

	Note: the playlist in this version does very little now, but you can save the library
	from there using the right-click menu.  The main window is mostly complete.


30-Nov-2003
0.0.10
- Bugfixes for python 2.3 support and misc. (thanks Ulrich)
- Added Track number and Comment tag display to the browser
- Added <track> regex tag for guess() function

10-Sept-2003
0.0.9
- Split out the playlist code to allow easier addition of stuff like filtering.
- Rudimentary filtering: single Artist, Album or Genre only for now.
- Added regex pattern for splitting the path/filename into artist/album/title.  This
	is used on initial load and when there is no tag information.  You can edit this
	pattern to match your preference for storing and naming your music.
- Added Spanish translation (thanks Nicolas)
- Refactored player.py to allow song-specific parameters to be passed into the ouput
	driver (fixed problems with mp3 sampled at 22050 instead of the more typical 44100)
- Automatically try linuxaudiodevice if ao fails to import. (not tested)
- Allow menu from right-click on song list (preparing for selection-specific menu)
- Fixed shuffle cache code (int_value not value)

1-Sept-2003
0.0.8

- Fixes for hangs that several people were reporting (need pygtk 1.99.17 or higher)
- Fix to prevent crash when using Seek bar with no song playing.
- Fixes for missing ogg, mad, ao handling.  Requires at least one of ogg/mad and requires
	ao to run.
- Added Shuffle cache to prevent replaying of songs too frequently in shuffle mode.
- Re-layout Options dialog.
- Load initial playlist based on directory structure (Artist/Album/Song), then load
	tag information in the background.  Should speed up initial loading for large
	playlists.  (Works well for me with ~400 songs via 802.11b wireless connection)


29-Aug-2003
0.0.7 (Version 0.0.6 wasn't very good)

- Rewrite player code to use pymad, pyogg, pyao directly.  No more MPG123/321.  This
	gives better control over the player and it now works correctly when using
	esd (you can hear your sound effects and notifications; e.g. 'you've got mail!')
- OGG!
- Playlist support (.pls and .m3u)
- Drag and Drop support - you can drag and drop folders, mp3, ogg, pls or m3u files
	onto MusicBox.  If you hold the Shift key these files will be added to the
	current list, otherwise the list will be replaced.  The result will be saved
	as the default.
- Moved remaining time and current song to the Title bar so that this information shows
	while iconized.
- Italian and Portugese (Brazil) translations (thanks to Yuri and Leandro) - but they
	need a couple of small updates.
- Decided that volume control was not going to happen, so I changed it to a Seek bar
	so that you can skip to any point in the song.  It also keeps moving while the
	song plays.


23-Aug-2003
0.0.5
- Added support for multiple Music folders using ':' as separator (e.g. like PATH).
- Added support for drag and drop of folders into main window.  Dropped folder list
	replaces current library and is saved as the default.
- Loading library is now in a thread so window comes up faster and you can start playing
	before library is completely loaded (for those with large libraries).
- MAY have fixed the bug that some are seeing with mpg321/123 locking up when Stop or
	other buttons are pressed (I fixed a gtk threads issue, but since I have not
	seen the reported problem it may not be the same problem)
- Display song and remaining time on title bar so that minimized player still shows status.
	(This needs some work and should be optional I think)
- I received an Italian translation (thanks yuri), but it is not working.  Someone tell
	me what I'm doing wrong, please.

I've noticed that only ogg123 allows other sounds to be played when using esd.  This
kinda sucks.  I'm looking at doing all the playing in python (pyogg, pyao, pymad) to
see if that works any better.


19-Aug-2003
0.0.4
- Added error handling for missing library path and missing mp3 player.
- Default mp3 player to none and show options dialog at first run.
- Removed 'Time' column for now because a) it was broken and b) when I fixed it it took
	WAY too long to load even my measly 300 song library.
- Fixed Shuffle to use time.time() as the Random() seed to that it is actually
	somewhat Random.
- Don't load mp3 player until needed (first step to supporting ogg)

0.0.3
- Edited the Options.xml to have a big tooltip for the mp3 player explaining some things.
- Edited the README a bit (put MY email address in there instead of Thomas') giving some
	basic instructions.
- Changed mp3 player launching from os.popen2 to popen2.Popen3 so I can get
	the pid and kill it later if necessary (for me it is needed for mpg123, otherwise
	the player never dies and runs at 100%)
- Initial value of mp3 player is now ''.  MusicBox now detects that at startup and
	shows the Options dialog so you can specify your player.  (TODO: Need to detect
	failed player launch and inform the user to try again)

18-Aug-2003
-----------
0.0.2
- Fixed Prev button and rewrote Next button handling to match.
- Implemented Repeat and Shuffle and their options.
- Got ToggleButtons working thanks to this tutorial -
	http://www.moeraki.com/pygtktutorial/index.html


17-Aug-2003
-----------
0.0.1
First release!
