diff --git a/public/js/reader.js b/public/js/reader.js index a5d8e6b..fa66b77 100644 --- a/public/js/reader.js +++ b/public/js/reader.js @@ -29,14 +29,16 @@ const readerComponent = () => { return { id: i + 1, url: `${base_url}api/page/${tid}/${eid}/${i+1}`, - width: d.width, - height: d.height, + width: d.width == 0 ? "100%" : d.width, + height: d.height == 0 ? "100%" : d.height, }; }); - const avgRatio = this.items.reduce((acc, cur) => { + // Note: for image types not supported by image_size.cr, the width and height will be 0, and so `avgRatio` will be `Infinity`. + // TODO: support more image types in image_size.cr + const avgRatio = dimensions.reduce((acc, cur) => { return acc + cur.height / cur.width - }, 0) / this.items.length; + }, 0) / dimensions.length; console.log(avgRatio); this.longPages = avgRatio > 2; diff --git a/src/config.cr b/src/config.cr index dd0fbda..867b8ab 100644 --- a/src/config.cr +++ b/src/config.cr @@ -8,16 +8,21 @@ class Config property host : String = (ENV["LISTEN_HOST"]? || "0.0.0.0") property port : Int32 = (ENV["LISTEN_PORT"]? || 9000).to_i property base_url : String = (ENV["BASE_URL"]? || "/") + # ameba:disable Layout/LineLength property session_secret : String = (ENV["SESSION_SECRET"]? || "mango-session-secret") property library_path : String = (ENV["LIBRARY_PATH"]? || "~/mango/library") + # ameba:disable Layout/LineLength property library_cache_path : String = (ENV["LIBRARY_CACHE_PATH"]? || "~/mango/library.yml.gz") property db_path : String = (ENV["DB_PATH"]? || "~/mango/mango.db") + # ameba:disable Layout/LineLength property queue_db_path : String = (ENV["QUEUE_DB_PATH"]? || "~/mango/queue.db") property scan_interval_minutes : Int32 = (ENV["SCAN_INTERVAL"]? || 5).to_i + # ameba:disable Layout/LineLength property thumbnail_generation_interval_hours : Int32 = (ENV["THUMBNAIL_INTERVAL"]? || 24).to_i property log_level : String = (ENV["LOG_LEVEL"]? || "info") property upload_path : String = (ENV["UPLOAD_PATH"]? || "~/mango/uploads") property plugin_path : String = (ENV["PLUGIN_PATH"]? || "~/mango/plugins") + # ameba:disable Layout/LineLength property download_timeout_seconds : Int32 = (ENV["DOWNLOAD_TIMEOUT"]? || 30).to_i property cache_enabled : Bool = env_is_true?("CACHE_ENABLED", true) property cache_size_mbs : Int32 = (ENV["CACHE_SIZE"]? || 50).to_i @@ -25,6 +30,7 @@ class Config property disable_login : Bool = env_is_true?("DISABLE_LOGIN", false) property default_username : String = (ENV["DEFAULT_USERNAME"]? || "") property auth_proxy_header_name : String = (ENV["AUTH_PROXY_HEADER"]? || "") + # ameba:disable Layout/LineLength property plugin_update_interval_hours : Int32 = (ENV["PLUGIN_UPDATE_INTERVAL"]? || 24).to_i @@singlet : Config? diff --git a/src/library/title.cr b/src/library/title.cr index e9873f2..9c3ad78 100644 --- a/src/library/title.cr +++ b/src/library/title.cr @@ -632,6 +632,16 @@ class Title if last_read_entry && last_read_entry.finished? username last_read_entry = last_read_entry.next_entry username + if last_read_entry.nil? + # The last entry is finished. Return the first unfinished entry + # (if any) + sorted_entries(username).each do |e| + unless e.finished? username + last_read_entry = e + break + end + end + end end last_read_entry diff --git a/src/util/util.cr b/src/util/util.cr index ed3dc46..ce658aa 100644 --- a/src/util/util.cr +++ b/src/util/util.cr @@ -11,6 +11,7 @@ SUPPORTED_IMG_TYPES = %w( image/avif image/gif image/svg+xml + image/jxl ) def random_str @@ -49,6 +50,7 @@ def register_mime_types # defiend by Crystal in `MIME.DEFAULT_TYPES` ".apng" => "image/apng", ".avif" => "image/avif", + ".jxl" => "image/jxl", }.each do |k, v| MIME.register k, v end