OK, nun habe ich also einen Kindle und kann lesen was ich will und wann ich will. Da fällt mir als erstes natürlich Wikipedia ein. Doch so wie es scheint, gibt es keine aktuelle Version von Wikipedia für den Kindle. Was nun? Eine alte Version von 2099 habe ich noch gefunden oder einzelne Artikel mit Hilfe von web2kindle kopieren? Ne, da wird sich doch was machen lassen. Also starte ich mal wieder mit einem neuen Projekt. Folgende Aufgaben liegen vor mir:
1. Von den ca. 1.4 Millionen deutschen Artikeln die Top Artikel rauspicken.
Das ist einfach. Ich habe Zugriff auf die Wikipedia Statistiken. Hier habe ich mir die ca. 90.000 Artikel mit den Top Zugriffszahlen rausgesucht.
Erledigt.
2. Die Artikel als HTML erzeugen.
Dies ist ein echtes Problem. Meine Idee war, ich lade mir den XML Dump, exportiere die benötigten Artikel und konvertiere die Wiki-Syntax nach HTML. Nachdem ich ca. 20 Wiki-Parser ausprobiert habe, ist mir die Luft ausgegangen und ich habe es mit HTML Scraping versucht. Also die Artikel direkt bei de.wikipedia.org als HTML Code heruntergeladen und dann mit Hilfe von regulären Ausdrücken aus dem HTML Code den Header, Footer, Navigation, etc. entfernt. Das ist zwar so ziemlich die dämlichste Lösung, die mir eingefallen ist, aber es funktioniert und ist sogar vergleichsweise schnell.
3. Erzeugen einer EPUB Datei.
Aus den Wikipedia HTML Dateien muss ich nun eine Epub Datei erzeugen. Das ist wieder ein Schritt, der erst mal recht simpel klingt, aber es doch wieder in sich hat, da hier viele Sonderfälle unterschieden werden müssen. Alles in allem ist eine Epub Datei ja nur ein Zip Archiv, das verschiedene Elemente wie z.B. die toc.ncx, toc.xhtml und content.opf enthält. Zusätzlich noch die HTML Dateien, ein Cover und ein paar andere unwichtige Dateien, die ich hier jetzt nicht extra aufzählen muss. Also habe ich mir ein paar Scripte gebastelt, mit denen ich die Inhalte der toc.ncx, toc.xhtml und content.opf erzeugen kann und die Dateistruktur einer epub Datei anlege. Das ganze wird dann noch mit zip -r zu einem Archiv gepackt und fertig ist die epub Datei. Das ganze funktioniert bis hierhin schon mal ganz gut. Die fertige epub Datei ist allerdings 550 MB groß. Zum Test habe ich mal eine epub Datei mit nur 1000 Wikipedia Artikeln erstellt und mit der Datei weiter gearbeitet.
4. Umwandeln der epub Datei in eine mobi Datei
Extra für diesen Zweck stellt Amazon ein kleines Werkzeug zur Verfügung. Das Tool “kindlegen” kann epub Dateien in einem Rutsch in eine mobi Datei umwandeln. Klingt erst mal gut, aber was ist, wenn die Datei etwas größer ist? Zum Umwandlen meiner Wikipedia Test Datei (1000 Artikel) hat kindlegen (Amazon.com kindlegen Linux V2.4 build 69900) je nach Kompressionsverfahren ganz schön lange gebraucht. Es gibt folgende 3 Kompessionen:
-c0: no compression
-c1: standard DOC compression
-c2: Kindle huffdic compression
Vor allem die Option -c2 (Kindle huffdic compression) hat eine Laufzeit, die bei der kleinen Test Datei schon mehrere Tage ist. Zudem scheinen meine XHTML Dateien nicht ganz OK zu sein, denn ich bekomme einen Haufen von Warnungen. Hier mal eine kleine Auswahl der kindlegen Warnungen, die ich während der Erzeugung der mobi Datei gesehen habe:
Warnung(htmlprocessor):W27002: Im Inhalt spezifiertes HTML-Attribut wird von Kindle-Lesegeräten nicht unterstützt. Attribut wird entfernt: ‘onclick’ In Datei: /tmp/mobi-0sOkqg/data/wiki/f9c66c5f662f815902d8ee7023aea1275660465e.xhtml
Warnung(htmlprocessor):W28001: Im Inhalt spezifierter CSS-Stil wird von Kindle-Lesegeräten nicht unterstützt. CSS-Property wird entfernt: ‘column-count’ In Datei: /tmp/mobi-0sOkqg/data/wiki/849630f710aac962836ede95abdb3d15c022b389.xhtml
Warnung(htmlprocessor):W28001: Im Inhalt spezifierter CSS-Stil wird von Kindle-Lesegeräten nicht unterstützt. CSS-Property wird entfernt: ‘overflow-y’ In Datei: /tmp/mobi-0sOkqg/data/wiki/f6f23dbba3e352e9760f1798031bd1e247035c4a.xhtml
Warnung(htmlprocessor):W28003: Im Inhalt spezifierter Wert für CSS-Property wird von Kindle-Lesegeräten nicht unterstützt. Lesen Sie bitte in den Kindle Publishing Guidelines über die Verwendung von Eigenschaften: ‘position: relative’ In Datei: /tmp/mobi-0sOkqg/data/wiki/ff623093e737d48f55ba74ea743f983abf686796.xhtml
Warnung(inputpreprocessor):W29004: Gewaltsam geschlossenes offenes Tag:
Warnung(inputpreprocessor):W29007: Abgelehntes unbekanntes Tag:
Warnung(inputpreprocessor):W29008: Tag wegen unsachgemäßer Nutzung abgelehnt:
Warnung(NCXBuilder):W30001: Ein überlappender darauffolgender Navigationspunkt wurde für den Navigationspunkt gefunden: “Utopie”
Warnung(prcgen):W14001: Hyperlink nicht aufgelöst: /w/index.php?title=Uilpata&action=edit&redlink=1
Warnung(prcgen):W14002: Einige Hyperlinks konnten nicht aufgelöst werden.
Warnung(prcgen):W14010: Mediendatei nicht gefunden /tmp/mobi-0sOkqg/data/wiki/Datei:Administrative_Gliederung_Deutschlands.png
Warnung(prcgen):W14019: Cover ist zu klein : /tmp/mobi-0sOkqg/data/cover.jpeg
Warnung(prcgen):W14210: Syntax-Fehler in einem Skript (Skript wird nicht ausgeführt)
Warnung(prcgen):W14217: <input type=”text” />-, <select>- oder </select><textarea>-Tag kein name-Attribut: Tag wird ignoriert </textarea>
Zum Glück ist der kindlegen recht auskunftsfreudig und so sehe ich wenigstens was der Prozess so alles macht und welcher Teil so lange benötigt. Hier mal die Zusammenfassung der Ausgaben des kindlegen mit der Option “-verbose (provides more information during ebook conversion).
**************************************************
* Amazon.com kindlegen(Linux) V2.4 build 69900 *
* Ein E-Book-Befehlszeilen-Compiler *
* Copyright Amazon.com 2012 *
**************************************************
Info:I9007:Option: -c2: Kindle Huffdic-Komprimierung
Info:I9014:Option: -verbose: Ausführliche Ausgabe
Info(prcgen):I1048: ePub-Datei entpacken
Info(prcgen):I1047: Metadaten hinzugefügt dc:Title “Wikipedia für den Kindle”
Info(prcgen):I1047: Metadaten hinzugefügt dc:Creator “Michael Jentsch”
Info(prcgen):I1047: Metadaten hinzugefügt dc:Publisher “web2kindle.de”
Info(prcgen):I1047: Metadaten hinzugefügt dc:Rights “Creative Commons Attribution-ShareAlike 3.0 Unported”
Info(cssparser):I10004: @-Regeln außer @import, @charset und @font-face werden nicht unterstützt.
Info(prcgen):I1052: Kindle unterstützt Cover-Bilder aber nicht die Cover HTML. Daher mit dem angegebenes Cover-Bild benuetzen und die Cover HTML im Inhalt unterdrücken. URL: /tmp/mobi-0sOkqg/data/titlepage.xhtml
Info(prcgen):I1002: Parsing von Dateien 0001002
Info(prcgen):I1003: Parsing der Datei URL: toc.xhtml
Info(prcgen):I1003: Parsing der Datei URL: part-1.xhtml
Info(prcgen):I1003: Parsing der Datei URL: 74a55336adf2f8e7bdc17d39d1070d648ca984d6.xhtml
….
Info(prcgen):I1003: Parsing der Datei URL: 7de840c0ada81d52f8625e60ee9da26eead63b3d.xhtml
Error: Token does not correspond to any possible token in language at position: 24
Zeile: 0000245 In Datei: /tmp/mobi-0sOkqg/data/wiki/7de840c0ada81d52f8625e60ee9da26eead63b3d.xhtml
Info(prcgen):I1003: Parsing der Datei URL: bcc6c53fedd159ffdc049933a2ebef65b5a06ecb.xhtml
Info(prcgen):I1015: PRC-Datei erstellen
Info(prcgen):I1006: Hyperlinks werden aufgelöst
Info(prcgen):I1010: Hyperlinks schreiben
Info(prcgen):I1049: Inhaltsverzeichnis erstellen URL: /tmp/mobi-0sOkqg/data/toc.ncx
Info(prcgen):I1014: Mediendatei konvertieren und zusammenführen “/tmp/mbt-C3GDmD”
Info(prcgen):I1014: Mediendatei konvertieren und zusammenführen “/tmp/mobi-0sOkqg/data/FreeSerif.otf”
Info(prcgen):I1014: Mediendatei konvertieren und zusammenführen “/tmp/mobi-0sOkqg/data/FreeSerifItalic.otf”
Info(prcgen):I1014: Mediendatei konvertieren und zusammenführen “/tmp/mobi-0sOkqg/data/FreeSerifBold.otf”
Info(prcgen):I1014: Mediendatei konvertieren und zusammenführen “/tmp/mobi-0sOkqg/data/FreeSerifBoldItalic.otf”
Info(prcgen):I1013: Bilddatei konvertieren und zusammenführen “/tmp/mobi-0sOkqg/data/wiki/Datei:Administrative_Gliederung_Deutschlands.png”
Info(prcgen):I1013: Bilddatei konvertieren und zusammenführen “/tmp/mobi-0sOkqg/data/cover.jpeg”
Info(pagemap):I8000: Keine Page-Map im Buch gefunden
Info(prcgen/inflections):I1012: Kompilieren der Flexionen
Info(prcgen):I1019: Index wird im Datensatz erstellt 0000000 Indexname: $NCX
Info(prcgen):I1026: Unicode-Index verwendet utf-8-Kodierung
Info(prcgen):I1045: Benötigte UNICODE-Bereiche für das Buch werden berechnet
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Basic Latin [20..7E]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Latin-1 Supplement [A0..FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: General Punctuation – Windows 1252 [2013..2014]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Spacing Modifier Letters [2B0..2FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Latin Extended-A [100..17F]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Basic Greek [370..3FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Greek Extended [1F00..1FFF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Arrows [2190..21FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: IPA Extensions [250..2AF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Mathematical Operators [2200..22FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Geometric Shapes [25A0..25FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: CJK Unified Ideographs [4E00..9FFF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: General Punctuation – other than Windows 1252 [2031..2038]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Latin Extended-B [180..24F]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Latin Extended Additional [1E00..1EFF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Basic Arabic [600..6FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Currency Symbols [20A0..20CF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Combining Diacritical Marks [300..36F]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Basic Hebrew [590..5FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Cyrillic [400..4FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Halfwidth and Fullwidth Forms [FF00..FFEF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Hiragana [3040..309F]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Chinese, Japanese, and Korean (CJK) Symbols and Punctuation [3000..303F]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Miscellaneous Technical [2300..23FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Letter-like Symbols [2100..214F]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Subscripts and Superscripts [2070..209F]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Miscellaneous Symbols [2600..26FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Gujarati [A80..AFF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Basic Georgian [10A0..10FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Devanagari [900..97F]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Katakana [30A0..30FF]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Hangul [AC00..D7A3]
Info(prcgen):I1046: Gefundener UNICODE-Bereich: Armenian [530..58F]
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000001
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000002
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000004
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000008
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000016
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000032
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000064
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000128
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000256
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0000512
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0001024
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0002048
Info(prcgen/compress):I4001: Kompilation des Quelltexts zur Komprimierung (max. 4096 Durchgänge Durchgang 0004095
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000001
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000002
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000003
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 36.03%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 003070554 bytes 000278298 Einträge
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000004
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 33.22%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 002117950 bytes 000189492 Einträge
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000005
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 32.34%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 001705374 bytes 000149420 Einträge
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000006
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 31.49%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 001371844 bytes 000118992 Einträge
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000007
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 30.95%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 001105218 bytes 000095031 Einträge
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000008
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 30.67%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 000902596 bytes 000075920 Einträge
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000009
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 30.56%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 000736848 bytes 000060715 Einträge
Info(prcgen/compress):I4002: Komprimierungsdurchgang 0000010
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 30.59%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 000602246 bytes 000048573 Einträge
Info(prcgen):I1044: Uncomprimierte Datensatzgröße: 0004096
Info(prcgen/compress):I4005: Erweiterte Komprimierung erfolgreich (dekodiert und verifiziert)
Info(prcgen):I2001: Endstatistik – Text: 008551281 bytes 000006907 Datensätze
Info(prcgen):I2002: Endstatistik – Bilder: 000000000 bytes 000000000 Datensätze
Info(prcgen):I2003: Endstatistik – Indizes: 000032892 bytes 000000003 Datensätze
Info(prcgen):I2004: Endstatistik – Hinterkante: 000040924 bytes 000006858 Datensätze
Info(prcgen):I2005: Endstatistik – Frames: 000000088 bytes 000000002 Datensätze
Info(prcgen):I2006: Endstatistik – Andere: 015185211 bytes 000000013 Datensätze
Info(prcgen):I2007: Endstatistik – Gesamt: 023810396 bytes 000006925 Datensätze
Info(prcgen):I1039: Endstatistik – text komprimiert (in% der Originalgröße): 30.59%
Info(prcgen):I1040: Die Dokument-ID ist: “Wikipedia_fur_den_Kindle”
Info(prcgen):I1041: Die Dateiformatversion ist V6
Info(prcgen):I1031: PRC-Datei speichern
Info(prcgen):I1033: PRC-Datei mit Warnungen erstellt!
Info(prcgen):I1016: Erweiterte PRC-Datei erstellen
Info(prcgen):I1007: Mediaidlinks werden aufgelöst
Info(prcgen):I1011: Mediaidlinks schreiben
Info(prcgen):I1009: Guide-Elemente werden aufgelöst
Info(prcgen):I1014: Mediendatei konvertieren und zusammenführen “/tmp/mobi-0sOkqg/data/cover.jpeg”
Info(prcgen):I1019: Index wird im Datensatz erstellt 0000000 Indexname: $FRAG
Info(prcgen):I1019: Index wird im Datensatz erstellt 0000005 Indexname: $SKEL
Info(prcgen):I1019: Index wird im Datensatz erstellt 0000007 Indexname: $GUIDE
Info(prcgen):I1019: Index wird im Datensatz erstellt 0000010 Indexname: $NCX
Info(prcgen):I1029: Der Standard-Suchindex ist: “$NCX”
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 34.94%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 003710702 bytes 000332912 Einträge
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 002564650 bytes 000225614 Einträge
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 31.43%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 002091822 bytes 000178240 Einträge
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 30.61%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 001684764 bytes 000142004 Einträge
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 30.15%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 001380220 bytes 000113414 Einträge
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 29.89%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 001137498 bytes 000090649 Einträge
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 29.78%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 000939516 bytes 000072504 Einträge
Info(prcgen/compress):I4006: Text komprimiert auf (in % der Originalgröße): 29.81%
Info(prcgen/compress):I4007: Komprimierungswörterbuch-Statistiken: 000779046 bytes 000058019 Einträge
Info(prcgen):I2001: Endstatistik – Text: 010888156 bytes 000009021 Datensätze
Info(prcgen):I2003: Endstatistik – Indizes: 000279928 bytes 000000013 Datensätze
Info(prcgen):I2004: Endstatistik – Hinterkante: 000053464 bytes 000008963 Datensätze
Info(prcgen):I2005: Endstatistik – Frames: 000000116 bytes 000000003 Datensätze
Info(prcgen):I2006: Endstatistik – Andere: 000029240 bytes 000000003 Datensätze
Info(prcgen):I2007: Endstatistik – Gesamt: 011250904 bytes 000009040 Datensätze
Info(prcgen):I1039: Endstatistik – text komprimiert (in% der Originalgröße): 29.81%
Info(prcgen):I1041: Die Dateiformatversion ist V8
Info(prcgen):I1032: PRC-Datei erfolgreich erstellt
Info(prcgen):I1037: Mobi-Datei mit Warnungen erstellt!
Jetzt habe ich also 3 mobi Dateien mit dem gleichen Inhalt. Aber die 3 mobi Dateien haben je nach Kompression unterschiedliche Dateigröße.
Ohne Kompression ist die Datei 77 MB groß. Mit der Standard DOC Kompression ist die Datei noch 47 MB groß und die Kindle huffdic Kompression erstellt eine 34 MB große Datei. Klar ist die letzte Datei die kleinste und das Kompressionsverfahren ist für den Kindle optimiert, aber wenn ich für eine Datei mit 1000 Artikel mehrere Tage Laufzeit einplanen muss, was ist dann, wenn die Datei statt der 1000 Artikel nun ca. 80.000 oder mehr Artikel enthält? Das gilt es nun auszuprobieren und ich bin schon gespannt auf das Ergebnis.
To be continued …
Wow hab seit gestern ein Kindle und finds echt toll! Aber deine Anleitung übersteigt doch bei weiten meine Kompetenz^^ Vielleicht warte ich bis irgendwann Wikipedia auch für das Kindle erreichbar ist. Aber trotzdem danke für deine Mühe.