diff --git a/src/library.cr b/src/library.cr index 7d1f6ec..a0d8dcb 100644 --- a/src/library.cr +++ b/src/library.cr @@ -70,7 +70,70 @@ class Title def get_entry(name) @entries.find { |e| e.title == name } end + def save_progress(username, entry, page) + info = TitleInfo.new @dir + if info.progress[username]?.nil? + info.progress[username] = {entry => page} + info.save @dir + return + end + info.progress[username][entry] = page + info.save @dir + end + def load_progress(username, entry : String) + info = TitleInfo.new @dir + if info.progress[username]?.nil? + return 0 + end + if info.progress[username][entry]?.nil? + return 0 + end + info.progress[username][entry] + end + def load_percetage(username, entry : String) + info = TitleInfo.new @dir + page = load_progress username, entry + entry_obj = get_entry entry + return 0 if entry_obj.nil? + page / entry_obj.pages + end + def load_percetage(username) + read_pages = 0 + total_pages = 0 + @entries.each do |e| + read_pages += load_progress username, e.title + total_pages += e.pages + end + read_pages / total_pages + end +end +class TitleInfo + # { user1: { entry1: 10, entry2: 0 } } + include JSON::Serializable + + @[JSON::Field(key: "comment")] + property comment = "Generated by Mango. DO NOT EDIT!" + + @[JSON::Field(key: "progress")] + property progress : Hash(String, Hash(String, Int32)) + + def initialize(title_dir) + info = nil + + json_path = File.join title_dir, "info.json" + if File.exists? json_path + info = TitleInfo.from_json File.read json_path + else + info = TitleInfo.from_json "{\"progress\": {}}" + end + + @progress = info.progress.clone + end + def save(title_dir) + json_path = File.join title_dir, "info.json" + File.write json_path, self.to_pretty_json + end end class Library diff --git a/src/mango.cr b/src/mango.cr index fb292cf..33a35e2 100644 --- a/src/mango.cr +++ b/src/mango.cr @@ -8,6 +8,8 @@ config = Config.load library = Library.new config.library_path storage = Storage.new config.db_path +imgs_each_page = 5 + macro layout(name) render "src/views/#{{{name}}}.ecr", "src/views/layout.ecr" end @@ -32,17 +34,26 @@ def hash_to_query(hash) end get "/" do |env| - titles = library.titles - layout "index" + begin + titles = library.titles + username = (get_username env).not_nil! + percentage = titles.map &.load_percetage username + layout "index" + rescue + env.response.status_code = 500 + end end get "/book/:title" do |env| - title = library.get_title env.params.url["title"] - if title.nil? + begin + title = (library.get_title env.params.url["title"]).not_nil! + username = (get_username env).not_nil! + percentage = title.entries.map { |e| title.load_percetage username,\ + e.title } + layout "title" + rescue env.response.status_code = 404 - next end - layout "title" end get "/admin" do |env| @@ -148,14 +159,23 @@ get "/reader/:title/:entry" do |env| begin title = (library.get_title env.params.url["title"]).not_nil! entry = (title.get_entry env.params.url["entry"]).not_nil! - env.redirect "/reader/#{title.title}/#{entry.title}/0" - rescue + + # load progress + username = get_username env + entry_page = title.load_progress username, entry.title + # we go above 1 * `imgs_each_page` pages. the infinite scroll library + # perloads a few pages in advance, and the user might not have actually + # read it + page = [(entry_page // imgs_each_page) - 1, 0].max + + env.redirect "/reader/#{title.title}/#{entry.title}/#{page}" + rescue e + pp e 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"]).not_nil! @@ -163,6 +183,10 @@ get "/reader/:title/:entry/:page" do |env| page = env.params.url["page"].to_i raise "" if page * imgs_each_page >= entry.pages + # save progress + username = (get_username env).not_nil! + title.save_progress username, entry.title, page * imgs_each_page + urls = ((page * imgs_each_page)...\ [entry.pages, (page + 1) * imgs_each_page].min) \ .map { |idx| "/api/page/#{title.title}/#{entry.title}/#{idx}" } diff --git a/src/views/index.ecr b/src/views/index.ecr index 6535a3d..dcb953a 100644 --- a/src/views/index.ecr +++ b/src/views/index.ecr @@ -1,7 +1,7 @@

Library

<%= titles.size %> titles found

- <%- titles.each do |t| -%> + <%- titles.each_with_index do |t, i| -%>
@@ -9,7 +9,7 @@
-
Badge
+
<%= (percentage[i] * 100).round(1) %>%

<%= t.title %>

<%= t.entries.size %> entries

diff --git a/src/views/title.ecr b/src/views/title.ecr index fc7d77e..7abf7f9 100644 --- a/src/views/title.ecr +++ b/src/views/title.ecr @@ -1,7 +1,7 @@

<%= title.title %>

<%= title.entries.size %> entries found