Looong time ago I've started to convert my quite big CD collection into MP3 files. This was a tedious task so this called for some scripts to simplify the work. This was around 1996 or so when everything I found on the net didn't fit my needs. Again, it was time to "roll my own".
At this time it took my computers (yeah, several of them simultanously) ages to grab and convert the data. Keeping track of everything got hard. So the first set of scripts was about "jobfiles". Each grabbed disc was accompanied with a jobfile. Immediately after grabbing the disc with "dudl-grab" I've vi'ed the titles + artists into the jobfile and submitted it for encoding with "dudl-encode". Encoded files were fed to "dudl-rename" to give the files names according to a homogenous scheme and set their ID3-tags with the jobfile's information.
It turned out quite handy to do bulk updates on jobfiles within vi or with other text-tools - especially for renaming files I've encoded without dudl-grab/-encode/-rename. Usually their file names don't match my naming scheme, but "dudl-rengen" guesstimates the metadata and creates jobfiles I can adjust and feed to dudl-rename.
When I've archived the encoded files, I've kept the jobfiles because I've gotten used to running in the limits of ID3(v1) and ISO filesystems. I had plenty files with titles that didn't fit. The primary archive was on MP3 CDs. Though I kept copies of quite a number of MP3 CDs ("storage units") on harddisk - each disc in a subdir. A symlink farm glued them together into something more human-friendly.
Most of the time I've searched the archive with file lists and grep, but I wasn't satisfied with the capabilities so I put the jobfiles' data into a postgresql "dudl-db". The DB also had information about the data on MP3 CDs currently not available (neither copied to harddisk nor mounted, ...)
In the beginning I was quite satisfied with mserv. I loved it's way to add arbitrary tags (aka Genres) to the tracks and filter based on these tags. Though with a growing archive the startup times increased a lot and updates to the metadata were a pain. For a long time I've generated the metadata out of the DB and restarted mserv after each update. It was a hassle to make it work with parts of the archive living on readonly media. In a first attempt I've tried to teach mserv accessing my DB directly, but I got too despaired and rewrote "a networked jukebox" from scratch: "dudld".
I've put dudld a step further and allowed multiple tags per track. This
allows very powerful expressions for searches and random playback filters
by looking at several tags. Recently I've been looking at other "networked
jukeboxes" like xmms2 and MPD but couldn't find anyting offering
something similar. As examply my random filter usually looks like:
( !( tag IN "bad", "junk", "norandom", "failed" ) )&( tag IN
"metal", "rock", "indie")
Unfortunatly my enhancements weren't compatible with the old mserv protocol. Well, it had some other shortcomings, too, but I don't remember the details. So I bit the bullet, abandoned all the wonderful clients for other jukeboxes and wrote my own clients.
file based tools:
- dudl-grab
- Uses cdparanoia to grab files from CDs, pulls details from freedb and generates a jobfile.
- dudl-encode
- Feeds all job's files to lame. I've also had a version that spread the encoding to serveral networked computers.
- dudl-rename
- Renames the MP3s and sets their ID3 tags according to my naming scheme (Schemes are configurable).
- dudl-do*
- Helper scripts coordinating the work, moving jobs between differnt directories in my "spool". Where needed drops you into an editor with the jobfile to allow you adjust the auto-discovered data.
DB tools:
- dudl-storscan
- Scan file contents of MP3 CDs and adds the data to DB.
- dudl-mus*
- Fills and maintains Artist, Album, Title, Tag tables in DB.
- web
- Some quick and dirty CGI scripts for browsing the DB.
Jukebox dudld:
- pulls all metadata from the DB
- postgresql DB backend
- code layout allows easy adoption to other DB backends
- is desinged to cope with intermittent availability of MP3 files
- very powerfull filters (especially when using tags)
- uses gstreamer for playback
- supports replaygain
- supports automatic skipping of begin + end of tracks when there is silence
- copes with very large MP3 collections
- multi-user capable
- fine grained user control
- real random playback
- keeps history of played files
- network accessible through it's own event driven protocol
- protocol library for writing clients easily
Jukebox clients:
- dudlc - the fully fleged command-line client
- gtk-dudlc - some buttons + seekable progress slider (very basic)
- irdudl - using lirc
Take a look at the Screenshots.
Download / Install:
Dudl is split into several packages, that have to be installed individually. Usually each packages comes with it's own README. I'm still working on improving the documentation. There are also debian build scripts included.
The individual packages have the following requirements:
package: dudl
The base package with the file and DB tools. The individual tools require:
- dudl-rename
- MP3::Digest (from this site)
- MP3::Tag
- dudl-grab / -encode:
- cdparanoia
- lame
- Net::FreeDB2
- dudl-db:
- postgreSQL
- Mp3::Info
- Gstreamer (perl module) + plugins: mad, rganalysis, cutter
- EzDBI (from this site)
- EzDBo (from this site)
- DBD::Pg
Code is available in my dudl github repository.
package: dudl-www
DB web-frontend
- requires dudl-db
- CGI capable webserver
Code is available in my dudl-www github repository.
package: dudld
Jukebox daemon.
- connects to dudl-db
- glib2
- gstreamer-0.10 (currently hardcoded to use mad as decoder)
- liblockfile
- postgreSQL client lib (libpq)
Code is available in my dudld github repository.
packate: dudlc
Client library and some clients for dudld. The individual clients have the following extra requirements:
- dudlc (command line):
- libreadline
- gktdudlc (GTK):
- gtk2
- irdudl (lirc):
- lirc
- liblockfile
Code is available in my dudlc github repository.
Changes:
dudlc 0.1.16 2009-04-24
- cli: moved config file handling into seperate module
- gtk: code cleanup, split into several files
- gtk: added view for track lists
- gtk: therefor connection changed to global var.
- gtk: added view for album lists
- gtk: added queue window
- gtk: added track search window
- gtk: menu + button hiding is now optional
- gtk: added gtkdudlc man page
- minor cleanups to header inclusion + man pages
- lib: made iterators type-safe
- gtk: moved common functions to treehelper.c
- gtk: select sorting colum for inplace searching, too
- gtk: keep queue window around on delete-event, just hide it
- gtk: don't default to multi-select
- gtk: added window to browse archive
- gtk: added menu+toolbar to all child windows
- gtk: keep track + album lists up to date
dudld 0.1.22 2009-04-24
- made gstreamer output pipeline configurable
- fix: do not ignore errors when sending data to clients
- fixed some memholes, made allocation + free more robust
dudl 0.1.21 2009-04-24
- minor documentation updates
dudld 0.1.21 2008-12-31
- switch from popt to GOption to allow ...
- switch to gstreamer-0.10
License:
Where possible I've used the MIT "free to do what you want" license.
According to my understanding that's not possible for the command-line dudl-client (uses readline with GPL) and dudl-lirc (ueses lirc with GPL). So they inherit the GPL license from the libs.