Fertige E-Books für den Kindle leicht gemacht: Das CPAN-Modul EBook::MOBI überführt das bewährte POD-Format für Perl-Dokumentation per Tastendruck in das digitale Mobi-Format für unterschiedliche mobile Endgeräte der Kindle-Familie und ihrer Ableger.
Meine Arbeiten an der Perl-Snapshot-Reihe beginnen regelmäßig mit einem Manuskript im POD-Format (Abbildung 1). Schließlich ist das bewährte Dokumentationsformat einfach zu tippen und zu lesen, und eine Reihe von Tools wandelt es problemlos um: in HTML, in Manual-Seiten, in Latex (und damit in PDF oder Postscript) oder in das vom Linux-Magazins gewünschte Format [2]. Mit dem CPAN-Modul »EBook::MOBI« ist es sogar möglich, aus POD Mobi-Dateien zu erzeugen und private Erzeugnisse als E-Books für Kindle-Lesegeräte und -Apps zu veröffentlichen.
Cloud teilt aus
Dank einer Reihe von Mechanismen zur Verbreitung von E-Book-Dateien innerhalb Amazons Cloud und daran angeschlossener Endgeräte dauert es nicht lange, bis nach der Transformation in das proprietäre HTML-ähnliche Format selbst gefertigte E-Books auf Kindle und Android-Geräten, iPads oder iPhones erscheinen. Kurz: auf jeder Plattform, auf der Amazons Kindle-App läuft.
Die Abbildung 2 präsentiert das Android-Modell Galaxy 4.0 – ein telefonloses Smartphone, das einem iPod Touch nicht unähnlich aussieht – mit einer Neuerscheinung im Kindle-Store: dem aus dem Manuskript-POD der aktuellen Perl-Snapshot-Folge generierten E-Book. Die zugehörige Textansicht in Abbildung 3 zeigt, wie die Kindle-App die Mobi-Datei in ein ansprechendes digitales Layout verwandelt.

Abbildung 2: Die selbst gestrickte Mobi-Datei in der Rubrik “Neuerscheinungen” in der Kindle-App auf einem Galaxy 4.0 Android.

Abbildung 3: Der Text der Mobi-Datei ist hier in der Kindle-App auf dem Galaxy 4.0 Android im angepassten Layout zu sehen.
Ein Blick auf das Original-Manuskript in Abbildung 1 offenbart, dass die Redakteure meine Titelvorschläge oft umschreiben: Aus “Das feuerrote Kindle-Mobil” wurde so ein konservatives “Gutenberg at Home”. Noch etwas fällt auf: Das POD-Format verfügt von Haus aus über kein Image-Tag, aber »EBook::MOBI« versteht das Pseudo-Tag
=image /Pfad/Image.jpg Beschreibung
und fügt die Bilddatei mit Bildtext in das E-Book ein. Doch wie wurde aus der POD-Datei ein digitales E-Book im Amazon-Format?
Listing 1 benötigt drei CPAN-Module, »Sysadm::Install« , »Pod::Parser« und »EBook::MOBI« , die der Aufruf
Listing 1
pod2mobi
01 #!/usr/local/bin/perl -w
02
03 ###################
04 package MyParser;
05 ###################
06 our @ISA = qw(Pod::Parser);
07
08 ###########################################
09 sub title {
10 ###########################################
11 my( $self ) = @_;
12
13 return $self->{ __title };
14 }
15
16 ###########################################
17 sub command {
18 ###########################################
19 my ($parser, $command,
20 $paragraph, $line_num) = @_;
21
22 $paragraph =~ s/\n+$//;
23
24 if( $command eq "head1" ) {
25 $parser->{ __title } = $paragraph if
26 !defined $parser->{ __title };
27 }
28 }
29
30 ###################
31 package main;
32 ###################
33 use strict;
34 use Sysadm::Install qw( slurp );
35 use EBook::MOBI;
36 use Pod::Parser;
37
38 my( $pod_file ) = @ARGV;
39
40 if( !defined $pod_file ) {
41 die "usage: $0 file.pod";
42 }
43
44 my $parser = MyParser->new();
45 $parser->parse_from_file(
46 $pod_file, "/dev/null" );
47
48 my $book = EBook::MOBI->new();
49 my $pod = slurp ( $pod_file,
50 { utf8 => 1 } );
51
52 $book->set_author( "Mike Schilli" );
53 $book->set_title( $parser->title() );
54
55 $book->set_encoding(':encoding(UTF-8)');
56
57 $book->add_pod_content($pod, 'pagemode');
58 $book->make();
59 $book->save();
perl -MCPAN -e 'install Sysadm::Install, EBook::MOBI, Pod::Parser'
vom CPAN-Mirror auf den Rechner holt und installieren lässt. Damit ist das Handwerkszeug vorhanden, um aus einer auf der Kommandozeile übergebenen POD-Datei ein E-Book für Kindle-Apps namens »book.mobi« zu generieren.
Parser-Klasse sucht Titel
Eigentlich benötigt »EBook::MOBI« in Listing 1 nur die Zeilen ab »package main« . Da aber »pod2mobi« den Inhalt der ersten »=head1« -Zeile des POD extrahiert und mit »set_title()« zum Titel des E-Books erhebt, definiert »package MyParser« ab Zeile 4 eine von »Pod::Parser« abgeleitete Klasse. Ihre einzige Aufgabe ist es, im Callback »command« ab Zeile 17 zu überprüfen, ob es sich beim aktuellen POD-Kommando um die erste Hauptüberschrift vom Typ »=head1« handelt, und falls ja, deren Inhalt in der Instanzvariablen »__title« zu sichern.
Die Methode »title()« ab Zeile 9 spielt diesen Inhalt dann etwa dem Hauptprogramm zu. Dieses ruft die Methode »parse_from_file()« des Parsers auf und übergibt den Namen der POD-Datei und die Datei »/dev/null« , damit beim Durchforsten des POD-Codes keine Ausgaben auf »Stdout« erfolgen.
Die Methoden »set_author()« und »set_title()« der Klasse »EBook::MOBI« setzen Autor und Titel des Mobi-Dokuments. Damit Umlaute des UTF-8-kodierten POD-Textes im E-Book ordentlich erscheinen, setzt Zeile 55 die Kodierung mit »set_encoding()« auf »UTF-8« . Fehlt noch, den POD-Code mit »add_pod_content()« zum E-Book hinzuzufügen. Der zweite Parameter »pagemode« veranlasst den Konverter nach jeder »=head1« -Überschrift zum Seitenumbruch. Ein »make()« generiert das Mobi-Format. Die in Zeile 59 aufgerufene Methode »save()« sichert es unter dem Namen »book.mobi« .
Portables E-Book
Nun ist zu klären, wie das frisch erzeugte E-Book auf die Endgeräte gelangt, die das Format lesefreundlich anzeigen. Die unter Linux und anderen Betriebssystemen verfügbare Applikation Calibre stellt das generierte E-Book zwar dar (Abbildung 4), kommt aber mit den Abbildungen durcheinander und scheint allgemein mit dem Mobi-Format auf Kriegsfuß zu stehen. Bei meinen Tests brachte Calibre einige Male Kindle-Geräte beim Hochladen der offiziell unterstützen Dateien zum Absturz.
SSH auf dem Android
Das im Test verwendete Android-Gerät Galaxy 4.0 hat die kostenpflichtige proprietäre App Quick SSHd installiert (Abbildung 5), die einen SSH-Server startet, mit dem sich das »ssh« -Programm auf einem Laptop übers WLAN verbindet. User authentisieren sich per Passwort oder Private-/Public-Key-Kombination. Experimentierfreudige können so, ohne das Gerät rooten zu müssen, das dortige Dateisystem erforschen.

Abbildung 5: Die App Quick SSHd startet einen SSH-Server, der per »scp« die Mobi-Datei im Kindle-Verzeichnis speichert.
Abbildung 6 zeigt, wie das Kommando »scp« vom Laptop aus die Mobi-Datei in das Verzeichnis »/mnt/sdcard/kindle« kopiert, einem Ordner auf der im Android steckenden SD-Speicherkarte, den die installierte Kindle-Applikation überwacht. Findet sie eine neue Mobi-Datei, erscheint sie in den Bereichen »Home« und »On Device« der Kindle-Applikation (Abbildung 2). Wenn ein Kindle am USB-Port einer Linux-Box steckt, lässt sich die Datei auch ins lokal gemountete Verzeichnis »/media/Kindle/documents« kopieren.

Abbildung 6: Das »scp«-Kommando kopiert die Mobi-Datei in den Ordner der Kindle-Applikation auf dem Android-Gerät.
Ab die Post
Listing 2 nutzt stattdessen die Mail-Schnittstelle von Amazon, um die Mobi-Datei an ein Endgerät zu senden. Die Übertragung ist kostenlos, solange das jeweilige Gerät über eine Wireless-Verbindung erreichbar ist. Empfängt der Service eine Mail mit Mobi-Datei als Attachment, schickt er diese ans angegebene Zielgerät. Zudem sind diese E-Books über die Kindle-Cloud auf jedem damit verlinkten Gerät verfügbar (Abbildung 7).
Listing 2
mail-to-kindle
01 #!/usr/local/bin/perl -w
02 use strict;
03 use MIME::Lite;
04
05 my( $file ) = @ARGV;
06
07 if( !defined $file ) {
08 die "usage: $0 file.mobi";
09 }
10
11 my $msg = MIME::Lite->new(
12 From => 'm@perlmeister.com',
13 To =>
14 'Gaxy Galaxy xxx@Kindle.com>',
15 Subject => 'My Ebook',
16 Type => 'multipart/mixed'
17 );
18
19 my $part = MIME::Lite->new(
20 Type => 'text/plain',
21 Data => "some text\n",
22 );
23
24 $msg->attach( $part );
25
26 $msg->attach(
27 Type => 'application/mobi',
28 Path => $file,
29 Filename => $file,
30 Disposition => 'attachment',
31 );
32
33 $msg->send( 'smtp', 'mail.some-smtp.com' );

Abbildung 7: Das selbst gefertigte E-Book erscheint in der persönlichen Kindle-Library auf dem Amazon-Service.
Das Skript in Listing 2 erwartet den Namen der zu übertragenden Mobi-Datei auf der Kommandozeile, zum Beispiel »mail-to-kindle book.mobi« , und erzeugt mit dem CPAN-Moduls MIME::Lite eine Mail mit Attachment. Die schickt es an einen SMTP-Mailserver, der sie zur Amazon-Adresse weiterleitet. Der Name des SMTP-Servers in Zeile 33 ist an den verwendeten Mail-Provider anzupassen.
Jedes Kindle-Gerät und jede Kindle-App zeigt im Menü »Settings« eine personalisierte E-Mail-Adresse unter »@Kindle.com« an. Dort nimmt Amazon Mobi und andere Formate entgegen, jedoch kein ».epub« , und leitet sie an das via Cloud angeschlossene Lesegerät. Die Empfängeradresse in Zeile 14 ist also im Skript an das Endgerät anzupassen.
Vorsicht: Nur über WLAN ist die Übertragung kostenlos, in Amazons Handy-Netzwerk Whispernet fallen Gebühren an. Von der Kindle-Library (Abbildung 7) darf jedes Gerät des Users das E-Book herunterladen. Abbildung 8 zeigt das Manuskript auf einem iPad 2.
Noch nicht ganz perfekt
Aber der Teufel steckt wie immer im Detail: Damit ein E-Book schön formatiert daherkommt, muss oft ein Layouter manuell eingreifen. So dürfen etwa Abbildungen nicht zu dicht hintereinander stehen, damit sie den Textfluss nicht unterbrechen, und zu viele lange Wörter stören den Zeilenumbruch.
Insgesamt ist das proprietäre Mobi-Format weniger durch eine vollständige Spezifikation definiert als dadurch, was auf den jeweiligen Readern gut ankommt. So erfordern unterschiedliche Reader oft auch unterschiedliche Auflösungen für Grafiken. Der Kindle-Shop ist daher voll mit entsprechenden Praxisratgebern.
Das CPAN-Modul »EBook::MOBI« baut auf dem betagten Mobi-Perl-Code [3] auf und unterstützt, anders als das Original, leider keine Abbildung des Covers. Der Code verträgt durchaus noch einige Verbesserungen, wer mag, sollte sich an dem Projekt beteiligen.
Online PLUS
In einem Screencast demonstriert Michael Schilli das Beispiel: https://www.linux-magazin.de/plus/2012/08
Infos
- Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2012/08/Perl
- Linux-Magazin: Hinweise für Autoren: https://www.linux-magazin.de/Heft-Abo/Kontakt/Autor-werden#textformat
- Mobiperl-VN-Repository: https://dev.mobileread.com/svn/mobiperl/
- Kindle Personal Documents Service: http://www.amazon.com/gp/help/customer/display.html?nodeId=200767340









