Find nålen i epub-høstakken

Forleden stod jeg overfor en interessant problemstilling. Jeg skulle blandt vores over 1000 epub-filer finde dem, der var lavet i fixed layout. Ja, vi havde noteret det, men var optegnelsen komplet og var der almindeligt reflowable epubs, der ved en menneskelig fejl var blevet indført som fixed?

Så hvad nu? Åbne hver enkelt fil og checke om den var fixed? Python to the rescue! Epubs er jo bare omdøbte zipfiler, og i metadatafilen i epub’en (.opf) ligger en entydig tekststreng (“pre-paginated“), som kun findes i fixed epubs.

20 minutter og 17 linjer kode senere (vi er helt oppe på 17 linjer, fordi jeg godt kan lide mellemrum i koden – og 20 minutter fordi jeg misforstod hvordan modulet zipfile fungerede) og jeg kunne køre scriptet op mod mappen og få vist, hvilke filer var lavet som fixed.
Har jeg husket at nævne at jeg elsker Python?

Ret smart, hvis jeg selv skal sige det, især af et quick-and-dirty hack at være. Sig endeligt til hvis du har forslag til forbedringer – jeg ser f.eks. nu, at listen fixed er totalt unødvendig, når jeg bare vil skrive filnavnet i konsollen, så scriptet kunne være endnu kortere (linje 14: “print epub” i stedet for “fixed.append(epub)” og så væk med de to nederste linjer). Men hey, det virkede!

Efterfølgende blev jeg så opmærksom på, at hvis der er filer i mappen lavet efter Apples fixed overbygning på epub2-standarden, bliver de ikke fundet – der skal jeg lede efter filen com.apple.ibooks.display-options.xml og i den finde strengen pre-paginated: true. Men det er et job for en senere version af scriptet, hvis jeg nogensinde gider at lave en – jeg tænker at LXML vil være oplagt at bruge. Så kunne jeg også blive bedre til LXML, hvilket aldrig har slået nogen ihjel (i al fald ikke i sager, hvor der har været pålidelige vidner involveret).

Og ja, der var 8 filer i mappen, der var lavet efter Apples gamle overbygning og som ikke blev fundet. Ah well. Det var også en møgoverbygning.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *