#
Filename
Size
@@ -124,15 +162,19 @@ export default {
return {
audiofilesEncoding: {},
audiofilesFinished: {},
- updatingMetadata: false,
- embedFinished: false,
- toneObject: null
+ processing: false,
+ isFinished: false,
+ toneObject: null,
+ selectedTool: 'embed'
}
},
computed: {
libraryItemId() {
return this.libraryItem.id
},
+ libraryItemRelPath() {
+ return this.libraryItem.relPath
+ },
media() {
return this.libraryItem.media || {}
},
@@ -140,16 +182,42 @@ export default {
return this.media.metadata || {}
},
audioFiles() {
- return this.media.audioFiles || []
+ return (this.media.audioFiles || []).filter((af) => !af.exclude && !af.invalid)
+ },
+ isSingleM4b() {
+ return this.audioFiles.length === 1 && this.audioFiles[0].metadata.ext.toLowerCase() === '.m4b'
},
streamLibraryItem() {
return this.$store.state.streamLibraryItem
},
metadataChapters() {
return this.media.chapters || []
+ },
+ availableTools() {
+ if (this.isSingleM4b) {
+ return [{ value: 'embed', text: 'Embed Metadata' }]
+ } else {
+ return [
+ { value: 'embed', text: 'Embed Metadata' },
+ { value: 'm4b', text: 'M4B Encoder' }
+ ]
+ }
}
},
methods: {
+ encodeM4bClick() {
+ this.processing = true
+ this.$axios
+ .$get(`/api/audiobook-merge/${this.libraryItemId}`)
+ .then(() => {
+ this.processing = false
+ })
+ .catch((error) => {
+ var errorMsg = error.response ? error.response.data || 'Unknown Error' : 'Unknown Error'
+ this.$toast.error(errorMsg)
+ this.processing = false
+ })
+ },
embedClick() {
const payload = {
message: `Are you sure you want to embed metadata in ${this.audioFiles.length} audio files?`,
@@ -163,7 +231,7 @@ export default {
this.$store.commit('globals/setConfirmPrompt', payload)
},
updateAudioFileMetadata() {
- this.updatingMetadata = true
+ this.processing = true
this.$axios
.$get(`/api/items/${this.libraryItemId}/audio-metadata?tone=1`)
.then(() => {
@@ -171,20 +239,20 @@ export default {
})
.catch((error) => {
console.error('Audio metadata encode failed', error)
- this.updatingMetadata = false
+ this.processing = false
})
},
audioMetadataStarted(data) {
console.log('audio metadata started', data)
if (data.libraryItemId !== this.libraryItemId) return
this.audiofilesFinished = {}
- this.updatingMetadata = true
+ this.processing = true
},
audioMetadataFinished(data) {
console.log('audio metadata finished', data)
if (data.libraryItemId !== this.libraryItemId) return
- this.updatingMetadata = false
- this.embedFinished = true
+ this.processing = false
+ this.isFinished = true
this.audiofilesEncoding = {}
this.$toast.success('Audio file metadata updated')
},
@@ -197,6 +265,20 @@ export default {
this.$set(this.audiofilesEncoding, data.ino, false)
this.$set(this.audiofilesFinished, data.ino, true)
},
+ selectedToolUpdated() {
+ let newurl = window.location.protocol + '//' + window.location.host + window.location.pathname + `?tool=${this.selectedTool}`
+ window.history.replaceState({ path: newurl }, '', newurl)
+ },
+ init() {
+ this.fetchToneObject()
+ if (this.$route.query.tool === 'm4b') {
+ if (this.availableTools.some((t) => t.value === 'm4b')) {
+ this.selectedTool = 'm4b'
+ } else {
+ this.selectedToolUpdated()
+ }
+ }
+ },
fetchToneObject() {
this.$axios
.$get(`/api/items/${this.libraryItemId}/tone-object`)
@@ -210,7 +292,7 @@ export default {
}
},
mounted() {
- this.fetchToneObject()
+ this.init()
this.$root.socket.on('audio_metadata_started', this.audioMetadataStarted)
this.$root.socket.on('audio_metadata_finished', this.audioMetadataFinished)
this.$root.socket.on('audiofile_metadata_started', this.audiofileMetadataStarted)
diff --git a/server/Server.js b/server/Server.js
index 71213960..6259fde4 100644
--- a/server/Server.js
+++ b/server/Server.js
@@ -223,10 +223,10 @@ class Server {
// Client dynamic routes
const dyanimicRoutes = [
'/item/:id',
- '/item/:id/manage',
'/author/:id',
'/audiobook/:id/chapters',
'/audiobook/:id/edit',
+ '/audiobook/:id/manage',
'/library/:library',
'/library/:library/search',
'/library/:library/bookshelf/:id?',
diff --git a/server/controllers/MiscController.js b/server/controllers/MiscController.js
index 300257c0..c9b15007 100644
--- a/server/controllers/MiscController.js
+++ b/server/controllers/MiscController.js
@@ -84,8 +84,8 @@ class MiscController {
// GET: api/audiobook-merge/:id
async mergeAudiobook(req, res) {
- if (!req.user.canDownload) {
- Logger.error('User attempting to download without permission', req.user)
+ if (!req.user.isAdminOrUp) {
+ Logger.error('[MiscController] mergeAudiobook: Non-admin user attempting to make m4b', req.user)
return res.sendStatus(403)
}