iBooks ade - wie von iBooks zu Calibre oder anderem ePub Programm
Bei dieser Newsmeldung (
) Anfang dieses Jahres, hatte ich kurz meine Erfahrung zu iBooks geschrieben.
Eigentlich fand ich iBooks erträglich, abgesehen von der schlechten Meta Daten Bearbeitung war es ausreichend. Es diente aber auch nur als Sync Applikation zwischen meinem iPad und iPhone und der Library.
Aber als ich dann auf Calibre umsteigen wollte wegen deren Server Funktionalität und auch den Sync Möglichkeiten war ich geschockt:
Hier nochmal mein Kommentar:
"Ein bisschen Off Topic es geht mehr um iBooks am Mac:
Diese Applikation ist zwar nett zum lesen von eBooks aber zum reinen Verwalten von ePubs ist diese sehr gefährlich wenn man sich nicht vorsieht. Bevor es iBooks gab hatte ich schon alle ePubs in iTunes 10, war auch kein Problem mit dem Syncronisieren oder mal ein ePub aus der Library kopieren woanders hin etc. Dann wurde automatisch zu iBooks gewechselt mit Mavericks und alle ePubs wurden migriert und entpackt. Das ist mir erst vor knapp einem Monat wirklich aufgefallen und auch was die Folgen sind. Leider war ich ohne Backup. Sobald man also ein ePub in iBooks importiert wird es von iBooks entpackt (ePubs sind nur zip Dateien). Die Endung bleibt erhalten. Im Finder wird es immer noch als ePub angezeigt aber ich kann dieses ePub nicht mehr mit z.B. Calibre öffnen, da es ja nur noch ein Ordner ist. (ein ls -a im Terminal zeigt auch ein d für directory)
Ziemlich ärgerlich wenn man mal auf die Idee kommt ein anderes Tool als iBooks zu benutzen.
Ich hab dann ein Bash script geschrieben, damit alle ePubs wieder richtig gezippt werden sowie die Namen aus den Metadaten ausgelesen damit der Dateiname anders ist als 213489701234klöafsd.ePub.
Es gibt bestimmt noch andere Anwendungen wo solche teilweise überaus ärgerlichen und fast unverschämte Probleme auftreten.
Was sich Apple dabei gedacht hat, bzw. die Projektmanager und die Entwickler kann ich mir nicht erklären - außer abhängigkeit zu schaffen. Traurig. Werde bei Zeiten das Script zur Verfügung stellen falls es anderen ähnlich geht wie mir."
Nachdem jetzt einige Zeit vergangen ist traue ich mich ein Skript zur freien Verfügung zu stellen. Ich übernehme keine Garantie aber hier bei mir läuft es ohne Probleme.
Vielleicht hilft es dem ein oder anderen ja weiter.
#!/bin/bash
function describe {
echo "#########################################################"
echo Usage: $0 {1 2}
echo Usage: $0 {Exportfolder debug-log}
echo Usage: example $0 {$HOME/Documents/Exportfolder $HOME/Destktop/$0/debug.log}
echo " "
echo This script will read the iTunes books from $STARTFOLDER
echo "#########################################################"
}
START_temp=$HOME/Library/Containers/com.apple.BKAgentService
STARTFOLDER=$START_temp/Data/Documents/iBooks/Books
if [ -z "$1" ] || [ ! -d "$1" ]; then
echo >&2 "Error: You must supply the first argument as a directory!"
describe
exit 1
elif [ -z "$2" ] || [ -d "$2" ]; then
echo >&2 "Error: You must supply the second argument as a filename, not directory!"
describe
exit 1
fi
EXPFOLDER=$1
DEBUGLOG=$2
TEMPDIR=$EXPFOLDER/tmp/ && mkdir -p $TEMPDIR
# ****************************************************************
# get file list of existing books/files in the startfolder for debugging only
# ****************************************************************
cd $STARTFOLDER
FILES="`find . -type d -maxdepth 1`" #$FILES is only for debugging
echo "Starting the program $0:" && echo "Starting the program $0 at `date`" > $DEBUGLOG # second part only for debugging
echo "Following files found:" >> $DEBUGLOG # only for debugging
echo $FILES >> $DEBUGLOG # only for debugging
# ******************************************************************************************
# exclude the root dir and ds store file in the start folder
# for each book (actually folder in iTunes) process the following steps
# - remove iTunesMetadata
# - get the title of the book from the opf file
# - add mimetype file to epub zip
# - add iTunesArtwork file to epub zip
# - add META-INF folder to epub zip
# - add all other files to epub zip
# ******************************************************************************************
for f in ./*
do
cd $STARTFOLDER
if [ "$f" == "." ] || [ "$f" == ".." ] || [ "$f" == "./.DS_Store" ] || [ ! -d "$f" ]
then
continue
fi
cp -r "$f" "$TEMPDIR/"
cd "$TEMPDIR/$f"
echo "Working now in following folder:" >> $DEBUGLOG # - only for debugging
echo "$f" >> $DEBUGLOG # - only for debugging
# ****************************************
# remove iTunesMetadata
# ****************************************
rm -rf iTunesMetadata*
# ************************************************
# get the title of the book from the opf file
# ************************************************
value=`find . -type f -name "*.opf" -exec cat {} \;`
title=$( sed -n 's/.*<dc:title.*>\([^<]*\)<\/dc:title>.*/\1/p' <<< $value )
title=$( echo $title | cut -c 1-93 )
title=$( echo ${title/:/ } )
title=$( echo ${title/\//_} )
title=$( echo ${title/&/&} )
echo "The following book title was generated:" >> $DEBUGLOG # - only for debugging
echo "$title" >> $DEBUGLOG # - only for debugging
# ****************************************
# add mimetype file to epub zip
# ****************************************
if [ -f ./mimetype ]
then
echo "Add mimetypes to book $title" >> $DEBUGLOG # - only for debugging
zip -X0 "$EXPFOLDER/$title.epub" "mimetype" >> $DEBUGLOG
rm -rf mimetype
rm -rf ./.DS_Store
else
echo the file "mimetype" does not exist, without that file you will not have a valid epub file
exit 1
fi
# ****************************************
# add iTunesArtwork file to epub zip
# ****************************************
if [ -f ./iTunesArtwork ]
then
cp ./iTunesArtwork ./cover.png
echo "Add iTunesArtwork to book $title" >> $DEBUGLOG # - only for debugging
zip -Xr "$EXPFOLDER/$title.epub" "iTunesArtwork" "cover.png" >> $DEBUGLOG
rm -rf ./iTunesArtwork
rm -rf ./cover.png
fi
# ****************************************
# add META-INF folder to epub zip
# ****************************************
if [ -d ./META-INF ]
then
cc="${PWD##*/}"
echo "Add META-INF to book $title" >> $DEBUGLOG # - only for debugging
zip -Xr "$EXPFOLDER/$title.epub" "META-INF" >> $DEBUGLOG
rm -rf ./META-INF
fi
# ****************************************
# add all other files to epub zip
# ****************************************
cc="${PWD##*/}"
FILESINDIR="./*"
for g in $FILESINDIR
do
echo "Add rest of the files to book $title" >> $DEBUGLOG # - only for debugging
zip -Xr "$EXPFOLDER/$title.epub" "$g" >> $DEBUGLOG
done
done
# ****************************************
# rename .ibooks into .epub files
# ****************************************
string='.ibooks'
cd "$EXPFOLDER"
for h in ./*
do
if [[ $h == *$string* ]]
then
for h in * ; do mv "$h" "${h//.ibooks/.epub}" ; done
fi
done
# ****************************************
# Remove temporary work directory
# ****************************************
echo "Remove temporary directory" >> $DEBUGLOG
rm -rf $TEMPDIR
echo "finished" && echo "Finished at `date`" >> $DEBUGLOG
echo "Please find the following files in $EXPFOLDER"
echo " "
echo `ls -a $EXPFOLDER`
echo "Please find the log file here: $DEBUGLOG"
exit 0
Um es zu starten muss folgendes getan werden:
- kopiere den Inhalt des Codes in eine Datei, am besten mit einem Editor oder auch Textedit.
- Speichere die Datei mit einem beliebigen Namen (hier heißt es runEpub.sh)
- erstelle einen leeren Ordner in dem die konvertierten Dateien landen sollen
- öffne das Terminal
- navigiere in den Ordner wo dieses Skript liegt ("
cd OrdnerName" zum Ordner wechseln, "
ls" zum Anschauen welche Ordner verfügbar sind, "
pwd" um zu schauen wo man sich gerade auf der Festplatte befindet)
- Führe das Skript dann z.B. so aus:
bash runEpub.sh $HOME/Desktop/export $HOME/Desktop/runEpub.log
- bash ist der Befehl mit dem ich das Skript starte
- dann kommt der Name des Skripts
- dann der ganze Pfad zu dem erstellten Export Ordner ($HOME steht für das User Verzeichnis des aktuellen Users)
- dann der ganze Pfad in dem eine log Datei erstellt werden soll
In der Log Datei sieht man dann grob was gemacht wurde.
Die originalen Dateien werden nicht verändert.