Journals>Journals von diekroete>iBooks ade - wie von iBooks zu Calibre oder anderem ePub Programm

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/&amp;/&} )
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.

Kommentare

Feline36906.06.15 21:17
Hi!

Ich habe das selbe Problem mit iBooks und würde gerne Dein Skript ausführen. Doch leider kenne ich mich mit Terminal nicht so richtig aus und daher läuft es nicht. Stattdessen lässt es mich mit vielen Fragezeichen zurück:

- Welche Ordner / Dateien müssen wo existieren?
- Was hat es mit den Parametern auf sich?
- Bei mir haben die Ordner deutsche Namen (z.B. Dokumente statt Documents) muss ich dann etwas an dem Skript verändern? Wenn ja, an welchen Stellen?
- Im Skript ist im Pfad für den Startfolder ein Leerzeichen vor iBooks - ist das richtig?

Kannst Du vielleicht für Anfänger noch mal erklären, wie genau man das Skript ausführt?

Vielen Dank und viele Grüße,
Feline
diekroete08.06.15 09:49
Hallo Feline,
danke für deine Nachfrage und die gefunden Fehler.
Ich habe am Ende des Journals nochmal Schritt für Schritt geschrieben was getan weden muss. Ich hoffe das Hilft.

- Existieren muss nur eine Skript Datei mit dem Code und der (leere) Export Ordner.
- die Beiden Paramter sind einmal der Export Ordner und dann zweitens die Log Datei (jeweils den ganzen Pfad angeben)
- der Name vom STARTFOLDER ist tatsächlich Englisch (zumindest habe ich das noch nicht anders gesehen)
(zum Testen gib im Terminal mal folgendes ein: cd $HOME/Library/Containers/com.apple.BKAgentService/Data/Docum ents/iBooks/Books
und dann ls)
Damit solltest du dann eine Ausgabe von allen einen Büchern erhalten, die in iBooks drin sind)

- das Leerzeichen bei iBooks war falsch, ist durch automatischen Umbruch hier hinzugefügt worden, das habe ich jetzt aufgeteilt, damit das nicht mehr passiert.

Viele Grüße,
Claas
Feline36908.06.15 23:29
Hallo Claas,

danke für die ausführliche Erläuterung. Nachdem ich es geschafft hatte, das Skript in eine Datei (über OpenOffice als txt-Datei) zu speichern, lief alles wunderbar (auch wenn mich zunächst ein paar Fehlermeldungen irritiert haben, doch die habe ich einfach ignoriert *gg*).

Viele Grüße,
Feline

Kommentieren

Sie müssen sich einloggen, um diese Funktion nutzen zu können.

OK MacTechNews.de verwendet Cookies unter anderem für personalisierte Inhalte, Seitenanalyse und bei der Auslieferung von Google-Anzeigen. Dies war zwar schon immer so, auf Wunsch der EU muss nun jedoch explizit darauf hingewiesen werden. Durch Nutzung der Website erklären Sie sich damit einverstanden. Weitere Informationen