-------------------------------------------------------------------------------
madman administrates digital music archives neatly
-------------------------------------------------------------------------------

QUICK BUILD INSTRUCTIONS (see below for potentially more detailed instructions)

To build madman, just type 
 ./scons.py
at your shell prompt. 

To install, type

 ./scons.py prefix=/where/ever install

-------------------------------------------------------------------------------
I. Welcome to madman.
-------------------------------------------------------------------------------

madman is a music manager application that allows you to easily keep your
music database organized and tidy, and it helps you listen to better music,
be happier, brighten your teeth and quickly restore world peace.

madman's killer features include
- A builtin web server
- Ratings just like iTunes
- An icon in the system tray
- Full mp3 and ogg tag support, both reading and writing.
  Convenient retagging with a spreadsheet-like interface

- Fully drag and drop enabled: Drop a song onto a set,
  reorder your sets by drag and drop, reorder songs within
  a set - all it takes is one mouse drag.
- Powerful expression syntax to quickly locate the music you're looking
  for.

  Examples:
    - pearl|creed|metallica to find something for your 
      anger.
    - jetplane cher to find Cher's version of "Leaving
      on a jetplane."
    - "dog eat" to find "Dog eat dog", but not
      "Sound of dogs eating a human".

- "Sets" which are somewhat like playlists, except they can
  be automatically keep track of songs matched by expressions.

You can get in contact with the author by writing to <inducer@users.sf.net>.
madman's homepage is at http://madman.sf.net.

See the web page for an FAQ.

-------------------------------------------------------------------------------
II. Compiling
-------------------------------------------------------------------------------

To compile madman, you need

- XMMS. [http://www.xmms.org]
  Version 1.2.6 and above.
  IMPORTANT: Version 1.2.9 causes random crashes. Do not use it.

- Qt. [http://www.trolltech.com]
  Version 3.2.x tested, others might work, too. (patches welcome)
- libid3tag [http://www.underbit.com/products/mad]
  Version 0.15.0b required.
- Ogg Vorbis libraries [http://www.xiph.org]
  Any recent version should be fine.

To build madman, just type 
 ./scons.py
at your shell prompt. Type
 ./scons.py -h
for help on the supported build options and
 ./scons.py -H
for scons's builtin options.

For example, to specify the include directory for libid3tag, you would type

 ./scons.py libid3tag_include=/where/ever

To install, type

 ./scons.py prefix=/where/ever install

-------------------------------------------------------------------------------
III. Change log
-------------------------------------------------------------------------------

far future --------------------------------------------------------------------
+ Support audioscrobbler.sourceforge.net.
+ Maybe rethink the UI.
+ What do MoodLogic (moodlogic.com), iTunes (apple.com/itunes),
  MusicMatch (musicmatch.com) have that we don't?
+ Add more flexible tagging from file name.
+ Add on-disk reorganization, i.e. renaming according to tags.
+ Allow players to have their own customization UI,
  thus allow having a customizable player executable.
+ Add some sort of history display and evaluation.
+ Session management.
* Don't put songs in playlist that are already in there
  (confusion-proof UI?) (Johan Forsberg)
+ One-time commit feature for tag writes. (Johan Forsberg)
+ HTTP access restrictions (Tim Dreessen)

future ------------------------------------------------------------------------
+ Support FLAC.
+ Support Musepack.
  http://www.personal.uni-jena.de/~pfk/mpp/index2.html
+ Maybe add little builtin player.
+ Splash screen.
+ Support musicbrainz.
+ Can we rip off Amazon's "other customers also bought" recommendations?
  MP3 Piranha, Amazon Web Services ...
  Should be possible to at least display album cover.
+ Maybe use MusicLink.com?
+ Add Plink. (playlist link)
  - Plink over Jabber.
  - Plink broadcast UDP discovery.
  - Plink clients for Winamp2 (3?), XMMS (write them using the tPlayer class?)
+ Integrate translations into build system.
+ BPM extraction.
* Export M3U.
* Automatically add .mad extension to filename entered in
  SaveAs dialog. (Jon Burgess) [is this really a good idea?]
+ Hierarchical sorting. (album, track number) (good UI?)
+ Added man page.
* Try to identify current song through title if identifying through
  file name doesn't work.
+ Criteria wizard.
+ Allowed Player customization UI.
* Ability to query whether criteria are time-dependent.
  (Automatic update of Last Few Songs)
+ IMMS-like ratings based on play history.
+ non-local criteria like
  - ~is_in_set(name)
  - ~playcount_percentile(...)
  - ~artist_rating(...)
  - ~auto_dj_score(...)
  phase out jammed-together criteria
+ modularized criterion parser with factories for various criteria.
+ Allowed file renames from tag interface.
+ Add a mechanism for debug messages to get through to user that is not STDOUT.
* Sprinkled the singleton pattern all over the program, 
  wherever it applies.
+ ~average_play_percentage()
+ Introduce smoothly-scaling criteria.
  ~usually_played_to_end, ...
* use pimpl pattern in more places.
* Song play detection in Non-GUI mode
* ~play_count_within_n_days
* ~manual_play_count, ~manual_play_immediately_count
* ~new, halflife of about a week.
* ~played_within_days(parameter), gradation
* Portable player support: Copy files to directory without running out of 
  space. (Clive Butler)
* Add support for alsaplayer (Tim Sawchuck)
* Continuous AutoDJ (Shawn, Adam Ward)
* ID3 writing format switch: v1/v2 (Adam Ward)

0.93 --------------------------------------------------------------------------
* Fixed the scan failure problem. [done]
* Fixed a link order problem. [done]
* Removed 3.2 dependency of UI files.
* Added flags that allow to add custom include and library paths.
  (Daryl Anderman) [done]
* Playlists can't scroll past the end any more. [done]
* Fixed a segfault in the auto tagger. [done]
* Fixed configure to cope with non-case-sensitive bashes. [done]
  (Christian Hammers)
* Fixed the expat load errors, hopefully for real this time. [done]
* Fixed an exception while reading tags / adding songs. (Klaus S. Madsen)
  [done]

0.93rc2 -----------------------------------------------------------------------
+ A my_cxx build option was added. [done]
+ Validated compilation with only a c++ compiler, especially for vcedit.c.
  [done]
* Fixed README to state correct dependencies. [done]
* Removed ctags from default build. [done]
* About dialog shouldn't talk about Musepack/MPC when it's not actually 
  there. [done]
* Attempted to fix non-reproducible crasher within XMMS libraries through
  better error checking. [done]
* Fix crasher when removing from empty directory list. (Tim Dreessen)
  [done]
* Rescan no longer adds duplicate copies of songs. (Tim Dreessen)
  [done]
* Plugins directory was missing from the release tarball. (Tim Dreessen)
  [done]

0.93rc1 -----------------------------------------------------------------------
MAJOR CHANGES:
* Auto Tagger. [done]
* Changed build system to SCons. [done]
* Minimize to system tray. [done]
+ Add passive popup song announcements. [done]
* Made search substantially faster. [done]
- Removed fuzzy search misfeature. [done]
+ Visually indicate current song. [done]
+ Select visible columns per list view, not in preferences. [done]
* Unify madmanweb through song field identifier methods. [done]
* Rewrote AutoDJ. (Shawn Willden) [done]

MINOR IMPROVEMENTS:
* Made sure filenames are never converted from one encoding
  to the next. [done]
+ Integrate M3U export script from Adam Ward. [done]
* Added Christian's madman art. [done]
* Balance AutoDJ score min, max, offset, at least in default. [done]
+ Progress bar for repeat tagging. [done]
* Busy progress bar for scanning. [done]
* Display totals in a more appropriate way. [done]
* 0.5 is now the default match threshold. [done]
* Renamed tCriterion::operator() to matchDegree(). [done]
* Improved startup performance by removing a stray stat(). [done]
* Added a new about dialog. [done]
* Greatly reduced memory footprint of madman's database.
  - Use static list for (repetitive) directory names. [done]
  - Eliminated key hack for ~any criterion. [done]
+ Remember sort field between runs. [done]
* Deprecated multiword criteria without underscores. [done]
+ Added ~year,~track_number criteria. [done]
+ Added scripting for the playlist tree. [done]
* Ensured uniqueness and validity of playlist names.
  Also made sure related exceptions are caught. [done]
* Took care of UTF8->Unicode string conversion in remote. [done]
* Drop down box for genre edit. [done]
+ Search for and play like songs through the context menu. [done]
+ Added Clear button for search box. [done]
+ Rate current from toolbar and tray icon. [done]
+ Hide main window while saving database. [done]
* Smaller playlist buttons. [done]
+ Added ~full_play_count, ~partial_play_count criteria. [done]
+ Added ~lastplayed_n_days_ago criterion. [done]
+ Added a central facility to get a one-liner describing a song. [done]
* "File exists since" now defaults to the file's ctime. [done]
+ Added an option to restrict webserver access to localhost. [done]
* Modified plugin interface to use field identifiers. [done]

BUGS/ANNOYANCES FIXED:
* Fixed odd tag encoding bug. (reported by Adam Ward)
  Fixed by switching to libid3tag, which is much better
  in many regards. [done]
+ Don't stop rescan on broken files. (ogg, file not found)
  (Adam Ward) [done]
* Fix right click in playlist pane crasher. (Adam Ward) [done]
* Fixed a crasher in tSongListView::getSelection(tSongList &) [done]
* Added k3b version detection to cd burning scripts. [done]
* Made http server much more crash-resilient. [done]
* Made madmancontrol quit actually work(tm) without a segfault. [done]
* LastPlayed was not properly initialized. [done]
* Only rescan after prefs if media directories have changed. [done]
* Ogg tagging fixed - accidentally used Latin1 instead of UTF8. [done]
* Fixed the case of moving to a new file type
  (the new file would be read using the old file type, no matter what)
  [done]
* Focus AllSongsList on home. [done]
* If we don't have read permission for a song, don't add it. [done]
* Worked around a Qt3.2 bug that would not update the search line
  until the end of the search. [done]
* Fixed a crasher in the web server. [done]

0.92rc1 -----------------------------------------------------------------------
MAJOR ADDITIONS:
+ Builtin web server for remote control, streaming/sharing, scripting.
  Made option for webserver to run standalone (no X). [done]
+ Added python script for remote control. [done]
+ Better auto DJ. (now uses Mersenne Twister random number generator,
  forbids replays,  allows configuration) [done]
+ Bookmark button. [done]
+ Added Player controls. [done]

MINOR IMPROVEMENTS:
+ Right click menu for Artist/Album list.
  (Jon Burgess, David O'Shaugnessy) [done]
+ Allow command line specification of the file that is 
  to be opened. [done]
* Add --help command line option. [done]
* Add criteria examples to help. [done]
* Make backups even if file does not have .mad extension.
  (Jon Burgess) [not reproducible, assumed fixed by previous changes]
+ Add file name and path to search index. (Johan Forsberg) [done]
+ Keep modification time stamps of songs, reread changed on rescan. [done]
* Try and deal with oddball track numbers (like "04/18"). [done]
* Added criterion ~unrated, to avoid depending on ~rating(=-1). [done]
+ Make a toolbar button to highlight currently playing song.
  (Fix F12 non-obviousness.) [done]
* Changed tPlayer architecture from polling to signalling for song and
  state changes. (hide polling mechanism within tXmmsPlayer) [done]
* Save whether toolbars are shown to config. [done]
+ Added rewrite tag function. [done]
* Modified number after "By Artist" to state number of songs
  (UI non-obviousness reported by Edgar Seemann) [done]
* Added button icons, thus friendlifying the whole UI a bit. [done]
* Cleaned up notification-on-modification in tSong. [done]

BUGS/ANNOYANCES FIXED:
* Fixed bug about column ordering not being preserved in some
  cases. [done]
* Workaround for id3lib's borked unicode tagging facility [done]
  UNICODE mp3 tagging is BROKEN by this.
* Weed out invalid characters in tag data. [done]
* Don't fail with only a console message if the web server couldn't be
  started. [done]
* Update hash table when adding/removing songs to/from collection.
  (reported by Martin Sauter) [done]
* Fixed Unicode ID3 tag reading/writing. [done]
* Madman's database is now really stored in UTF8. [done]
+ Will ask to save before opening new database. [done]
* Fixed a bug where hitting one of the numbers (for rating) wouldn't
  properly update the playlist window. [seems to have disappeared]
* Fixed the fact that there are no result when searching for uppercase
  strings. [done]
* Fixed several file descriptor leaks reported by 
  Jon Burgess <mplayer@jburgess.uklinux.net>. [done]
* Fixed segfault that occurred when reading Ogg tag from non-existent song.
  Reported by Jon Burgess <mplayer@jburgess.uklinux.net>. [done]
* Added proper exception handling in many spots that were lacking it.
  [done]

0.91.1 ------------------------------------------------------------------------
+ Fixed some compilation problem on SuSE gcc 3.2 prerelease compilers.

0.91 --------------------------------------------------------------------------
+ Added much marketing hype to the website. [done]

MAJOR ADDITIONS:
+ Added fuzzy match methods. [done]
+ Added plugin scripts. [done]
  Sample plugin scripts provided: Burn to CD, Move to Trash.
+ Made separate fields for Composer/Performer. [done]
+ Added play history collection.
  History records if a song is allowed to play to the end,
  to allow for statistical evaluation. Can be disabled. [done]
+ Rating feature, ~rating(...) criterion. [done]
+ Searches now work asynchronously, making them
  (seem) much faster. [done]
+ Added separate preferences dialog. [done]
+ More categories in overview tree (albums) [done]
+ In-Archive-Since, Last-Played and Play-Count are recorded for each song.
  Statistics are resettable per-song. [done]
+ Build process was autotoolsified. [done]
+ Make backups of databases. [done]
+ Added mass tagging. [done]
* Improved startup performance.
  - Used expat instead of Qt for XML parsing. [done]
  - Centralize reading serialization code in tDatabase. [done]
  - Made overview tree generate itself on the fly when clicked. [done]
+ Can import M3U and player playlists. [done]
+ Added a real help browser. [done]

MINOR IMPROVEMENTS:
+ Automatically show relevant page of preferences dialog if 
  creating a new file. Greet new users. [done]
* Display <none> instead of the empty string in the overview. [done]
+ Remember main window geometry (may be turned off in preferences). [done]
+ Added possibility to add 20 random songs from command line. [done]
* Moved duration column further to the front. [done]
* Better keyboard bindings. [done]
+ Added "Highlight current song". [done]
+ Made tag display dynamic. [done]
- Removed "search forward" feature because the improved "Restrict" 
  works so much better. Avoids user confusion. [done]
+ Order of columns is preserved between runs. [done]
* Achieved display speedup through not letting Qt do the 
  sorting. [done]
+ Added ability to customize which columns are shown. [done]
+ Added a file size column. [done]
+ Show a summary on the status bar whenever the selection changes. [done]
+ Show counts in overview. [done]

BUGS/ANNOYANCES FIXED:
* Removed set control buttons -> more screen real estate for actual songs. [done]
* Fixed bug in removing multiple songs from sets. [done]
- Removed the empty "View" menu. [done]
* Fixed auto_ptr+exception bug in expression compilation, 
  fixed or precedence. [done]
* Deferred retags until next main loop to avoid crashes when retag means
  removal from current set. [done]
* Fix artist sorting in overview.
* Flicker and slowness upon deleting multiple files was fixed. [done]
* Fixed crashes:
  - Make new file, add set. [done]
  - Open another file, drag song to set. [done]
  - updateSongSetTree was trying to use pointers that had
    become invalid while [done]
* Made fileOpen() exception-safe. [done]
* Fixed expression parsing so parentheses would really work. [done]
* Fixed error reporting for duration extraction from MP3s. [done]

0.90.1 - Feb 27, 2003 ---------------------------------------------------------
- Fixed Compilation with Qt3.0.

0.90 - Feb 26, 2003 -----------------------------------------------------------
- Initial relase

