1 package org.readium.r2_streamer.server;
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;
14 import fi.iki.elonen.router.RouterNanoHTTPD;
17 * Created by Shrikant Badwaik on 20-Jan-17.
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;
27 public EpubServer(int portNo) {
33 * Creates local server routes for manifest,search and media-overlay
35 * @param container contains implementation for getting raw data from file
36 * @param filePath path to the epub/cbz file
38 public void addEpub(Container container, String filePath) {
40 EpubPublication publication = parse(container, filePath);
42 addLinks(publication, filePath);
44 EpubFetcher fetcher = new EpubFetcher(container, publication);
45 if (containsMediaOverlay) {
46 addRoute(filePath + MEDIA_OVERLAY_HANDLE, MediaOverlayHandler.class, fetcher);
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);
59 * Adds links to the publication
61 * ref=> https://github.org/readium/webpub-manifest#links
63 * @param publication publication with parsed OPF data
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);
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,
80 "application/webpub+json"));
82 publication.links.add(new Link(
83 "localhost:" + getListeningPort() + filePath + SEARCH_QUERY_HANDLE,
88 private EpubPublication parse(Container container, String filePath) {
89 EpubParser parser = new EpubParser(container);
90 return parser.parseEpubFile(filePath);