Create Tdarr_Plugin_00td_action_re_order_all_streams_v2.js (#249)
parent
7ffcd4d4f7
commit
a5b230df72
@ -0,0 +1,212 @@
|
|||||||
|
const details = () => ({
|
||||||
|
id: 'Tdarr_Plugin_00td_action_re_order_all_streams_v2',
|
||||||
|
Stage: 'Pre-processing',
|
||||||
|
Name: 'Re-order all streams V2',
|
||||||
|
Type: 'Video',
|
||||||
|
Operation: 'Transcode',
|
||||||
|
Description: `
|
||||||
|
This action has a built-in filter. Additional filters can be added. \n\n
|
||||||
|
This plugin re-orders all streams based on: codecs,channels,languages,streamTypes.
|
||||||
|
`,
|
||||||
|
Version: '1.00',
|
||||||
|
Tags: 'action',
|
||||||
|
Inputs: [
|
||||||
|
{
|
||||||
|
name: 'processOrder',
|
||||||
|
type: 'string',
|
||||||
|
defaultValue: 'codecs,channels,languages,streamTypes',
|
||||||
|
inputUI: {
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
tooltip:
|
||||||
|
`Specify the process order.
|
||||||
|
For example, if 'languages' is first, the streams will be ordered based on that first.
|
||||||
|
|
||||||
|
\\nExample:\\n
|
||||||
|
codecs,channels,languages,streamTypes
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'languages',
|
||||||
|
type: 'string',
|
||||||
|
defaultValue: '',
|
||||||
|
inputUI: {
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
tooltip:
|
||||||
|
`Specify the language tags order, separated by commas. Leave blank to disable.
|
||||||
|
\\nExample:\\n
|
||||||
|
eng,fre
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'channels',
|
||||||
|
type: 'string',
|
||||||
|
defaultValue: '',
|
||||||
|
inputUI: {
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
tooltip:
|
||||||
|
`Specify the channels order, separated by commas. Leave blank to disable.
|
||||||
|
|
||||||
|
\\nExample:\\n
|
||||||
|
7.1,5.1,2,1`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'codecs',
|
||||||
|
type: 'string',
|
||||||
|
defaultValue: '',
|
||||||
|
inputUI: {
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
tooltip:
|
||||||
|
`Specify the codec order, separated by commas. Leave blank to disable.
|
||||||
|
|
||||||
|
\\nExample:\\n
|
||||||
|
aac,ac3`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'streamTypes',
|
||||||
|
type: 'string',
|
||||||
|
defaultValue: 'video,audio,subtitle',
|
||||||
|
inputUI: {
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
tooltip:
|
||||||
|
`Specify the streamTypes order, separated by commas. Leave blank to disable.
|
||||||
|
\\nExample:\\n
|
||||||
|
video,audio,subtitle
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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,
|
||||||
|
infoLog: '',
|
||||||
|
};
|
||||||
|
|
||||||
|
let { streams } = file.ffProbeData;
|
||||||
|
|
||||||
|
streams.forEach((stream, index) => {
|
||||||
|
// eslint-disable-next-line no-param-reassign
|
||||||
|
stream.typeIndex = index;
|
||||||
|
});
|
||||||
|
|
||||||
|
const originalStreams = JSON.stringify(streams);
|
||||||
|
|
||||||
|
const sortStreams = (sortType) => {
|
||||||
|
const items = sortType.inputs.split(',');
|
||||||
|
items.reverse();
|
||||||
|
for (let i = 0; i < items.length; i += 1) {
|
||||||
|
const matchedStreams = [];
|
||||||
|
for (let j = 0; j < streams.length; j += 1) {
|
||||||
|
if (String(sortType.getValue(streams[j])).includes(String(items[i]))) {
|
||||||
|
matchedStreams.push(streams[j]);
|
||||||
|
streams.splice(j, 1);
|
||||||
|
j -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
streams = matchedStreams.concat(streams);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let {
|
||||||
|
processOrder,
|
||||||
|
} = inputs;
|
||||||
|
|
||||||
|
const {
|
||||||
|
languages, codecs, channels, streamTypes,
|
||||||
|
} = inputs;
|
||||||
|
|
||||||
|
const sortTypes = {
|
||||||
|
languages: {
|
||||||
|
getValue: (stream) => {
|
||||||
|
try {
|
||||||
|
return stream.tags.language;
|
||||||
|
} catch (err) {
|
||||||
|
// err
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
inputs: languages,
|
||||||
|
},
|
||||||
|
codecs: {
|
||||||
|
getValue: (stream) => {
|
||||||
|
try {
|
||||||
|
return stream.codec_name;
|
||||||
|
} catch (err) {
|
||||||
|
// err
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
inputs: codecs,
|
||||||
|
},
|
||||||
|
channels: {
|
||||||
|
getValue: (stream) => {
|
||||||
|
const chanMap = {
|
||||||
|
8: '7.1',
|
||||||
|
6: '5.1',
|
||||||
|
2: '2',
|
||||||
|
1: '1',
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
if (chanMap[stream.channels]) {
|
||||||
|
return chanMap[stream.channels];
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
// err
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
inputs: channels,
|
||||||
|
},
|
||||||
|
streamTypes: {
|
||||||
|
getValue: (stream) => {
|
||||||
|
try {
|
||||||
|
return stream.codec_type;
|
||||||
|
} catch (err) {
|
||||||
|
// err
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
inputs: streamTypes,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
processOrder = processOrder.split(',');
|
||||||
|
|
||||||
|
for (let k = 0; k < processOrder.length; k += 1) {
|
||||||
|
if (sortTypes[processOrder[k]] && sortTypes[processOrder[k]].inputs) {
|
||||||
|
sortStreams(sortTypes[processOrder[k]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JSON.stringify(streams) !== originalStreams) {
|
||||||
|
response.infoLog += 'Streams are not in the correct order!';
|
||||||
|
response.processFile = true;
|
||||||
|
let command = '<io> -c copy';
|
||||||
|
|
||||||
|
for (let l = 0; l < streams.length; l += 1) {
|
||||||
|
command += ` -map 0:${streams[l].typeIndex}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
response.preset = command;
|
||||||
|
} else {
|
||||||
|
response.infoLog += 'Streams are in the correct order!';
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.details = details;
|
||||||
|
module.exports.plugin = plugin;
|
||||||
Loading…
Reference in new issue