mirror of
https://github.com/hkalexling/Mango.git
synced 2025-08-02 10:55:30 -04:00
- save/load reading progress
This commit is contained in:
parent
042df2bf1f
commit
5534b9bcdf
@ -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
|
||||||
|
40
src/mango.cr
40
src/mango.cr
@ -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}" }
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user