package com.ndu.mobile.daisy.providers.librivox; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Locale; import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlSerializer; import com.ndu.mobile.daisy.providers.exceptions.NDULibraryParsingException; public class Daisy2Generator { public static final String NCC_FILE = "ncc.html"; public static final String MASTER_FILE = "master.smil"; public static final String SMIL_FILE = "Book.smil"; public static final String AUDIO_DIR = "audio/"; public static void Generate(String title, String author, String basedir, LVoxRSS rss) throws NDULibraryParsingException { writeNCC(title, author, basedir, rss); writeMaster(title, basedir); writeSmil(title, author, basedir, rss); } private static void writeNCC(String title, String author, String basedir, LVoxRSS rss) throws NDULibraryParsingException { File output = new File(basedir, NCC_FILE); try { XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance(); XmlSerializer serializer = parserFactory.newSerializer(); FileWriter writer = new FileWriter(output); //StringWriter writer = new StringWriter(); serializer.setOutput(writer); serializer.startDocument("UTF-8", true); serializer.startTag("", "html"); serializer.attribute("", "xmlns", "http://www.w3.org/1999/xhtml"); serializer.startTag("", "head"); serializer.startTag("", "title"); serializer.text(title); serializer.endTag("", "title"); writeMeta(serializer, "dc:title", title); writeMeta(serializer, "dc:creator", author); serializer.endTag("", "head"); serializer.startTag("", "body"); for (int i = 0; i < rss.getChapters().size(); i++) { writeNavEntry(serializer, i, rss.getChapters().get(i)); } serializer.endTag("", "body"); serializer.endTag("", "html"); serializer.endDocument(); writer.close(); //return true; } catch (Exception e) { throw new NDULibraryParsingException(e.getMessage()); } } private static void writeMeta(XmlSerializer serializer, String name, String content) throws IOException { serializer.startTag("", "meta" ); serializer.attribute("", "name", name); serializer.attribute("", "content", content); serializer.endTag("", "meta"); } private static void writeNavEntry(XmlSerializer serializer, int index, LVoxChapter chapter) throws IOException { String strIndex = String.valueOf(index); serializer.startTag("", "h1" ); serializer.attribute("", "id", "entry-" + strIndex); serializer.startTag("", "a" ); serializer.attribute("", "href", "Book.smil#dtb" + strIndex); serializer.attribute("", "id", "link" + strIndex); serializer.text(chapter.getTitle()); serializer.endTag("", "a"); serializer.endTag("", "h1"); } private static void writeMaster(String title, String basedir) throws NDULibraryParsingException { File output = new File(basedir, MASTER_FILE); try { XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance(); XmlSerializer serializer = parserFactory.newSerializer(); FileWriter writer = new FileWriter(output); //StringWriter writer = new StringWriter(); serializer.setOutput(writer); serializer.startDocument("UTF-8", true); serializer.startTag("", "smil"); serializer.startTag("", "head"); writeMeta(serializer, "dc:title", title); writeMeta(serializer, "dc:format", "Daisy 2.02"); writeMeta(serializer, "ncc:generator", "Darwin Reader"); serializer.endTag("", "head"); serializer.startTag("", "body"); serializer.startTag("", "ref"); serializer.attribute("", "title", title); serializer.attribute("", "src", SMIL_FILE); serializer.attribute("", "id", "masterdtb111"); serializer.endTag("", "ref"); serializer.endTag("", "body"); serializer.endTag("", "smil"); serializer.endDocument(); writer.close(); //return true; } catch (Exception e) { throw new NDULibraryParsingException(e.getMessage()); } } private static void writeSmil(String title, String author, String basedir, LVoxRSS rss) throws NDULibraryParsingException { File output = new File(basedir, SMIL_FILE); try { XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance(); XmlSerializer serializer = parserFactory.newSerializer(); FileWriter writer = new FileWriter(output); //StringWriter writer = new StringWriter(); serializer.setOutput(writer); serializer.startDocument("UTF-8", true); serializer.startTag("", "smil"); serializer.startTag("", "head"); writeMeta(serializer, "dc:format", "Daisy 2.02"); writeMeta(serializer, "generator", "Darwin Reader"); serializer.endTag("", "head"); serializer.startTag("", "body"); serializer.startTag("", "seq"); for (int i = 0; i < rss.getChapters().size(); i++) { writePar(serializer, basedir, i, rss.getChapters().get(i)); } serializer.endTag("", "seq"); serializer.endTag("", "body"); serializer.endTag("", "smil"); serializer.endDocument(); writer.close(); //return true; } catch (Exception e) { throw new NDULibraryParsingException(e.getMessage()); } } private static void writePar(XmlSerializer serializer, String basedir, int index, LVoxChapter chapter) throws IOException { String indexStr = String.valueOf(index); File mp3File = new File(basedir, AUDIO_DIR + indexStr + ".mp3"); double duration = calculateDuration(mp3File); serializer.startTag("", "par"); serializer.startTag("", "audio"); serializer.attribute("", "src", "audio/" + indexStr + ".mp3"); serializer.attribute("", "clip-begin", "npt=0.00s"); serializer.attribute("", "clip-end", String.format(Locale.US, "npt=%.3fs", duration) ); serializer.attribute("", "id", "dtb" + index); serializer.endTag("", "audio"); serializer.endTag("", "par"); } private static double calculateDuration(File mp3File) { // GetDuration = Int(((LOF(intNumFile) * 8) / intBitrate) / 1000) // assuming 64 kbps on all the MP3s from Librivox final double BIT_RATE = 64; double duration = mp3File.length() * 8 / BIT_RATE / 1000; return duration; } }