diff --git a/src/routes/opds.cr b/src/routes/opds.cr
new file mode 100644
index 0000000..648bcac
--- /dev/null
+++ b/src/routes/opds.cr
@@ -0,0 +1,32 @@
+require "./router"
+
+class OPDSRouter < Router
+ def initialize
+ get "/opds" do |env|
+ titles = @context.library.titles
+ render_xml "src/views/opds/index.ecr"
+ end
+
+ get "/opds/book/:title_id" do |env|
+ begin
+ title = @context.library.get_title(env.params.url["title_id"]).not_nil!
+ render_xml "src/views/opds/title.ecr"
+ rescue e
+ @context.error e
+ env.response.status_code = 404
+ end
+ end
+
+ get "/opds/download/:title/:entry" do |env|
+ begin
+ title = (@context.library.get_title env.params.url["title"]).not_nil!
+ entry = (title.get_entry env.params.url["entry"]).not_nil!
+
+ send_attachment env, entry.zip_path
+ rescue e
+ @context.error e
+ env.response.status_code = 404
+ end
+ end
+ end
+end
diff --git a/src/server.cr b/src/server.cr
index 8412d0e..f12d470 100644
--- a/src/server.cr
+++ b/src/server.cr
@@ -53,6 +53,7 @@ class Server
AdminRouter.new
ReaderRouter.new
APIRouter.new
+ OPDSRouter.new
Kemal.config.logging = false
add_handler LogHandler.new
diff --git a/src/views/opds/index.ecr b/src/views/opds/index.ecr
new file mode 100644
index 0000000..3bcf68f
--- /dev/null
+++ b/src/views/opds/index.ecr
@@ -0,0 +1,24 @@
+
+
+
+
+ urn:mango:index
+
+
+
+
+ Library
+
+
+ Mango
+ https://github.com/hkalexling/Mango
+
+
+ <% titles.each do |t| %>
+
+ <%= t.display_name %>
+ urn:mango:<%= t.id %>
+
+
+ <% end %>
+
diff --git a/src/views/opds/title.ecr b/src/views/opds/title.ecr
new file mode 100644
index 0000000..bd4567c
--- /dev/null
+++ b/src/views/opds/title.ecr
@@ -0,0 +1,38 @@
+
+
+ urn:mango:<%= title.id %>
+
+
+
+
+ <%= title.display_name %>
+
+
+ Mango
+ https://github.com/hkalexling/Mango
+
+
+ <% title.titles.each do |t| %>
+
+ <%= t.display_name %>
+ urn:mango:<%= t.id %>
+
+
+ <% end %>
+
+ <% title.entries.each do |e| %>
+
+ <%= e.display_name %>
+ urn:mango:<%= e.id %>
+
+
+
+
+
+
+
+
+
+ <% end %>
+
+