File Release Notes and Changelog
Notes:
Version 3.0 is a rewrite using JavaServer Faces. A Web Archive
file (mp3dj-3.0.war) is included in the distribution. The
mp3dj web application can be used to setup ices & icecast and
create/refresh the database. The file selection list and
playlist elements of the main page were combined; a single
table represents both the active playlist.m3u and the files
database table. Mp3dj is more extensible and it's GUI simpler
and a notch more intuitive as a result of these changes.
See the project page for installation information:
http://mp3dj.sourceforge.net/
Changes:
* The mp3dj GUI was rewritten utilizing JavaServer Faces.
In the previous release, servlets were generating html.
Now all html lives in JSPs and backing beans control access
to the database and playlist through delegates in the model
of a model-view-controller organization.
* JavaServer Faces makes internationalization support
simple, and it's here in the first version. All labels
in JSPs and messages in Java code are centralized in
pair of resource files, opening the door for languages
other than English. See resources/labels.properties and
resources/messages.properties.
* Added admin page for editing the configuration via the
web interface. The database can also be created/refreshed
from the page, which features a custom DHTML progressbar
component. This support means you can simply deploy the Web
Archive file (ex. mp3dj-3.0.war) and visit the admin page
to setup. The interface deals gracefully with a broken
configuration and provides instructions for creating
a database. Validators check new property values when
they're entered, providing immediate "red" messages in a
column that collapses when all properties are valid.
* All properties live in application context, so they
persist across sessions. Default property values are housed
in faces-config.xml, which can be edited before building
the source distribution. Alternatively you can extract the
.war, edit, and recreate the .war using the jar command to
your own defaults permanent across deploys.
* The refresh operation builds a set of _incoming tables,
which are not engaged until the operation finalizes.
As a result, while the operation is in progresss,
you can continue using the existing database tables.
When the [refresh database] button is pressed, it changes
to [cancel refresh], so the operation can be stopped.
When the operation completes, the progressbar returns to
0%, and the statistics message at the top of the admin page
will contain a new date value.
* The home page was simplified. A single dataTable
represents both the playlist and the database. Rather than
adding to the playlist by clicking on a separate files list
- this version uses a track menu for all operations. Files
are inserted or appended to the playlist by selecting
a track number. The same menu is used for removing or
repositioning a file already selected for play. The table
features a paginator at the top so buttons are stationary.
A configuration property (mp3dj.gui.rows) controls the size
of the data table.
* Controls were consolidated and placed in two rows below
a message at the top of the home page. The first row
includes the search text field for initiating a query,
and a new folders menu which initiates a database query for
all files in the assoicated folder. All playlist controls
appear in the second row. The start and stop buttons were
removed. Now we're always streaming. The elements dealing
with an existing playlist (save, restore, and delete)
operate on a single menu.
* A [show playlist] button was introduced to display the
files selected for play in ascending track number order.
While viewing the playlist, the button becomes [show
filelist]. This takes you back to your previous search
results context. The playlist and filelist contexts are
preserved, so you remain on page you navigated to previously
in either.
* A playing track number menu indicates whats playing now.
Selecting a new track with the menu skips too the associated
track. The track that's playing and the playing menu appear
in red. Other files selected for play appear in green.
* A message above the data table to the right of the
paginator is updated on each request to indicate what was
done last, and along with the paginator indicate the size of
the result set. A search generates a message like: 14 found
for 'merson Lake', [show playlist] like: 109 in playlist,
and selecting from the folder menu might say: 66 in folder.
* Added cross-fade support. This requires reencoding with
liblame, which was added to Components and is included
in the updated install-icecast example script which
can be used to install icecast, ices, and libshout.
Setting ices.crossfade.seconds to zero disables reencoding.
* Simplified installation by inserting a recognizable
variable (ICES_DIRECTORY) into ices.py and having
PlaylistDelegate set it with the ices.playlist.directory
value. The ices directory can be non-existent initially now
too, because the directory, script, playlist.pos, and inital
playlist.m3u are created when they don't exist. The source
ices.py file lives in <base>/src/com/mp3dj/resources/ices.py.
* Creating the ices base directory dynamically in validating
the admin properties form, and also in PlaylistDelegate
to deal with the case were broken default values might be
set in faces-config.xml. When the ices.base.directory
is changed, ices.py is created in the new directory by
replacing instances of ICES_BASE_DIRECTORY while copying
resources/ices.py. The playlist.m3u and playlist.pos
files are copied from the old base directory. As a result,
your streaming the same track after the change.
* Both Icecast and Ices are invoked with arguments
corresponding to the property sets on the admin page.
The configuration file for each is included so you can
customize further by engaging your own version of a config
file. So, for example, if you wanted a bitrate different
from the default of 128kbs - there's no property for that -
so you edit the <Bitrate> target you'll find in ices.conf.
Pressing the [submit] button or <Enter> kills the ices
and icecast deamons and restarts them using the new set
of arguments.