mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-01-03 00:06:46 +01:00
Add:Cancel m4b merge button #1008
This commit is contained in:
parent
39979ff8a3
commit
02d997897c
@ -67,6 +67,7 @@
|
|||||||
<p v-else class="text-success text-lg font-semibold">Embed Finished!</p>
|
<p v-else class="text-success text-lg font-semibold">Embed Finished!</p>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="w-full flex justify-end items-center mb-4">
|
<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>
|
<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-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>
|
<p v-else class="text-success text-lg font-semibold">M4B Finished!</p>
|
||||||
@ -166,7 +167,8 @@ export default {
|
|||||||
audiofilesFinished: {},
|
audiofilesFinished: {},
|
||||||
isFinished: false,
|
isFinished: false,
|
||||||
toneObject: null,
|
toneObject: null,
|
||||||
selectedTool: 'embed'
|
selectedTool: 'embed',
|
||||||
|
isCancelingEncode: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@ -230,10 +232,25 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
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() {
|
encodeM4bClick() {
|
||||||
this.processing = true
|
this.processing = true
|
||||||
this.$axios
|
this.$axios
|
||||||
.$get(`/api/audiobook-merge/${this.libraryItemId}`)
|
.$get(`/api/encode-m4b/${this.libraryItemId}`)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
console.log('Ab m4b merge started')
|
console.log('Ab m4b merge started')
|
||||||
})
|
})
|
||||||
|
@ -82,26 +82,26 @@ class MiscController {
|
|||||||
res.sendStatus(200)
|
res.sendStatus(200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET: api/audiobook-merge/:id
|
// GET: api/encode-m4b/:id
|
||||||
async mergeAudiobook(req, res) {
|
async encodeM4b(req, res) {
|
||||||
if (!req.user.isAdminOrUp) {
|
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)
|
return res.sendStatus(403)
|
||||||
}
|
}
|
||||||
|
|
||||||
var libraryItem = this.db.getLibraryItem(req.params.id)
|
var libraryItem = this.db.getLibraryItem(req.params.id)
|
||||||
if (!libraryItem || libraryItem.isMissing || libraryItem.isInvalid) {
|
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')
|
return res.status(404).send('Audiobook not found')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libraryItem.mediaType !== 'book') {
|
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')
|
return res.status(500).send('Invalid library item: not a book')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libraryItem.media.tracks.length <= 0) {
|
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')
|
return res.status(500).send('Invalid audiobook: no audio tracks')
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,6 +110,21 @@ class MiscController {
|
|||||||
res.sendStatus(200)
|
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
|
// GET: api/tasks
|
||||||
getTasks(req, res) {
|
getTasks(req, res) {
|
||||||
res.json({
|
res.json({
|
||||||
|
@ -22,6 +22,14 @@ class AbMergeManager {
|
|||||||
this.pendingTasks = []
|
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
|
async ensureDownloadDirPath() { // Creates download path if necessary and sets owner and permissions
|
||||||
if (this.downloadDirPathExist) return
|
if (this.downloadDirPathExist) return
|
||||||
|
|
||||||
@ -223,6 +231,7 @@ class AbMergeManager {
|
|||||||
if (pendingDl.worker) {
|
if (pendingDl.worker) {
|
||||||
try {
|
try {
|
||||||
pendingDl.worker.postMessage('STOP')
|
pendingDl.worker.postMessage('STOP')
|
||||||
|
return
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
Logger.error('[AbMergeManager] Error posting stop message to worker', error)
|
Logger.error('[AbMergeManager] Error posting stop message to worker', error)
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ class TaskManager {
|
|||||||
|
|
||||||
taskFinished(task) {
|
taskFinished(task) {
|
||||||
if (this.tasks.some(t => t.id === task.id)) {
|
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())
|
this.emitter('task_finished', task.toJSON())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -224,7 +224,8 @@ class ApiRouter {
|
|||||||
// Misc Routes
|
// Misc Routes
|
||||||
//
|
//
|
||||||
this.router.post('/upload', MiscController.handleUpload.bind(this))
|
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.get('/tasks', MiscController.getTasks.bind(this))
|
||||||
this.router.patch('/settings', MiscController.updateServerSettings.bind(this)) // Root only
|
this.router.patch('/settings', MiscController.updateServerSettings.bind(this)) // Root only
|
||||||
this.router.post('/purgecache', MiscController.purgeCache.bind(this)) // Root only
|
this.router.post('/purgecache', MiscController.purgeCache.bind(this)) // Root only
|
||||||
|
Loading…
Reference in New Issue
Block a user