From f67e4e6cb9994fd86cafe8b9d8c0541be3b894cb Mon Sep 17 00:00:00 2001 From: Alex Ling Date: Mon, 6 Sep 2021 13:32:10 +0000 Subject: [PATCH 1/3] Support all image types (resolves #192) --- src/library/entry.cr | 6 ++---- src/library/types.cr | 2 -- src/routes/api.cr | 5 ++--- src/util/util.cr | 4 ++++ src/views/title.html.ecr | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/library/entry.cr b/src/library/entry.cr index 28b7122..301c3ba 100644 --- a/src/library/entry.cr +++ b/src/library/entry.cr @@ -40,8 +40,7 @@ class Entry file = ArchiveFile.new @zip_path @pages = file.entries.count do |e| - SUPPORTED_IMG_TYPES.includes? \ - MIME.from_filename? e.filename + filename_is_image e.filename end file.close end @@ -103,8 +102,7 @@ class Entry ArchiveFile.open @zip_path do |file| entries = file.entries .select { |e| - SUPPORTED_IMG_TYPES.includes? \ - MIME.from_filename? e.filename + filename_is_image e.filename } .sort! { |a, b| compare_numerically a.filename, b.filename diff --git a/src/library/types.cr b/src/library/types.cr index a4de007..a91ca86 100644 --- a/src/library/types.cr +++ b/src/library/types.cr @@ -1,5 +1,3 @@ -SUPPORTED_IMG_TYPES = ["image/jpeg", "image/png", "image/webp"] - enum SortMethod Auto Title diff --git a/src/routes/api.cr b/src/routes/api.cr index b1fb3b3..80cb278 100644 --- a/src/routes/api.cr +++ b/src/routes/api.cr @@ -456,9 +456,8 @@ struct APIRouter entry_id = env.params.query["eid"]? title = Library.default.get_title(title_id).not_nil! - unless SUPPORTED_IMG_TYPES.includes? \ - MIME.from_filename? filename - raise "The uploaded image must be either JPEG or PNG" + unless filename_is_image filename + raise "The uploaded file must be an image" end ext = File.extname filename diff --git a/src/util/util.cr b/src/util/util.cr index c4e168a..2db7457 100644 --- a/src/util/util.cr +++ b/src/util/util.cr @@ -120,3 +120,7 @@ class String match / s.size end end + +def filename_is_image(fn : String) : Bool + MIME.from_filename?(fn).try(&.starts_with?("image/")) || false +end diff --git a/src/views/title.html.ecr b/src/views/title.html.ecr index 78edf98..dc0dc3d 100644 --- a/src/views/title.html.ecr +++ b/src/views/title.html.ecr @@ -101,7 +101,7 @@ Upload a cover image by dropping it here or
- "> + selecting one
From d9adb49c2712003cb7371198b133b3518e1c6b09 Mon Sep 17 00:00:00 2001 From: Alex Ling Date: Tue, 7 Sep 2021 10:45:59 +0000 Subject: [PATCH 2/3] Revert "Support all image types (resolves #192)" This reverts commit f67e4e6cb9994fd86cafe8b9d8c0541be3b894cb. --- src/library/entry.cr | 6 ++++-- src/library/types.cr | 2 ++ src/routes/api.cr | 5 +++-- src/util/util.cr | 4 ---- src/views/title.html.ecr | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/library/entry.cr b/src/library/entry.cr index 301c3ba..28b7122 100644 --- a/src/library/entry.cr +++ b/src/library/entry.cr @@ -40,7 +40,8 @@ class Entry file = ArchiveFile.new @zip_path @pages = file.entries.count do |e| - filename_is_image e.filename + SUPPORTED_IMG_TYPES.includes? \ + MIME.from_filename? e.filename end file.close end @@ -102,7 +103,8 @@ class Entry ArchiveFile.open @zip_path do |file| entries = file.entries .select { |e| - filename_is_image e.filename + SUPPORTED_IMG_TYPES.includes? \ + MIME.from_filename? e.filename } .sort! { |a, b| compare_numerically a.filename, b.filename diff --git a/src/library/types.cr b/src/library/types.cr index a91ca86..a4de007 100644 --- a/src/library/types.cr +++ b/src/library/types.cr @@ -1,3 +1,5 @@ +SUPPORTED_IMG_TYPES = ["image/jpeg", "image/png", "image/webp"] + enum SortMethod Auto Title diff --git a/src/routes/api.cr b/src/routes/api.cr index 80cb278..b1fb3b3 100644 --- a/src/routes/api.cr +++ b/src/routes/api.cr @@ -456,8 +456,9 @@ struct APIRouter entry_id = env.params.query["eid"]? title = Library.default.get_title(title_id).not_nil! - unless filename_is_image filename - raise "The uploaded file must be an image" + unless SUPPORTED_IMG_TYPES.includes? \ + MIME.from_filename? filename + raise "The uploaded image must be either JPEG or PNG" end ext = File.extname filename diff --git a/src/util/util.cr b/src/util/util.cr index 2db7457..c4e168a 100644 --- a/src/util/util.cr +++ b/src/util/util.cr @@ -120,7 +120,3 @@ class String match / s.size end end - -def filename_is_image(fn : String) : Bool - MIME.from_filename?(fn).try(&.starts_with?("image/")) || false -end diff --git a/src/views/title.html.ecr b/src/views/title.html.ecr index dc0dc3d..78edf98 100644 --- a/src/views/title.html.ecr +++ b/src/views/title.html.ecr @@ -101,7 +101,7 @@ Upload a cover image by dropping it here or
- + "> selecting one
From 371796cce94a4858ae1eedde9a2547b2addd6304 Mon Sep 17 00:00:00 2001 From: Alex Ling Date: Tue, 7 Sep 2021 11:04:05 +0000 Subject: [PATCH 3/3] Support additional image formats: - APNG - AVIF - GIF - SVG --- src/library/types.cr | 10 +++++++++- src/util/util.cr | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/library/types.cr b/src/library/types.cr index a4de007..0545184 100644 --- a/src/library/types.cr +++ b/src/library/types.cr @@ -1,4 +1,12 @@ -SUPPORTED_IMG_TYPES = ["image/jpeg", "image/png", "image/webp"] +SUPPORTED_IMG_TYPES = %w( + image/jpeg + image/png + image/webp + image/apng + image/avif + image/gif + image/svg+xml +) enum SortMethod Auto diff --git a/src/util/util.cr b/src/util/util.cr index c4e168a..bc710bd 100644 --- a/src/util/util.cr +++ b/src/util/util.cr @@ -35,6 +35,11 @@ def register_mime_types # FontAwesome fonts ".woff" => "font/woff", ".woff2" => "font/woff2", + + # Supported image formats. JPG, PNG, GIF, WebP, and SVG are already + # defiend by Crystal in `MIME.DEFAULT_TYPES` + ".apng" => "image/apng", + ".avif" => "image/avif", }.each do |k, v| MIME.register k, v end