1
0
mirror of https://github.com/janeczku/calibre-web synced 2024-11-28 12:30:00 +00:00

Error handling rarfiles

This commit is contained in:
OzzieIsaacs 2017-11-19 18:08:55 +01:00
parent 9f8cbe8c1f
commit 5756785073
4 changed files with 145 additions and 91 deletions

View File

@ -508,3 +508,22 @@ class Updater(threading.Thread):
logging.getLogger('cps.web').debug("Could not remove:" + item_path) logging.getLogger('cps.web').debug("Could not remove:" + item_path)
shutil.rmtree(source, ignore_errors=True) shutil.rmtree(source, ignore_errors=True)
def check_unrar(unrarLocation):
error = False
if os.path.exists(unrarLocation):
try:
p = subprocess.Popen(unrarLocation, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.wait()
for lines in p.stdout.readlines():
if isinstance(lines, bytes):
lines = lines.decode('utf-8')
value=re.search('UNRAR (.*) freeware', lines)
if value:
version = value.group(1)
except Exception:
error = True
version=_(u'Excecution permissions missing')
else:
version = _(u'Unrar binary file not found')
error=True
return (error, version)

View File

@ -289,16 +289,15 @@ function loadFromArrayBuffer(ab) {
imageFilenames.push(f.filename); imageFilenames.push(f.filename);
imageFiles.push(new kthoom.ImageFile(f)); imageFiles.push(new kthoom.ImageFile(f));
// add thumbnails to the TOC list // add thumbnails to the TOC list
$('#thumbnails').append( $('#thumbnails').append(
"<li> \ "<li> \
<a data-page='"+ imageFiles.length +"'> \ <a data-page='"+ imageFiles.length +"'> \
<img src='"+ imageFiles[imageFiles.length - 1].dataURI +"' /> \ <img src='"+ imageFiles[imageFiles.length - 1].dataURI +"' /> \
<span>"+ imageFiles.length +"</span> \ <span>"+ imageFiles.length +"</span> \
</a> \ </a> \
</li>" </li>"
); );
//}
} }
var percentage = (ab.page+1) / (ab.last+1); var percentage = (ab.page+1) / (ab.last+1);
totalImages = ab.last+1; totalImages = ab.last+1;
@ -339,81 +338,93 @@ function setImage(url) {
updateScale(true); updateScale(true);
canvas.width = innerWidth - 100; canvas.width = innerWidth - 100;
canvas.height = 200; canvas.height = 200;
x.fillStyle = "red"; x.fillStyle = "black";
x.font = "50px sans-serif"; x.textAlign="center";
x.font = "24px sans-serif";
x.strokeStyle = "black"; x.strokeStyle = "black";
x.fillText("Loading Page #" + (currentImage + 1), 100, 100); x.fillText("Loading Page #" + (currentImage + 1), innerWidth/2, 100);
} else { } else {
if ($("body").css("scrollHeight") / innerHeight > 1) { if (url === "error") {
$("body").css("overflowY", "scroll");
}
var img = new Image();
img.onerror = function() {
canvas.width = innerWidth - 100;
canvas.height = 300;
updateScale(true); updateScale(true);
x.fillStyle = "orange"; canvas.width = innerWidth - 100;
x.font = "50px sans-serif"; canvas.height = 200;
x.fillStyle = "black";
x.textAlign="center";
x.font = "24px sans-serif";
x.strokeStyle = "black"; x.strokeStyle = "black";
x.fillText("Page #" + (currentImage + 1) + " (" + x.fillText("Unable to decompress image #" + (currentImage + 1), innerWidth/2, 100);
imageFiles[currentImage].filename + ")", 100, 100); } else {
x.fillStyle = "red"; if ($("body").css("scrollHeight") / innerHeight > 1) {
x.fillText("Is corrupt or not an image", 100, 200); $("body").css("overflowY", "scroll");
}
var xhr = new XMLHttpRequest(); var img = new Image();
if (/(html|htm)$/.test(imageFiles[currentImage].filename)) { img.onerror = function() {
xhr.open("GET", url, true); canvas.width = innerWidth - 100;
xhr.onload = function() { canvas.height = 300;
//document.getElementById('mainText').style.display = ''; updateScale(true);
$("#mainText").css("display", ""); x.fillStyle = "black";
$("#mainText").innerHTML("<iframe style=\"width:100%;height:700px;border:0\" src=\"data:text/html," + escape(xhr.responseText) + "\"></iframe>"); x.font = "50px sans-serif";
x.strokeStyle = "black";
x.fillText("Page #" + (currentImage + 1) + " (" +
imageFiles[currentImage].filename + ")", innerWidth/2, 100);
x.fillStyle = "black";
x.fillText("Is corrupt or not an image", innerWidth/2, 200);
var xhr = new XMLHttpRequest();
if (/(html|htm)$/.test(imageFiles[currentImage].filename)) {
xhr.open("GET", url, true);
xhr.onload = function() {
//document.getElementById('mainText').style.display = '';
$("#mainText").css("display", "");
$("#mainText").innerHTML("<iframe style=\"width:100%;height:700px;border:0\" src=\"data:text/html," + escape(xhr.responseText) + "\"></iframe>");
}
xhr.send(null);
} else if (!/(jpg|jpeg|png|gif)$/.test(imageFiles[currentImage].filename) && imageFiles[currentImage].data.uncompressedSize < 10 * 1024) {
xhr.open("GET", url, true);
xhr.onload = function() {
$("#mainText").css("display", "");
$("#mainText").innerText(xhr.responseText);
};
xhr.send(null);
} }
xhr.send(null); };
} else if (!/(jpg|jpeg|png|gif)$/.test(imageFiles[currentImage].filename) && imageFiles[currentImage].data.uncompressedSize < 10 * 1024) { img.onload = function() {
xhr.open("GET", url, true); var h = img.height,
xhr.onload = function() { w = img.width,
$("#mainText").css("display", ""); sw = w,
$("#mainText").innerText(xhr.responseText); sh = h;
}; settings.rotateTimes = (4 + settings.rotateTimes) % 4;
xhr.send(null); x.save();
} if (settings.rotateTimes % 2 === 1) {
}; sh = w;
img.onload = function() { sw = h;
var h = img.height, }
w = img.width, canvas.height = sh;
sw = w, canvas.width = sw;
sh = h; x.translate(sw / 2, sh / 2);
settings.rotateTimes = (4 + settings.rotateTimes) % 4; x.rotate(Math.PI / 2 * settings.rotateTimes);
x.save(); x.translate(-w / 2, -h / 2);
if (settings.rotateTimes % 2 === 1) { if (settings.vflip) {
sh = w; x.scale(1, -1);
sw = h; x.translate(0, -h);
} }
canvas.height = sh; if (settings.hflip) {
canvas.width = sw; x.scale(-1, 1);
x.translate(sw / 2, sh / 2); x.translate(-w, 0);
x.rotate(Math.PI / 2 * settings.rotateTimes); }
x.translate(-w / 2, -h / 2); canvas.style.display = "none";
if (settings.vflip) { scrollTo(0, 0);
x.scale(1, -1); x.drawImage(img, 0, 0);
x.translate(0, -h);
}
if (settings.hflip) {
x.scale(-1, 1);
x.translate(-w, 0);
}
canvas.style.display = "none";
scrollTo(0, 0);
x.drawImage(img, 0, 0);
updateScale(); updateScale();
canvas.style.display = ""; canvas.style.display = "";
$("body").css("overflowY", ""); $("body").css("overflowY", "");
x.restore(); x.restore();
}; };
img.src = url; img.src = url;
}
} }
} }
@ -528,19 +539,26 @@ function keyHandler(evt) {
function ImageLoadCallback(event) { function ImageLoadCallback(event) {
var jso=this.response; var jso=this.response;
if (jso.page !== jso.last) // Unable to decompress file, or no response from server
{ if (jso === null){
// var secRequest = new XMLHttpRequest(); setImage("error");
this.open("GET", this.fileid + "/"+(jso.page+1));
this.addEventListener("load",ImageLoadCallback);
this.send();
} }
else else
{ {
var diff = ((new Date).getTime() - start)/1000; if (jso.page !== jso.last)
console.log('Transfer done in ' + diff + 's'); {
// var secRequest = new XMLHttpRequest();
this.open("GET", this.fileid + "/"+(jso.page+1));
this.addEventListener("load",ImageLoadCallback);
this.send();
}
else
{
var diff = ((new Date).getTime() - start)/1000;
console.log('Transfer done in ' + diff + 's');
}
loadFromArrayBuffer(jso);
} }
loadFromArrayBuffer(jso);
} }
function init(fileid) { function init(fileid) {
start = (new Date).getTime(); start = (new Date).getTime();

View File

@ -42,6 +42,10 @@
<th>Kindlegen</th> <th>Kindlegen</th>
<td>{{versions['KindlegenVersion']}}</td> <td>{{versions['KindlegenVersion']}}</td>
</tr> </tr>
<tr>
<th>Unrar</th>
<td>{{versions['unrarVersion']}}</td>
</tr>
<tr> <tr>
<th>ImageMagick</th> <th>ImageMagick</th>
<td>{{versions['ImageVersion']}}</td> <td>{{versions['ImageVersion']}}</td>

View File

@ -934,10 +934,11 @@ def get_comic_book(book_id, book_format, page):
extractedfile="data:image/png;base64," + (rf.read(rarNames[page])).encode('base64') extractedfile="data:image/png;base64," + (rf.read(rarNames[page])).encode('base64')
fileData={"name": rarNames[page],"page":page, "last":rarNames.__len__()-1, "content": extractedfile} fileData={"name": rarNames[page],"page":page, "last":rarNames.__len__()-1, "content": extractedfile}
except: except:
return ""
# rarfile not valid # rarfile not valid
# ToDo: error handling app.logger.error('Unrar binary not found unable to decompress file ' + cbr_file)
return ""
else: else:
app.logger.info('Unrar is not supported please install python rarfile extension')
# no support means return nothing # no support means return nothing
return "" return ""
if book_format == "cbz": if book_format == "cbz":
@ -1507,7 +1508,13 @@ def stats():
versions['requests'] = requests.__version__ versions['requests'] = requests.__version__
versions['pysqlite'] = db.engine.dialect.dbapi.version versions['pysqlite'] = db.engine.dialect.dbapi.version
versions['sqlite'] = db.engine.dialect.dbapi.sqlite_version versions['sqlite'] = db.engine.dialect.dbapi.sqlite_version
if rar_support:
rarVersion = helper.check_unrar(config.config_rarfile_location)
if not rarVersion[0]:
versions['unrarVersion'] = rarVersion[1]
else:
versions['unrarVersion'] = _('not installed')
app.logger.info(rarVersion[1])
return render_title_template('stats.html', bookcounter=counter, authorcounter=authors, versions=versions, return render_title_template('stats.html', bookcounter=counter, authorcounter=authors, versions=versions,
categorycounter=categorys, seriecounter=series, title=_(u"Statistics")) categorycounter=categorys, seriecounter=series, title=_(u"Statistics"))
@ -2535,8 +2542,14 @@ def configuration_helper(origin):
# Rarfile Content configuration # Rarfile Content configuration
# ToDo check: location valid # ToDo check: location valid
if "config_rarfile_location" in to_save: if "config_rarfile_location" in to_save:
content.config_rarfile_location = to_save["config_rarfile_location"].strip() check = helper.check_unrar(to_save["config_rarfile_location"].strip())
if not check[0] :
content.config_rarfile_location = to_save["config_rarfile_location"].strip()
else:
flash(check[1], category="error")
return render_title_template("config_edit.html", content=config, origin=origin, gdrive=gdrive_support,
goodreads=goodreads_support, rarfile_support=rar_support,
title=_(u"Basic Configuration"))
content.config_default_role = 0 content.config_default_role = 0
if "admin_role" in to_save: if "admin_role" in to_save: