Add:Cancel m4b merge button #1008

This commit is contained in:
advplyr 2022-10-02 14:31:04 -05:00
parent 39979ff8a3
commit 02d997897c
5 changed files with 52 additions and 10 deletions

View File

@ -67,6 +67,7 @@
<p v-else class="text-success text-lg font-semibold">Embed Finished!</p>
</div>
<div v-else class="w-full flex justify-end items-center mb-4">
<ui-btn v-if="!isTaskFinished && processing" color="error" :loading="isCancelingEncode" class="mr-2" @click.stop="cancelEncodeClick">Cancel Encode</ui-btn>
<ui-btn v-if="!isTaskFinished" color="primary" :loading="processing" @click.stop="encodeM4bClick">Start M4B Encode</ui-btn>
<p v-else-if="taskFailed" class="text-error text-lg font-semibold">M4B Failed! {{ taskError }}</p>
<p v-else class="text-success text-lg font-semibold">M4B Finished!</p>
@ -166,7 +167,8 @@ export default {
audiofilesFinished: {},
isFinished: false,
toneObject: null,
selectedTool: 'embed'
selectedTool: 'embed',
isCancelingEncode: false
}
},
watch: {
@ -230,10 +232,25 @@ export default {
}
},
methods: {
cancelEncodeClick() {
this.isCancelingEncode = true
this.$axios
.$post(`/api/encode-m4b/${this.libraryItemId}/cancel`)
.then(() => {
this.$toast.success('Encode canceled')
})
.catch((error) => {
console.error('Failed to cancel encode', error)
this.$toast.error('Failed to cancel encode')
})
.finally(() => {
this.isCancelingEncode = false
})
},
encodeM4bClick() {
this.processing = true
this.$axios
.$get(`/api/audiobook-merge/${this.libraryItemId}`)
.$get(`/api/encode-m4b/${this.libraryItemId}`)
.then(() => {
console.log('Ab m4b merge started')
})

View File

@ -82,26 +82,26 @@ class MiscController {
res.sendStatus(200)
}
// GET: api/audiobook-merge/:id
async mergeAudiobook(req, res) {
// GET: api/encode-m4b/:id
async encodeM4b(req, res) {
if (!req.user.isAdminOrUp) {
Logger.error('[MiscController] mergeAudiobook: Non-admin user attempting to make m4b', req.user)
Logger.error('[MiscController] encodeM4b: Non-admin user attempting to make m4b', req.user)
return res.sendStatus(403)
}
var libraryItem = this.db.getLibraryItem(req.params.id)
if (!libraryItem || libraryItem.isMissing || libraryItem.isInvalid) {
Logger.error(`[MiscController] mergeAudiboook: library item not found or invalid ${req.params.id}`)
Logger.error(`[MiscController] encodeM4b: library item not found or invalid ${req.params.id}`)
return res.status(404).send('Audiobook not found')
}
if (libraryItem.mediaType !== 'book') {
Logger.error(`[MiscController] mergeAudiboook: Invalid library item ${req.params.id}: not a book`)
Logger.error(`[MiscController] encodeM4b: Invalid library item ${req.params.id}: not a book`)
return res.status(500).send('Invalid library item: not a book')
}
if (libraryItem.media.tracks.length <= 0) {
Logger.error(`[MiscController] mergeAudiboook: Invalid audiobook ${req.params.id}: no audio tracks`)
Logger.error(`[MiscController] encodeM4b: Invalid audiobook ${req.params.id}: no audio tracks`)
return res.status(500).send('Invalid audiobook: no audio tracks')
}
@ -110,6 +110,21 @@ class MiscController {
res.sendStatus(200)
}
// POST: api/encode-m4b/:id/cancel
async cancelM4bEncode(req, res) {
if (!req.user.isAdminOrUp) {
Logger.error('[MiscController] cancelM4bEncode: Non-admin user attempting to cancel m4b encode', req.user)
return res.sendStatus(403)
}
const workerTask = this.abMergeManager.getPendingTaskByLibraryItemId(req.params.id)
if (!workerTask) return res.sendStatus(404)
this.abMergeManager.cancelEncode(workerTask.task)
res.sendStatus(200)
}
// GET: api/tasks
getTasks(req, res) {
res.json({

View File

@ -22,6 +22,14 @@ class AbMergeManager {
this.pendingTasks = []
}
getPendingTaskByLibraryItemId(libraryItemId) {
return this.pendingTasks.find(t => t.task.data.libraryItemId === libraryItemId)
}
cancelEncode(task) {
return this.removeTask(task, true)
}
async ensureDownloadDirPath() { // Creates download path if necessary and sets owner and permissions
if (this.downloadDirPathExist) return
@ -223,6 +231,7 @@ class AbMergeManager {
if (pendingDl.worker) {
try {
pendingDl.worker.postMessage('STOP')
return
} catch (error) {
Logger.error('[AbMergeManager] Error posting stop message to worker', error)
}

View File

@ -12,7 +12,7 @@ class TaskManager {
taskFinished(task) {
if (this.tasks.some(t => t.id === task.id)) {
this.tasks = this.tasks.filter(t => t !== task.id)
this.tasks = this.tasks.filter(t => t.id !== task.id)
this.emitter('task_finished', task.toJSON())
}
}

View File

@ -224,7 +224,8 @@ class ApiRouter {
// Misc Routes
//
this.router.post('/upload', MiscController.handleUpload.bind(this))
this.router.get('/audiobook-merge/:id', MiscController.mergeAudiobook.bind(this))
this.router.get('/encode-m4b/:id', MiscController.encodeM4b.bind(this))
this.router.post('/encode-m4b/:id/cancel', MiscController.cancelM4bEncode.bind(this))
this.router.get('/tasks', MiscController.getTasks.bind(this))
this.router.patch('/settings', MiscController.updateServerSettings.bind(this)) // Root only
this.router.post('/purgecache', MiscController.purgeCache.bind(this)) // Root only