Press "Enter" to skip to content

Delicious Library 3

Delicious Library 3 WebsiteMy wife and I read a lot of books. Now that our son has gotten a little older and needs less attention, I go through more than a book a week on average, Bobbie doesn’t go through as many books in number, but she is reading much larger non-fiction books and taking copious amounts of notes.

Many years ago I bought Delicious Library 2 (DL2) as a part of a bundle deal. Bobbie and I used it to catalog all of our fiction and collectable books. It worked well enough and with some simple PHP and YUI coding I built a simple web page we could use on our phones to check our library while out and about.

Then disaster struck, I reformatted/re-installed all of our computers and updated them to the latest version of the Mac OS. I thought I had backed everything up, but apparently Delicious Library’s database was not.

Lately Bobbie has been asking me about how to update the Library page with the new books we have purchased. I did another round of research for library software and came to the decision to buy and use Delicious Library 3 (DL3).

I bought it from the Apple App Store, which means it can run on all of our machines and it will stay up-to-date via the App Store app.

The great news is that even though I had lost the DL2 database, DL3 was able to import the CSV file I was using on our website and retrieve the information for the 450+ plus books that were in it from Amazon. That was pretty amazing and made me very happy.

Also, the iPhone app Delicious Scanner worked great for me successfully scanning about 75% of the books that had barcodes in our library. I was kind of surprised how well it worked, DL2 was not nearly as successful using the iSight camera on a laptop. I was also surprised by how many books we have that do not have any kind of bar code or even an ISBN code, a lot of Bobbie’s antique books predate ISBN.

The good news is that scanning the rest of the books went faster than I expected and DL3 did a good job of finding the books on Amazon with a little bit of manual help. DL3 is not fully automatic; I don’t think any book library app could be, there is always going to be manual work involved. Adding the meta-data that is important to us like the name of the Series that a book is a part of, the book’s number in the series, and the character name’s that appear in the book is always going to be manual because what is important to us is not going to be important to everyone.

The bad news is the DL3 is still burying its database in a proprietary format in a deeply hidden corner of your computer. There is still no way for multiple people to collaborate on a single library, you can export/import libraries but it is very klunky and if every book does not have an associated ISBN or Amazon code you are bound to have duplicate entries. And the templates for exporting an HTML version of your library are absolutely useless!

The HTML output and even the default interface of DL3 makes me very sad and frustrated. The developers/designers of the app spent all this time on graphics, 3D effects, and a multitude of wood grains instead of on the usability of the app.

This is what we need from a library app:

  1. Easy book entry
  2. Easy to find a book in the library

Delicious Library 3 is awesome at book entry, that part fits my needs almost perfectly. The only thing that would make it better is integration with data sources other than Amazon.

DL3 Bookshelf ViewWhen it comes to finding a previously entered book, the DL3 app on the desktop works ok. The default 3D Bookshelf view with the books on a shelf (duh) is absolutely worthless for this, it makes it almost impossible to scan through the books and the cover from Amazon may not match the cover of the real book on your shelf making it counter-productive.

Switching to List view improves the situation a lot. You can control what fields/columns are visible and sort the columns.

DL3 Search ResultsOh wait; right there in the top left is search box. Well that should help right? WRONG, when you enter text in that box it displays the results in a pop-up with a fixed width that truncates the book titles to the point that they are useless.

I am going to stop complaining right there. Delicious Library has a lot of usability issues that will apparently never be addressed, lets move on to why it is still a very useful app.

You can output a CSV file!

DL3 Export a CSVI have written a little PHP file that takes the CVS file that DL3 outputs and makes a very simple HTML table with the data. Then I use jQuery and a couple libraries to make the table sortable, searchable, and filterable.

The PHP is not very efficient, if we had many more books the JavaScript/jQuery would be to slow to be useful, and having it all in a database would make it easier to do some other cool stuff with the data. But for now the simple PHP and JavaScript fit our needs and give us a great interface into our book library.

My Simple Library
My Simple Library

Here is my UGLY PHP:

$firstRow = true;
$file_handle = fopen("export.csv""r");
while (!feof($file_handle) ) {
    $line_of_text = fgetcsv($file_handle1024);
    $author = $line_of_text[1];
    $title = $line_of_text[4];
    $series = $line_of_text[2];
    $subtitle = $line_of_text[3];
    if ($author == "") {
        $author = " ";
    if ($title == "") {
        $title = " ";
    if ($series == "") {
        $series = " ";
    if ($subtitle == "") {
        $subtitle = " ";
    if ($firstRow == false) {
        if ($line_of_text[0]) {
            print "" . $author . "" . $title . "" . $series . "" . $subtitle . " ";
    } else {
        $firstRow = false;

I am using jQuery 2.0.2 and tablesorter with the Zebra and Filter widgets.

Here is the JavaScript, it is almost entirely cut and paste from the tablesorter web page:

          theme : 'blue',
          sortList: [[0,0], [1,0]],
          widgets: ["zebra""filter"],
          widgetOptions : {
            // If there are child rows in the table (rows with class name from "cssChildRow" option)
            // and this option is true and a match is found anywhere in the child row, then it will make that row
            // visible; default is false
            filter_childRows : false,

            // if true, a filter will be added to the top of each table column;
            // disabled by using -> headers: { 1: { filter: false } } OR add class="filter-false"
            // if you set this to false, make sure you perform a search using the second method below
            filter_columnFilters : true,

            // css class applied to the table row containing the filters & the inputs within that row
            filter_cssFilter : 'tablesorter-filter',

            // class added to filtered rows (rows that are not showing); needed by pager plugin
            filter_filteredRow   : 'filtered',

            // add custom filter elements to the filter row
            // see the filter formatter demos for more specifics
            filter_formatter : null,

            // add custom filter functions using this option
            // see the filter widget custom demo for more specifics on how to use this option
            filter_functions : null,

            // if true, filters are collapsed initially, but can be revealed by hovering over the grey bar immediately
            // below the header row. Additionally, tabbing through the document will open the filter row when an input gets focus
            filter_hideFilters : false// true, (see note in the options section above)

            // Set this option to false to make the searches case sensitive
            filter_ignoreCase : true,

            // if true, search column content while the user types (with a delay)
            filter_liveSearch : true,

            // jQuery selector string of an element used to reset the filters
            filter_reset : 'button.reset',

            // Delay in milliseconds before the filter widget starts searching; This option prevents searching for
            // every character while typing and should make searching large tables faster.
            filter_searchDelay : 300,

            // if true, server-side filtering should be performed because client-side filtering will be disabled, but
            // the ui and events will still be used.

            // Set this option to true to use the filter to find text from the start of the column
            // So typing in "a" will find "albert" but not "frank", both have a's; default is false
            filter_startsWith : false,

            // Filter using parsed content for ALL columns
            // be careful on using this on date columns as the date is parsed and stored as time in seconds
            filter_useParsedData : false,

            filter_onlyAvail : 'filter-onlyAvail'

If you are looking for a way to keep track of your books, give Delicious Library 3 a try. So far it is working well for us.


    • Dave Nelson Dave Nelson July 15, 2013

      It looks like Library Hunter has been updated recently, that is what I would (and will) try. Looks cool.

  1. David David July 15, 2013

    The one killer feature of DL3 seems like it might be the recommendation engine.

    Has anyone tried that and had a strong opinion of it’s usefulness?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.