diff --git a/src/library.cr b/src/library.cr index d7982cb..6315770 100644 --- a/src/library.cr +++ b/src/library.cr @@ -26,7 +26,12 @@ class Entry @zip_path = path @title = File.basename path, ".zip" @size = (File.size path).humanize_bytes - @pages = Zip::File.new(path).entries.size + @pages = Zip::File.new(path).entries + .select { |e| + ["image/jpeg", "image/png"].includes? \ + MIME.from_filename? e.filename + } + .size @cover_url = "/api/page/#{@book_title}/#{title}/0" end def read_page(page_num) diff --git a/src/mango.cr b/src/mango.cr index f4264ca..0d9ea07 100644 --- a/src/mango.cr +++ b/src/mango.cr @@ -32,6 +32,42 @@ get "/book/:title" do |env| layout "title" end +get "/reader/:title/:entry" do |env| + # We should save the reading progress, and ask the user if she wants to + # start over or resume. For now we just start from page 0 + begin + title = library.get_title env.params.url["title"] + raise "" if title.nil? + entry = title.get_entry env.params.url["entry"] + raise "" if entry.nil? + env.redirect "/reader/#{title.title}/#{entry.title}/0" + rescue + env.response.status_code = 404 + end +end + +get "/reader/:title/:entry/:page" do |env| + imgs_each_page = 5 + # here each :page contains `imgs_each_page` images + begin + title = library.get_title env.params.url["title"] + raise "" if title.nil? + entry = title.get_entry env.params.url["entry"] + raise "" if entry.nil? + page = env.params.url["page"].to_i + raise "" if page * imgs_each_page >= entry.pages + + urls = ((page * imgs_each_page)...\ + [entry.pages, (page + 1) * imgs_each_page].min) \ + .map { |idx| "/api/page/#{title.title}/#{entry.title}/#{idx}" } + next_url = "/reader/#{title.title}/#{entry.title}/#{page + 1}" + next_url = nil if (page + 1) * imgs_each_page >= entry.pages + render "src/views/reader.ecr" + rescue + env.response.status_code = 404 + end +end + get "/login" do |env| render "src/views/login.ecr" end diff --git a/src/views/reader.ecr b/src/views/reader.ecr new file mode 100644 index 0000000..4f43962 --- /dev/null +++ b/src/views/reader.ecr @@ -0,0 +1,39 @@ + + +
+ + +