Skip to content

Instantly share code, notes, and snippets.

@tbje
Created September 13, 2010 10:11
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tbje/577088 to your computer and use it in GitHub Desktop.
Save tbje/577088 to your computer and use it in GitHub Desktop.
#!/bin/bash
# http://blog.trondbjerkestrand.no/post/1114624297/automated-kindle-epub-delivery
# navigate to home directory
cd /home/[username]/aftenposten
url=[find this when signing up to beta test]
kindleEmail=[username]@Kindle.com # or [username]@free.kindle.com
# date as argument or todays date
if [ $# -eq 0 ]; then
date=`date '+%Y%m%d'`
else
date=$1
fi
# only proceed if not already downloaded
if [ ! -f aftenposten_${date}.epub ]; then
# download file, proceed only if available
if `wget ${url}/aftenposten_${date}.epub`; then
unzip -d aftenposten_$date aftenposten_$date.epub
scala -cp bin FixAftenposten aftenposten_$date/metadata.opf aftenposten_$date/toc.ncx aftenposten_$date/content/contents.html
cd aftenposten_$date
zip -r ../aftenposten_${date}_kindle.epub *
cd ..
bin/kindlegen aftenposten_${date}_kindle.epub
mutt -a aftenposten_${date}_kindle.mobi -s Aftenposten ${kindleEmail} < "."
rm -rf aftenposten_$date aftenposten_${date}_kindle.epub aftenposten_${date}_kindle.mobi
fi
fi
/* http://blog.trondbjerkestrand.no/post/1114624297/automated-kindle-epub-delivery */
import scala.xml._
import scala.xml.transform._
import scala.xml.factory.XMLLoader
import javax.xml.parsers.SAXParser
/* Avoid loading dtd for contents.xml */
object MyXML extends XMLLoader[Elem] {
override def parser: SAXParser = {
val f = javax.xml.parsers.SAXParserFactory.newInstance()
f.setNamespaceAware(false)
f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
f.newSAXParser()
}
}
/* Arguments: Location of metadata.opf, toc.ncx, contents.html */
object FixAftenposten {
def main(args: Array[String]) {
val metadata = XML.load(args(0))
val toc = XML.load(args(1))
val items = (metadata \\ "item").map(x=>(x \ "@href" text, x \ "@id" text)).toMap
val spine = (toc \\ "content").map(_ \ "@src" text).map(items(_)).map(x=>(<itemref idref={x}/>))
object ReplaceSpine extends RewriteRule {
override def transform(n: Node): Seq[Node] = n match {
case Elem(prefix, n @ "spine", attribs, scope, a @ _*) =>
Elem(prefix, n, attribs, scope, a(1)++spine :_*)
case other => other
}
}
object AftenpostenTransformer extends RuleTransformer(ReplaceSpine)
XML.save(args(0), AftenpostenTransformer(metadata), "UTF-8", true, null)
val content = MyXML.load(args(2))
object ReplaceIndex extends RewriteRule {
override def transform(n: Node): Seq[Node] = n match {
case Elem(prefix, n @ "table", attribs, scope, children @ _*) =>
(<ul>{children \\ "li"}</ul>)
case other => other
}
}
object AftenpostenIndexTransformer extends RuleTransformer(ReplaceIndex)
XML.save(args(2), AftenpostenIndexTransformer(content), "UTF-8", true, null)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment