Set status as "Error" if downloaded zip is invalid

(#29)
This commit is contained in:
Alex Ling 2020-04-08 10:30:29 +00:00
parent fc6a33e5fd
commit 39f4897fc5
3 changed files with 28 additions and 18 deletions

View File

@ -106,7 +106,13 @@ class Title
next
end
if [".zip", ".cbz"].includes? File.extname path
next if !valid_zip path
zip_exception = validate_zip path
unless zip_exception.nil?
@logger.warn "File #{path} is corrupted or is not a valid zip " \
"archive. Ignoring it."
@logger.debug "Zip error: #{zip_exception}"
next
end
entry = Entry.new path, self, @id, storage
@entries << entry if entry.pages > 0
end
@ -171,20 +177,6 @@ class Title
@entries.size + @title_ids.size
end
# When downloading from MangaDex, the zip/cbz file would not be valid
# before the download is completed. If we scan the zip file,
# Entry.new would throw, so we use this method to check before
# constructing Entry
private def valid_zip(path : String)
file = Zip::File.new path
file.close
true
rescue
@logger.warn "File #{path} is corrupted or is not a valid zip " \
"archive. Ignoring it."
false
end
def get_entry(eid)
@entries.find { |e| e.id == eid }
end

View File

@ -343,10 +343,16 @@ module MangaDex
"#{fail_count}/#{page_jobs.size} failed"
writer.close
@logger.debug "cbz File created at #{zip_path}"
if fail_count == 0
@queue.set_status JobStatus::Completed, job
else
zip_exception = validate_zip zip_path
if !zip_exception.nil?
@queue.add_message "The downloaded archive is corrupted. " \
"Error: #{zip_exception}", job
@queue.set_status JobStatus::Error, job
elsif fail_count > 0
@queue.set_status JobStatus::MissingPages, job
else
@queue.set_status JobStatus::Completed, job
end
@downloading = false
end

View File

@ -81,3 +81,15 @@ end
def compare_alphanumerically(a : String, b : String)
compare_alphanumerically split_by_alphanumeric(a), split_by_alphanumeric(b)
end
# When downloading from MangaDex, the zip/cbz file would not be valid
# before the download is completed. If we scan the zip file,
# Entry.new would throw, so we use this method to check before
# constructing Entry
def validate_zip(path : String) : Exception?
file = Zip::File.new path
file.close
return
rescue e
e
end