From 724dcd9502d163fe4d0dbb4d5be3f0b4291d5953 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Mon, 27 Nov 2023 07:01:07 +0000 Subject: [PATCH 1/4] Add Copy/Move Folder Content --- .../file/copyMoveFolderContent/1.0.0/index.js | 266 ++++++++++++++++++ .../file/copyMoveFolderContent/1.0.0/index.ts | 234 +++++++++++++++ 2 files changed, 500 insertions(+) create mode 100644 FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js create mode 100644 FlowPluginsTs/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.ts diff --git a/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js new file mode 100644 index 0000000..495f084 --- /dev/null +++ b/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js @@ -0,0 +1,266 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.plugin = exports.details = void 0; +var fs_1 = require("fs"); +var fileUtils_1 = require("../../../../FlowHelpers/1.0.0/fileUtils"); +var normJoinPath_1 = __importDefault(require("../../../../FlowHelpers/1.0.0/normJoinPath")); +var fileMoveOrCopy_1 = __importDefault(require("../../../../FlowHelpers/1.0.0/fileMoveOrCopy")); +/* eslint no-plusplus: ["error", { "allowForLoopAfterthoughts": true }] */ +var details = function () { return ({ + name: 'Copy/Move Folder Content', + description: "Copy or move folder content to another folder. \nDoes not apply to the current file being processed (either the original or working file).\nUseful if, for example, you want to move things like subtitle files or cover art to a new folder.", + style: { + borderColor: 'green', + }, + tags: '', + isStartPlugin: false, + pType: '', + requiresVersion: '2.11.01', + sidebarPosition: -1, + icon: 'faArrowRight', + inputs: [ + { + label: 'Source Directory', + name: 'sourceDirectory', + type: 'string', + defaultValue: 'original', + inputUI: { + type: 'dropdown', + options: [ + 'originalDirectory', + 'workingDirectory', + ], + }, + tooltip: 'Specify the source location of where files will be copied/moved from', + }, + { + label: 'Copy or Move', + name: 'copyOrMove', + type: 'string', + defaultValue: 'original', + inputUI: { + type: 'dropdown', + options: [ + 'copy', + 'move', + ], + }, + tooltip: 'Specify whether to copy or move the files', + }, + { + label: 'Output Directory', + name: 'outputDirectory', + type: 'string', + defaultValue: '', + inputUI: { + type: 'directory', + }, + tooltip: 'Specify ouput directory', + }, + { + label: 'Keep Relative Path', + name: 'keepRelativePath', + type: 'boolean', + defaultValue: 'true', + inputUI: { + type: 'dropdown', + options: [ + 'false', + 'true', + ], + }, + tooltip: "Specify whether to keep the relative path", + }, + { + label: 'All Files?', + name: 'allFiles', + type: 'boolean', + defaultValue: 'false', + inputUI: { + type: 'dropdown', + options: [ + 'false', + 'true', + ], + }, + tooltip: 'Specify whether to copy/move all files in the directory (excluding the original and working file)', + }, + { + label: 'File Extensions', + name: 'fileExtensions', + type: 'string', + defaultValue: 'srt,ass', + inputUI: { + type: 'text', + displayConditions: { + logic: 'AND', + sets: [ + { + logic: 'AND', + inputs: [ + { + name: 'allFiles', + value: 'false', + condition: '===', + }, + ], + }, + ], + }, + }, + tooltip: 'Specify a comma separated list of file extensions to copy/move', + }, + ], + outputs: [ + { + number: 1, + tooltip: 'Continue to next plugin', + }, + ], +}); }; +exports.details = details; +var doOperation = function (_a) { + var args = _a.args, sourcePath = _a.sourcePath, destinationPath = _a.destinationPath, operation = _a.operation; + return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + args.jobLog("Input path: ".concat(sourcePath)); + args.jobLog("Output path: ".concat(destinationPath)); + if (!(sourcePath === destinationPath)) return [3 /*break*/, 1]; + args.jobLog("Input and output path are the same, skipping ".concat(operation)); + return [3 /*break*/, 3]; + case 1: + args.deps.fsextra.ensureDirSync((0, fileUtils_1.getFileAbosluteDir)(destinationPath)); + return [4 /*yield*/, (0, fileMoveOrCopy_1.default)({ + operation: operation, + sourcePath: sourcePath, + destinationPath: destinationPath, + args: args, + })]; + case 2: + _b.sent(); + _b.label = 3; + case 3: return [2 /*return*/]; + } + }); + }); +}; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function () { + var lib, _a, keepRelativePath, allFiles, sourceDirectory, outputDirectory, copyOrMove, fileExtensions, outputPath, subStem, sourceDir, filesInDir, i; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + lib = require('../../../../../methods/lib')(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars,no-param-reassign + args.inputs = lib.loadDefaultValues(args.inputs, details); + _a = args.inputs, keepRelativePath = _a.keepRelativePath, allFiles = _a.allFiles; + sourceDirectory = String(args.inputs.sourceDirectory); + outputDirectory = String(args.inputs.outputDirectory); + copyOrMove = String(args.inputs.copyOrMove); + fileExtensions = String(args.inputs.fileExtensions).split(',').map(function (row) { return row.trim(); }); + outputPath = ''; + if (keepRelativePath) { + subStem = (0, fileUtils_1.getSubStem)({ + inputPathStem: args.librarySettings.folder, + inputPath: args.originalLibraryFile._id, + }); + outputPath = (0, normJoinPath_1.default)({ + upath: args.deps.upath, + paths: [ + outputDirectory, + subStem, + ], + }); + } + else { + outputPath = outputDirectory; + } + sourceDir = (0, fileUtils_1.getFileAbosluteDir)(args.originalLibraryFile._id); + if (sourceDirectory === 'workingDirectory') { + sourceDir = (0, fileUtils_1.getFileAbosluteDir)(args.inputFileObj._id); + } + return [4 /*yield*/, fs_1.promises.readdir(sourceDir)]; + case 1: + filesInDir = (_b.sent()) + .map(function (row) { return ({ + source: "".concat(sourceDir, "/").concat(row), + destination: (0, normJoinPath_1.default)({ + upath: args.deps.upath, + paths: [ + outputPath, + row, + ], + }), + }); }) + .filter(function (row) { return row.source !== args.originalLibraryFile._id && row.source !== args.inputFileObj._id; }); + if (!allFiles) { + filesInDir = filesInDir.filter(function (row) { return fileExtensions.includes((0, fileUtils_1.getContainer)(row.source)); }); + } + i = 0; + _b.label = 2; + case 2: + if (!(i < filesInDir.length)) return [3 /*break*/, 5]; + // eslint-disable-next-line no-await-in-loop + return [4 /*yield*/, doOperation({ + args: args, + sourcePath: filesInDir[i].source, + destinationPath: filesInDir[i].destination, + operation: copyOrMove, + })]; + case 3: + // eslint-disable-next-line no-await-in-loop + _b.sent(); + _b.label = 4; + case 4: + i += 1; + return [3 /*break*/, 2]; + case 5: return [2 /*return*/, { + outputFileObj: args.inputFileObj, + outputNumber: 1, + variables: args.variables, + }]; + } + }); +}); }; +exports.plugin = plugin; diff --git a/FlowPluginsTs/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.ts b/FlowPluginsTs/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.ts new file mode 100644 index 0000000..45c7de8 --- /dev/null +++ b/FlowPluginsTs/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.ts @@ -0,0 +1,234 @@ +import { promises as fs } from 'fs'; +import { + getContainer, getFileAbosluteDir, getSubStem, +} from '../../../../FlowHelpers/1.0.0/fileUtils'; +import { + IpluginDetails, + IpluginInputArgs, + IpluginOutputArgs, +} from '../../../../FlowHelpers/1.0.0/interfaces/interfaces'; +import normJoinPath from '../../../../FlowHelpers/1.0.0/normJoinPath'; +import fileMoveOrCopy from '../../../../FlowHelpers/1.0.0/fileMoveOrCopy'; + +/* eslint no-plusplus: ["error", { "allowForLoopAfterthoughts": true }] */ +const details = (): IpluginDetails => ({ + name: 'Copy/Move Folder Content', + description: `Copy or move folder content to another folder. +Does not apply to the current file being processed (either the original or working file). +Useful if, for example, you want to move things like subtitle files or cover art to a new folder.`, + style: { + borderColor: 'green', + }, + tags: '', + isStartPlugin: false, + pType: '', + requiresVersion: '2.11.01', + sidebarPosition: -1, + icon: 'faArrowRight', + inputs: [ + { + label: 'Source Directory', + name: 'sourceDirectory', + type: 'string', + defaultValue: 'original', + inputUI: { + type: 'dropdown', + options: [ + 'originalDirectory', + 'workingDirectory', + ], + }, + tooltip: 'Specify the source location of where files will be copied/moved from', + }, + { + label: 'Copy or Move', + name: 'copyOrMove', + type: 'string', + defaultValue: 'original', + inputUI: { + type: 'dropdown', + options: [ + 'copy', + 'move', + ], + }, + tooltip: 'Specify whether to copy or move the files', + }, + { + label: 'Output Directory', + name: 'outputDirectory', + type: 'string', + defaultValue: '', + inputUI: { + type: 'directory', + }, + tooltip: 'Specify ouput directory', + }, + { + label: 'Keep Relative Path', + name: 'keepRelativePath', + type: 'boolean', + defaultValue: 'true', + inputUI: { + type: 'dropdown', + options: [ + 'false', + 'true', + ], + }, + tooltip: 'Specify whether to keep the relative path', + }, + { + label: 'All Files?', + name: 'allFiles', + type: 'boolean', + defaultValue: 'false', + inputUI: { + type: 'dropdown', + options: [ + 'false', + 'true', + ], + }, + tooltip: 'Specify whether to copy/move all files in the directory (excluding the original and working file)', + }, + { + label: 'File Extensions', + name: 'fileExtensions', + type: 'string', + defaultValue: 'srt,ass', + inputUI: { + type: 'text', + displayConditions: { + logic: 'AND', + sets: [ + { + logic: 'AND', + inputs: [ + { + name: 'allFiles', + value: 'false', + condition: '===', + }, + ], + }, + ], + }, + }, + tooltip: 'Specify a comma separated list of file extensions to copy/move', + }, + ], + outputs: [ + { + number: 1, + tooltip: 'Continue to next plugin', + }, + ], +}); + +const doOperation = async ({ + args, + sourcePath, + destinationPath, + operation, +}:{ + args: IpluginInputArgs, + sourcePath:string, + destinationPath:string, + operation: 'copy' | 'move', +}) => { + args.jobLog(`Input path: ${sourcePath}`); + args.jobLog(`Output path: ${destinationPath}`); + + if (sourcePath === destinationPath) { + args.jobLog(`Input and output path are the same, skipping ${operation}`); + } else { + args.deps.fsextra.ensureDirSync(getFileAbosluteDir(destinationPath)); + + await fileMoveOrCopy({ + operation, + sourcePath, + destinationPath, + args, + }); + } +}; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +const plugin = async (args: IpluginInputArgs): Promise => { + const lib = require('../../../../../methods/lib')(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars,no-param-reassign + args.inputs = lib.loadDefaultValues(args.inputs, details); + + const { + keepRelativePath, + allFiles, + } = args.inputs; + + const sourceDirectory = String(args.inputs.sourceDirectory); + const outputDirectory = String(args.inputs.outputDirectory); + const copyOrMove = String(args.inputs.copyOrMove); + const fileExtensions = String(args.inputs.fileExtensions).split(',').map((row) => row.trim()); + + let outputPath = ''; + + if (keepRelativePath) { + const subStem = getSubStem({ + inputPathStem: args.librarySettings.folder, + inputPath: args.originalLibraryFile._id, + }); + + outputPath = normJoinPath({ + upath: args.deps.upath, + paths: [ + outputDirectory, + subStem, + ], + }); + } else { + outputPath = outputDirectory; + } + + let sourceDir = getFileAbosluteDir(args.originalLibraryFile._id); + + if (sourceDirectory === 'workingDirectory') { + sourceDir = getFileAbosluteDir(args.inputFileObj._id); + } + + let filesInDir = (await fs.readdir(sourceDir)) + .map((row) => ({ + source: `${sourceDir}/${row}`, + destination: normJoinPath({ + upath: args.deps.upath, + paths: [ + outputPath, + row, + ], + }), + })) + .filter((row) => row.source !== args.originalLibraryFile._id && row.source !== args.inputFileObj._id); + + if (!allFiles) { + filesInDir = filesInDir.filter((row) => fileExtensions.includes(getContainer(row.source))); + } + + for (let i = 0; i < filesInDir.length; i += 1) { + // eslint-disable-next-line no-await-in-loop + await doOperation({ + args, + sourcePath: filesInDir[i].source, + destinationPath: filesInDir[i].destination, + operation: copyOrMove as 'copy' | 'move', + }); + } + + return { + outputFileObj: args.inputFileObj, + outputNumber: 1, + variables: args.variables, + }; +}; +export { + details, + plugin, +}; From 2e9d4e68a8bf6abbab394c271c9d488b6e1ffcd9 Mon Sep 17 00:00:00 2001 From: HaveAGitGat Date: Mon, 27 Nov 2023 07:03:10 +0000 Subject: [PATCH 2/4] Apply auto-build changes --- .../file/copyMoveFolderContent/1.0.0/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js index 495f084..63988a1 100644 --- a/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js @@ -108,7 +108,7 @@ var details = function () { return ({ 'true', ], }, - tooltip: "Specify whether to keep the relative path", + tooltip: 'Specify whether to keep the relative path', }, { label: 'All Files?', From 778892ba1662d7107b4ae72632c776fd1596c06a Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Mon, 27 Nov 2023 07:03:23 +0000 Subject: [PATCH 3/4] Fix defaults --- .../file/copyMoveFolderContent/1.0.0/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FlowPluginsTs/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.ts b/FlowPluginsTs/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.ts index 45c7de8..5463d7b 100644 --- a/FlowPluginsTs/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.ts +++ b/FlowPluginsTs/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.ts @@ -30,7 +30,7 @@ Useful if, for example, you want to move things like subtitle files or cover art label: 'Source Directory', name: 'sourceDirectory', type: 'string', - defaultValue: 'original', + defaultValue: 'originalDirectory', inputUI: { type: 'dropdown', options: [ @@ -44,7 +44,7 @@ Useful if, for example, you want to move things like subtitle files or cover art label: 'Copy or Move', name: 'copyOrMove', type: 'string', - defaultValue: 'original', + defaultValue: 'copy', inputUI: { type: 'dropdown', options: [ From 7d51df9e9f2be330f6f27aa49dde71b60957fa20 Mon Sep 17 00:00:00 2001 From: HaveAGitGat Date: Mon, 27 Nov 2023 07:06:14 +0000 Subject: [PATCH 4/4] Apply auto-build changes --- .../file/copyMoveFolderContent/1.0.0/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js index 63988a1..64593dc 100644 --- a/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/file/copyMoveFolderContent/1.0.0/index.js @@ -62,7 +62,7 @@ var details = function () { return ({ label: 'Source Directory', name: 'sourceDirectory', type: 'string', - defaultValue: 'original', + defaultValue: 'originalDirectory', inputUI: { type: 'dropdown', options: [ @@ -76,7 +76,7 @@ var details = function () { return ({ label: 'Copy or Move', name: 'copyOrMove', type: 'string', - defaultValue: 'original', + defaultValue: 'copy', inputUI: { type: 'dropdown', options: [