show errors from kepubify and kindlegen, scrap flash cookie
This commit is contained in:
73
index.js
73
index.js
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user