DRY when listing archive entries

This commit is contained in:
Alex Ling 2020-09-12 06:58:03 +00:00
parent 5d7b8a1ef9
commit 67ef1f7112

View File

@ -79,11 +79,9 @@ class Entry
url url
end end
def read_page(page_num) private def sorted_archive_entries
raise "Unreadble archive. #{@err_msg}" if @err_msg
img = nil
ArchiveFile.open @zip_path do |file| ArchiveFile.open @zip_path do |file|
page = file.entries entries = file.entries
.select { |e| .select { |e|
SUPPORTED_IMG_TYPES.includes? \ SUPPORTED_IMG_TYPES.includes? \
MIME.from_filename? e.filename MIME.from_filename? e.filename
@ -91,7 +89,15 @@ class Entry
.sort { |a, b| .sort { |a, b|
compare_numerically a.filename, b.filename compare_numerically a.filename, b.filename
} }
.[page_num - 1] yield file, entries
end
end
def read_page(page_num)
raise "Unreadble archive. #{@err_msg}" if @err_msg
img = nil
sorted_archive_entries do |file, entries|
page = entries[page_num - 1]
data = file.read_entry page data = file.read_entry page
if data if data
img = Image.new data, MIME.from_filename(page.filename), page.filename, img = Image.new data, MIME.from_filename(page.filename), page.filename,
@ -103,28 +109,20 @@ class Entry
def page_dimensions def page_dimensions
sizes = [] of Hash(String, Int32) sizes = [] of Hash(String, Int32)
ArchiveFile.open @zip_path do |file| sorted_archive_entries do |file, entries|
file.entries entries.each_with_index do |e, i|
.select { |e| begin
SUPPORTED_IMG_TYPES.includes? \ data = file.read_entry(e).not_nil!
MIME.from_filename? e.filename size = ImageSize.get data
} sizes << {
.sort { |a, b| "width" => size.width,
compare_numerically a.filename, b.filename "height" => size.height,
} }
.each_with_index do |e, i| rescue
begin Logger.warn "Failed to read page #{i} of entry #{@id}"
data = file.read_entry(e).not_nil! sizes << {"width" => 1000_i32, "height" => 1000_i32}
size = ImageSize.get data
sizes << {
"width" => size.width,
"height" => size.height,
}
rescue
Logger.warn "Failed to read page #{i} of entry #{@id}"
sizes << {"width" => 1000_i32, "height" => 1000_i32}
end
end end
end
end end
sizes sizes
end end