Added Android code
[wl-app.git] / Android / r2-streamer / r2-server / src / main / java / org / readium / r2_streamer / server / EpubServer.java
1 package org.readium.r2_streamer.server;
2
3 import org.readium.r2_streamer.fetcher.EpubFetcher;
4 import org.readium.r2_streamer.fetcher.EpubFetcherException;
5 import org.readium.r2_streamer.model.container.Container;
6 import org.readium.r2_streamer.model.publication.EpubPublication;
7 import org.readium.r2_streamer.model.publication.link.Link;
8 import org.readium.r2_streamer.parser.EpubParser;
9 import org.readium.r2_streamer.server.handler.ManifestHandler;
10 import org.readium.r2_streamer.server.handler.MediaOverlayHandler;
11 import org.readium.r2_streamer.server.handler.ResourceHandler;
12 import org.readium.r2_streamer.server.handler.SearchQueryHandler;
13
14 import fi.iki.elonen.router.RouterNanoHTTPD;
15
16 /**
17  * Created by Shrikant Badwaik on 20-Jan-17.
18  */
19
20 public class EpubServer extends RouterNanoHTTPD {
21     private static final String SEARCH_QUERY_HANDLE = "/search";
22     private static final String MANIFEST_HANDLE = "/manifest";
23     private static final String MANIFEST_ITEM_HANDLE = "/(.*)";
24     private static final String MEDIA_OVERLAY_HANDLE = "/media-overlay";
25     private boolean containsMediaOverlay = false;
26
27     public EpubServer(int portNo) {
28         super(portNo);
29     }
30
31
32     /**
33      * Creates local server routes for manifest,search and media-overlay
34      *
35      * @param container contains implementation for getting raw data from file
36      * @param filePath  path to the epub/cbz file
37      */
38     public void addEpub(Container container, String filePath) {
39         try {
40             EpubPublication publication = parse(container, filePath);
41
42             addLinks(publication, filePath);
43
44             EpubFetcher fetcher = new EpubFetcher(container, publication);
45             if (containsMediaOverlay) {
46                 addRoute(filePath + MEDIA_OVERLAY_HANDLE, MediaOverlayHandler.class, fetcher);
47             }
48             //addRoute(filePath + SPINE_HANDLE, EpubHandler.class, fetcher);
49             //addRoute(filePath + TOC_HANDLE, EpubHandler.class, fetcher);
50             addRoute(filePath + MANIFEST_HANDLE, ManifestHandler.class, fetcher);
51             addRoute(filePath + SEARCH_QUERY_HANDLE, SearchQueryHandler.class, fetcher);
52             addRoute(filePath + MANIFEST_ITEM_HANDLE, ResourceHandler.class, fetcher);
53         } catch (EpubFetcherException e) {
54             System.out.println("EpubServer" + " EpubFetcherException: " + e);
55         }
56     }
57
58     /**
59      * Adds links to the publication
60      * <p>
61      * ref=> https://github.org/readium/webpub-manifest#links
62      *
63      * @param publication publication with parsed OPF data
64      * @param filePath
65      */
66     private void addLinks(EpubPublication publication, String filePath) {
67         containsMediaOverlay = false;
68         for (Link link : publication.links) {
69             if (link.rel.contains("media-overlay")) {
70                 containsMediaOverlay = true;
71                 link.href = link.href.replace("port", "localhost:" + getListeningPort() + filePath);
72             }
73         }
74
75         // A manifest must contain at least one link using the self relationship.
76         // This link must point to the canonical location of the manifest using an absolute URI:
77         publication.links.add(new Link(
78                 "localhost:" + getListeningPort() + filePath + MANIFEST_HANDLE,
79                 "self",
80                 "application/webpub+json"));
81
82         publication.links.add(new Link(
83                 "localhost:" + getListeningPort() + filePath + SEARCH_QUERY_HANDLE,
84                 "search",
85                 "text/html"));
86     }
87
88     private EpubPublication parse(Container container, String filePath) {
89         EpubParser parser = new EpubParser(container);
90         return parser.parseEpubFile(filePath);
91     }
92 }