You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
314 lines
9.4 KiB
314 lines
9.4 KiB
|
|
|
|
module.exports = function transcodeAddAudioStream(file, audioEncoder, langTag, channelCount) {
|
|
|
|
// response.preset = library.actions.transcodeAddAudioStream(file, 'aac', 'en', 1).preset
|
|
|
|
//Function required responses
|
|
// preset
|
|
// processFile
|
|
// note
|
|
|
|
try {
|
|
|
|
var audioCodec = audioEncoder
|
|
langTag = langTag.toLowerCase()
|
|
|
|
if (audioEncoder == 'dca') {
|
|
audioCodec = 'dts'
|
|
}
|
|
|
|
if (audioEncoder == 'libmp3lame') {
|
|
audioCodec = 'mp3'
|
|
}
|
|
|
|
//Step 1: Check if the file already has the required stream codec/langtag/channel count
|
|
|
|
var hasStreamAlready = file.ffProbeData.streams.filter(stream => {
|
|
|
|
try {
|
|
if (stream.codec_type == 'audio' && stream.codec_name === audioCodec && stream.tags.language.toLowerCase().includes(langTag.toLowerCase()) && stream.channels == channelCount) {
|
|
return true
|
|
}
|
|
|
|
} catch (err) { }
|
|
|
|
return false
|
|
})
|
|
|
|
if (hasStreamAlready.length > 0) {
|
|
|
|
return {
|
|
preset: '',
|
|
processFile: false,
|
|
note: `File already has ${langTag} stream in ${audioEncoder}, ${channelCount} channels\n`
|
|
}
|
|
}
|
|
|
|
|
|
//Step 2: Check if file has streams with specified lang tag
|
|
|
|
var streamsWithLangTag = file.ffProbeData.streams.filter(stream => {
|
|
|
|
try {
|
|
if (stream.codec_type == 'audio' && stream.tags.language.toLowerCase().includes(langTag)) {
|
|
return true
|
|
}
|
|
} catch (err) { }
|
|
|
|
return false
|
|
|
|
})
|
|
|
|
console.log("streamsWithLangTag:" + streamsWithLangTag)
|
|
|
|
if (streamsWithLangTag.length != 0) {
|
|
|
|
return attemptMakeStreamLang(langTag)
|
|
|
|
} else {
|
|
|
|
return attemptMakeStreamUnd('und')
|
|
|
|
}
|
|
|
|
|
|
function attemptMakeStreamLang(langTag) {
|
|
|
|
|
|
var streamsWithLangTag = file.ffProbeData.streams.filter(stream => {
|
|
try {
|
|
if (stream.codec_type == 'audio' && stream.tags.language.toLowerCase().includes(langTag)) {
|
|
|
|
return true
|
|
}
|
|
|
|
} catch (err) { }
|
|
|
|
return false
|
|
|
|
})
|
|
|
|
|
|
var highestChannelCount = streamsWithLangTag.reduce(getHighest)
|
|
|
|
function getHighest(first, second) {
|
|
if (first.channels > second.channels && first) {
|
|
return first
|
|
} else {
|
|
return second
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (parseInt(highestChannelCount.channels) >= parseInt(channelCount)) {
|
|
|
|
var hasStreamAlready = file.ffProbeData.streams.filter(stream => {
|
|
|
|
try {
|
|
if (stream.codec_type == 'audio' && stream.codec_name === audioCodec && stream.tags.language.toLowerCase().includes(langTag.toLowerCase()) && stream.channels == channelCount) {
|
|
return true
|
|
}
|
|
|
|
} catch (err) { }
|
|
|
|
return false
|
|
})
|
|
|
|
if (hasStreamAlready.length > 0) {
|
|
|
|
return {
|
|
preset: '',
|
|
processFile: false,
|
|
note: `File already has ${langTag} stream in ${audioEncoder}, ${channelCount} channels \n`
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return {
|
|
preset: `,-map 0:v -map 0:${highestChannelCount.index} -map 0:a -map 0:s? -map 0:d? -c copy -c:a:0 ${audioEncoder} -ac ${channelCount}`,
|
|
processFile: true,
|
|
note: `The required channel count ${channelCount} is lower than the highest available channel count (${highestChannelCount.channels}). Adding! \n`
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
console.log('here3')
|
|
|
|
var hasStreamAlready = file.ffProbeData.streams.filter(stream => {
|
|
|
|
try {
|
|
if (stream.codec_type == 'audio' && stream.codec_name === audioCodec && stream.tags.language.toLowerCase().includes(langTag.toLowerCase()) && stream.channels == highestChannelCount.channels) {
|
|
return true
|
|
}
|
|
|
|
} catch (err) { }
|
|
|
|
return false
|
|
})
|
|
|
|
if (hasStreamAlready.length > 0) {
|
|
|
|
return {
|
|
preset: '',
|
|
processFile: false,
|
|
note: `File already has ${langTag} stream in ${audioEncoder}, ${highestChannelCount.channels} channels (Highest available) \n`
|
|
}
|
|
} else {
|
|
|
|
return {
|
|
preset: `,-map 0:v -map 0:${highestChannelCount.index} -map 0:a -map 0:s? -map 0:d? -c copy -c:a:0 ${audioEncoder} -ac ${highestChannelCount.channels}`,
|
|
processFile: true,
|
|
note: `The required channel count (${channelCount}) is higher than the highest channel available in specified lang tag (${highestChannelCount.channels}). Adding lower channel track. \n`
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
function attemptMakeStreamUnd(langTag) {
|
|
|
|
console.log('No tracks with specified lang tag exist. Checking undefined tracks.')
|
|
|
|
console.log(langTag)
|
|
|
|
var streamsWithLangTag = file.ffProbeData.streams.filter(stream => {
|
|
|
|
try {
|
|
if (stream.codec_type == 'audio' && (stream.tags == undefined || stream.tags.language == undefined || stream.tags.language.toLowerCase().includes(langTag))) {
|
|
|
|
return true
|
|
}
|
|
|
|
} catch (err) { }
|
|
|
|
return false
|
|
|
|
})
|
|
|
|
if (streamsWithLangTag.length == 0) {
|
|
return {
|
|
preset: ``,
|
|
processFile: false,
|
|
note: `Unable to add audio stream in ${langTag}/und with ${channelCount} channels \n`
|
|
}
|
|
}
|
|
|
|
var highestChannelCount = streamsWithLangTag.reduce(getHighest)
|
|
|
|
function getHighest(first, second) {
|
|
if (first.channels > second.channels && first) {
|
|
return first
|
|
} else {
|
|
return second
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (parseInt(highestChannelCount.channels) >= parseInt(channelCount)) {
|
|
|
|
var hasStreamAlready = file.ffProbeData.streams.filter(stream => {
|
|
|
|
try {
|
|
if (stream.codec_type == 'audio' && stream.codec_name === audioCodec && (stream.tags == undefined || stream.tags.language == undefined || stream.tags.language.toLowerCase().includes(langTag)) && stream.channels == channelCount) {
|
|
return true
|
|
}
|
|
|
|
} catch (err) { }
|
|
|
|
return false
|
|
})
|
|
|
|
if (hasStreamAlready.length > 0) {
|
|
|
|
return {
|
|
preset: '',
|
|
processFile: false,
|
|
note: `File already has ${langTag} stream in ${audioEncoder}, ${channelCount} channels \n`
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return {
|
|
preset: `,-map 0:v -map 0:${highestChannelCount.index} -map 0:a -map 0:s? -map 0:d? -c copy -c:a:0 ${audioEncoder} -ac ${channelCount}`,
|
|
processFile: true,
|
|
note: `The required channel count ${channelCount} is lower than the highest available channel count (${highestChannelCount.channels}). Adding! \n`
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
var hasStreamAlready = file.ffProbeData.streams.filter(stream => {
|
|
|
|
try {
|
|
if (stream.codec_type == 'audio' && stream.codec_name === audioCodec && (stream.tags == undefined || stream.tags.language == undefined || stream.tags.language.toLowerCase().includes(langTag)) && stream.channels == highestChannelCount.channels) {
|
|
return true
|
|
}
|
|
|
|
} catch (err) { }
|
|
|
|
return false
|
|
})
|
|
|
|
if (hasStreamAlready.length > 0) {
|
|
|
|
return {
|
|
preset: '',
|
|
processFile: false,
|
|
note: `File already has ${langTag} stream in ${audioEncoder}, ${highestChannelCount.channels} channels (Highest available) \n`
|
|
}
|
|
} else {
|
|
|
|
return {
|
|
preset: `,-map 0:v -map 0:${highestChannelCount.index} -map 0:a -map 0:s? -map 0:d? -c copy -c:a:0 ${audioEncoder} -ac ${highestChannelCount.channels}`,
|
|
processFile: true,
|
|
note: `The required channel count (${channelCount}) is higher than the highest channel available in specified lang tag (${highestChannelCount.channels}). Adding lower channel track. \n`
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} catch (err) {
|
|
|
|
return {
|
|
preset: '',
|
|
processFile: false,
|
|
note: `library.actions.transcodeAddAudioStream error: ${err} \n`
|
|
}
|
|
|
|
}
|
|
}
|