show errors from kepubify and kindlegen, scrap flash cookie

This commit is contained in:
daniel-j
2024-07-21 16:24:08 +02:00
parent 04b2622ec9
commit 8ccc6f74e5
3 changed files with 91 additions and 30 deletions

View File

@@ -78,12 +78,12 @@ function expireKey (key) {
function flash (ctx, data) { function flash (ctx, data) {
console.log(data) console.log(data)
ctx.cookies.set('flash', encodeURIComponent(JSON.stringify(data)), {overwrite: true, httpOnly: false, sameSite: 'strict', maxAge: 10 * 1000}) //ctx.cookies.set('flash', encodeURIComponent(JSON.stringify(data)), {overwrite: true, httpOnly: false, sameSite: 'strict', maxAge: 10 * 1000})
ctx.response.status = data.success ? 200 : 400 ctx.response.status = data.success ? 200 : 400
if (!data.success) { if (!data.success) {
ctx.set("Connection", "close") ctx.set("Connection", "close")
} }
ctx.body = data ctx.body = data.message
} }
const app = new Koa() const app = new Koa()
@@ -315,12 +315,24 @@ router.post('/upload', async (ctx, next) => {
conversion = 'kindlegen' conversion = 'kindlegen'
const outname = ctx.request.file.path.replace(/\.epub$/i, '.mobi') const outname = ctx.request.file.path.replace(/\.epub$/i, '.mobi')
filename = filename.replace(/\.kepub\.epub$/i, '.epub').replace(/\.epub$/i, '.mobi') filename = filename.replace(/\.kepub\.epub$/i, '.epub').replace(/\.epub$/i, '.mobi')
let stderr = ''
data = await new Promise((resolve, reject) => { let p = new Promise((resolve, reject) => {
const kindlegen = spawn('kindlegen', [basename(ctx.request.file.path), '-dont_append_source', '-c1', '-o', basename(outname)], { const kindlegen = spawn('kindlegen', [basename(ctx.request.file.path), '-dont_append_source', '-c1', '-o', basename(outname)], {
stdio: 'inherit', // stdio: 'inherit',
cwd: dirname(ctx.request.file.path) cwd: dirname(ctx.request.file.path)
}) })
kindlegen.once('error', function (err) {
fs.unlink(ctx.request.file.path, (err) => {
if (err) console.error(err)
else console.log('Removed file', ctx.request.file.path)
})
fs.unlink(ctx.request.file.path.replace(/\.epub$/i, '.mobi8'), (err) => {
if (err) console.error(err)
else console.log('Removed file', ctx.request.file.path.replace(/\.epub$/i, '.mobi8'))
})
reject('kindlegen error: ' + err)
})
kindlegen.once('close', (code) => { kindlegen.once('close', (code) => {
fs.unlink(ctx.request.file.path, (err) => { fs.unlink(ctx.request.file.path, (err) => {
if (err) console.error(err) if (err) console.error(err)
@@ -330,13 +342,31 @@ router.post('/upload', async (ctx, next) => {
if (err) console.error(err) if (err) console.error(err)
else console.log('Removed file', ctx.request.file.path.replace(/\.epub$/i, '.mobi8')) else console.log('Removed file', ctx.request.file.path.replace(/\.epub$/i, '.mobi8'))
}) })
if (code !== 0) { if (code !== 0 && code !== 1) {
console.warn('kindlegen error code ' + code) reject('kindlegen error code: ' + code + '\n' + stderr)
return
} }
resolve(outname) resolve(outname)
}) })
kindlegen.stdout.on('data', function (str) {
stderr += str
console.log('kindlegen: ' + str)
})
kindlegen.stderr.on('data', function (str) {
stderr += str
console.log('kindlegen: ' + str)
})
}) })
try {
data = await p
} catch (err) {
flash(ctx, {
success: false,
message: err.replaceAll(basename(ctx.request.file.path), "infile.epub").replaceAll(basename(outname), "outfile.mobi")
})
return
}
} else if (mimetype === TYPE_EPUB && (info.agent.includes('Kobo') || info.agent.toLowerCase().includes('tolino')) && ctx.request.body.kepubify) { } else if (mimetype === TYPE_EPUB && (info.agent.includes('Kobo') || info.agent.toLowerCase().includes('tolino')) && ctx.request.body.kepubify) {
// convert to Kobo EPUB // convert to Kobo EPUB
@@ -344,24 +374,49 @@ router.post('/upload', async (ctx, next) => {
const outname = ctx.request.file.path.replace(/\.epub$/i, '.kepub.epub') const outname = ctx.request.file.path.replace(/\.epub$/i, '.kepub.epub')
filename = filename.replace(/\.kepub\.epub$/i, '.epub').replace(/\.epub$/i, '.kepub.epub') filename = filename.replace(/\.kepub\.epub$/i, '.epub').replace(/\.epub$/i, '.kepub.epub')
data = await new Promise((resolve, reject) => { let p = new Promise((resolve, reject) => {
let stderr = ''
const kepubify = spawn('kepubify', ['-v', '-u', '-o', basename(outname), basename(ctx.request.file.path)], { const kepubify = spawn('kepubify', ['-v', '-u', '-o', basename(outname), basename(ctx.request.file.path)], {
stdio: 'inherit', //stdio: 'inherit',
cwd: dirname(ctx.request.file.path) cwd: dirname(ctx.request.file.path)
}) })
kepubify.once('error', function (err) {
fs.unlink(ctx.request.file.path, (err) => {
if (err) console.error(err)
else console.log('Removed file', ctx.request.file.path)
})
reject('kepubify error: ' + err)
})
kepubify.once('close', (code) => { kepubify.once('close', (code) => {
fs.unlink(ctx.request.file.path, (err) => { fs.unlink(ctx.request.file.path, (err) => {
if (err) console.error(err) if (err) console.error(err)
else console.log('Removed file', ctx.request.file.path) else console.log('Removed file', ctx.request.file.path)
}) })
if (code !== 0) { if (code !== 0) {
reject('kepubify error code ' + code) reject('Kepubify error code: ' + code + '\n' + stderr)
return return
} }
resolve(outname) resolve(outname)
}) })
kepubify.stdout.on('data', function (str) {
stderr += str
console.log('kepubify: ' + str)
})
kepubify.stderr.on('data', function (str) {
stderr += str
console.log('kepubify: ' + str)
})
}) })
try {
data = await p
} catch (err) {
flash(ctx, {
success: false,
message: err.replaceAll(basename(ctx.request.file.path), "infile.epub").replaceAll(basename(outname), "outfile.kepub.epub")
})
return
}
} else { } else {
// No conversion // No conversion
data = ctx.request.file.path data = ctx.request.file.path

View File

@@ -94,6 +94,7 @@ input[type="url"], input[type="text"] {
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
line-height: 1.7; line-height: 1.7;
white-space: pre;
} }
#uploadstatus.success { #uploadstatus.success {

View File

@@ -50,19 +50,27 @@ var siteurl = document.getElementById('siteurl')
var flashtimer = null var flashtimer = null
function handleFlash(flashFallback) { function hideUploadStatus() {
var flash = getCookies().flash uploadstatus.style.opacity = 0
if (!flash) flash = flashFallback clearTimeout(flashtimer)
flashtimer = setTimeout(function () {
uploadstatus.textContent = ''
uploadstatus.className = ''
}, 500)
}
function handleFlash(flash) {
// if (!flash) getCookies().flash
console.log(flash) console.log(flash)
clearTimeout(flashtimer) clearTimeout(flashtimer)
if (flash) { if (flash) {
if (flash.message) { if (flash.message) {
if (flash.success) { if (flash.success) {
uploadstatus.className = " success" uploadstatus.className = " success"
uploadstatus.innerHTML = flash.message uploadstatus.innerHTML = flash.message.trim()
} else { } else {
uploadstatus.className = " error" uploadstatus.className = " error"
uploadstatus.textContent = flash.message uploadstatus.textContent = flash.message.trim()
} }
uploadstatus.style.opacity = 1 uploadstatus.style.opacity = 1
} }
@@ -73,24 +81,14 @@ function handleFlash(flashFallback) {
urlinput.value = flash.url urlinput.value = flash.url
} }
} else { } else {
uploadstatus.style.opacity = 0 hideUploadStatus()
flashtimer = setTimeout(function () {
uploadstatus.textContent = ''
uploadstatus.className = ''
}, 500)
} }
} }
handleFlash() // handleFlash()
uploadstatus.addEventListener('click', function () { uploadstatus.addEventListener('click', function () {
uploadstatus.style.opacity = 0 hideUploadStatus()
clearTimeout(flashtimer)
flashtimer = setTimeout(function () {
uploadstatus.textContent = ''
uploadstatus.className = ''
}, 500)
}, false) }, false)
@@ -135,6 +133,7 @@ if (isIOS) {
} }
uploadform.addEventListener('submit', function (e) { uploadform.addEventListener('submit', function (e) {
hideUploadStatus()
e.preventDefault() e.preventDefault()
var fd = new FormData(uploadform) var fd = new FormData(uploadform)
var req = new XMLHttpRequest() var req = new XMLHttpRequest()
@@ -149,10 +148,13 @@ uploadform.addEventListener('submit', function (e) {
} }
req.onload = function () { req.onload = function () {
console.log('upload ok', req.status, req.responseText, req.responseType) console.log('upload ok', req.status, req.responseText, req.responseType)
handleFlash() handleFlash({
success: req.status == 200,
message: req.responseText
})
} }
req.onerror = function () { req.onerror = function () {
console.log('upload error', req.status) console.log('upload error', req.status, req.responseText, req.responseType)
handleFlash({ handleFlash({
success: false, success: false,
message: "Upload error - is the key correct?" message: "Upload error - is the key correct?"
@@ -160,7 +162,10 @@ uploadform.addEventListener('submit', function (e) {
} }
req.onabort = function () { req.onabort = function () {
console.log('aborted', req.status) console.log('aborted', req.status)
handleFlash() handleFlash({
success: false,
message: "Upload aborted"
})
} }
req.send(fd) req.send(fd)
return false return false