diff --git a/src/library.cr b/src/library.cr index 7ed5912..7e1b2ed 100644 --- a/src/library.cr +++ b/src/library.cr @@ -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 diff --git a/src/mangadex/downloader.cr b/src/mangadex/downloader.cr index 6ffb46e..3f7e033 100644 --- a/src/mangadex/downloader.cr +++ b/src/mangadex/downloader.cr @@ -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 diff --git a/src/util.cr b/src/util.cr index 761fb30..45ab6da 100644 --- a/src/util.cr +++ b/src/util.cr @@ -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