Merge tracks with codec copy'

This commit is contained in:
Mark Cooper 2021-09-09 05:10:55 -05:00
parent 315de87bfc
commit ddbf678a8b
5 changed files with 49 additions and 21 deletions

View File

@ -106,7 +106,9 @@ export default {
var downloadPayload = {
audiobookId: this.audiobook.id,
type: 'singleAudio'
type: 'singleAudio',
includeMetadata: true,
includeCover: true
}
this.$root.socket.emit('download', downloadPayload)
},

View File

@ -1,6 +1,6 @@
{
"name": "audiobookshelf-client",
"version": "1.1.1",
"version": "1.1.2",
"description": "Audiobook manager and player",
"main": "index.js",
"scripts": {

View File

@ -1,6 +1,6 @@
{
"name": "audiobookshelf",
"version": "1.1.1",
"version": "1.1.2",
"description": "Self-hosted audiobook server for managing and playing audiobooks.",
"main": "index.js",
"scripts": {

View File

@ -65,10 +65,14 @@ class DownloadManager {
var audiobookDirname = Path.basename(audiobook.path)
if (downloadType === 'singleAudio') {
var audioFileType = options.audioFileType || 'm4b'
var audioFileType = options.audioFileType || '.m4b'
delete options.audioFileType
filename = audiobookDirname + '.' + audioFileType
fileext = '.' + audioFileType
if (audioFileType === 'same') {
var firstTrack = audiobook.tracks[0]
audioFileType = firstTrack.ext
}
filename = audiobookDirname + audioFileType
fileext = audioFileType
filepath = Path.join(dlpath, filename)
}
@ -97,33 +101,47 @@ class DownloadManager {
}
async processSingleAudioDownload(audiobook, download) {
// If changing audio file type then encoding is needed
var requiresEncode = audiobook.tracks[0].ext !== download.ext || download.includeCover || download.includeMetadata
var concatFilePath = Path.join(download.dirpath, 'files.txt')
await writeConcatFile(audiobook.tracks, concatFilePath)
var metadataFilePath = Path.join(download.dirpath, 'metadata.txt')
await writeMetadataFile(audiobook, metadataFilePath)
const ffmpegInputs = [
{
input: concatFilePath,
options: ['-safe 0', '-f concat']
},
{
input: metadataFilePath
}
]
const logLevel = process.env.NODE_ENV === 'production' ? 'error' : 'warning'
const ffmpegOptions = [
`-loglevel ${logLevel}`,
'-map 0:a',
'-map_metadata 1',
'-acodec aac',
'-ac 2',
'-b:a 64k',
'-id3v2_version 3']
var ffmpegOptions = [`-loglevel ${logLevel}`]
if (audiobook.book.cover) {
if (requiresEncode) {
ffmpegOptions = ffmpegOptions.concat([
'-map 0:a',
'-acodec aac',
'-ac 2',
'-b:a 64k',
'-id3v2_version 3'
])
} else {
ffmpegOptions.push('-c copy')
}
if (download.includeMetadata) {
var metadataFilePath = Path.join(download.dirpath, 'metadata.txt')
await writeMetadataFile(audiobook, metadataFilePath)
ffmpegInputs.push({
input: metadataFilePath
})
ffmpegOptions.push('-map_metadata 1')
}
if (download.includeCover && audiobook.book.cover) {
ffmpegInputs.push({
input: audiobook.book.cover,
options: ['-f image2pipe']

View File

@ -28,6 +28,14 @@ class Download {
}
}
get includeMetadata() {
return !!this.options.includeMetadata
}
get includeCover() {
return !!this.options.includeCover
}
get mimeType() {
if (this.ext === '.mp3' || this.ext === '.m4b' || this.ext === '.m4a') {
return 'audio/mpeg'