1 MusicBox - an MP3/OGG Player for the ROX Desktop
6 - Tried to stop using threads since many people seem to have problems there,
7 but only managed to reduce thread use to one (the main player thread). Without
8 threads playback was too jumpy.
9 - Add suggested/requested UI changes:
10 * Configurable toolbar like the Filer has (any buttons can be hidden)
11 * Show/Hide for toolbar, volume, seek-bar (for minimalists)
12 * Toggle for word wrap of text area (just in case you don't like word wrap)
13 - Tried to fix seek bar (clicking in 'page' area always jumps backwards!) but it
14 seems to be a Gtk issue (at least as of 2.4.9)
15 - All new client server mechanism using xsoap.py that I wrote a while back. This
16 is based on ROX-Filer's client/server mechanism, but without the XML part.
17 - Extras folder with tiny little AppDirs to remote control MusicBox
18 (thanks whoever sent the originals of these. I can't find the email, sorry)
19 - Control for elapsed vs remaining time.
23 - More user feedback changes;
24 * Text display (main window) font settings (Title and others)
25 * Text and main display background color settings
26 * Proper wordwrap and resizing of text in main display.
27 * Fixed repeat bug (always did repeat even if setting was off)
28 * Fixed save playlist to xml bug introduced in 016
29 - Time display now shows elapsed/total instead of just remaining.
33 - Due to user feedback, changed how Drag and Drop works.
34 * Main Window defaults to replacing the current playlist.
35 * Playlist Window defaults to appending to the current playlist.
36 * Ctrl pressed when dropping on either Window always appends.
37 * Shift pressed when dropping on either Window always replaces.
38 * When replacing always play after the load completes.
39 * At startup with no args or rpc input, don't play. Otherwise always play.
40 - Replaced rpc call load_args() with load_songs() and add_songs(). The first
41 one always replaces, the second one always appends.
45 - Changed menu to use new Action menu system of ROX-Lib2
46 - Fixed alignment of text in main window
47 - Volume and Progress bars have finer stepping now
48 - Playback thread is created at startup and reused. Previoulsy each song started a new
49 thread. This caused race conditions and occasional lockups.
50 - Playback now uses a queue to send songs from the main window to the Player. Avoids
51 race conditions and lockups.
52 - Playlist now uses a GtkListModel for its storage. This avoids needing a separate
53 structure for the playlist and PlaylistUI. It also means that the Main Window and
54 PlaylistUI remain syncronized. (e.g. Sorting now works properly!)
55 - Show song title and remaining time in Iconified mode.
56 - Prevent multiple Playlist windows.
57 - Make Back/Prev button 'Really' work like a browser. I mean it this time!
58 - Went back to the old behavior for importing audio support libs. Sometimes we would
59 fail to import something we needed.
60 - Make sure we send 'pause' state to main window.
61 - Shuffle cache was never using the value from the Options dialog. Fixed.
62 - Initial Playlist window size and column widths fixed to show all info. Still resizeable.
63 - Removed Filters (until I can use Gtk 2.4's ListModel.filter_new() feature. Needs PyGtk 2.4)
64 - Added DnD to the Playlist! (using XMLrpc to send the info and commands to the main window)
66 And last, but certainly not least...(OK, maybe it is least.)
67 - A New (SVG) Icon!!!! (I made it myself. I are a Artist.)
71 - Oops! Last release broke OGG playback. For some reason using a buffer larger than 512 bytes
72 causes lots of ugly distortion. I forced it to 256 and it seems OK on my system.
77 - Changed version numbering. I like the simple serial number better than the dot notation.
78 - Removed the gtkexceptionhook.py thing in favor of a simple rox.report_exception() call.
79 - Moved the genre list into a separate file to make it easier to share with other apps.
80 - Updated findrox.py, again :)
81 - Applied two patches from Eric Gillespie (don't use ':' as separator in DnD paths
82 and allow relative paths in m3u files)
83 - Set window borders to 0 to look better in WMs with no window borders.
84 - When iconized show title and remaining time in title (icon caption)
85 - Word wrap song title, artist, album in display window
86 - Refactor player.py a bit and improve error handling.
87 - Make ossaudiodev the default playback device (instead of ao)
88 - Update volume control widget if someone else changes PCM volume.
89 - DnD of directories and playlists does not change your default Library.
91 - Add initial track sorting code (slow!)
92 - The Prev button now works like a browser Back button.
93 - Fix long-standing Unicode vs Ansi support in id3 tags.
94 - Add support for Extended Attributes as song tags
95 (user.Title, user.Artist, user.Album, user.Genre, user.Track)
98 - Sort by Track (really sorts by Album, then by Track which is what you would expect)
102 - Fixed a couple of bugs with crashing on empty playlists.
103 - Disable controls when no songs in playlist.
105 - New French translation from Sébastien Person
109 - PlaylistUI is nearing completion. It is useable now and stays synced with the main
111 - Finally worked out how I wanted the library vs on-demand playing to work. Now you can
112 easily just play a few songs, or you can save a large list for fast loading (in xml)
113 - Added xmlrpc to prevent multiple instances and pass commands from the outside. So now
114 if you are aready playing and you launch a new .mp3 file, it just replaces the list
115 and starts playing. Could add XMMS-style remote control with this too.
116 - Added savebox to the save menu so you can save full or filtered playlists to xml for
118 - Added pyid3lib support (optional) for ID3v2 tag support. Needs separate installation.
119 see http://pyid3lib.sourceforge.net and http://id3lib.sourceforge.net
120 (Note: due to these changes, loading a big list of songs takes considerably longer
121 it seems. However, now you can at least see the song count as it is loading, you
122 can safely start playing while the list is still loading, and you can save the list
123 with tag info to xml for fast loading later. Did I mention the fast loading part?)
124 - New findrox.py for 0install support.
129 - Preview Release of next version. Looking for feedback.
130 - UI redesign (main window is like Gnome CD player, playlist window is a popup)
131 - Code refactoring. Trying for a MVC design (UI->Playlist->Player->libraries(ID3/MAD/OGG)
132 - Playlist main store is an array now instead of a dictionary. The dict is what caused
133 the default 'sort order' to be other than your directory layout.
134 - Take advantage of Python 2.3 (currently only ossaudiodev support to enable the volume control)
135 - Fix: last version slowed down the playlist loading due to enabling the Artist column
136 for sorting before the list was filled. Man does that slow things down!
137 - New feature: Volume control if you are using Python 2.3 and OSS (or alsa oss emulation)
138 - New feature: The current playlist can be saved with all the tag info in an XML file
139 called Library.xml in your Choices/MusicBox dir. If this file exists then it will
140 be loaded by default when starting. This greatly speeds up load times for large
141 collections. I'm toying with the idea of making this file iTunes compatible. (I have
142 an iBook and and iPod so there is incentive there for me)
144 Note: the playlist in this version does very little now, but you can save the library
145 from there using the right-click menu. The main window is mostly complete.
150 - Bugfixes for python 2.3 support and misc. (thanks Ulrich)
151 - Added Track number and Comment tag display to the browser
152 - Added <track> regex tag for guess() function
156 - Split out the playlist code to allow easier addition of stuff like filtering.
157 - Rudimentary filtering: single Artist, Album or Genre only for now.
158 - Added regex pattern for splitting the path/filename into artist/album/title. This
159 is used on initial load and when there is no tag information. You can edit this
160 pattern to match your preference for storing and naming your music.
161 - Added Spanish translation (thanks Nicolas)
162 - Refactored player.py to allow song-specific parameters to be passed into the ouput
163 driver (fixed problems with mp3 sampled at 22050 instead of the more typical 44100)
164 - Automatically try linuxaudiodevice if ao fails to import. (not tested)
165 - Allow menu from right-click on song list (preparing for selection-specific menu)
166 - Fixed shuffle cache code (int_value not value)
171 - Fixes for hangs that several people were reporting (need pygtk 1.99.17 or higher)
172 - Fix to prevent crash when using Seek bar with no song playing.
173 - Fixes for missing ogg, mad, ao handling. Requires at least one of ogg/mad and requires
175 - Added Shuffle cache to prevent replaying of songs too frequently in shuffle mode.
176 - Re-layout Options dialog.
177 - Load initial playlist based on directory structure (Artist/Album/Song), then load
178 tag information in the background. Should speed up initial loading for large
179 playlists. (Works well for me with ~400 songs via 802.11b wireless connection)
183 0.0.7 (Version 0.0.6 wasn't very good)
185 - Rewrite player code to use pymad, pyogg, pyao directly. No more MPG123/321. This
186 gives better control over the player and it now works correctly when using
187 esd (you can hear your sound effects and notifications; e.g. 'you've got mail!')
189 - Playlist support (.pls and .m3u)
190 - Drag and Drop support - you can drag and drop folders, mp3, ogg, pls or m3u files
191 onto MusicBox. If you hold the Shift key these files will be added to the
192 current list, otherwise the list will be replaced. The result will be saved
194 - Moved remaining time and current song to the Title bar so that this information shows
196 - Italian and Portugese (Brazil) translations (thanks to Yuri and Leandro) - but they
197 need a couple of small updates.
198 - Decided that volume control was not going to happen, so I changed it to a Seek bar
199 so that you can skip to any point in the song. It also keeps moving while the
205 - Added support for multiple Music folders using ':' as separator (e.g. like PATH).
206 - Added support for drag and drop of folders into main window. Dropped folder list
207 replaces current library and is saved as the default.
208 - Loading library is now in a thread so window comes up faster and you can start playing
209 before library is completely loaded (for those with large libraries).
210 - MAY have fixed the bug that some are seeing with mpg321/123 locking up when Stop or
211 other buttons are pressed (I fixed a gtk threads issue, but since I have not
212 seen the reported problem it may not be the same problem)
213 - Display song and remaining time on title bar so that minimized player still shows status.
214 (This needs some work and should be optional I think)
215 - I received an Italian translation (thanks yuri), but it is not working. Someone tell
216 me what I'm doing wrong, please.
218 I've noticed that only ogg123 allows other sounds to be played when using esd. This
219 kinda sucks. I'm looking at doing all the playing in python (pyogg, pyao, pymad) to
220 see if that works any better.
225 - Added error handling for missing library path and missing mp3 player.
226 - Default mp3 player to none and show options dialog at first run.
227 - Removed 'Time' column for now because a) it was broken and b) when I fixed it it took
228 WAY too long to load even my measly 300 song library.
229 - Fixed Shuffle to use time.time() as the Random() seed to that it is actually
231 - Don't load mp3 player until needed (first step to supporting ogg)
234 - Edited the Options.xml to have a big tooltip for the mp3 player explaining some things.
235 - Edited the README a bit (put MY email address in there instead of Thomas') giving some
237 - Changed mp3 player launching from os.popen2 to popen2.Popen3 so I can get
238 the pid and kill it later if necessary (for me it is needed for mpg123, otherwise
239 the player never dies and runs at 100%)
240 - Initial value of mp3 player is now ''. MusicBox now detects that at startup and
241 shows the Options dialog so you can specify your player. (TODO: Need to detect
242 failed player launch and inform the user to try again)
247 - Fixed Prev button and rewrote Next button handling to match.
248 - Implemented Repeat and Shuffle and their options.
249 - Got ToggleButtons working thanks to this tutorial -
250 http://www.moeraki.com/pygtktutorial/index.html