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.
125 lines
3.4 KiB
125 lines
3.4 KiB
/* eslint-disable */
|
|
const details = () => {
|
|
return {
|
|
id: "Tdarr_Plugin_c0r1_SetDefaultAudioStream",
|
|
Stage: "Pre-processing",
|
|
Name: "Set Default Audio Stream (Based On Channel Count)",
|
|
Type: "Audio",
|
|
Operation: "Transcode",
|
|
Description: `This plugin will set an audio channel (2.0, 5.1, 7.1) to default and remove default from all other audio streams \n\n`,
|
|
Version: "0.1.0a",
|
|
Tags: "audio only,ffmpeg,configurable",
|
|
|
|
Inputs: [
|
|
{
|
|
name: "channels",
|
|
type: 'string',
|
|
defaultValue:'2',
|
|
inputUI: {
|
|
type: 'text',
|
|
},
|
|
tooltip: `Desired audio channel number.
|
|
|
|
\\nExample:\\n
|
|
|
|
2
|
|
|
|
\\nExample:\\n
|
|
|
|
6
|
|
|
|
\\nExample:\\n
|
|
|
|
8`,
|
|
},
|
|
],
|
|
};
|
|
};
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
const plugin = (file, librarySettings, inputs, otherArguments) => {
|
|
|
|
const lib = require('../methods/lib')();
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-param-reassign
|
|
inputs = lib.loadDefaultValues(inputs, details);
|
|
var response = {
|
|
processFile: false,
|
|
preset: "",
|
|
container: "." + file.container,
|
|
handBrakeMode: false,
|
|
FFmpegMode: true,
|
|
infoLog: "",
|
|
};
|
|
|
|
var shouldProcess = false;
|
|
var defaultAudioStreams = 0;
|
|
var matchingAudioStreams = 0;
|
|
var defaultSet = false;
|
|
var ffmpegCommandInsert = "";
|
|
|
|
// Check if default audio stream matches user's channel selection
|
|
for (var i = 0; i < file.ffProbeData.streams.length; i++) {
|
|
if (
|
|
file.ffProbeData.streams[i].codec_type.toLowerCase() === "audio" &&
|
|
file.ffProbeData.streams[i].channels == inputs.channels
|
|
) {
|
|
matchingAudioStreams++;
|
|
if (file.ffProbeData.streams[i].disposition.default === 1) {
|
|
defaultAudioStreams++;
|
|
}
|
|
}
|
|
}
|
|
|
|
// build command
|
|
for (var i = 0; i < file.ffProbeData.streams.length; i++) {
|
|
if (file.ffProbeData.streams[i].codec_type.toLowerCase() === "audio") {
|
|
if (file.ffProbeData.streams[i].channels == inputs.channels) {
|
|
if (!defaultSet) {
|
|
ffmpegCommandInsert += `-disposition:${i} default `;
|
|
defaultSet = true;
|
|
} else {
|
|
ffmpegCommandInsert += `-disposition:${i} 0 `;
|
|
}
|
|
} else {
|
|
ffmpegCommandInsert += `-disposition:${i} 0 `;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Only process when there is a matching stream and
|
|
// when there is either no default or more than 1 default stream set
|
|
if (matchingAudioStreams >= 1 && defaultAudioStreams !== 1) {
|
|
shouldProcess = true;
|
|
response.infoLog += "☒ Matching audio stream is not set to default. \n";
|
|
}
|
|
|
|
if (shouldProcess) {
|
|
response.processFile = true;
|
|
response.reQueueAfter = true;
|
|
response.preset = `,-map 0 -c copy ${ffmpegCommandInsert}`;
|
|
response.infoLog +=
|
|
"☒ Setting " +
|
|
inputs.channels +
|
|
" channel matching audio stream to default. Remove default from all other audio streams \n";
|
|
} else {
|
|
if (matchingAudioStreams < 1) {
|
|
response.infoLog +=
|
|
"☑ No " + inputs.channels + " channel audio stream exists. \n ";
|
|
} else if (defaultAudioStreams === 1) {
|
|
response.infoLog +=
|
|
"☑ Default " +
|
|
inputs.channels +
|
|
" channel audio stream already exists. \n ";
|
|
} else {
|
|
response.infoLog += "☑ Unexpected: Did not process \n ";
|
|
}
|
|
|
|
response.processFile = false;
|
|
}
|
|
return response;
|
|
};
|
|
|
|
|
|
|
|
module.exports.details = details;
|
|
module.exports.plugin = plugin; |