The information is stored in a PostgreSQL database consisting of 2 tables. One table contains the basic information and the other one contains possible Amazon links for each review.
When I want to add a new review, I run the master Python program, '~/html/books/new.py'. It's very short and does nothing itself, it just uses other Python programs as modules and binds them together appropriately. Each one of the modules can also be run from the command line so debugging or enhancing any part of the system is trivial.
The different modules/programs are:
addbook.py Launches Emacs with a template file in which I fill in the review's information, which it then reads from the file and stores in the database, returning the id of the new review.
se.py Uses Amazon's web services to automatically find matching books from both Amazon USA and Amazon UK using the information (Author and Name) from the review in the database. It then eliminates audio books, not immediately available books, and all other not-wanted results, and if any results are still left, selects one of them (one for USA and one for UK) to use as the link. It then stores the image URL and link URL in the database.
update_books_html.py Redoes all the generated pages (author/name lists, per-year files, per-book files, last-15, RSS feed), which takes ~2 seconds.
gen_books_graph.py Generates the graph of total books read over time.
linkcheck.py Checks all the Amazon links for validity and redoes the Amazon search for a book as needed.
Known problems
Microsoft's Internet Explorer 6 shows the review pages somewhat incorrectly due to the severe bugs in its CSS support.
The Amazon searches aren't always 100% accurate. To overcome this, I will need to add an option for manually assigning ISBN item numbers to a review when needed, and then updating the se.py script to use those (if specified) instead of author/name when fetching information from Amazon web services.