- save/load reading progress

This commit is contained in:
Alex Ling 2020-02-14 03:22:12 +00:00
parent 042df2bf1f
commit 5534b9bcdf
4 changed files with 100 additions and 13 deletions

View File

@ -70,7 +70,70 @@ class Title
def get_entry(name) def get_entry(name)
@entries.find { |e| e.title == name } @entries.find { |e| e.title == name }
end 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 end
class Library class Library

View File

@ -8,6 +8,8 @@ config = Config.load
library = Library.new config.library_path library = Library.new config.library_path
storage = Storage.new config.db_path storage = Storage.new config.db_path
imgs_each_page = 5
macro layout(name) macro layout(name)
render "src/views/#{{{name}}}.ecr", "src/views/layout.ecr" render "src/views/#{{{name}}}.ecr", "src/views/layout.ecr"
end end
@ -32,17 +34,26 @@ def hash_to_query(hash)
end end
get "/" do |env| get "/" do |env|
begin
titles = library.titles titles = library.titles
username = (get_username env).not_nil!
percentage = titles.map &.load_percetage username
layout "index" layout "index"
rescue
env.response.status_code = 500
end
end end
get "/book/:title" do |env| get "/book/:title" do |env|
title = library.get_title env.params.url["title"] begin
if title.nil? title = (library.get_title env.params.url["title"]).not_nil!
env.response.status_code = 404 username = (get_username env).not_nil!
next percentage = title.entries.map { |e| title.load_percetage username,\
end e.title }
layout "title" layout "title"
rescue
env.response.status_code = 404
end
end end
get "/admin" do |env| get "/admin" do |env|
@ -148,14 +159,23 @@ get "/reader/:title/:entry" do |env|
begin begin
title = (library.get_title env.params.url["title"]).not_nil! title = (library.get_title env.params.url["title"]).not_nil!
entry = (title.get_entry env.params.url["entry"]).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 env.response.status_code = 404
end end
end end
get "/reader/:title/:entry/:page" do |env| get "/reader/:title/:entry/:page" do |env|
imgs_each_page = 5
# here each :page contains `imgs_each_page` images # here each :page contains `imgs_each_page` images
begin begin
title = (library.get_title env.params.url["title"]).not_nil! 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 page = env.params.url["page"].to_i
raise "" if page * imgs_each_page >= entry.pages 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)...\ urls = ((page * imgs_each_page)...\
[entry.pages, (page + 1) * imgs_each_page].min) \ [entry.pages, (page + 1) * imgs_each_page].min) \
.map { |idx| "/api/page/#{title.title}/#{entry.title}/#{idx}" } .map { |idx| "/api/page/#{title.title}/#{entry.title}/#{idx}" }

View File

@ -1,7 +1,7 @@
<h2 class=uk-title>Library</h2> <h2 class=uk-title>Library</h2>
<p class="uk-text-meta"><%= titles.size %> titles found</p> <p class="uk-text-meta"><%= titles.size %> titles found</p>
<div class="uk-child-width-1-4@m" uk-grid> <div class="uk-child-width-1-4@m" uk-grid>
<%- titles.each do |t| -%> <%- titles.each_with_index do |t, i| -%>
<div> <div>
<a class="acard" href="/book/<%= t.title %>"> <a class="acard" href="/book/<%= t.title %>">
<div class="uk-card uk-card-default"> <div class="uk-card uk-card-default">
@ -9,7 +9,7 @@
<img src="<%= t.entries[0].cover_url %>" alt=""> <img src="<%= t.entries[0].cover_url %>" alt="">
</div> </div>
<div class="uk-card-body"> <div class="uk-card-body">
<div class="uk-card-badge uk-label">Badge</div> <div class="uk-card-badge uk-label"><%= (percentage[i] * 100).round(1) %>%</div>
<h3 class="uk-card-title"><%= t.title %></h3> <h3 class="uk-card-title"><%= t.title %></h3>
<p><%= t.entries.size %> entries</p> <p><%= t.entries.size %> entries</p>
</div> </div>

View File

@ -1,7 +1,7 @@
<h2 class=uk-title><%= title.title %></h2> <h2 class=uk-title><%= title.title %></h2>
<p class="uk-text-meta"><%= title.entries.size %> entries found</p> <p class="uk-text-meta"><%= title.entries.size %> entries found</p>
<div class="uk-child-width-1-4@m" uk-grid> <div class="uk-child-width-1-4@m" uk-grid>
<%- title.entries.each do |e| -%> <%- title.entries.each_with_index do |e, i| -%>
<div> <div>
<a class="acard" href="/reader/<%= title.title %>/<%= e.title %>"> <a class="acard" href="/reader/<%= title.title %>/<%= e.title %>">
<div class="uk-card uk-card-default"> <div class="uk-card uk-card-default">
@ -9,7 +9,7 @@
<img src="<%= e.cover_url %>" alt=""> <img src="<%= e.cover_url %>" alt="">
</div> </div>
<div class="uk-card-body"> <div class="uk-card-body">
<div class="uk-card-badge uk-label">Badge</div> <div class="uk-card-badge uk-label"><%= (percentage[i] * 100).round(1) %>%</div>
<h3 class="uk-card-title"><%= e.title %></h3> <h3 class="uk-card-title"><%= e.title %></h3>
</div> </div>
</div> </div>