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.
Tdarr_Plugins/Community/Tdarr_Plugin_z80t_keep_orig...

161 lines
4.7 KiB

module.exports.dependencies = [
'axios',
'path-extra',
'touch',
];
// tdarrSkipTest
const details = () => ({
id: 'Tdarr_Plugin_z80t_keep_original_date',
Stage: 'Post-processing',
Name: 'Keep original file dates and times after transcoding',
Type: 'Video',
Operation: 'Transcode',
Description: 'This plugin copies the original file dates and times to the transcoded file \n\n',
Version: '1.10',
Tags: 'post-processing,dates,date',
Inputs: [{
name: 'server',
type: 'string',
defaultValue: '192.168.1.100',
inputUI: {
type: 'text',
},
tooltip: `IP address or hostname of the server assigned to this node, will be used for API requests.
If you are running nodes within Docker you should use the server IP address rather than the name.
\\nExample:\\n
tdarrserver
\\nExample:\\n
192.168.1.100`,
}, {
name: 'extensions',
type: 'string',
defaultValue: '',
inputUI: {
type: 'text',
},
tooltip: `When files are trans-coded the file extension may change,
enter a list of extensions to try and match the original file with in the database after trans-coding.
Default is the list of container types from library settings. The list will be searched in order and
the extension of the original file will always be checked first before the list is used.
\\nExample:\\n
mkv,mp4,avi`,
},
{
name: 'log',
type: 'boolean',
defaultValue: false,
inputUI: {
type: 'dropdown',
options: [
'false',
'true',
],
},
tooltip: `Write log entries to console.log. Default is false.
\\nExample:\\n
true`,
},
],
});
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const plugin = async (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);
// eslint-disable-next-line import/no-unresolved
const axios = require('axios');
// eslint-disable-next-line import/no-unresolved
const touch = require('touch');
// eslint-disable-next-line import/no-unresolved
const path = require('path-extra');
const log = (msg) => {
if (inputs.log === true) {
// eslint-disable-next-line no-console
console.log(msg);
}
};
const getFileData = async (filePath, extensions, server) => {
const originalExtension = path.extname(filePath).split('.')[1];
if (extensions.indexOf(originalExtension) > -1) {
extensions.splice(extensions.indexOf(originalExtension), 1);
}
extensions.unshift(originalExtension);
let httpResponse = null;
for (let i = 0; i < extensions.length; i += 1) {
const fileName = path.replaceExt(filePath, `.${extensions[i]}`);
log(`Fetching file object for ${fileName}...`);
// eslint-disable-next-line no-await-in-loop
httpResponse = await axios.post(`http://${server}:8265/api/v2/search-db`, {
data: {
string: fileName,
lessThanGB: 10000,
greaterThanGB: 0,
},
});
if (httpResponse.status === 200) {
if (httpResponse.data.length > 0) {
log(`Got response for ${fileName}`);
return httpResponse;
}
log(`Response for ${fileName} is empty`);
} else {
log(`API request for ${filePath} failed.`);
}
}
log('Could not get file info from API, giving up.');
return httpResponse;
};
const responseData = {
file,
removeFromDB: false,
updateDB: false,
infoLog: '',
};
try {
if (!inputs.server || inputs.server.trim() === '') {
responseData.infoLog += 'Tdarr server name/IP not configured in library transcode options\n';
return responseData;
}
log('Waiting 5 seconds...');
let { extensions } = inputs;
if (!extensions || extensions.trim() === '') {
extensions = librarySettings.containerFilter;
}
extensions = extensions.split(',');
await new Promise((resolve) => setTimeout(resolve, 5000));
const response = await getFileData(file._id, extensions, inputs.server);
if (response.data.length > 0) {
log('Changing date...');
touch.sync(file._id, { time: Date.parse(response.data[0].statSync.mtime), force: true });
log('Done.');
responseData.infoLog += 'File timestamps updated or match original file\n';
return responseData;
}
responseData.infoLog += `Could not find file using API using ${inputs.server}\n`;
return responseData;
} catch (err) {
log(err);
}
return responseData;
};
module.exports.details = details;
module.exports.plugin = plugin;