Note: The script below is old and remains here for history's sake. You can find the
latest version in the Related Tools section.
-----
I got fairly annoyed with having to download calibre manually every time there was an update. Here's a bash script I wrote that handles updates for OS X.
You can run the script from the terminal with `bash calibre-installer.sh` or change the file extension to `.command` and double click the file.
`calibre-install.sh`:
Code:
#! /bin/bash
#
# Install the latest version of calibre for OS X
# Replaces any existing version in /Applications or ~/Applications
#
# Copyright (C) 2012 Faraz Yashar
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <http://www.gnu.org/licenses/>.
# Note: `set -e` is not included in order to provide custom error failures for
# failed cURL requests; with `set -e`, cURL the script will exit if returns `1`
# with a failed download
#
# Utility functions
#
# Exit with an optional [error message] and [exit status]
error_exit() {
echo "Calibre install error: ${1:-"Unknown Error"}
You can manually download and install calibre from http://calibre-ebook.com/download_osx" 1>&2; exit "${2:-1}"
}
# GET a <URL> and write the output to <output file>; throw an error if the request fails
download_or_exit(){
response_code=`curl --write-out %{http_code} --silent --output $2 $1`
[ "$response_code" != "200" ] && error_exit "Failed HTTP request!
Server responded with a $response_code error when requesting \"$1\"
See $2 for the full output of the request"
}
#
# Main script
#
[ `uname` != 'Darwin' ] && error_exit "This installation script is incompatible with `uname` operating systems."
calibre_running=`pidof calibre`
if [ $calibre_running ]; then
echo "Quitting calibre..."
osascript -e "tell application \"calibre\" to quit" || error_exit "Calibre failed to quit!"
fi
release_url='http://code.google.com/feeds/p/calibre-ebook/downloads/basic'
echo "Downloading the calibre release feed from $release_url..."
download_or_exit $release_url /tmp/calibre-feed
calibre_download_url=`cat /tmp/calibre-feed | grep -o "http://calibre-ebook\.googlecode\.com/files/calibre.*\.dmg"`
# Raise an error if no download URL is found
if [ -z $calibre_download_url ]; then
page_title=`cat /tmp/calibre-feed | grep "<title>.*</title>" | sed s/'<\/*title>'//g`
error_exit "No download URL found at $release_url. Instead found page: $page_title
See /tmp/calibre-feed for the full contents of $release_url."
fi
echo "Downloading calibre image from $calibre_download_url..."
dmg=`basename $calibre_download_url` # The image filename (e.g. 'calibre-x.x.x.dmg')
download_or_exit $calibre_download_url /tmp/$dmg
mount_point="/Volumes/`basename $dmg .dmg`"
echo "Mounting /tmp/$dmg to $mount_point..."
hdiutil attach /tmp/$dmg
[ -e $mount_point/calibre.app ] || error_exit '"calibre.app" could not be found in the downloaded .dmg'
local_calibre="$HOME/Applications/calibre.app"
backup_dir="/tmp/calibre-`date +%s`.app.bak"
if [ -e local_calibre ]; then
echo "Moving current calibre installation in ~/Applications to $backup_dir..."
mv local_calibre backup_dir
elif [ -e /Applications/calibre.app ]; then
echo "Moving current calibre installation in /Applications to $backup_dir..."
mv /Applications/calibre.app backup_dir
fi
cp -R $mount_point/calibre.app /Applications/calibre.app
hdiutil detach `hdiutil info | grep $mount_point | grep -o "/dev/disk\d*s\d*"`
echo "Done! Launching calibre!"
osascript -e "tell application \"calibre\" to activate" || error_exit "Calibre failed to open!"