Merge branch 'HaveAGitGat:master' into master

This commit is contained in:
Aune 2022-06-13 19:00:01 +02:00 committed by GitHub
commit 61a375a320
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 360 additions and 9 deletions

View file

@ -102,6 +102,18 @@ const plugin = (file, librarySettings, inputs, otherArguments) => {
+ 'This may be due to a corrupt file or permissions issue when scanning the file.');
}
if (file.container === 'mp4' && file.fileMedium === 'video') {
if (file.ffProbeData.streams[0].codec_type === 'video') {
response.infoLog += 'File is mp4 and already has the video stream in the correct order!'
+ ' Due to FFmpeg issues when reordering streams in mp4 files, other stream ordering will be skipped';
return response;
}
response.processFile = true;
response.infoLog += 'File is mp4 and contains video but video is not first stream, remuxing';
response.preset = ',-map 0:v? -map 0:a? -map 0:s? -map 0:d? -map 0:t? -c copy';
return response;
}
let { streams } = JSON.parse(JSON.stringify(file.ffProbeData));
streams.forEach((stream, index) => {

View file

@ -0,0 +1,100 @@
const details = () => ({
id: 'Tdarr_Plugin_00td_action_remove_audio_by_channel_count',
Stage: 'Pre-processing',
Name: 'Remove audio streams by channel count',
Type: 'Video',
Operation: 'Transcode',
Description: `
This plugin removes audio streams based on channel count. The output container is the same as the original.
If the file only has one audio stream, the plugin will be skipped. If the number of audio streams to remove
equals the total number of audio streams, the plugin will be skipped. This ensures there is always at least
one audio stream in the file.
`,
Version: '1.00',
Tags: 'action',
Inputs: [
{
name: 'channelCounts',
type: 'string',
defaultValue: '',
inputUI: {
type: 'text',
},
tooltip:
`Enter the the channel counts to remove.
\\nExample:\\n
8,6
`,
},
],
});
// eslint-disable-next-line no-unused-vars
const plugin = (file, librarySettings, inputs, otherArguments) => {
const lib = require('../methods/lib')();
// eslint-disable-next-line no-unused-vars,no-param-reassign
inputs = lib.loadDefaultValues(inputs, details);
const response = {
processFile: false,
preset: '',
container: `.${file.container}`,
handBrakeMode: false,
FFmpegMode: true,
reQueueAfter: false,
infoLog: '',
};
if (inputs.channelCounts.trim() === '') {
response.infoLog += 'No input entered in plugin, skipping';
return response;
}
const audioStreams = file.ffProbeData.streams.filter((row) => row.codec_type === 'audio');
if (audioStreams.length === 0) {
response.infoLog += 'File has no audio streams, skipping plugin';
return response;
}
if (audioStreams.length === 1) {
response.infoLog += 'File only has 1 audio stream, skipping plugin';
return response;
}
response.preset += ', -map 0 -c copy -max_muxing_queue_size 9999';
const audioToRemove = [];
const channelCounts = inputs.channelCounts.trim().split(',');
for (let i = 0; i < channelCounts.length; i += 1) {
const channelCount = parseInt(channelCounts[i], 10);
for (let j = 0; j < audioStreams.length; j += 1) {
if (channelCount === audioStreams[j].channels) {
audioToRemove.push(audioStreams[j]);
}
}
}
if (audioToRemove.length === 0) {
response.infoLog += 'No audio streams to remove!';
return response;
}
if (audioToRemove.length === audioStreams.length) {
response.infoLog += 'The number of audio streams to remove equals '
+ 'the total number of audio streams, skipping plugin';
return response;
}
audioToRemove.forEach((row) => {
response.preset += ` -map -0:${row.index} `;
response.infoLog += ` Removing stream ${row.index} which has ${row.channels} channels.`;
});
response.processFile = true;
return response;
};
module.exports.details = details;
module.exports.plugin = plugin;

View file

@ -100,9 +100,7 @@ const plugin = (file, librarySettings, inputs, otherArguments) => {
var ffmpegCommand = ", -c copy";
if (file.ffProbeData.streams[0].codec_type.toLowerCase() == "video") {
ffmpegCommand += ` -map 0:v `;
}
ffmpegCommand += ` -map 0:v? `;
var allAudioTracks = file.ffProbeData.streams.filter(
(stream) => stream.codec_type.toLowerCase() == "audio"