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` } } }