Added Android code
[wl-app.git] / Android / r2-streamer / r2-server / src / main / java / org / readium / r2_streamer / server / EpubServer.java
diff --git a/Android/r2-streamer/r2-server/src/main/java/org/readium/r2_streamer/server/EpubServer.java b/Android/r2-streamer/r2-server/src/main/java/org/readium/r2_streamer/server/EpubServer.java
new file mode 100755 (executable)
index 0000000..88490d6
--- /dev/null
@@ -0,0 +1,92 @@
+package org.readium.r2_streamer.server;
+
+import org.readium.r2_streamer.fetcher.EpubFetcher;
+import org.readium.r2_streamer.fetcher.EpubFetcherException;
+import org.readium.r2_streamer.model.container.Container;
+import org.readium.r2_streamer.model.publication.EpubPublication;
+import org.readium.r2_streamer.model.publication.link.Link;
+import org.readium.r2_streamer.parser.EpubParser;
+import org.readium.r2_streamer.server.handler.ManifestHandler;
+import org.readium.r2_streamer.server.handler.MediaOverlayHandler;
+import org.readium.r2_streamer.server.handler.ResourceHandler;
+import org.readium.r2_streamer.server.handler.SearchQueryHandler;
+
+import fi.iki.elonen.router.RouterNanoHTTPD;
+
+/**
+ * Created by Shrikant Badwaik on 20-Jan-17.
+ */
+
+public class EpubServer extends RouterNanoHTTPD {
+    private static final String SEARCH_QUERY_HANDLE = "/search";
+    private static final String MANIFEST_HANDLE = "/manifest";
+    private static final String MANIFEST_ITEM_HANDLE = "/(.*)";
+    private static final String MEDIA_OVERLAY_HANDLE = "/media-overlay";
+    private boolean containsMediaOverlay = false;
+
+    public EpubServer(int portNo) {
+        super(portNo);
+    }
+
+
+    /**
+     * Creates local server routes for manifest,search and media-overlay
+     *
+     * @param container contains implementation for getting raw data from file
+     * @param filePath  path to the epub/cbz file
+     */
+    public void addEpub(Container container, String filePath) {
+        try {
+            EpubPublication publication = parse(container, filePath);
+
+            addLinks(publication, filePath);
+
+            EpubFetcher fetcher = new EpubFetcher(container, publication);
+            if (containsMediaOverlay) {
+                addRoute(filePath + MEDIA_OVERLAY_HANDLE, MediaOverlayHandler.class, fetcher);
+            }
+            //addRoute(filePath + SPINE_HANDLE, EpubHandler.class, fetcher);
+            //addRoute(filePath + TOC_HANDLE, EpubHandler.class, fetcher);
+            addRoute(filePath + MANIFEST_HANDLE, ManifestHandler.class, fetcher);
+            addRoute(filePath + SEARCH_QUERY_HANDLE, SearchQueryHandler.class, fetcher);
+            addRoute(filePath + MANIFEST_ITEM_HANDLE, ResourceHandler.class, fetcher);
+        } catch (EpubFetcherException e) {
+            System.out.println("EpubServer" + " EpubFetcherException: " + e);
+        }
+    }
+
+    /**
+     * Adds links to the publication
+     * <p>
+     * ref=> https://github.org/readium/webpub-manifest#links
+     *
+     * @param publication publication with parsed OPF data
+     * @param filePath
+     */
+    private void addLinks(EpubPublication publication, String filePath) {
+        containsMediaOverlay = false;
+        for (Link link : publication.links) {
+            if (link.rel.contains("media-overlay")) {
+                containsMediaOverlay = true;
+                link.href = link.href.replace("port", "localhost:" + getListeningPort() + filePath);
+            }
+        }
+
+        // A manifest must contain at least one link using the self relationship.
+        // This link must point to the canonical location of the manifest using an absolute URI:
+        publication.links.add(new Link(
+                "localhost:" + getListeningPort() + filePath + MANIFEST_HANDLE,
+                "self",
+                "application/webpub+json"));
+
+        publication.links.add(new Link(
+                "localhost:" + getListeningPort() + filePath + SEARCH_QUERY_HANDLE,
+                "search",
+                "text/html"));
+    }
+
+    private EpubPublication parse(Container container, String filePath) {
+        EpubParser parser = new EpubParser(container);
+        return parser.parseEpubFile(filePath);
+    }
+}
\ No newline at end of file