mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-07-24 04:44:57 +02:00
Adding download tab and download manager, ffmpeg in worker thread
This commit is contained in:
parent
a86bda59f6
commit
e4dac5dd05
28 changed files with 757 additions and 60 deletions
|
@ -1,8 +1,6 @@
|
|||
const Path = require('path')
|
||||
const Logger = require('../Logger')
|
||||
const prober = require('./prober')
|
||||
const AudioFile = require('../AudioFile')
|
||||
|
||||
|
||||
function getDefaultAudioStream(audioStreams) {
|
||||
if (audioStreams.length === 1) return audioStreams[0]
|
||||
|
|
68
server/utils/downloadWorker.js
Normal file
68
server/utils/downloadWorker.js
Normal file
|
@ -0,0 +1,68 @@
|
|||
const Ffmpeg = require('fluent-ffmpeg')
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
Ffmpeg.setFfmpegPath(process.env.FFMPEG_PATH)
|
||||
}
|
||||
|
||||
const { parentPort, workerData } = require("worker_threads")
|
||||
const Logger = require('../Logger')
|
||||
|
||||
Logger.info('[DownloadWorker] Starting Worker...')
|
||||
|
||||
|
||||
const ffmpegCommand = Ffmpeg()
|
||||
const startTime = Date.now()
|
||||
|
||||
ffmpegCommand.input(workerData.input)
|
||||
if (workerData.inputFormat) ffmpegCommand.inputFormat(workerData.inputFormat)
|
||||
if (workerData.inputOption) ffmpegCommand.inputOption(workerData.inputOption)
|
||||
if (workerData.options) ffmpegCommand.addOption(workerData.options)
|
||||
ffmpegCommand.output(workerData.output)
|
||||
|
||||
var isKilled = false
|
||||
|
||||
async function runFfmpeg() {
|
||||
var success = await new Promise((resolve) => {
|
||||
ffmpegCommand.on('start', (command) => {
|
||||
Logger.info('[DownloadWorker] FFMPEG concat started with command: ' + command)
|
||||
})
|
||||
|
||||
ffmpegCommand.on('stderr', (stdErrline) => {
|
||||
Logger.info(stdErrline)
|
||||
})
|
||||
|
||||
ffmpegCommand.on('error', (err, stdout, stderr) => {
|
||||
if (err.message && err.message.includes('SIGKILL')) {
|
||||
// This is an intentional SIGKILL
|
||||
Logger.info('[DownloadWorker] User Killed singleAudio')
|
||||
} else {
|
||||
Logger.error('[DownloadWorker] Ffmpeg Err', err.message)
|
||||
}
|
||||
resolve(false)
|
||||
})
|
||||
|
||||
ffmpegCommand.on('end', (stdout, stderr) => {
|
||||
Logger.info('[DownloadWorker] singleAudio ended')
|
||||
resolve(true)
|
||||
})
|
||||
ffmpegCommand.run()
|
||||
})
|
||||
|
||||
var resultMessage = {
|
||||
type: 'RESULT',
|
||||
isKilled,
|
||||
elapsed: Date.now() - startTime,
|
||||
success
|
||||
}
|
||||
parentPort.postMessage(resultMessage)
|
||||
}
|
||||
|
||||
parentPort.on('message', (message) => {
|
||||
if (message === 'STOP') {
|
||||
Logger.info('[DownloadWorker] Requested a hard stop')
|
||||
isKilled = true
|
||||
ffmpegCommand.kill()
|
||||
}
|
||||
})
|
||||
|
||||
runFfmpeg()
|
37
server/utils/ffmpegHelpers.js
Normal file
37
server/utils/ffmpegHelpers.js
Normal file
|
@ -0,0 +1,37 @@
|
|||
const fs = require('fs-extra')
|
||||
|
||||
function escapeSingleQuotes(path) {
|
||||
// return path.replace(/'/g, '\'\\\'\'')
|
||||
return path.replace(/\\/g, '/').replace(/ /g, '\\ ').replace(/'/g, '\\\'')
|
||||
}
|
||||
|
||||
// Returns first track start time
|
||||
// startTime is for streams starting an encode part-way through an audiobook
|
||||
async function writeConcatFile(tracks, outputPath, startTime = 0) {
|
||||
var trackToStartWithIndex = 0
|
||||
var firstTrackStartTime = 0
|
||||
|
||||
// Find first track greater than startTime
|
||||
if (startTime > 0) {
|
||||
var currTrackEnd = 0
|
||||
var startingTrack = tracks.find(t => {
|
||||
currTrackEnd += t.duration
|
||||
return startTime < currTrackEnd
|
||||
})
|
||||
if (startingTrack) {
|
||||
firstTrackStartTime = currTrackEnd - startingTrack.duration
|
||||
trackToStartWithIndex = startingTrack.index
|
||||
}
|
||||
}
|
||||
|
||||
var tracksToInclude = tracks.filter(t => t.index >= trackToStartWithIndex)
|
||||
var trackPaths = tracksToInclude.map(t => {
|
||||
var line = 'file ' + escapeSingleQuotes(t.fullPath) + '\n' + `duration ${t.duration}`
|
||||
return line
|
||||
})
|
||||
var inputstr = trackPaths.join('\n\n')
|
||||
await fs.writeFile(outputPath, inputstr)
|
||||
|
||||
return firstTrackStartTime
|
||||
}
|
||||
module.exports.writeConcatFile = writeConcatFile
|
|
@ -17,6 +17,13 @@ async function getFileStat(path) {
|
|||
}
|
||||
module.exports.getFileStat = getFileStat
|
||||
|
||||
async function getFileSize(path) {
|
||||
var stat = await getFileStat(path)
|
||||
if (!stat) return 0
|
||||
return stat.size || 0
|
||||
}
|
||||
module.exports.getFileSize = getFileSize
|
||||
|
||||
function bytesPretty(bytes, decimals = 0) {
|
||||
if (bytes === 0) {
|
||||
return '0 Bytes'
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue