From 6f0b3bbda0fbb69d4f07ab832c795f64f185f640 Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Tue, 5 Mar 2019 21:28:55 +0100 Subject: [PATCH] Fix for #812 --- cps/comic.py | 31 +++++++++++++------ cps/static/js/kthoom.js | 55 ++++++++++++++++++++------------- cps/static/js/unzip.js | 11 +++++++ cps/static/js/uploadprogress.js | 2 +- 4 files changed, 67 insertions(+), 32 deletions(-) diff --git a/cps/comic.py b/cps/comic.py index 05ffef9b..91cb325d 100644 --- a/cps/comic.py +++ b/cps/comic.py @@ -24,21 +24,34 @@ import uploader def extractCover(tmp_file_name, original_file_extension): + cover_data = None if original_file_extension.upper() == '.CBZ': cf = zipfile.ZipFile(tmp_file_name) - compressed_name = cf.namelist()[0] - cover_data = cf.read(compressed_name) + for name in cf.namelist(): + ext = os.path.splitext(name) + if len(ext) > 1: + extension = ext[1].lower() + if extension == '.jpg': + cover_data = cf.read(name) + break elif original_file_extension.upper() == '.CBT': cf = tarfile.TarFile(tmp_file_name) - compressed_name = cf.getnames()[0] - cover_data = cf.extractfile(compressed_name).read() + for name in cf.getnames(): + ext = os.path.splitext(name) + if len(ext) > 1: + extension = ext[1].lower() + if extension == '.jpg': + cover_data = cf.extractfile(name).read() + break prefix = os.path.dirname(tmp_file_name) - - tmp_cover_name = prefix + '/cover' + os.path.splitext(compressed_name)[1] - image = open(tmp_cover_name, 'wb') - image.write(cover_data) - image.close() + if cover_data: + tmp_cover_name = prefix + '/cover' + extension + image = open(tmp_cover_name, 'wb') + image.write(cover_data) + image.close() + else: + tmp_cover_name = None return tmp_cover_name diff --git a/cps/static/js/kthoom.js b/cps/static/js/kthoom.js index 6a107b9a..6ab25ad7 100644 --- a/cps/static/js/kthoom.js +++ b/cps/static/js/kthoom.js @@ -99,14 +99,15 @@ kthoom.setSettings = function() { }; var createURLFromArray = function(array, mimeType) { - var offset = array.byteOffset, len = array.byteLength; + var offset = array.byteOffset; + var len = array.byteLength; var url; var blob; if (mimeType === 'image/xml+svg') { const xmlStr = new TextDecoder('utf-8').decode(array); return 'data:image/svg+xml;UTF-8,' + encodeURIComponent(xmlStr); - } + } // TODO: Move all this browser support testing to a common place // and do it just once. @@ -137,11 +138,13 @@ var createURLFromArray = function(array, mimeType) { kthoom.ImageFile = function(file) { this.filename = file.filename; var fileExtension = file.filename.split(".").pop().toLowerCase(); - var mimeType = fileExtension === "png" ? "image/png" : + this.mimeType = fileExtension === "png" ? "image/png" : (fileExtension === "jpg" || fileExtension === "jpeg") ? "image/jpeg" : fileExtension === "gif" ? "image/gif" : fileExtension == 'svg' ? 'image/xml+svg' : undefined; - this.dataURI = createURLFromArray(file.fileData, mimeType); - this.data = file; + if ( this.mimeType !== undefined) { + this.dataURI = createURLFromArray(file.fileData, this.mimeType); + this.data = file; + } }; @@ -169,34 +172,42 @@ function loadFromArrayBuffer(ab) { unarchiver.addEventListener(bitjs.archive.UnarchiveEvent.Type.PROGRESS, function(e) { var percentage = e.currentBytesUnarchived / e.totalUncompressedBytesInArchive; - totalImages = e.totalFilesInArchive; + if (totalImages === 0) { + totalImages = e.totalFilesInArchive; + } updateProgress(percentage *100); lastCompletion = percentage * 100; }); unarchiver.addEventListener(bitjs.archive.UnarchiveEvent.Type.EXTRACT, function(e) { - // convert DecompressedFile into a bunch of ImageFiles + // convert DecompressedFile into a bunch of ImageFiles if (e.unarchivedFile) { var f = e.unarchivedFile; // add any new pages based on the filename if (imageFilenames.indexOf(f.filename) === -1) { - imageFilenames.push(f.filename); - imageFiles.push(new kthoom.ImageFile(f)); - // add thumbnails to the TOC list - $("#thumbnails").append( - "
  • " + - "" + - "" + - "" + imageFiles.length + "" + - "" + - "
  • " - ); + var test = new kthoom.ImageFile(f); + if ( test.mimeType !== undefined) { + imageFilenames.push(f.filename); + imageFiles.push(test); + // add thumbnails to the TOC list + $("#thumbnails").append( + "
  • " + + "" + + "" + + "" + imageFiles.length + "" + + "" + + "
  • " + ); + // display first page if we haven't yet + if (imageFiles.length === currentImage + 1) { + updatePage(lastCompletion); + } + } + else { + totalImages--; + } } } - // display first page if we haven't yet - if (imageFiles.length === currentImage + 1) { - updatePage(lastCompletion); - } }); unarchiver.addEventListener(bitjs.archive.UnarchiveEvent.Type.FINISH, function() { diff --git a/cps/static/js/unzip.js b/cps/static/js/unzip.js index f0370f53..0a067516 100644 --- a/cps/static/js/unzip.js +++ b/cps/static/js/unzip.js @@ -113,6 +113,7 @@ ZipLocalFile.prototype.unzip = function() { info("ZIP v" + this.version + ", store only: " + this.filename + " (" + this.compressedSize + " bytes)"); currentBytesUnarchivedInFile = this.compressedSize; currentBytesUnarchived += this.compressedSize; + this.fileData = zeroCompression(this.fileData, this.uncompressedSize); } // version == 20, compression method == 8 (DEFLATE) else if (this.compressionMethod == 8) { @@ -493,6 +494,16 @@ function inflateBlockData(bstream, hcLiteralTable, hcDistanceTable, buffer) { return blockSize; } +function zeroCompression(compressedData, numDecompressedBytes) { + var bstream = new bitjs.io.BitStream(compressedData.buffer, + false /* rtl */, + compressedData.byteOffset, + compressedData.byteLength); + var buffer = new bitjs.io.ByteBuffer(numDecompressedBytes); + buffer.insertBytes(bstream.readBytes(numDecompressedBytes)); + return buffer.data; +} + // {Uint8Array} compressedData A Uint8Array of the compressed file data. // compression method 8 // deflate: http://tools.ietf.org/html/rfc1951 diff --git a/cps/static/js/uploadprogress.js b/cps/static/js/uploadprogress.js index 1711f182..eef5f853 100644 --- a/cps/static/js/uploadprogress.js +++ b/cps/static/js/uploadprogress.js @@ -170,7 +170,7 @@ replaceForm: function(html) { var newForm; var formId = this.$form.attr("id"); - if ( typeof(formId) !== "undefined") { + if ( typeof formId !== "undefined") { newForm = $(html).find("#" + formId); } else { newForm = $(html).find("form");