aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/assistant/Ops.js
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/assistant/Ops.js')
-rw-r--r--desktop/assistant/Ops.js53
1 files changed, 53 insertions, 0 deletions
diff --git a/desktop/assistant/Ops.js b/desktop/assistant/Ops.js
new file mode 100644
index 0000000..e59560d
--- /dev/null
+++ b/desktop/assistant/Ops.js
@@ -0,0 +1,53 @@
+// Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+.pragma library
+
+// The file state's Do row. op is a fileops operation, or "md" for the
+// daemon's write, or "compress", which opens the COMPRESS formats. kinds
+// lists the staged kinds it fits ("any" fits every mix); min is the number
+// of files it needs; format is the suffix a file already has when the
+// operation would not change it.
+const OPS = [
+ { label: "To .md", op: "md", kinds: ["pdf"] },
+ { label: "To images", op: "pdf-images", kinds: ["pdf"] },
+ { label: "Merge", op: "pdf-merge", kinds: ["pdf"], min: 2 },
+ { label: "Extract audio", op: "audio", kinds: ["video"] },
+ { label: "To MP4", op: "mp4", kinds: ["video"], format: [".mp4"] },
+ { label: "To WebM", op: "webm", kinds: ["video"], format: [".webm"] },
+ { label: "To GIF", op: "gif", kinds: ["video"] },
+ { label: "Trackcrop", op: "trackcrop", kinds: ["video"] },
+ { label: "To PNG", op: "png", kinds: ["image"], format: [".png"] },
+ { label: "To JPEG", op: "jpeg", kinds: ["image"], format: [".jpg", ".jpeg"] },
+ { label: "To WebP", op: "webp", kinds: ["image"], format: [".webp"] },
+ { label: "Resize 50%", op: "half", kinds: ["image"] },
+ { label: "Extract", op: "extract", kinds: ["archive"] },
+ { label: "Compress…", op: "compress", kinds: ["any"] },
+];
+
+const COMPRESS = [
+ { label: ".zip", op: "zip" },
+ { label: ".tar.gz", op: "tgz" },
+ { label: ".tar.xz", op: "txz" },
+ { label: ".tar.bz2", op: "tbz2" },
+];
+
+function ext(name) {
+ const n = name.toLowerCase(), dot = n.lastIndexOf(".");
+ return dot > 0 ? n.slice(dot) : "";
+}
+
+function offered(files) {
+ if (!files.length) return [];
+ return OPS.filter(o => (o.kinds.includes("any") || files.every(f => o.kinds.includes(f.kind)))
+ && files.length >= (o.min ?? 1)
+ && !(o.format && files.every(f => o.format.includes(ext(f.name)))));
+}