From 20562ef46989e3e13c94789c8a754b427964f983 Mon Sep 17 00:00:00 2001 From: babayaga Date: Tue, 12 Aug 2025 09:11:29 +0200 Subject: [PATCH] kbot salamand --- packages/ai-tools/dist/types_kbot.d.ts | 25 +- packages/ai-tools/src/types_kbot.ts | 25 +- .../commons/src/schemas/media.code-workspace | 14 + .../kbot/dist-in/commands/run-completion.js | 5 +- packages/kbot/dist-in/zod_schema.js | 5 +- packages/kbot/dist-in/zod_types.d.ts | 25 +- packages/kbot/package.json | 1 + packages/kbot/salamand.json | 8 + packages/kbot/schema.json | 7 +- packages/kbot/schema_ui.json | 7 +- packages/kbot/src/commands/run-completion.ts | 3 +- packages/kbot/src/zod_schema.ts | 6 + packages/kbot/src/zod_types.ts | 25 +- packages/media/commands/audio.js | 36 - .../commands/common/sanitize-filename.d.ts | 10 - .../commands/common/sanitize-filename.js | 69 - .../commands/common/sanitize-filename.js.map | 1 - packages/media/commands/convert.js | 42 - packages/media/commands/pdf2jpg.d.ts | 1 - packages/media/commands/pdf2jpg.js | 53 - packages/media/commands/pdf2jpg.js.map | 1 - packages/media/commands/resize.d.ts | 2 - packages/media/commands/resize.js | 71 - packages/media/commands/svg2jpg.js | 49 - packages/media/commands/svg2jpg.js.map | 1 - packages/media/commands/video.d.ts | 2 - packages/media/commands/video.js | 39 - packages/media/commands/watermark.d.ts | 2 - packages/media/commands/watermark.js | 75 - packages/media/dist-in/commands/audio.d.ts | 4 +- packages/media/dist-in/commands/audio.js | 28 +- .../commands/background-remove-bria.d.ts | 4 +- .../commands/background-remove-bria.js | 81 +- .../dist-in/commands/background-remove.d.ts | 4 +- .../dist-in/commands/background-remove.js | 80 +- packages/media/dist-in/commands/convert.js | 8 +- .../dist-in/commands/crop-foreground.d.ts | 4 +- .../media/dist-in/commands/crop-foreground.js | 72 +- packages/media/dist-in/commands/pdf2jpg.d.ts | 2 +- packages/media/dist-in/commands/pdf2jpg.js | 60 +- packages/media/dist-in/commands/resize.js | 256 +- packages/media/dist-in/commands/schemas.d.ts | 5 + packages/media/dist-in/commands/schemas.js | 49 + .../commands/thumbs.d.ts} | 5 +- packages/media/dist-in/commands/thumbs.js | 68 + packages/media/dist-in/commands/video.js | 8 +- .../commands/watermark-rm.d.ts} | 5 +- .../media/dist-in/commands/watermark-rm.js | 70 + .../media/dist-in/commands/watermark.d.ts | 4 +- packages/media/dist-in/commands/watermark.js | 93 +- packages/media/dist-in/lib/fs/index.d.ts | 8 + packages/media/dist-in/lib/fs/index.js | 33 + .../dist-in/lib/media/audio/convert.d.ts | 26 +- .../media/dist-in/lib/media/audio/convert.js | 205 +- packages/media/dist-in/lib/media/ffmpeg.d.ts | 4 +- packages/media/dist-in/lib/media/ffmpeg.js | 38 +- .../media/images/background-remove-bria.d.ts | 3 + .../media/images/background-remove-bria.js | 67 +- .../lib/media/images/background-remove.d.ts | 3 + .../lib/media/images/background-remove.js | 76 +- .../lib/media/images/crop-foreground.d.ts | 3 + .../lib/media/images/crop-foreground.js | 61 +- .../media/dist-in/lib/media/images/index.d.ts | 1 - .../media/dist-in/lib/media/images/index.js | 4 +- .../dist-in/lib/media/images/resize.d.ts | 3 + .../media/dist-in/lib/media/images/resize.js | 106 +- .../dist-in/lib/media/images/watermark.d.ts | 3 + .../dist-in/lib/media/images/watermark.js | 94 +- .../dist-in/lib/media/video/convert.d.ts | 46 +- .../media/dist-in/lib/media/video/convert.js | 273 +- .../media/dist-in/lib/media/video/index.d.ts | 266 +- .../media/dist-in/lib/media/video/index.js | 153 +- .../media/dist-in/lib/media/video/lib.d.ts | 1 + packages/media/dist-in/lib/media/video/lib.js | 2 + .../media/dist-in/lib/media/video/merge.d.ts | 14 + .../media/dist-in/lib/media/video/merge.js | 98 + .../media/dist-in/lib/media/video/resize.d.ts | 12 +- .../media/dist-in/lib/media/video/resize.js | 336 +- packages/media/dist-in/lib/pdf/convert.d.ts | 8 +- packages/media/dist-in/lib/pdf/convert.js | 57 +- packages/media/dist-in/lib/pdf/split.d.ts | 1 + packages/media/dist-in/lib/pdf/split.js | 2 + packages/media/dist-in/lib/ui/electron.d.ts | 16 + packages/media/dist-in/lib/ui/electron.js | 55 + .../media/dist-in/lib/ui/electron/main.d.ts | 1 + .../media/dist-in/lib/ui/electron/main.js | 182 + .../dist-in/lib/ui/electron/preload.d.ts | 1 + .../media/dist-in/lib/ui/electron/preload.js | 56 + .../dist-in/lib/ui/electron/renderer.d.ts | 1 + .../media/dist-in/lib/ui/electron/renderer.js | 6 + packages/media/dist-in/lib/ui/types.d.ts | 12 + packages/media/dist-in/lib/ui/types.js | 2 + packages/media/dist-in/main.d.ts | 1 + packages/media/dist-in/main.js | 3 +- .../ref/chatgpt-ex.d.ts} | 3 +- packages/media/dist-in/ref/chatgpt-ex.js | 181 + packages/media/dist-in/ref/query.d.ts | 11 + packages/media/dist-in/ref/query.js | 272 + packages/media/dist-in/types.d.ts | 1 + .../dist-in/zod_types_background_remove.d.ts | 28 + .../dist-in/zod_types_background_remove.js | 2 + .../zod_types_background_remove_bria.d.ts | 28 + .../zod_types_background_remove_bria.js | 2 + .../dist-in/zod_types_crop_foreground.d.ts | 24 + .../dist-in/zod_types_crop_foreground.js | 2 + packages/media/dist-in/zod_types_pdf2jpg.d.ts | 16 + packages/media/dist-in/zod_types_pdf2jpg.js | 2 + packages/media/dist-in/zod_types_resize.d.ts | 51 + packages/media/dist-in/zod_types_resize.js | 2 + .../media/dist-in/zod_types_watermark.d.ts | 38 + packages/media/dist-in/zod_types_watermark.js | 2 + packages/media/docs/ui.md | 376 ++ packages/media/media.code-workspace | 11 + packages/media/output/image_1.png | 1 - packages/media/output/image_2.png | 1 - packages/media/output/image_3.png | 1 - packages/media/output/image_4.png | 1 - packages/media/output/image_5.png | 1 - packages/media/package-lock.json | 1032 +++- packages/media/package.json | 2 + .../media/schema_ui_background_remove.json | 72 + .../schema_ui_background_remove_bria.json | 72 + packages/media/schema_ui_crop_foreground.json | 62 + packages/media/schema_ui_pdf2jpg.json | 41 + packages/media/schema_ui_resize.json | 108 + packages/media/schema_ui_watermark.json | 97 + packages/media/schemas_background_remove.json | 93 + .../media/schemas_background_remove_bria.json | 87 + packages/media/schemas_crop_foreground.json | 77 + packages/media/schemas_pdf2jpg.json | 58 + packages/media/schemas_resize.json | 182 + packages/media/schemas_watermark.json | 130 + .../src/commands/background-remove-bria.ts | 80 +- .../media/src/commands/background-remove.ts | 82 +- .../media/src/commands/crop-foreground.ts | 71 +- packages/media/src/commands/pdf2jpg.ts | 60 +- packages/media/src/commands/resize.ts | 311 +- packages/media/src/commands/schemas.ts | 60 + packages/media/src/commands/watermark.ts | 92 +- .../media/images/background-remove-bria.ts | 110 + .../src/lib/media/images/background-remove.ts | 119 + .../src/lib/media/images/crop-foreground.ts | 98 + packages/media/src/lib/media/images/index.ts | 2 +- packages/media/src/lib/media/images/resize.ts | 562 +- .../media/src/lib/media/images/watermark.ts | 152 + packages/media/src/lib/pdf/convert.ts | 88 +- packages/media/src/lib/salamander/index.ts | 1002 ++-- packages/media/src/lib/ui/electron.ts | 93 + packages/media/src/lib/ui/electron/main.ts | 198 + packages/media/src/lib/ui/electron/preload.ts | 60 + .../media/src/lib/ui/electron/renderer.ts | 5 + packages/media/src/lib/ui/types.ts | 12 + packages/media/src/main.ts | 1 + packages/media/src/ref/config_sal_min.reg | 3453 ----------- packages/media/src/ref/min.reg | Bin 5484 -> 0 bytes packages/media/src/ref/sal_conf.reg | Bin 26740 -> 0 bytes packages/media/src/types.ts | 1 + .../media/src/zod_types_background_remove.ts | 28 + .../src/zod_types_background_remove_bria.ts | 28 + .../media/src/zod_types_crop_foreground.ts | 24 + packages/media/src/zod_types_pdf2jpg.ts | 16 + packages/media/src/zod_types_resize.ts | 51 + packages/media/src/zod_types_watermark.ts | 38 + packages/media/tests/barrel.jpg | Bin 0 -> 139613 bytes packages/media/tsconfig.json | 5 +- packages/media/web-ui/_prompt.html | 107 + .../media/web-ui/dist/assets/main-CXxoJTtt.js | 99 + .../web-ui/dist/assets/main-JagOhU99.css | 1 + packages/media/web-ui/dist/index.html | 15 + packages/media/web-ui/index.html | 14 + packages/media/web-ui/package-lock.json | 5268 +++++++++++++++++ packages/media/web-ui/package.json | 65 + packages/media/web-ui/postcss.config.js | 6 + packages/media/web-ui/prompt.html | 107 + packages/media/web-ui/src/App.tsx | 78 + .../src/components/FilePickerWidget.tsx | 204 + .../web-ui/src/components/SchemaForm.tsx | 163 + .../media/web-ui/src/components/ui/LedBar.tsx | 46 + .../web-ui/src/components/ui/accordion.tsx | 56 + .../web-ui/src/components/ui/alert-dialog.tsx | 139 + .../media/web-ui/src/components/ui/alert.tsx | 59 + .../web-ui/src/components/ui/aspect-ratio.tsx | 5 + .../media/web-ui/src/components/ui/avatar.tsx | 48 + .../media/web-ui/src/components/ui/badge.tsx | 36 + .../web-ui/src/components/ui/breadcrumb.tsx | 115 + .../media/web-ui/src/components/ui/button.tsx | 56 + .../media/web-ui/src/components/ui/card.tsx | 79 + .../web-ui/src/components/ui/checkbox.tsx | 28 + .../web-ui/src/components/ui/collapsible.tsx | 9 + .../web-ui/src/components/ui/command.tsx | 153 + .../web-ui/src/components/ui/context-menu.tsx | 198 + .../media/web-ui/src/components/ui/dialog.tsx | 120 + .../src/components/ui/dropdown-menu.tsx | 198 + .../media/web-ui/src/components/ui/form.tsx | 176 + .../web-ui/src/components/ui/hover-card.tsx | 27 + .../media/web-ui/src/components/ui/input.tsx | 22 + .../media/web-ui/src/components/ui/label.tsx | 24 + .../web-ui/src/components/ui/menubar.tsx | 234 + .../src/components/ui/multiple-selector.tsx | 292 + .../src/components/ui/navigation-menu.tsx | 128 + .../web-ui/src/components/ui/pagination.tsx | 117 + .../web-ui/src/components/ui/popover.tsx | 29 + .../web-ui/src/components/ui/progress.tsx | 26 + .../web-ui/src/components/ui/radio-group.tsx | 42 + .../web-ui/src/components/ui/resizable.tsx | 43 + .../web-ui/src/components/ui/scroll-area.tsx | 46 + .../media/web-ui/src/components/ui/select.tsx | 162 + .../web-ui/src/components/ui/separator.tsx | 29 + .../media/web-ui/src/components/ui/sheet.tsx | 131 + .../web-ui/src/components/ui/sidebar.tsx | 761 +++ .../web-ui/src/components/ui/skeleton.tsx | 15 + .../media/web-ui/src/components/ui/slider.tsx | 26 + .../media/web-ui/src/components/ui/sonner.tsx | 30 + .../media/web-ui/src/components/ui/switch.tsx | 27 + .../media/web-ui/src/components/ui/table.tsx | 117 + .../media/web-ui/src/components/ui/tabs.tsx | 53 + .../web-ui/src/components/ui/textarea.tsx | 24 + .../media/web-ui/src/components/ui/toast.tsx | 127 + .../web-ui/src/components/ui/toaster.tsx | 33 + .../web-ui/src/components/ui/toggle-group.tsx | 59 + .../media/web-ui/src/components/ui/toggle.tsx | 47 + .../web-ui/src/components/ui/tooltip.tsx | 28 + .../web-ui/src/components/ui/use-toast.ts | 3 + packages/media/web-ui/src/hooks/use-mobile.ts | 20 + packages/media/web-ui/src/hooks/use-toast.ts | 189 + packages/media/web-ui/src/index.css | 59 + packages/media/web-ui/src/lib/utils.ts | 6 + packages/media/web-ui/src/main.tsx | 10 + packages/media/web-ui/src/types/electron.d.ts | 20 + packages/media/web-ui/tailwind.config.js | 78 + packages/media/web-ui/tsconfig.json | 31 + packages/media/web-ui/tsconfig.node.json | 10 + packages/media/web-ui/vite.config.ts | 22 + 233 files changed, 18562 insertions(+), 6168 deletions(-) create mode 100644 packages/commons/src/schemas/media.code-workspace create mode 100644 packages/kbot/salamand.json delete mode 100644 packages/media/commands/audio.js delete mode 100644 packages/media/commands/common/sanitize-filename.d.ts delete mode 100644 packages/media/commands/common/sanitize-filename.js delete mode 100644 packages/media/commands/common/sanitize-filename.js.map delete mode 100644 packages/media/commands/convert.js delete mode 100644 packages/media/commands/pdf2jpg.d.ts delete mode 100644 packages/media/commands/pdf2jpg.js delete mode 100644 packages/media/commands/pdf2jpg.js.map delete mode 100644 packages/media/commands/resize.d.ts delete mode 100644 packages/media/commands/resize.js delete mode 100644 packages/media/commands/svg2jpg.js delete mode 100644 packages/media/commands/svg2jpg.js.map delete mode 100644 packages/media/commands/video.d.ts delete mode 100644 packages/media/commands/video.js delete mode 100644 packages/media/commands/watermark.d.ts delete mode 100644 packages/media/commands/watermark.js create mode 100644 packages/media/dist-in/commands/schemas.d.ts create mode 100644 packages/media/dist-in/commands/schemas.js rename packages/media/{commands/audio.d.ts => dist-in/commands/thumbs.d.ts} (79%) create mode 100644 packages/media/dist-in/commands/thumbs.js rename packages/media/{commands/convert.d.ts => dist-in/commands/watermark-rm.d.ts} (79%) create mode 100644 packages/media/dist-in/commands/watermark-rm.js create mode 100644 packages/media/dist-in/lib/fs/index.d.ts create mode 100644 packages/media/dist-in/lib/fs/index.js create mode 100644 packages/media/dist-in/lib/media/video/lib.d.ts create mode 100644 packages/media/dist-in/lib/media/video/lib.js create mode 100644 packages/media/dist-in/lib/media/video/merge.d.ts create mode 100644 packages/media/dist-in/lib/media/video/merge.js create mode 100644 packages/media/dist-in/lib/pdf/split.d.ts create mode 100644 packages/media/dist-in/lib/pdf/split.js create mode 100644 packages/media/dist-in/lib/ui/electron.d.ts create mode 100644 packages/media/dist-in/lib/ui/electron.js create mode 100644 packages/media/dist-in/lib/ui/electron/main.d.ts create mode 100644 packages/media/dist-in/lib/ui/electron/main.js create mode 100644 packages/media/dist-in/lib/ui/electron/preload.d.ts create mode 100644 packages/media/dist-in/lib/ui/electron/preload.js create mode 100644 packages/media/dist-in/lib/ui/electron/renderer.d.ts create mode 100644 packages/media/dist-in/lib/ui/electron/renderer.js create mode 100644 packages/media/dist-in/lib/ui/types.d.ts create mode 100644 packages/media/dist-in/lib/ui/types.js rename packages/media/{commands/svg2jpg.d.ts => dist-in/ref/chatgpt-ex.d.ts} (64%) create mode 100644 packages/media/dist-in/ref/chatgpt-ex.js create mode 100644 packages/media/dist-in/ref/query.d.ts create mode 100644 packages/media/dist-in/ref/query.js create mode 100644 packages/media/dist-in/zod_types_background_remove.d.ts create mode 100644 packages/media/dist-in/zod_types_background_remove.js create mode 100644 packages/media/dist-in/zod_types_background_remove_bria.d.ts create mode 100644 packages/media/dist-in/zod_types_background_remove_bria.js create mode 100644 packages/media/dist-in/zod_types_crop_foreground.d.ts create mode 100644 packages/media/dist-in/zod_types_crop_foreground.js create mode 100644 packages/media/dist-in/zod_types_pdf2jpg.d.ts create mode 100644 packages/media/dist-in/zod_types_pdf2jpg.js create mode 100644 packages/media/dist-in/zod_types_resize.d.ts create mode 100644 packages/media/dist-in/zod_types_resize.js create mode 100644 packages/media/dist-in/zod_types_watermark.d.ts create mode 100644 packages/media/dist-in/zod_types_watermark.js create mode 100644 packages/media/docs/ui.md create mode 100644 packages/media/media.code-workspace delete mode 100644 packages/media/output/image_1.png delete mode 100644 packages/media/output/image_2.png delete mode 100644 packages/media/output/image_3.png delete mode 100644 packages/media/output/image_4.png delete mode 100644 packages/media/output/image_5.png create mode 100644 packages/media/schema_ui_background_remove.json create mode 100644 packages/media/schema_ui_background_remove_bria.json create mode 100644 packages/media/schema_ui_crop_foreground.json create mode 100644 packages/media/schema_ui_pdf2jpg.json create mode 100644 packages/media/schema_ui_resize.json create mode 100644 packages/media/schema_ui_watermark.json create mode 100644 packages/media/schemas_background_remove.json create mode 100644 packages/media/schemas_background_remove_bria.json create mode 100644 packages/media/schemas_crop_foreground.json create mode 100644 packages/media/schemas_pdf2jpg.json create mode 100644 packages/media/schemas_resize.json create mode 100644 packages/media/schemas_watermark.json create mode 100644 packages/media/src/commands/schemas.ts create mode 100644 packages/media/src/lib/ui/electron.ts create mode 100644 packages/media/src/lib/ui/electron/main.ts create mode 100644 packages/media/src/lib/ui/electron/preload.ts create mode 100644 packages/media/src/lib/ui/electron/renderer.ts create mode 100644 packages/media/src/lib/ui/types.ts delete mode 100644 packages/media/src/ref/config_sal_min.reg delete mode 100644 packages/media/src/ref/min.reg delete mode 100644 packages/media/src/ref/sal_conf.reg create mode 100644 packages/media/src/zod_types_background_remove.ts create mode 100644 packages/media/src/zod_types_background_remove_bria.ts create mode 100644 packages/media/src/zod_types_crop_foreground.ts create mode 100644 packages/media/src/zod_types_pdf2jpg.ts create mode 100644 packages/media/src/zod_types_resize.ts create mode 100644 packages/media/src/zod_types_watermark.ts create mode 100644 packages/media/tests/barrel.jpg create mode 100644 packages/media/web-ui/_prompt.html create mode 100644 packages/media/web-ui/dist/assets/main-CXxoJTtt.js create mode 100644 packages/media/web-ui/dist/assets/main-JagOhU99.css create mode 100644 packages/media/web-ui/dist/index.html create mode 100644 packages/media/web-ui/index.html create mode 100644 packages/media/web-ui/package-lock.json create mode 100644 packages/media/web-ui/package.json create mode 100644 packages/media/web-ui/postcss.config.js create mode 100644 packages/media/web-ui/prompt.html create mode 100644 packages/media/web-ui/src/App.tsx create mode 100644 packages/media/web-ui/src/components/FilePickerWidget.tsx create mode 100644 packages/media/web-ui/src/components/SchemaForm.tsx create mode 100644 packages/media/web-ui/src/components/ui/LedBar.tsx create mode 100644 packages/media/web-ui/src/components/ui/accordion.tsx create mode 100644 packages/media/web-ui/src/components/ui/alert-dialog.tsx create mode 100644 packages/media/web-ui/src/components/ui/alert.tsx create mode 100644 packages/media/web-ui/src/components/ui/aspect-ratio.tsx create mode 100644 packages/media/web-ui/src/components/ui/avatar.tsx create mode 100644 packages/media/web-ui/src/components/ui/badge.tsx create mode 100644 packages/media/web-ui/src/components/ui/breadcrumb.tsx create mode 100644 packages/media/web-ui/src/components/ui/button.tsx create mode 100644 packages/media/web-ui/src/components/ui/card.tsx create mode 100644 packages/media/web-ui/src/components/ui/checkbox.tsx create mode 100644 packages/media/web-ui/src/components/ui/collapsible.tsx create mode 100644 packages/media/web-ui/src/components/ui/command.tsx create mode 100644 packages/media/web-ui/src/components/ui/context-menu.tsx create mode 100644 packages/media/web-ui/src/components/ui/dialog.tsx create mode 100644 packages/media/web-ui/src/components/ui/dropdown-menu.tsx create mode 100644 packages/media/web-ui/src/components/ui/form.tsx create mode 100644 packages/media/web-ui/src/components/ui/hover-card.tsx create mode 100644 packages/media/web-ui/src/components/ui/input.tsx create mode 100644 packages/media/web-ui/src/components/ui/label.tsx create mode 100644 packages/media/web-ui/src/components/ui/menubar.tsx create mode 100644 packages/media/web-ui/src/components/ui/multiple-selector.tsx create mode 100644 packages/media/web-ui/src/components/ui/navigation-menu.tsx create mode 100644 packages/media/web-ui/src/components/ui/pagination.tsx create mode 100644 packages/media/web-ui/src/components/ui/popover.tsx create mode 100644 packages/media/web-ui/src/components/ui/progress.tsx create mode 100644 packages/media/web-ui/src/components/ui/radio-group.tsx create mode 100644 packages/media/web-ui/src/components/ui/resizable.tsx create mode 100644 packages/media/web-ui/src/components/ui/scroll-area.tsx create mode 100644 packages/media/web-ui/src/components/ui/select.tsx create mode 100644 packages/media/web-ui/src/components/ui/separator.tsx create mode 100644 packages/media/web-ui/src/components/ui/sheet.tsx create mode 100644 packages/media/web-ui/src/components/ui/sidebar.tsx create mode 100644 packages/media/web-ui/src/components/ui/skeleton.tsx create mode 100644 packages/media/web-ui/src/components/ui/slider.tsx create mode 100644 packages/media/web-ui/src/components/ui/sonner.tsx create mode 100644 packages/media/web-ui/src/components/ui/switch.tsx create mode 100644 packages/media/web-ui/src/components/ui/table.tsx create mode 100644 packages/media/web-ui/src/components/ui/tabs.tsx create mode 100644 packages/media/web-ui/src/components/ui/textarea.tsx create mode 100644 packages/media/web-ui/src/components/ui/toast.tsx create mode 100644 packages/media/web-ui/src/components/ui/toaster.tsx create mode 100644 packages/media/web-ui/src/components/ui/toggle-group.tsx create mode 100644 packages/media/web-ui/src/components/ui/toggle.tsx create mode 100644 packages/media/web-ui/src/components/ui/tooltip.tsx create mode 100644 packages/media/web-ui/src/components/ui/use-toast.ts create mode 100644 packages/media/web-ui/src/hooks/use-mobile.ts create mode 100644 packages/media/web-ui/src/hooks/use-toast.ts create mode 100644 packages/media/web-ui/src/index.css create mode 100644 packages/media/web-ui/src/lib/utils.ts create mode 100644 packages/media/web-ui/src/main.tsx create mode 100644 packages/media/web-ui/src/types/electron.d.ts create mode 100644 packages/media/web-ui/tailwind.config.js create mode 100644 packages/media/web-ui/tsconfig.json create mode 100644 packages/media/web-ui/tsconfig.node.json create mode 100644 packages/media/web-ui/vite.config.ts diff --git a/packages/ai-tools/dist/types_kbot.d.ts b/packages/ai-tools/dist/types_kbot.d.ts index 0fe855a7..45665219 100644 --- a/packages/ai-tools/dist/types_kbot.d.ts +++ b/packages/ai-tools/dist/types_kbot.d.ts @@ -33,8 +33,6 @@ export interface IKBotOptions {  agentica-org/deepcoder-14b-preview | paid agentica-org/deepcoder-14b-preview:free | free - ai21/jamba-1.6-large | paid - ai21/jamba-1.6-mini | paid aion-labs/aion-1.0 | paid aion-labs/aion-1.0-mini | paid aion-labs/aion-rp-llama-3.1-8b | paid @@ -102,7 +100,6 @@ export interface IKBotOptions { cognitivecomputations/dolphin3.0-r1-mistral-24b | paid cognitivecomputations/dolphin3.0-r1-mistral-24b:free | free eleutherai/llemma_7b | paid - sao10k/fimbulvetr-11b-v2 | paid alpindale/goliath-120b | paid google/gemini-flash-1.5 | paid google/gemini-flash-1.5-8b | paid @@ -129,7 +126,6 @@ export interface IKBotOptions { google/gemma-3n-e2b-it:free | free google/gemma-3n-e4b-it | paid google/gemma-3n-e4b-it:free | free - openrouter/horizon-beta | paid inception/mercury | paid inception/mercury-coder | paid infermatic/mn-inferor-12b | paid @@ -230,8 +226,6 @@ export interface IKBotOptions { nvidia/llama-3.3-nemotron-super-49b-v1 | paid openai/chatgpt-4o-latest | paid openai/codex-mini | paid - openai/gpt-oss-120b | paid - openai/gpt-oss-20b | paid openai/gpt-3.5-turbo | paid openai/gpt-3.5-turbo-0613 | paid openai/gpt-3.5-turbo-16k | paid @@ -253,6 +247,13 @@ export interface IKBotOptions { openai/gpt-4o-mini | paid openai/gpt-4o-mini-2024-07-18 | paid openai/gpt-4o-mini-search-preview | paid + openai/gpt-5 | paid + openai/gpt-5-chat | paid + openai/gpt-5-mini | paid + openai/gpt-5-nano | paid + openai/gpt-oss-120b | paid + openai/gpt-oss-20b | paid + openai/gpt-oss-20b:free | free openai/o1 | paid openai/o1-mini | paid openai/o1-mini-2024-09-12 | paid @@ -330,7 +331,6 @@ export interface IKBotOptions { tngtech/deepseek-r1t-chimera | paid tngtech/deepseek-r1t-chimera:free | free tngtech/deepseek-r1t2-chimera:free | free - undi95/toppy-m-7b | paid scb10x/llama3.1-typhoon2-70b-instruct | paid cognitivecomputations/dolphin-mistral-24b-venice-edition:free | free microsoft/wizardlm-2-8x22b | paid @@ -399,6 +399,13 @@ export interface IKBotOptions { gpt-4o-search-preview gpt-4o-search-preview-2025-03-11 gpt-4o-transcribe + gpt-5 + gpt-5-2025-08-07 + gpt-5-chat-latest + gpt-5-mini + gpt-5-mini-2025-08-07 + gpt-5-nano + gpt-5-nano-2025-08-07 gpt-image-1 o1 o1-2024-12-17 @@ -406,6 +413,8 @@ export interface IKBotOptions { o1-mini-2024-09-12 o1-pro o1-pro-2025-03-19 + o3 + o3-2025-04-16 o3-mini o3-mini-2025-01-31 o4-mini @@ -459,6 +468,8 @@ export interface IKBotOptions { logs?: string; /** Enable streaming (verbose LLM output) */ stream?: boolean; + /** Use alternate tokenizer & instead of $ */ + alt?: boolean; /** Environment (in profile) */ env?: string; variables?: { diff --git a/packages/ai-tools/src/types_kbot.ts b/packages/ai-tools/src/types_kbot.ts index 897e6b73..e2c4f309 100644 --- a/packages/ai-tools/src/types_kbot.ts +++ b/packages/ai-tools/src/types_kbot.ts @@ -33,8 +33,6 @@ export interface IKBotOptions {  agentica-org/deepcoder-14b-preview | paid agentica-org/deepcoder-14b-preview:free | free - ai21/jamba-1.6-large | paid - ai21/jamba-1.6-mini | paid aion-labs/aion-1.0 | paid aion-labs/aion-1.0-mini | paid aion-labs/aion-rp-llama-3.1-8b | paid @@ -102,7 +100,6 @@ export interface IKBotOptions { cognitivecomputations/dolphin3.0-r1-mistral-24b | paid cognitivecomputations/dolphin3.0-r1-mistral-24b:free | free eleutherai/llemma_7b | paid - sao10k/fimbulvetr-11b-v2 | paid alpindale/goliath-120b | paid google/gemini-flash-1.5 | paid google/gemini-flash-1.5-8b | paid @@ -129,7 +126,6 @@ export interface IKBotOptions { google/gemma-3n-e2b-it:free | free google/gemma-3n-e4b-it | paid google/gemma-3n-e4b-it:free | free - openrouter/horizon-beta | paid inception/mercury | paid inception/mercury-coder | paid infermatic/mn-inferor-12b | paid @@ -230,8 +226,6 @@ export interface IKBotOptions { nvidia/llama-3.3-nemotron-super-49b-v1 | paid openai/chatgpt-4o-latest | paid openai/codex-mini | paid - openai/gpt-oss-120b | paid - openai/gpt-oss-20b | paid openai/gpt-3.5-turbo | paid openai/gpt-3.5-turbo-0613 | paid openai/gpt-3.5-turbo-16k | paid @@ -253,6 +247,13 @@ export interface IKBotOptions { openai/gpt-4o-mini | paid openai/gpt-4o-mini-2024-07-18 | paid openai/gpt-4o-mini-search-preview | paid + openai/gpt-5 | paid + openai/gpt-5-chat | paid + openai/gpt-5-mini | paid + openai/gpt-5-nano | paid + openai/gpt-oss-120b | paid + openai/gpt-oss-20b | paid + openai/gpt-oss-20b:free | free openai/o1 | paid openai/o1-mini | paid openai/o1-mini-2024-09-12 | paid @@ -330,7 +331,6 @@ export interface IKBotOptions { tngtech/deepseek-r1t-chimera | paid tngtech/deepseek-r1t-chimera:free | free tngtech/deepseek-r1t2-chimera:free | free - undi95/toppy-m-7b | paid scb10x/llama3.1-typhoon2-70b-instruct | paid cognitivecomputations/dolphin-mistral-24b-venice-edition:free | free microsoft/wizardlm-2-8x22b | paid @@ -399,6 +399,13 @@ export interface IKBotOptions { gpt-4o-search-preview gpt-4o-search-preview-2025-03-11 gpt-4o-transcribe + gpt-5 + gpt-5-2025-08-07 + gpt-5-chat-latest + gpt-5-mini + gpt-5-mini-2025-08-07 + gpt-5-nano + gpt-5-nano-2025-08-07 gpt-image-1 o1 o1-2024-12-17 @@ -406,6 +413,8 @@ export interface IKBotOptions { o1-mini-2024-09-12 o1-pro o1-pro-2025-03-19 + o3 + o3-2025-04-16 o3-mini o3-mini-2025-01-31 o4-mini @@ -459,6 +468,8 @@ export interface IKBotOptions { logs?: string; /** Enable streaming (verbose LLM output) */ stream?: boolean; + /** Use alternate tokenizer & instead of $ */ + alt?: boolean; /** Environment (in profile) */ env?: string; variables?: { diff --git a/packages/commons/src/schemas/media.code-workspace b/packages/commons/src/schemas/media.code-workspace new file mode 100644 index 00000000..327942a8 --- /dev/null +++ b/packages/commons/src/schemas/media.code-workspace @@ -0,0 +1,14 @@ +{ + "folders": [ + { + "path": "../../../media" + }, + { + "path": "../.." + }, + { + "path": "../../../kbot" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/packages/kbot/dist-in/commands/run-completion.js b/packages/kbot/dist-in/commands/run-completion.js index de847f82..b713fd27 100644 --- a/packages/kbot/dist-in/commands/run-completion.js +++ b/packages/kbot/dist-in/commands/run-completion.js @@ -15,11 +15,10 @@ export const onCompletion = async (result = "", options) => { MODEL: options.model ? path.parse(options.model).name : 'unknown_model', ROUTER: options.router || 'unknown_router', }; - const dstPath = path.resolve(resolve(options.dst, false, vars)); + const dstPath = path.resolve(resolve(options.dst, options.alt, vars)); writeOrAppend(dstPath, result, options.append); const action = options.append ? `${options.append} content to` : 'Wrote completion result to'; options.logger?.debug(`${action} ${dstPath} : ${options.dst}`); - console.log(`wrote ${action} ${dstPath} : ${options.dst}`); } else { marked.use(markedTerminal({ @@ -49,4 +48,4 @@ export const runCompletion = async (client, params, options) => { result = await onCompletion(result, options); return result; }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWNvbXBsZXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcnVuLWNvbXBsZXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDaEQsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0sZUFBZSxDQUFBO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFHakQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxTQUFjLEVBQUUsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDekUsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQW1CLElBQUksRUFBRSxDQUFDLENBQUE7SUFDaEUsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzdCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksR0FBRztZQUNMLEdBQUcsSUFBSTtZQUNQLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWU7WUFDdkUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksZ0JBQWdCO1NBQzNDLENBQUE7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQy9ELGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUEwQixDQUFDLENBQUE7UUFDbEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxhQUFhLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFBO1FBQzdGLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsTUFBTSxJQUFJLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUM1RCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1lBQ3hCLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDLENBQUE7UUFDSCxNQUFNLE9BQU8sR0FBVyxNQUFNLENBQUMsTUFBTSxDQUFXLENBQUM7UUFDakQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUNELFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNyQixrQkFBa0I7SUFDbEIsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBRSxNQUFXLEVBQUUsT0FBa0IsRUFBRSxFQUFFO0lBQ3JGLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUE7UUFDbEQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDdEQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixlQUFlLEVBQUUsT0FBTyxDQUFDLE1BQWE7S0FDdkMsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3SSxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFDRCxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUE7SUFDbEQsTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM1QyxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWNvbXBsZXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcnVuLWNvbXBsZXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDaEQsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0sZUFBZSxDQUFBO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFHakQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxTQUFjLEVBQUUsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDekUsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQW1CLElBQUksRUFBRSxDQUFDLENBQUE7SUFDaEUsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzdCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksR0FBRztZQUNMLEdBQUcsSUFBSTtZQUNQLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWU7WUFDdkUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksZ0JBQWdCO1NBQzNDLENBQUE7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNyRSxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBMEIsQ0FBQyxDQUFBO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQTtRQUM3RixPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDaEUsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztZQUN4QixLQUFLLEVBQUUsS0FBSztTQUNiLENBQUMsQ0FBQyxDQUFBO1FBQ0gsTUFBTSxPQUFPLEdBQVcsTUFBTSxDQUFDLE1BQU0sQ0FBVyxDQUFDO1FBQ2pELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFDRCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDckIsa0JBQWtCO0lBQ2xCLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxNQUFjLEVBQUUsTUFBVyxFQUFFLE9BQWtCLEVBQUUsRUFBRTtJQUNyRixJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1FBQ2xELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3RELEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxNQUFhO0tBQ3ZDLENBQUMsQ0FBQTtJQUNGLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0ksT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFBO0lBQ2xELE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDNUMsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/packages/kbot/dist-in/zod_schema.js b/packages/kbot/dist-in/zod_schema.js index 9719119a..e9a31342 100644 --- a/packages/kbot/dist-in/zod_schema.js +++ b/packages/kbot/dist-in/zod_schema.js @@ -131,6 +131,9 @@ export const OptionsSchema = (opts) => { .describe('Logging directory')).add('stream', z.boolean() .default(false) .describe('Enable streaming (verbose LLM output)')) + .add('alt', z.boolean() + .default(false) + .describe('Use alternate tokenizer & instead of $')) .add('env', z.string() .default('default') .describe('Environment (in profile)')) @@ -224,4 +227,4 @@ export const schemas = () => { write([OptionsSchema()], 'schema.json', 'kbot', {}); writeFS('schema_ui.json', schemaMap.getUISchema()); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kX3NjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy96b2Rfc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDdkIsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQTtBQUN6QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRixPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLElBQUksT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDcEQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUV0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFckYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtBQUNoSyxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUMzSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE1BQWMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQTtBQUNqSixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUU1QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBUSxDQUFDLENBQUE7QUFFNUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBR3JJLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixVQUFVLEVBQUUsWUFBWTtJQUN4QixLQUFLLEVBQUUsT0FBTztJQUNkLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLE1BQU0sRUFBRSxRQUFRO0NBQ1IsQ0FBQTtBQUVWLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxVQUFVO0lBQ2pCLE1BQU0sQ0FBQyxLQUFLO0lBQ1osTUFBTSxDQUFDLFNBQVM7SUFDaEIsTUFBTSxDQUFDLFNBQVM7SUFDaEIsTUFBTSxDQUFDLE1BQU07Q0FDZCxDQUFDLENBQUE7QUFFRix1Q0FBdUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7QUFJbEUscUNBQXFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7QUFHbEQsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQSxDQUFDLHdDQUF3QztBQUs3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLElBQUksNkJBQTZCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUNwSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLElBQUkseUJBQXlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUV4RyxJQUFJLFNBQVMsQ0FBQTtBQUViLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQVUsRUFBTyxFQUFFO0lBRS9DLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFxQixDQUFBO0lBQ2xELFNBQVMsQ0FBQyxHQUFHLENBQ1gsTUFBTSxFQUNOLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDUCxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQztTQUNaLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUM3QixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUN6QixHQUFHLENBQ0YsUUFBUSxFQUNSLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDUCxRQUFRLENBQUMsNERBQTRELENBQUM7U0FDdEUsUUFBUSxFQUFFLENBQ2Q7U0FDQSxHQUFHLENBQ0YsUUFBUSxFQUNSLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDUCxRQUFRLEVBQUU7U0FDVixRQUFRLENBQUMsMERBQTBELENBQUMsQ0FDeEU7U0FDQSxHQUFHLENBQ0YsS0FBSyxFQUNMLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDUCxRQUFRLEVBQUU7U0FDVixRQUFRLENBQUMseUlBQXlJLENBQUMsQ0FDdko7U0FDQSxHQUFHLENBQ0YsUUFBUSxFQUNSLFlBQVk7U0FDVCxRQUFRLEVBQUU7U0FDVixRQUFRLENBQUMsMktBQTJLLENBQUMsQ0FDekw7U0FDQSxHQUFHLENBQ0YsTUFBTSxFQUNOLFVBQVU7U0FDUCxPQUFPLENBQUMsTUFBTSxDQUFDO1NBQ2YsUUFBUSxDQUFDLG1GQUFtRixDQUFDLENBQ2pHO1NBQ0EsR0FBRyxDQUNGLE1BQU0sRUFDTixDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ1AsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLDZPQUE2TyxDQUFDLENBQzNQO1NBQ0EsR0FBRyxDQUNGLFNBQVMsRUFDVCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNoQixPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ1gsUUFBUSxDQUFDLDJDQUEyQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQzFGO1NBQ0EsR0FBRyxDQUNGLGNBQWMsRUFDZCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNoQixRQUFRLEVBQUU7U0FDVixPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ1gsUUFBUSxDQUFDLG1DQUFtQyxDQUFDLENBQ2pEO1NBQ0EsR0FBRyxDQUNGLE9BQU8sRUFDUCxDQUFDLENBQUMsS0FBSyxDQUNMO1FBQ0UsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLE1BQU0sRUFBRTtLQUNYLENBQUMsQ0FBQyxRQUFRLEVBQUU7U0FDWixPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztTQUM5QixRQUFRLENBQUMsNEZBQTRGLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7U0FDdkksU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDakU7U0FDQSxHQUFHLENBQ0YsU0FBUyxFQUNULENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2hCLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyxnR0FBZ0csQ0FBQyxDQUM5RztTQUNBLEdBQUcsQ0FDRixTQUFTLEVBQ1QsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDaEIsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLGdHQUFnRyxDQUFDLENBQzlHO1NBQ0EsR0FBRyxDQUNGLGVBQWUsRUFDZixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMscUNBQXFDO1NBQ3pFLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FDUCx3REFBd0QsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDN0YsZ0dBQWdHO1FBQ2hHLHdEQUF3RCxDQUN6RCxDQUNKO1NBQ0EsR0FBRyxDQUNGLFNBQVMsRUFDVCxDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ1AsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLHlCQUF5QixDQUFDLENBQ3ZDO1NBQ0EsR0FBRyxDQUNGLE9BQU8sRUFDUCxDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ1AsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLHNEQUFzRCxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUM5RjtTQUNBLEdBQUcsQ0FDRixRQUFRLEVBQ1IsQ0FBQyxDQUFDLE1BQU0sRUFBRTtTQUNQLE9BQU8sQ0FBQyxZQUFZLENBQUM7U0FDckIsUUFBUSxDQUFDLCtDQUErQyxDQUFDLENBQzdEO1NBQ0EsR0FBRyxDQUNGLE1BQU0sRUFDTixLQUFLO1NBQ0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDckIsUUFBUSxDQUFDO1lBQ04sS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzlCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDN0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzdCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztPQUMvQixDQUFDLENBQ0g7U0FDQSxHQUFHLENBQ0YsVUFBVSxFQUNWLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDUCxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ1YsUUFBUSxDQUFDLG1DQUFtQyxDQUFDLENBQ2pEO1NBQ0EsR0FBRyxDQUNGLFNBQVMsRUFDVCxDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ1AsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLGdFQUFnRSxDQUFDLENBQzlFO1NBQ0EsR0FBRyxDQUNGLFNBQVMsRUFDVCxDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ1AsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLG9EQUFvRCxDQUFDLENBQ2xFO1NBQ0EsR0FBRyxDQUNGLFFBQVEsRUFDUixDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ1AsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLDZFQUE2RSxDQUFDLENBQzNGO1NBQ0EsR0FBRyxDQUNGLE1BQU0sRUFDTixDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ1AsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQy9CO1NBQ0EsR0FBRyxDQUNGLGFBQWEsRUFDYixDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ1AsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDOUIsUUFBUSxDQUFDLDBHQUEwRyxDQUFDLENBQ3hIO1NBQ0EsR0FBRyxDQUNGLE1BQU0sRUFDTixDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ1AsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1NBQzFCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUNqQyxDQUFDLEdBQUcsQ0FDSCxRQUFRLEVBQ1IsQ0FBQyxDQUFDLE9BQU8sRUFBRTtTQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUM7U0FDZCxRQUFRLENBQUMsdUNBQXVDLENBQUMsQ0FDckQ7U0FDQSxHQUFHLENBQ0YsS0FBSyxFQUNMLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDUCxPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ2xCLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUN4QztTQUNBLEdBQUcsQ0FDRixXQUFXLEVBQ1gsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQzdCLFFBQVEsRUFBRTtTQUNWLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FDZjtTQUNBLEdBQUcsQ0FDRixTQUFTLEVBQ1QsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNOLENBQUMsQ0FBQyxNQUFNLEVBQUU7UUFDVixDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNsQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUN0QixDQUFDO1NBQ0MsUUFBUSxFQUFFO1NBQ1YsT0FBTyxDQUFDLEVBQUUsQ0FBQztTQUNYLFFBQVEsQ0FBQzs7O3VCQUdLLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztTQUN2QyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNqQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JELE9BQU8sR0FBRyxDQUFBO1FBQ1osQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ2xELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDN0QsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQyxDQUFDLENBQ0w7U0FDQSxHQUFHLENBQ0YsT0FBTyxFQUNQLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDUCxRQUFRLEVBQUU7U0FDVixRQUFRLEVBQUU7U0FDVixPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ2IsUUFBUSxDQUFDLHNEQUFzRCxDQUFDLENBQ3BFO1NBQ0EsR0FBRyxDQUNGLEtBQUssRUFDTCxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ04sQ0FBQyxDQUFDLE9BQU8sRUFBRTtRQUNYLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUM7S0FDNUQsQ0FBQztTQUNDLFFBQVEsRUFBRTtTQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUM7U0FDZCxRQUFRLENBQUMsOERBQThELENBQUMsQ0FDNUU7U0FDQSxHQUFHLENBQ0YsUUFBUSxFQUNSLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDTixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxDQUFDO2dCQUNILHFDQUFxQztnQkFDckMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQzlDLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDN0MsbURBQW1EO29CQUNuRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO29CQUM1QyxPQUFPLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDaEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLG1DQUFtQztvQkFDbkMsSUFBSSxDQUFDO3dCQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQy9CLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDN0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQzt3QkFDNUMsT0FBTyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ2hELENBQUM7b0JBQUMsTUFBTSxDQUFDO3dCQUNQLHFEQUFxRDt3QkFDckQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDbkMsT0FBTyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ2hELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQzNDLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN4QixnREFBZ0Q7WUFDaEQsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDckQsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0tBQ0gsQ0FBQztTQUNDLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQywwSEFBMEgsQ0FBQyxDQUN4SSxDQUFDO0lBQ0osT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFO1NBQ3BCLFdBQVcsRUFBRTtTQUNiLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQTtBQUM3QixDQUFDLENBQUE7QUFDRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFO0lBQ3hCLG1CQUFtQixDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQzFELG1CQUFtQixDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5RixPQUFPLEVBQUUsQ0FBQTtBQUNYLENBQUMsQ0FBQTtBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUU7SUFDMUIsS0FBSyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ25ELE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQTtBQUNwRCxDQUFDLENBQUEifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kX3NjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy96b2Rfc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDdkIsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQTtBQUN6QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRixPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLElBQUksT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDcEQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUV0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFckYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVB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 \ No newline at end of file diff --git a/packages/kbot/dist-in/zod_types.d.ts b/packages/kbot/dist-in/zod_types.d.ts index c26471ec..95dc917c 100644 --- a/packages/kbot/dist-in/zod_types.d.ts +++ b/packages/kbot/dist-in/zod_types.d.ts @@ -33,8 +33,6 @@ export interface IKBotOptions {  agentica-org/deepcoder-14b-preview | paid agentica-org/deepcoder-14b-preview:free | free - ai21/jamba-1.6-large | paid - ai21/jamba-1.6-mini | paid aion-labs/aion-1.0 | paid aion-labs/aion-1.0-mini | paid aion-labs/aion-rp-llama-3.1-8b | paid @@ -102,7 +100,6 @@ export interface IKBotOptions { cognitivecomputations/dolphin3.0-r1-mistral-24b | paid cognitivecomputations/dolphin3.0-r1-mistral-24b:free | free eleutherai/llemma_7b | paid - sao10k/fimbulvetr-11b-v2 | paid alpindale/goliath-120b | paid google/gemini-flash-1.5 | paid google/gemini-flash-1.5-8b | paid @@ -129,7 +126,6 @@ export interface IKBotOptions { google/gemma-3n-e2b-it:free | free google/gemma-3n-e4b-it | paid google/gemma-3n-e4b-it:free | free - openrouter/horizon-beta | paid inception/mercury | paid inception/mercury-coder | paid infermatic/mn-inferor-12b | paid @@ -230,8 +226,6 @@ export interface IKBotOptions { nvidia/llama-3.3-nemotron-super-49b-v1 | paid openai/chatgpt-4o-latest | paid openai/codex-mini | paid - openai/gpt-oss-120b | paid - openai/gpt-oss-20b | paid openai/gpt-3.5-turbo | paid openai/gpt-3.5-turbo-0613 | paid openai/gpt-3.5-turbo-16k | paid @@ -253,6 +247,13 @@ export interface IKBotOptions { openai/gpt-4o-mini | paid openai/gpt-4o-mini-2024-07-18 | paid openai/gpt-4o-mini-search-preview | paid + openai/gpt-5 | paid + openai/gpt-5-chat | paid + openai/gpt-5-mini | paid + openai/gpt-5-nano | paid + openai/gpt-oss-120b | paid + openai/gpt-oss-20b | paid + openai/gpt-oss-20b:free | free openai/o1 | paid openai/o1-mini | paid openai/o1-mini-2024-09-12 | paid @@ -330,7 +331,6 @@ export interface IKBotOptions { tngtech/deepseek-r1t-chimera | paid tngtech/deepseek-r1t-chimera:free | free tngtech/deepseek-r1t2-chimera:free | free - undi95/toppy-m-7b | paid scb10x/llama3.1-typhoon2-70b-instruct | paid cognitivecomputations/dolphin-mistral-24b-venice-edition:free | free microsoft/wizardlm-2-8x22b | paid @@ -399,6 +399,13 @@ export interface IKBotOptions { gpt-4o-search-preview gpt-4o-search-preview-2025-03-11 gpt-4o-transcribe + gpt-5 + gpt-5-2025-08-07 + gpt-5-chat-latest + gpt-5-mini + gpt-5-mini-2025-08-07 + gpt-5-nano + gpt-5-nano-2025-08-07 gpt-image-1 o1 o1-2024-12-17 @@ -406,6 +413,8 @@ export interface IKBotOptions { o1-mini-2024-09-12 o1-pro o1-pro-2025-03-19 + o3 + o3-2025-04-16 o3-mini o3-mini-2025-01-31 o4-mini @@ -459,6 +468,8 @@ export interface IKBotOptions { logs?: string; /** Enable streaming (verbose LLM output) */ stream?: boolean; + /** Use alternate tokenizer & instead of $ */ + alt?: boolean; /** Environment (in profile) */ env?: string; variables?: { diff --git a/packages/kbot/package.json b/packages/kbot/package.json index 4be9c25f..86f64eb6 100644 --- a/packages/kbot/package.json +++ b/packages/kbot/package.json @@ -23,6 +23,7 @@ "start": "node dist/index.js", "dev": "tsc -p . --watch", "lint": "eslint src --ext .ts", + "register-commands": "pm-cli register-commands --config=salamand.json --group=kbot", "test": "vitest run", "test:basic": "vitest run tests/unit/basic.test.ts", "test:math": "vitest run tests/unit/math.test.ts", diff --git a/packages/kbot/salamand.json b/packages/kbot/salamand.json new file mode 100644 index 00000000..42d3ee72 --- /dev/null +++ b/packages/kbot/salamand.json @@ -0,0 +1,8 @@ +{ + "resize": { + "name": "Product Discription", + "command": "kbot-d", + "args": "modify --prompt=\"as short product description, in markdown - if possible extract product name, and specifications\" --alt=true --logLevel=3 --include=\"$(FullName)\" --dst=\"&{SRC_DIR}/&{SRC_NAME}_description.md\" --mode=completion", + "description": "Resize images" + } +} diff --git a/packages/kbot/schema.json b/packages/kbot/schema.json index a6dc5674..64d25e72 100644 --- a/packages/kbot/schema.json +++ b/packages/kbot/schema.json @@ -119,7 +119,7 @@ }, "model": { "type": "string", - "description": "AI model to use for processing. Available models:\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenRouter models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nagentica-org/deepcoder-14b-preview | paid\nagentica-org/deepcoder-14b-preview:free | free\nai21/jamba-1.6-large | paid\nai21/jamba-1.6-mini | paid\naion-labs/aion-1.0 | paid\naion-labs/aion-1.0-mini | paid\naion-labs/aion-rp-llama-3.1-8b | paid\nalfredpros/codellama-7b-instruct-solidity | paid\namazon/nova-lite-v1 | paid\namazon/nova-micro-v1 | paid\namazon/nova-pro-v1 | paid\nanthropic/claude-3-haiku | paid\nanthropic/claude-3-haiku:beta | paid\nanthropic/claude-3-opus | paid\nanthropic/claude-3-opus:beta | paid\nanthropic/claude-3.5-haiku | paid\nanthropic/claude-3.5-haiku-20241022 | paid\nanthropic/claude-3.5-haiku:beta | paid\nanthropic/claude-3.5-sonnet | paid\nanthropic/claude-3.5-sonnet-20240620 | paid\nanthropic/claude-3.5-sonnet-20240620:beta | paid\nanthropic/claude-3.5-sonnet:beta | paid\nanthropic/claude-3.7-sonnet | paid\nanthropic/claude-3.7-sonnet:beta | paid\nanthropic/claude-3.7-sonnet:thinking | paid\nanthropic/claude-opus-4 | paid\nanthropic/claude-opus-4.1 | paid\nanthropic/claude-sonnet-4 | paid\narcee-ai/coder-large | paid\narcee-ai/maestro-reasoning | paid\narcee-ai/spotlight | paid\narcee-ai/virtuoso-large | paid\narliai/qwq-32b-arliai-rpr-v1 | paid\narliai/qwq-32b-arliai-rpr-v1:free | free\nopenrouter/auto | paid\nbaidu/ernie-4.5-300b-a47b | paid\nbytedance/ui-tars-1.5-7b | paid\ncohere/command | paid\ncohere/command-a | paid\ncohere/command-r | paid\ncohere/command-r-03-2024 | paid\ncohere/command-r-08-2024 | paid\ncohere/command-r-plus | paid\ncohere/command-r-plus-04-2024 | paid\ncohere/command-r-plus-08-2024 | paid\ncohere/command-r7b-12-2024 | paid\ndeepseek/deepseek-prover-v2 | paid\ndeepseek/deepseek-r1-0528-qwen3-8b | paid\ndeepseek/deepseek-r1-0528-qwen3-8b:free | free\ndeepseek/deepseek-chat | paid\ndeepseek/deepseek-chat-v3-0324 | paid\ndeepseek/deepseek-chat-v3-0324:free | free\ndeepseek/deepseek-v3-base | paid\ndeepseek/deepseek-r1 | paid\ndeepseek/deepseek-r1:free | free\ndeepseek/deepseek-r1-0528 | paid\ndeepseek/deepseek-r1-0528:free | free\ndeepseek/deepseek-r1-distill-llama-70b | paid\ndeepseek/deepseek-r1-distill-llama-70b:free | free\ndeepseek/deepseek-r1-distill-llama-8b | paid\ndeepseek/deepseek-r1-distill-qwen-1.5b | paid\ndeepseek/deepseek-r1-distill-qwen-14b | paid\ndeepseek/deepseek-r1-distill-qwen-14b:free | free\ndeepseek/deepseek-r1-distill-qwen-32b | paid\ndeepseek/deepseek-r1-distill-qwen-7b | paid\ncognitivecomputations/dolphin-mixtral-8x22b | paid\ncognitivecomputations/dolphin3.0-mistral-24b | paid\ncognitivecomputations/dolphin3.0-mistral-24b:free | free\ncognitivecomputations/dolphin3.0-r1-mistral-24b | paid\ncognitivecomputations/dolphin3.0-r1-mistral-24b:free | free\neleutherai/llemma_7b | paid\nsao10k/fimbulvetr-11b-v2 | paid\nalpindale/goliath-120b | paid\ngoogle/gemini-flash-1.5 | paid\ngoogle/gemini-flash-1.5-8b | paid\ngoogle/gemini-pro-1.5 | paid\ngoogle/gemini-2.0-flash-001 | paid\ngoogle/gemini-2.0-flash-exp:free | free\ngoogle/gemini-2.0-flash-lite-001 | paid\ngoogle/gemini-2.5-flash | paid\ngoogle/gemini-2.5-flash-lite | paid\ngoogle/gemini-2.5-flash-lite-preview-06-17 | paid\ngoogle/gemini-2.5-pro | paid\ngoogle/gemini-2.5-pro-exp-03-25 | paid\ngoogle/gemini-2.5-pro-preview-05-06 | paid\ngoogle/gemini-2.5-pro-preview | paid\ngoogle/gemma-2-27b-it | paid\ngoogle/gemma-2-9b-it | paid\ngoogle/gemma-2-9b-it:free | free\ngoogle/gemma-3-12b-it | paid\ngoogle/gemma-3-12b-it:free | free\ngoogle/gemma-3-27b-it | paid\ngoogle/gemma-3-27b-it:free | free\ngoogle/gemma-3-4b-it | paid\ngoogle/gemma-3-4b-it:free | free\ngoogle/gemma-3n-e2b-it:free | free\ngoogle/gemma-3n-e4b-it | paid\ngoogle/gemma-3n-e4b-it:free | free\nopenrouter/horizon-beta | paid\ninception/mercury | paid\ninception/mercury-coder | paid\ninfermatic/mn-inferor-12b | paid\ninflection/inflection-3-pi | paid\ninflection/inflection-3-productivity | paid\nmoonshotai/kimi-dev-72b:free | free\nliquid/lfm-3b | paid\nliquid/lfm-40b | paid\nliquid/lfm-7b | paid\nmeta-llama/llama-guard-3-8b | paid\nanthracite-org/magnum-v2-72b | paid\nanthracite-org/magnum-v4-72b | paid\nmancer/weaver | paid\nmeta-llama/llama-3-70b-instruct | paid\nmeta-llama/llama-3-8b-instruct | paid\nmeta-llama/llama-3.1-405b | paid\nmeta-llama/llama-3.1-405b-instruct | paid\nmeta-llama/llama-3.1-405b-instruct:free | free\nmeta-llama/llama-3.1-70b-instruct | paid\nmeta-llama/llama-3.1-8b-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct:free | free\nmeta-llama/llama-3.2-1b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct:free | free\nmeta-llama/llama-3.2-90b-vision-instruct | paid\nmeta-llama/llama-3.3-70b-instruct | paid\nmeta-llama/llama-3.3-70b-instruct:free | free\nmeta-llama/llama-4-maverick | paid\nmeta-llama/llama-4-scout | paid\nmeta-llama/llama-guard-4-12b | paid\nmeta-llama/llama-guard-2-8b | paid\nmicrosoft/mai-ds-r1 | paid\nmicrosoft/mai-ds-r1:free | free\nmicrosoft/phi-4 | paid\nmicrosoft/phi-4-multimodal-instruct | paid\nmicrosoft/phi-4-reasoning-plus | paid\nmicrosoft/phi-3-medium-128k-instruct | paid\nmicrosoft/phi-3-mini-128k-instruct | paid\nmicrosoft/phi-3.5-mini-128k-instruct | paid\nsophosympatheia/midnight-rose-70b | paid\nminimax/minimax-m1 | paid\nminimax/minimax-01 | paid\nmistralai/mistral-large | paid\nmistralai/mistral-large-2407 | paid\nmistralai/mistral-large-2411 | paid\nmistralai/mistral-small | paid\nmistralai/mistral-tiny | paid\nmistralai/codestral-2501 | paid\nmistralai/codestral-2508 | paid\nmistralai/devstral-medium | paid\nmistralai/devstral-small | paid\nmistralai/devstral-small-2505 | paid\nmistralai/devstral-small-2505:free | free\nmistralai/magistral-medium-2506 | paid\nmistralai/magistral-medium-2506:thinking | paid\nmistralai/magistral-small-2506 | paid\nmistralai/ministral-3b | paid\nmistralai/ministral-8b | paid\nmistralai/mistral-7b-instruct | paid\nmistralai/mistral-7b-instruct:free | free\nmistralai/mistral-7b-instruct-v0.1 | paid\nmistralai/mistral-7b-instruct-v0.2 | paid\nmistralai/mistral-7b-instruct-v0.3 | paid\nmistralai/mistral-medium-3 | paid\nmistralai/mistral-nemo | paid\nmistralai/mistral-nemo:free | free\nmistralai/mistral-small-24b-instruct-2501 | paid\nmistralai/mistral-small-24b-instruct-2501:free | free\nmistralai/mistral-small-3.1-24b-instruct | paid\nmistralai/mistral-small-3.1-24b-instruct:free | free\nmistralai/mistral-small-3.2-24b-instruct | paid\nmistralai/mistral-small-3.2-24b-instruct:free | free\nmistralai/mixtral-8x22b-instruct | paid\nmistralai/mixtral-8x7b-instruct | paid\nmistralai/pixtral-12b | paid\nmistralai/pixtral-large-2411 | paid\nmistralai/mistral-saba | paid\nmoonshotai/kimi-vl-a3b-thinking | paid\nmoonshotai/kimi-vl-a3b-thinking:free | free\nmoonshotai/kimi-k2 | paid\nmoonshotai/kimi-k2:free | free\nmorph/morph-v3-fast | paid\nmorph/morph-v3-large | paid\ngryphe/mythomax-l2-13b | paid\nneversleep/llama-3-lumimaid-70b | paid\nneversleep/llama-3.1-lumimaid-8b | paid\nneversleep/noromaid-20b | paid\nnousresearch/deephermes-3-llama-3-8b-preview:free | free\nnousresearch/deephermes-3-mistral-24b-preview | paid\nnousresearch/nous-hermes-2-mixtral-8x7b-dpo | paid\nnousresearch/hermes-3-llama-3.1-405b | paid\nnousresearch/hermes-3-llama-3.1-70b | paid\nnousresearch/hermes-2-pro-llama-3-8b | paid\nnvidia/llama-3.1-nemotron-70b-instruct | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1 | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1:free | free\nnvidia/llama-3.3-nemotron-super-49b-v1 | paid\nopenai/chatgpt-4o-latest | paid\nopenai/codex-mini | paid\nopenai/gpt-oss-120b | paid\nopenai/gpt-oss-20b | paid\nopenai/gpt-3.5-turbo | paid\nopenai/gpt-3.5-turbo-0613 | paid\nopenai/gpt-3.5-turbo-16k | paid\nopenai/gpt-3.5-turbo-instruct | paid\nopenai/gpt-4 | paid\nopenai/gpt-4-0314 | paid\nopenai/gpt-4-turbo | paid\nopenai/gpt-4-1106-preview | paid\nopenai/gpt-4-turbo-preview | paid\nopenai/gpt-4.1 | paid\nopenai/gpt-4.1-mini | paid\nopenai/gpt-4.1-nano | paid\nopenai/gpt-4o | paid\nopenai/gpt-4o-2024-05-13 | paid\nopenai/gpt-4o-2024-08-06 | paid\nopenai/gpt-4o-2024-11-20 | paid\nopenai/gpt-4o:extended | paid\nopenai/gpt-4o-search-preview | paid\nopenai/gpt-4o-mini | paid\nopenai/gpt-4o-mini-2024-07-18 | paid\nopenai/gpt-4o-mini-search-preview | paid\nopenai/o1 | paid\nopenai/o1-mini | paid\nopenai/o1-mini-2024-09-12 | paid\nopenai/o1-pro | paid\nopenai/o3 | paid\nopenai/o3-mini | paid\nopenai/o3-mini-high | paid\nopenai/o3-pro | paid\nopenai/o4-mini | paid\nopenai/o4-mini-high | paid\nopengvlab/internvl3-14b | paid\nperplexity/r1-1776 | paid\nperplexity/sonar | paid\nperplexity/sonar-deep-research | paid\nperplexity/sonar-pro | paid\nperplexity/sonar-reasoning | paid\nperplexity/sonar-reasoning-pro | paid\npygmalionai/mythalion-13b | paid\nfeatherless/qwerky-72b:free | free\nqwen/qwen-2-72b-instruct | paid\nqwen/qwen-vl-max | paid\nqwen/qwen-vl-plus | paid\nqwen/qwen-max | paid\nqwen/qwen-plus | paid\nqwen/qwen-turbo | paid\nqwen/qwen2.5-vl-32b-instruct | paid\nqwen/qwen2.5-vl-32b-instruct:free | free\nqwen/qwen2.5-vl-72b-instruct | paid\nqwen/qwen2.5-vl-72b-instruct:free | free\nqwen/qwen-2.5-vl-7b-instruct | paid\nqwen/qwen3-14b | paid\nqwen/qwen3-14b:free | free\nqwen/qwen3-235b-a22b | paid\nqwen/qwen3-235b-a22b:free | free\nqwen/qwen3-235b-a22b-2507 | paid\nqwen/qwen3-235b-a22b-thinking-2507 | paid\nqwen/qwen3-30b-a3b | paid\nqwen/qwen3-30b-a3b:free | free\nqwen/qwen3-30b-a3b-instruct-2507 | paid\nqwen/qwen3-32b | paid\nqwen/qwen3-4b:free | free\nqwen/qwen3-8b | paid\nqwen/qwen3-8b:free | free\nqwen/qwen3-coder | paid\nqwen/qwq-32b | paid\nqwen/qwq-32b:free | free\nqwen/qwq-32b-preview | paid\nqwen/qwen-2.5-72b-instruct | paid\nqwen/qwen-2.5-72b-instruct:free | free\nqwen/qwen-2.5-7b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct:free | free\nrekaai/reka-flash-3:free | free\nundi95/remm-slerp-l2-13b | paid\nsao10k/l3-lunaris-8b | paid\nsao10k/l3-euryale-70b | paid\nsao10k/l3.1-euryale-70b | paid\nsao10k/l3.3-euryale-70b | paid\nsarvamai/sarvam-m:free | free\nshisa-ai/shisa-v2-llama3.3-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b:free | free\nraifle/sorcererlm-8x22b | paid\nswitchpoint/router | paid\ntencent/hunyuan-a13b-instruct | paid\ntencent/hunyuan-a13b-instruct:free | free\nthedrummer/anubis-70b-v1.1 | paid\nthedrummer/anubis-pro-105b-v1 | paid\nthedrummer/rocinante-12b | paid\nthedrummer/skyfall-36b-v2 | paid\nthedrummer/unslopnemo-12b | paid\nthedrummer/valkyrie-49b-v1 | paid\nthudm/glm-4-32b | paid\nthudm/glm-4.1v-9b-thinking | paid\nthudm/glm-z1-32b:free | free\ntngtech/deepseek-r1t-chimera | paid\ntngtech/deepseek-r1t-chimera:free | free\ntngtech/deepseek-r1t2-chimera:free | free\nundi95/toppy-m-7b | paid\nscb10x/llama3.1-typhoon2-70b-instruct | paid\ncognitivecomputations/dolphin-mistral-24b-venice-edition:free | free\nmicrosoft/wizardlm-2-8x22b | paid\nx-ai/grok-2-1212 | paid\nx-ai/grok-2-vision-1212 | paid\nx-ai/grok-3 | paid\nx-ai/grok-3-beta | paid\nx-ai/grok-3-mini | paid\nx-ai/grok-3-mini-beta | paid\nx-ai/grok-4 | paid\nx-ai/grok-vision-beta | paid\nz-ai/glm-4-32b | paid\nz-ai/glm-4.5 | paid\nz-ai/glm-4.5-air | paid\nz-ai/glm-4.5-air:free | free\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenAI models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nbabbage-002\nchatgpt-4o-latest\ncodex-mini-latest\ndall-e-2\ndall-e-3\ndavinci-002\ngpt-3.5-turbo\ngpt-3.5-turbo-0125\ngpt-3.5-turbo-1106\ngpt-3.5-turbo-16k\ngpt-3.5-turbo-instruct\ngpt-3.5-turbo-instruct-0914\ngpt-4\ngpt-4-0125-preview\ngpt-4-0613\ngpt-4-1106-preview\ngpt-4-turbo\ngpt-4-turbo-2024-04-09\ngpt-4-turbo-preview\ngpt-4.1\ngpt-4.1-2025-04-14\ngpt-4.1-mini\ngpt-4.1-mini-2025-04-14\ngpt-4.1-nano\ngpt-4.1-nano-2025-04-14\ngpt-4o\ngpt-4o-2024-05-13\ngpt-4o-2024-08-06\ngpt-4o-2024-11-20\ngpt-4o-audio-preview\ngpt-4o-audio-preview-2024-10-01\ngpt-4o-audio-preview-2024-12-17\ngpt-4o-audio-preview-2025-06-03\ngpt-4o-mini\ngpt-4o-mini-2024-07-18\ngpt-4o-mini-audio-preview\ngpt-4o-mini-audio-preview-2024-12-17\ngpt-4o-mini-realtime-preview\ngpt-4o-mini-realtime-preview-2024-12-17\ngpt-4o-mini-search-preview\ngpt-4o-mini-search-preview-2025-03-11\ngpt-4o-mini-transcribe\ngpt-4o-mini-tts\ngpt-4o-realtime-preview\ngpt-4o-realtime-preview-2024-10-01\ngpt-4o-realtime-preview-2024-12-17\ngpt-4o-realtime-preview-2025-06-03\ngpt-4o-search-preview\ngpt-4o-search-preview-2025-03-11\ngpt-4o-transcribe\ngpt-image-1\no1\no1-2024-12-17\no1-mini\no1-mini-2024-09-12\no1-pro\no1-pro-2025-03-19\no3-mini\no3-mini-2025-01-31\no4-mini\no4-mini-2025-04-16\no4-mini-deep-research\no4-mini-deep-research-2025-06-26\nomni-moderation-2024-09-26\nomni-moderation-latest\ntext-embedding-3-large\ntext-embedding-3-small\ntext-embedding-ada-002\ntts-1\ntts-1-1106\ntts-1-hd\ntts-1-hd-1106\nwhisper-1\n-----\n\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m Deepseek models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\ndeepseek-chat\ndeepseek-reasoner\n-----\n" + "description": "AI model to use for processing. Available models:\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenRouter models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nagentica-org/deepcoder-14b-preview | paid\nagentica-org/deepcoder-14b-preview:free | free\naion-labs/aion-1.0 | paid\naion-labs/aion-1.0-mini | paid\naion-labs/aion-rp-llama-3.1-8b | paid\nalfredpros/codellama-7b-instruct-solidity | paid\namazon/nova-lite-v1 | paid\namazon/nova-micro-v1 | paid\namazon/nova-pro-v1 | paid\nanthropic/claude-3-haiku | paid\nanthropic/claude-3-haiku:beta | paid\nanthropic/claude-3-opus | paid\nanthropic/claude-3-opus:beta | paid\nanthropic/claude-3.5-haiku | paid\nanthropic/claude-3.5-haiku-20241022 | paid\nanthropic/claude-3.5-haiku:beta | paid\nanthropic/claude-3.5-sonnet | paid\nanthropic/claude-3.5-sonnet-20240620 | paid\nanthropic/claude-3.5-sonnet-20240620:beta | paid\nanthropic/claude-3.5-sonnet:beta | paid\nanthropic/claude-3.7-sonnet | paid\nanthropic/claude-3.7-sonnet:beta | paid\nanthropic/claude-3.7-sonnet:thinking | paid\nanthropic/claude-opus-4 | paid\nanthropic/claude-opus-4.1 | paid\nanthropic/claude-sonnet-4 | paid\narcee-ai/coder-large | paid\narcee-ai/maestro-reasoning | paid\narcee-ai/spotlight | paid\narcee-ai/virtuoso-large | paid\narliai/qwq-32b-arliai-rpr-v1 | paid\narliai/qwq-32b-arliai-rpr-v1:free | free\nopenrouter/auto | paid\nbaidu/ernie-4.5-300b-a47b | paid\nbytedance/ui-tars-1.5-7b | paid\ncohere/command | paid\ncohere/command-a | paid\ncohere/command-r | paid\ncohere/command-r-03-2024 | paid\ncohere/command-r-08-2024 | paid\ncohere/command-r-plus | paid\ncohere/command-r-plus-04-2024 | paid\ncohere/command-r-plus-08-2024 | paid\ncohere/command-r7b-12-2024 | paid\ndeepseek/deepseek-prover-v2 | paid\ndeepseek/deepseek-r1-0528-qwen3-8b | paid\ndeepseek/deepseek-r1-0528-qwen3-8b:free | free\ndeepseek/deepseek-chat | paid\ndeepseek/deepseek-chat-v3-0324 | paid\ndeepseek/deepseek-chat-v3-0324:free | free\ndeepseek/deepseek-v3-base | paid\ndeepseek/deepseek-r1 | paid\ndeepseek/deepseek-r1:free | free\ndeepseek/deepseek-r1-0528 | paid\ndeepseek/deepseek-r1-0528:free | free\ndeepseek/deepseek-r1-distill-llama-70b | paid\ndeepseek/deepseek-r1-distill-llama-70b:free | free\ndeepseek/deepseek-r1-distill-llama-8b | paid\ndeepseek/deepseek-r1-distill-qwen-1.5b | paid\ndeepseek/deepseek-r1-distill-qwen-14b | paid\ndeepseek/deepseek-r1-distill-qwen-14b:free | free\ndeepseek/deepseek-r1-distill-qwen-32b | paid\ndeepseek/deepseek-r1-distill-qwen-7b | paid\ncognitivecomputations/dolphin-mixtral-8x22b | paid\ncognitivecomputations/dolphin3.0-mistral-24b | paid\ncognitivecomputations/dolphin3.0-mistral-24b:free | free\ncognitivecomputations/dolphin3.0-r1-mistral-24b | paid\ncognitivecomputations/dolphin3.0-r1-mistral-24b:free | free\neleutherai/llemma_7b | paid\nalpindale/goliath-120b | paid\ngoogle/gemini-flash-1.5 | paid\ngoogle/gemini-flash-1.5-8b | paid\ngoogle/gemini-pro-1.5 | paid\ngoogle/gemini-2.0-flash-001 | paid\ngoogle/gemini-2.0-flash-exp:free | free\ngoogle/gemini-2.0-flash-lite-001 | paid\ngoogle/gemini-2.5-flash | paid\ngoogle/gemini-2.5-flash-lite | paid\ngoogle/gemini-2.5-flash-lite-preview-06-17 | paid\ngoogle/gemini-2.5-pro | paid\ngoogle/gemini-2.5-pro-exp-03-25 | paid\ngoogle/gemini-2.5-pro-preview-05-06 | paid\ngoogle/gemini-2.5-pro-preview | paid\ngoogle/gemma-2-27b-it | paid\ngoogle/gemma-2-9b-it | paid\ngoogle/gemma-2-9b-it:free | free\ngoogle/gemma-3-12b-it | paid\ngoogle/gemma-3-12b-it:free | free\ngoogle/gemma-3-27b-it | paid\ngoogle/gemma-3-27b-it:free | free\ngoogle/gemma-3-4b-it | paid\ngoogle/gemma-3-4b-it:free | free\ngoogle/gemma-3n-e2b-it:free | free\ngoogle/gemma-3n-e4b-it | paid\ngoogle/gemma-3n-e4b-it:free | free\ninception/mercury | paid\ninception/mercury-coder | paid\ninfermatic/mn-inferor-12b | paid\ninflection/inflection-3-pi | paid\ninflection/inflection-3-productivity | paid\nmoonshotai/kimi-dev-72b:free | free\nliquid/lfm-3b | paid\nliquid/lfm-40b | paid\nliquid/lfm-7b | paid\nmeta-llama/llama-guard-3-8b | paid\nanthracite-org/magnum-v2-72b | paid\nanthracite-org/magnum-v4-72b | paid\nmancer/weaver | paid\nmeta-llama/llama-3-70b-instruct | paid\nmeta-llama/llama-3-8b-instruct | paid\nmeta-llama/llama-3.1-405b | paid\nmeta-llama/llama-3.1-405b-instruct | paid\nmeta-llama/llama-3.1-405b-instruct:free | free\nmeta-llama/llama-3.1-70b-instruct | paid\nmeta-llama/llama-3.1-8b-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct:free | free\nmeta-llama/llama-3.2-1b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct:free | free\nmeta-llama/llama-3.2-90b-vision-instruct | paid\nmeta-llama/llama-3.3-70b-instruct | paid\nmeta-llama/llama-3.3-70b-instruct:free | free\nmeta-llama/llama-4-maverick | paid\nmeta-llama/llama-4-scout | paid\nmeta-llama/llama-guard-4-12b | paid\nmeta-llama/llama-guard-2-8b | paid\nmicrosoft/mai-ds-r1 | paid\nmicrosoft/mai-ds-r1:free | free\nmicrosoft/phi-4 | paid\nmicrosoft/phi-4-multimodal-instruct | paid\nmicrosoft/phi-4-reasoning-plus | paid\nmicrosoft/phi-3-medium-128k-instruct | paid\nmicrosoft/phi-3-mini-128k-instruct | paid\nmicrosoft/phi-3.5-mini-128k-instruct | paid\nsophosympatheia/midnight-rose-70b | paid\nminimax/minimax-m1 | paid\nminimax/minimax-01 | paid\nmistralai/mistral-large | paid\nmistralai/mistral-large-2407 | paid\nmistralai/mistral-large-2411 | paid\nmistralai/mistral-small | paid\nmistralai/mistral-tiny | paid\nmistralai/codestral-2501 | paid\nmistralai/codestral-2508 | paid\nmistralai/devstral-medium | paid\nmistralai/devstral-small | paid\nmistralai/devstral-small-2505 | paid\nmistralai/devstral-small-2505:free | free\nmistralai/magistral-medium-2506 | paid\nmistralai/magistral-medium-2506:thinking | paid\nmistralai/magistral-small-2506 | paid\nmistralai/ministral-3b | paid\nmistralai/ministral-8b | paid\nmistralai/mistral-7b-instruct | paid\nmistralai/mistral-7b-instruct:free | free\nmistralai/mistral-7b-instruct-v0.1 | paid\nmistralai/mistral-7b-instruct-v0.2 | paid\nmistralai/mistral-7b-instruct-v0.3 | paid\nmistralai/mistral-medium-3 | paid\nmistralai/mistral-nemo | paid\nmistralai/mistral-nemo:free | free\nmistralai/mistral-small-24b-instruct-2501 | paid\nmistralai/mistral-small-24b-instruct-2501:free | free\nmistralai/mistral-small-3.1-24b-instruct | paid\nmistralai/mistral-small-3.1-24b-instruct:free | free\nmistralai/mistral-small-3.2-24b-instruct | paid\nmistralai/mistral-small-3.2-24b-instruct:free | free\nmistralai/mixtral-8x22b-instruct | paid\nmistralai/mixtral-8x7b-instruct | paid\nmistralai/pixtral-12b | paid\nmistralai/pixtral-large-2411 | paid\nmistralai/mistral-saba | paid\nmoonshotai/kimi-vl-a3b-thinking | paid\nmoonshotai/kimi-vl-a3b-thinking:free | free\nmoonshotai/kimi-k2 | paid\nmoonshotai/kimi-k2:free | free\nmorph/morph-v3-fast | paid\nmorph/morph-v3-large | paid\ngryphe/mythomax-l2-13b | paid\nneversleep/llama-3-lumimaid-70b | paid\nneversleep/llama-3.1-lumimaid-8b | paid\nneversleep/noromaid-20b | paid\nnousresearch/deephermes-3-llama-3-8b-preview:free | free\nnousresearch/deephermes-3-mistral-24b-preview | paid\nnousresearch/nous-hermes-2-mixtral-8x7b-dpo | paid\nnousresearch/hermes-3-llama-3.1-405b | paid\nnousresearch/hermes-3-llama-3.1-70b | paid\nnousresearch/hermes-2-pro-llama-3-8b | paid\nnvidia/llama-3.1-nemotron-70b-instruct | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1 | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1:free | free\nnvidia/llama-3.3-nemotron-super-49b-v1 | paid\nopenai/chatgpt-4o-latest | paid\nopenai/codex-mini | paid\nopenai/gpt-3.5-turbo | paid\nopenai/gpt-3.5-turbo-0613 | paid\nopenai/gpt-3.5-turbo-16k | paid\nopenai/gpt-3.5-turbo-instruct | paid\nopenai/gpt-4 | paid\nopenai/gpt-4-0314 | paid\nopenai/gpt-4-turbo | paid\nopenai/gpt-4-1106-preview | paid\nopenai/gpt-4-turbo-preview | paid\nopenai/gpt-4.1 | paid\nopenai/gpt-4.1-mini | paid\nopenai/gpt-4.1-nano | paid\nopenai/gpt-4o | paid\nopenai/gpt-4o-2024-05-13 | paid\nopenai/gpt-4o-2024-08-06 | paid\nopenai/gpt-4o-2024-11-20 | paid\nopenai/gpt-4o:extended | paid\nopenai/gpt-4o-search-preview | paid\nopenai/gpt-4o-mini | paid\nopenai/gpt-4o-mini-2024-07-18 | paid\nopenai/gpt-4o-mini-search-preview | paid\nopenai/gpt-5 | paid\nopenai/gpt-5-chat | paid\nopenai/gpt-5-mini | paid\nopenai/gpt-5-nano | paid\nopenai/gpt-oss-120b | paid\nopenai/gpt-oss-20b | paid\nopenai/gpt-oss-20b:free | free\nopenai/o1 | paid\nopenai/o1-mini | paid\nopenai/o1-mini-2024-09-12 | paid\nopenai/o1-pro | paid\nopenai/o3 | paid\nopenai/o3-mini | paid\nopenai/o3-mini-high | paid\nopenai/o3-pro | paid\nopenai/o4-mini | paid\nopenai/o4-mini-high | paid\nopengvlab/internvl3-14b | paid\nperplexity/r1-1776 | paid\nperplexity/sonar | paid\nperplexity/sonar-deep-research | paid\nperplexity/sonar-pro | paid\nperplexity/sonar-reasoning | paid\nperplexity/sonar-reasoning-pro | paid\npygmalionai/mythalion-13b | paid\nfeatherless/qwerky-72b:free | free\nqwen/qwen-2-72b-instruct | paid\nqwen/qwen-vl-max | paid\nqwen/qwen-vl-plus | paid\nqwen/qwen-max | paid\nqwen/qwen-plus | paid\nqwen/qwen-turbo | paid\nqwen/qwen2.5-vl-32b-instruct | paid\nqwen/qwen2.5-vl-32b-instruct:free | free\nqwen/qwen2.5-vl-72b-instruct | paid\nqwen/qwen2.5-vl-72b-instruct:free | free\nqwen/qwen-2.5-vl-7b-instruct | paid\nqwen/qwen3-14b | paid\nqwen/qwen3-14b:free | free\nqwen/qwen3-235b-a22b | paid\nqwen/qwen3-235b-a22b:free | free\nqwen/qwen3-235b-a22b-2507 | paid\nqwen/qwen3-235b-a22b-thinking-2507 | paid\nqwen/qwen3-30b-a3b | paid\nqwen/qwen3-30b-a3b:free | free\nqwen/qwen3-30b-a3b-instruct-2507 | paid\nqwen/qwen3-32b | paid\nqwen/qwen3-4b:free | free\nqwen/qwen3-8b | paid\nqwen/qwen3-8b:free | free\nqwen/qwen3-coder | paid\nqwen/qwq-32b | paid\nqwen/qwq-32b:free | free\nqwen/qwq-32b-preview | paid\nqwen/qwen-2.5-72b-instruct | paid\nqwen/qwen-2.5-72b-instruct:free | free\nqwen/qwen-2.5-7b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct:free | free\nrekaai/reka-flash-3:free | free\nundi95/remm-slerp-l2-13b | paid\nsao10k/l3-lunaris-8b | paid\nsao10k/l3-euryale-70b | paid\nsao10k/l3.1-euryale-70b | paid\nsao10k/l3.3-euryale-70b | paid\nsarvamai/sarvam-m:free | free\nshisa-ai/shisa-v2-llama3.3-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b:free | free\nraifle/sorcererlm-8x22b | paid\nswitchpoint/router | paid\ntencent/hunyuan-a13b-instruct | paid\ntencent/hunyuan-a13b-instruct:free | free\nthedrummer/anubis-70b-v1.1 | paid\nthedrummer/anubis-pro-105b-v1 | paid\nthedrummer/rocinante-12b | paid\nthedrummer/skyfall-36b-v2 | paid\nthedrummer/unslopnemo-12b | paid\nthedrummer/valkyrie-49b-v1 | paid\nthudm/glm-4-32b | paid\nthudm/glm-4.1v-9b-thinking | paid\nthudm/glm-z1-32b:free | free\ntngtech/deepseek-r1t-chimera | paid\ntngtech/deepseek-r1t-chimera:free | free\ntngtech/deepseek-r1t2-chimera:free | free\nscb10x/llama3.1-typhoon2-70b-instruct | paid\ncognitivecomputations/dolphin-mistral-24b-venice-edition:free | free\nmicrosoft/wizardlm-2-8x22b | paid\nx-ai/grok-2-1212 | paid\nx-ai/grok-2-vision-1212 | paid\nx-ai/grok-3 | paid\nx-ai/grok-3-beta | paid\nx-ai/grok-3-mini | paid\nx-ai/grok-3-mini-beta | paid\nx-ai/grok-4 | paid\nx-ai/grok-vision-beta | paid\nz-ai/glm-4-32b | paid\nz-ai/glm-4.5 | paid\nz-ai/glm-4.5-air | paid\nz-ai/glm-4.5-air:free | free\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenAI models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nbabbage-002\nchatgpt-4o-latest\ncodex-mini-latest\ndall-e-2\ndall-e-3\ndavinci-002\ngpt-3.5-turbo\ngpt-3.5-turbo-0125\ngpt-3.5-turbo-1106\ngpt-3.5-turbo-16k\ngpt-3.5-turbo-instruct\ngpt-3.5-turbo-instruct-0914\ngpt-4\ngpt-4-0125-preview\ngpt-4-0613\ngpt-4-1106-preview\ngpt-4-turbo\ngpt-4-turbo-2024-04-09\ngpt-4-turbo-preview\ngpt-4.1\ngpt-4.1-2025-04-14\ngpt-4.1-mini\ngpt-4.1-mini-2025-04-14\ngpt-4.1-nano\ngpt-4.1-nano-2025-04-14\ngpt-4o\ngpt-4o-2024-05-13\ngpt-4o-2024-08-06\ngpt-4o-2024-11-20\ngpt-4o-audio-preview\ngpt-4o-audio-preview-2024-10-01\ngpt-4o-audio-preview-2024-12-17\ngpt-4o-audio-preview-2025-06-03\ngpt-4o-mini\ngpt-4o-mini-2024-07-18\ngpt-4o-mini-audio-preview\ngpt-4o-mini-audio-preview-2024-12-17\ngpt-4o-mini-realtime-preview\ngpt-4o-mini-realtime-preview-2024-12-17\ngpt-4o-mini-search-preview\ngpt-4o-mini-search-preview-2025-03-11\ngpt-4o-mini-transcribe\ngpt-4o-mini-tts\ngpt-4o-realtime-preview\ngpt-4o-realtime-preview-2024-10-01\ngpt-4o-realtime-preview-2024-12-17\ngpt-4o-realtime-preview-2025-06-03\ngpt-4o-search-preview\ngpt-4o-search-preview-2025-03-11\ngpt-4o-transcribe\ngpt-5\ngpt-5-2025-08-07\ngpt-5-chat-latest\ngpt-5-mini\ngpt-5-mini-2025-08-07\ngpt-5-nano\ngpt-5-nano-2025-08-07\ngpt-image-1\no1\no1-2024-12-17\no1-mini\no1-mini-2024-09-12\no1-pro\no1-pro-2025-03-19\no3\no3-2025-04-16\no3-mini\no3-mini-2025-01-31\no4-mini\no4-mini-2025-04-16\no4-mini-deep-research\no4-mini-deep-research-2025-06-26\nomni-moderation-2024-09-26\nomni-moderation-latest\ntext-embedding-3-large\ntext-embedding-3-small\ntext-embedding-ada-002\ntts-1\ntts-1-1106\ntts-1-hd\ntts-1-hd-1106\nwhisper-1\n-----\n\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m Deepseek models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\ndeepseek-chat\ndeepseek-reasoner\n-----\n" }, "router": { "type": "string", @@ -174,6 +174,11 @@ "default": false, "description": "Enable streaming (verbose LLM output)" }, + "alt": { + "type": "boolean", + "default": false, + "description": "Use alternate tokenizer & instead of $" + }, "env": { "type": "string", "default": "default", diff --git a/packages/kbot/schema_ui.json b/packages/kbot/schema_ui.json index 6f714873..c4b20236 100644 --- a/packages/kbot/schema_ui.json +++ b/packages/kbot/schema_ui.json @@ -79,7 +79,7 @@ "ui:title": "Api_key" }, "model": { - "ui:description": "AI model to use for processing. Available models:\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenRouter models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nagentica-org/deepcoder-14b-preview | paid\nagentica-org/deepcoder-14b-preview:free | free\nai21/jamba-1.6-large | paid\nai21/jamba-1.6-mini | paid\naion-labs/aion-1.0 | paid\naion-labs/aion-1.0-mini | paid\naion-labs/aion-rp-llama-3.1-8b | paid\nalfredpros/codellama-7b-instruct-solidity | paid\namazon/nova-lite-v1 | paid\namazon/nova-micro-v1 | paid\namazon/nova-pro-v1 | paid\nanthropic/claude-3-haiku | paid\nanthropic/claude-3-haiku:beta | paid\nanthropic/claude-3-opus | paid\nanthropic/claude-3-opus:beta | paid\nanthropic/claude-3.5-haiku | paid\nanthropic/claude-3.5-haiku-20241022 | paid\nanthropic/claude-3.5-haiku:beta | paid\nanthropic/claude-3.5-sonnet | paid\nanthropic/claude-3.5-sonnet-20240620 | paid\nanthropic/claude-3.5-sonnet-20240620:beta | paid\nanthropic/claude-3.5-sonnet:beta | paid\nanthropic/claude-3.7-sonnet | paid\nanthropic/claude-3.7-sonnet:beta | paid\nanthropic/claude-3.7-sonnet:thinking | paid\nanthropic/claude-opus-4 | paid\nanthropic/claude-opus-4.1 | paid\nanthropic/claude-sonnet-4 | paid\narcee-ai/coder-large | paid\narcee-ai/maestro-reasoning | paid\narcee-ai/spotlight | paid\narcee-ai/virtuoso-large | paid\narliai/qwq-32b-arliai-rpr-v1 | paid\narliai/qwq-32b-arliai-rpr-v1:free | free\nopenrouter/auto | paid\nbaidu/ernie-4.5-300b-a47b | paid\nbytedance/ui-tars-1.5-7b | paid\ncohere/command | paid\ncohere/command-a | paid\ncohere/command-r | paid\ncohere/command-r-03-2024 | paid\ncohere/command-r-08-2024 | paid\ncohere/command-r-plus | paid\ncohere/command-r-plus-04-2024 | paid\ncohere/command-r-plus-08-2024 | paid\ncohere/command-r7b-12-2024 | paid\ndeepseek/deepseek-prover-v2 | paid\ndeepseek/deepseek-r1-0528-qwen3-8b | paid\ndeepseek/deepseek-r1-0528-qwen3-8b:free | free\ndeepseek/deepseek-chat | paid\ndeepseek/deepseek-chat-v3-0324 | paid\ndeepseek/deepseek-chat-v3-0324:free | free\ndeepseek/deepseek-v3-base | paid\ndeepseek/deepseek-r1 | paid\ndeepseek/deepseek-r1:free | free\ndeepseek/deepseek-r1-0528 | paid\ndeepseek/deepseek-r1-0528:free | free\ndeepseek/deepseek-r1-distill-llama-70b | paid\ndeepseek/deepseek-r1-distill-llama-70b:free | free\ndeepseek/deepseek-r1-distill-llama-8b | paid\ndeepseek/deepseek-r1-distill-qwen-1.5b | paid\ndeepseek/deepseek-r1-distill-qwen-14b | paid\ndeepseek/deepseek-r1-distill-qwen-14b:free | free\ndeepseek/deepseek-r1-distill-qwen-32b | paid\ndeepseek/deepseek-r1-distill-qwen-7b | paid\ncognitivecomputations/dolphin-mixtral-8x22b | paid\ncognitivecomputations/dolphin3.0-mistral-24b | paid\ncognitivecomputations/dolphin3.0-mistral-24b:free | free\ncognitivecomputations/dolphin3.0-r1-mistral-24b | paid\ncognitivecomputations/dolphin3.0-r1-mistral-24b:free | free\neleutherai/llemma_7b | paid\nsao10k/fimbulvetr-11b-v2 | paid\nalpindale/goliath-120b | paid\ngoogle/gemini-flash-1.5 | paid\ngoogle/gemini-flash-1.5-8b | paid\ngoogle/gemini-pro-1.5 | paid\ngoogle/gemini-2.0-flash-001 | paid\ngoogle/gemini-2.0-flash-exp:free | free\ngoogle/gemini-2.0-flash-lite-001 | paid\ngoogle/gemini-2.5-flash | paid\ngoogle/gemini-2.5-flash-lite | paid\ngoogle/gemini-2.5-flash-lite-preview-06-17 | paid\ngoogle/gemini-2.5-pro | paid\ngoogle/gemini-2.5-pro-exp-03-25 | paid\ngoogle/gemini-2.5-pro-preview-05-06 | paid\ngoogle/gemini-2.5-pro-preview | paid\ngoogle/gemma-2-27b-it | paid\ngoogle/gemma-2-9b-it | paid\ngoogle/gemma-2-9b-it:free | free\ngoogle/gemma-3-12b-it | paid\ngoogle/gemma-3-12b-it:free | free\ngoogle/gemma-3-27b-it | paid\ngoogle/gemma-3-27b-it:free | free\ngoogle/gemma-3-4b-it | paid\ngoogle/gemma-3-4b-it:free | free\ngoogle/gemma-3n-e2b-it:free | free\ngoogle/gemma-3n-e4b-it | paid\ngoogle/gemma-3n-e4b-it:free | free\nopenrouter/horizon-beta | paid\ninception/mercury | paid\ninception/mercury-coder | paid\ninfermatic/mn-inferor-12b | paid\ninflection/inflection-3-pi | paid\ninflection/inflection-3-productivity | paid\nmoonshotai/kimi-dev-72b:free | free\nliquid/lfm-3b | paid\nliquid/lfm-40b | paid\nliquid/lfm-7b | paid\nmeta-llama/llama-guard-3-8b | paid\nanthracite-org/magnum-v2-72b | paid\nanthracite-org/magnum-v4-72b | paid\nmancer/weaver | paid\nmeta-llama/llama-3-70b-instruct | paid\nmeta-llama/llama-3-8b-instruct | paid\nmeta-llama/llama-3.1-405b | paid\nmeta-llama/llama-3.1-405b-instruct | paid\nmeta-llama/llama-3.1-405b-instruct:free | free\nmeta-llama/llama-3.1-70b-instruct | paid\nmeta-llama/llama-3.1-8b-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct:free | free\nmeta-llama/llama-3.2-1b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct:free | free\nmeta-llama/llama-3.2-90b-vision-instruct | paid\nmeta-llama/llama-3.3-70b-instruct | paid\nmeta-llama/llama-3.3-70b-instruct:free | free\nmeta-llama/llama-4-maverick | paid\nmeta-llama/llama-4-scout | paid\nmeta-llama/llama-guard-4-12b | paid\nmeta-llama/llama-guard-2-8b | paid\nmicrosoft/mai-ds-r1 | paid\nmicrosoft/mai-ds-r1:free | free\nmicrosoft/phi-4 | paid\nmicrosoft/phi-4-multimodal-instruct | paid\nmicrosoft/phi-4-reasoning-plus | paid\nmicrosoft/phi-3-medium-128k-instruct | paid\nmicrosoft/phi-3-mini-128k-instruct | paid\nmicrosoft/phi-3.5-mini-128k-instruct | paid\nsophosympatheia/midnight-rose-70b | paid\nminimax/minimax-m1 | paid\nminimax/minimax-01 | paid\nmistralai/mistral-large | paid\nmistralai/mistral-large-2407 | paid\nmistralai/mistral-large-2411 | paid\nmistralai/mistral-small | paid\nmistralai/mistral-tiny | paid\nmistralai/codestral-2501 | paid\nmistralai/codestral-2508 | paid\nmistralai/devstral-medium | paid\nmistralai/devstral-small | paid\nmistralai/devstral-small-2505 | paid\nmistralai/devstral-small-2505:free | free\nmistralai/magistral-medium-2506 | paid\nmistralai/magistral-medium-2506:thinking | paid\nmistralai/magistral-small-2506 | paid\nmistralai/ministral-3b | paid\nmistralai/ministral-8b | paid\nmistralai/mistral-7b-instruct | paid\nmistralai/mistral-7b-instruct:free | free\nmistralai/mistral-7b-instruct-v0.1 | paid\nmistralai/mistral-7b-instruct-v0.2 | paid\nmistralai/mistral-7b-instruct-v0.3 | paid\nmistralai/mistral-medium-3 | paid\nmistralai/mistral-nemo | paid\nmistralai/mistral-nemo:free | free\nmistralai/mistral-small-24b-instruct-2501 | paid\nmistralai/mistral-small-24b-instruct-2501:free | free\nmistralai/mistral-small-3.1-24b-instruct | paid\nmistralai/mistral-small-3.1-24b-instruct:free | free\nmistralai/mistral-small-3.2-24b-instruct | paid\nmistralai/mistral-small-3.2-24b-instruct:free | free\nmistralai/mixtral-8x22b-instruct | paid\nmistralai/mixtral-8x7b-instruct | paid\nmistralai/pixtral-12b | paid\nmistralai/pixtral-large-2411 | paid\nmistralai/mistral-saba | paid\nmoonshotai/kimi-vl-a3b-thinking | paid\nmoonshotai/kimi-vl-a3b-thinking:free | free\nmoonshotai/kimi-k2 | paid\nmoonshotai/kimi-k2:free | free\nmorph/morph-v3-fast | paid\nmorph/morph-v3-large | paid\ngryphe/mythomax-l2-13b | paid\nneversleep/llama-3-lumimaid-70b | paid\nneversleep/llama-3.1-lumimaid-8b | paid\nneversleep/noromaid-20b | paid\nnousresearch/deephermes-3-llama-3-8b-preview:free | free\nnousresearch/deephermes-3-mistral-24b-preview | paid\nnousresearch/nous-hermes-2-mixtral-8x7b-dpo | paid\nnousresearch/hermes-3-llama-3.1-405b | paid\nnousresearch/hermes-3-llama-3.1-70b | paid\nnousresearch/hermes-2-pro-llama-3-8b | paid\nnvidia/llama-3.1-nemotron-70b-instruct | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1 | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1:free | free\nnvidia/llama-3.3-nemotron-super-49b-v1 | paid\nopenai/chatgpt-4o-latest | paid\nopenai/codex-mini | paid\nopenai/gpt-oss-120b | paid\nopenai/gpt-oss-20b | paid\nopenai/gpt-3.5-turbo | paid\nopenai/gpt-3.5-turbo-0613 | paid\nopenai/gpt-3.5-turbo-16k | paid\nopenai/gpt-3.5-turbo-instruct | paid\nopenai/gpt-4 | paid\nopenai/gpt-4-0314 | paid\nopenai/gpt-4-turbo | paid\nopenai/gpt-4-1106-preview | paid\nopenai/gpt-4-turbo-preview | paid\nopenai/gpt-4.1 | paid\nopenai/gpt-4.1-mini | paid\nopenai/gpt-4.1-nano | paid\nopenai/gpt-4o | paid\nopenai/gpt-4o-2024-05-13 | paid\nopenai/gpt-4o-2024-08-06 | paid\nopenai/gpt-4o-2024-11-20 | paid\nopenai/gpt-4o:extended | paid\nopenai/gpt-4o-search-preview | paid\nopenai/gpt-4o-mini | paid\nopenai/gpt-4o-mini-2024-07-18 | paid\nopenai/gpt-4o-mini-search-preview | paid\nopenai/o1 | paid\nopenai/o1-mini | paid\nopenai/o1-mini-2024-09-12 | paid\nopenai/o1-pro | paid\nopenai/o3 | paid\nopenai/o3-mini | paid\nopenai/o3-mini-high | paid\nopenai/o3-pro | paid\nopenai/o4-mini | paid\nopenai/o4-mini-high | paid\nopengvlab/internvl3-14b | paid\nperplexity/r1-1776 | paid\nperplexity/sonar | paid\nperplexity/sonar-deep-research | paid\nperplexity/sonar-pro | paid\nperplexity/sonar-reasoning | paid\nperplexity/sonar-reasoning-pro | paid\npygmalionai/mythalion-13b | paid\nfeatherless/qwerky-72b:free | free\nqwen/qwen-2-72b-instruct | paid\nqwen/qwen-vl-max | paid\nqwen/qwen-vl-plus | paid\nqwen/qwen-max | paid\nqwen/qwen-plus | paid\nqwen/qwen-turbo | paid\nqwen/qwen2.5-vl-32b-instruct | paid\nqwen/qwen2.5-vl-32b-instruct:free | free\nqwen/qwen2.5-vl-72b-instruct | paid\nqwen/qwen2.5-vl-72b-instruct:free | free\nqwen/qwen-2.5-vl-7b-instruct | paid\nqwen/qwen3-14b | paid\nqwen/qwen3-14b:free | free\nqwen/qwen3-235b-a22b | paid\nqwen/qwen3-235b-a22b:free | free\nqwen/qwen3-235b-a22b-2507 | paid\nqwen/qwen3-235b-a22b-thinking-2507 | paid\nqwen/qwen3-30b-a3b | paid\nqwen/qwen3-30b-a3b:free | free\nqwen/qwen3-30b-a3b-instruct-2507 | paid\nqwen/qwen3-32b | paid\nqwen/qwen3-4b:free | free\nqwen/qwen3-8b | paid\nqwen/qwen3-8b:free | free\nqwen/qwen3-coder | paid\nqwen/qwq-32b | paid\nqwen/qwq-32b:free | free\nqwen/qwq-32b-preview | paid\nqwen/qwen-2.5-72b-instruct | paid\nqwen/qwen-2.5-72b-instruct:free | free\nqwen/qwen-2.5-7b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct:free | free\nrekaai/reka-flash-3:free | free\nundi95/remm-slerp-l2-13b | paid\nsao10k/l3-lunaris-8b | paid\nsao10k/l3-euryale-70b | paid\nsao10k/l3.1-euryale-70b | paid\nsao10k/l3.3-euryale-70b | paid\nsarvamai/sarvam-m:free | free\nshisa-ai/shisa-v2-llama3.3-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b:free | free\nraifle/sorcererlm-8x22b | paid\nswitchpoint/router | paid\ntencent/hunyuan-a13b-instruct | paid\ntencent/hunyuan-a13b-instruct:free | free\nthedrummer/anubis-70b-v1.1 | paid\nthedrummer/anubis-pro-105b-v1 | paid\nthedrummer/rocinante-12b | paid\nthedrummer/skyfall-36b-v2 | paid\nthedrummer/unslopnemo-12b | paid\nthedrummer/valkyrie-49b-v1 | paid\nthudm/glm-4-32b | paid\nthudm/glm-4.1v-9b-thinking | paid\nthudm/glm-z1-32b:free | free\ntngtech/deepseek-r1t-chimera | paid\ntngtech/deepseek-r1t-chimera:free | free\ntngtech/deepseek-r1t2-chimera:free | free\nundi95/toppy-m-7b | paid\nscb10x/llama3.1-typhoon2-70b-instruct | paid\ncognitivecomputations/dolphin-mistral-24b-venice-edition:free | free\nmicrosoft/wizardlm-2-8x22b | paid\nx-ai/grok-2-1212 | paid\nx-ai/grok-2-vision-1212 | paid\nx-ai/grok-3 | paid\nx-ai/grok-3-beta | paid\nx-ai/grok-3-mini | paid\nx-ai/grok-3-mini-beta | paid\nx-ai/grok-4 | paid\nx-ai/grok-vision-beta | paid\nz-ai/glm-4-32b | paid\nz-ai/glm-4.5 | paid\nz-ai/glm-4.5-air | paid\nz-ai/glm-4.5-air:free | free\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenAI models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nbabbage-002\nchatgpt-4o-latest\ncodex-mini-latest\ndall-e-2\ndall-e-3\ndavinci-002\ngpt-3.5-turbo\ngpt-3.5-turbo-0125\ngpt-3.5-turbo-1106\ngpt-3.5-turbo-16k\ngpt-3.5-turbo-instruct\ngpt-3.5-turbo-instruct-0914\ngpt-4\ngpt-4-0125-preview\ngpt-4-0613\ngpt-4-1106-preview\ngpt-4-turbo\ngpt-4-turbo-2024-04-09\ngpt-4-turbo-preview\ngpt-4.1\ngpt-4.1-2025-04-14\ngpt-4.1-mini\ngpt-4.1-mini-2025-04-14\ngpt-4.1-nano\ngpt-4.1-nano-2025-04-14\ngpt-4o\ngpt-4o-2024-05-13\ngpt-4o-2024-08-06\ngpt-4o-2024-11-20\ngpt-4o-audio-preview\ngpt-4o-audio-preview-2024-10-01\ngpt-4o-audio-preview-2024-12-17\ngpt-4o-audio-preview-2025-06-03\ngpt-4o-mini\ngpt-4o-mini-2024-07-18\ngpt-4o-mini-audio-preview\ngpt-4o-mini-audio-preview-2024-12-17\ngpt-4o-mini-realtime-preview\ngpt-4o-mini-realtime-preview-2024-12-17\ngpt-4o-mini-search-preview\ngpt-4o-mini-search-preview-2025-03-11\ngpt-4o-mini-transcribe\ngpt-4o-mini-tts\ngpt-4o-realtime-preview\ngpt-4o-realtime-preview-2024-10-01\ngpt-4o-realtime-preview-2024-12-17\ngpt-4o-realtime-preview-2025-06-03\ngpt-4o-search-preview\ngpt-4o-search-preview-2025-03-11\ngpt-4o-transcribe\ngpt-image-1\no1\no1-2024-12-17\no1-mini\no1-mini-2024-09-12\no1-pro\no1-pro-2025-03-19\no3-mini\no3-mini-2025-01-31\no4-mini\no4-mini-2025-04-16\no4-mini-deep-research\no4-mini-deep-research-2025-06-26\nomni-moderation-2024-09-26\nomni-moderation-latest\ntext-embedding-3-large\ntext-embedding-3-small\ntext-embedding-ada-002\ntts-1\ntts-1-1106\ntts-1-hd\ntts-1-hd-1106\nwhisper-1\n-----\n\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m Deepseek models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\ndeepseek-chat\ndeepseek-reasoner\n-----\n", + "ui:description": "AI model to use for processing. Available models:\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenRouter models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nagentica-org/deepcoder-14b-preview | paid\nagentica-org/deepcoder-14b-preview:free | free\naion-labs/aion-1.0 | paid\naion-labs/aion-1.0-mini | paid\naion-labs/aion-rp-llama-3.1-8b | paid\nalfredpros/codellama-7b-instruct-solidity | paid\namazon/nova-lite-v1 | paid\namazon/nova-micro-v1 | paid\namazon/nova-pro-v1 | paid\nanthropic/claude-3-haiku | paid\nanthropic/claude-3-haiku:beta | paid\nanthropic/claude-3-opus | paid\nanthropic/claude-3-opus:beta | paid\nanthropic/claude-3.5-haiku | paid\nanthropic/claude-3.5-haiku-20241022 | paid\nanthropic/claude-3.5-haiku:beta | paid\nanthropic/claude-3.5-sonnet | paid\nanthropic/claude-3.5-sonnet-20240620 | paid\nanthropic/claude-3.5-sonnet-20240620:beta | paid\nanthropic/claude-3.5-sonnet:beta | paid\nanthropic/claude-3.7-sonnet | paid\nanthropic/claude-3.7-sonnet:beta | paid\nanthropic/claude-3.7-sonnet:thinking | paid\nanthropic/claude-opus-4 | paid\nanthropic/claude-opus-4.1 | paid\nanthropic/claude-sonnet-4 | paid\narcee-ai/coder-large | paid\narcee-ai/maestro-reasoning | paid\narcee-ai/spotlight | paid\narcee-ai/virtuoso-large | paid\narliai/qwq-32b-arliai-rpr-v1 | paid\narliai/qwq-32b-arliai-rpr-v1:free | free\nopenrouter/auto | paid\nbaidu/ernie-4.5-300b-a47b | paid\nbytedance/ui-tars-1.5-7b | paid\ncohere/command | paid\ncohere/command-a | paid\ncohere/command-r | paid\ncohere/command-r-03-2024 | paid\ncohere/command-r-08-2024 | paid\ncohere/command-r-plus | paid\ncohere/command-r-plus-04-2024 | paid\ncohere/command-r-plus-08-2024 | paid\ncohere/command-r7b-12-2024 | paid\ndeepseek/deepseek-prover-v2 | paid\ndeepseek/deepseek-r1-0528-qwen3-8b | paid\ndeepseek/deepseek-r1-0528-qwen3-8b:free | free\ndeepseek/deepseek-chat | paid\ndeepseek/deepseek-chat-v3-0324 | paid\ndeepseek/deepseek-chat-v3-0324:free | free\ndeepseek/deepseek-v3-base | paid\ndeepseek/deepseek-r1 | paid\ndeepseek/deepseek-r1:free | free\ndeepseek/deepseek-r1-0528 | paid\ndeepseek/deepseek-r1-0528:free | free\ndeepseek/deepseek-r1-distill-llama-70b | paid\ndeepseek/deepseek-r1-distill-llama-70b:free | free\ndeepseek/deepseek-r1-distill-llama-8b | paid\ndeepseek/deepseek-r1-distill-qwen-1.5b | paid\ndeepseek/deepseek-r1-distill-qwen-14b | paid\ndeepseek/deepseek-r1-distill-qwen-14b:free | free\ndeepseek/deepseek-r1-distill-qwen-32b | paid\ndeepseek/deepseek-r1-distill-qwen-7b | paid\ncognitivecomputations/dolphin-mixtral-8x22b | paid\ncognitivecomputations/dolphin3.0-mistral-24b | paid\ncognitivecomputations/dolphin3.0-mistral-24b:free | free\ncognitivecomputations/dolphin3.0-r1-mistral-24b | paid\ncognitivecomputations/dolphin3.0-r1-mistral-24b:free | free\neleutherai/llemma_7b | paid\nalpindale/goliath-120b | paid\ngoogle/gemini-flash-1.5 | paid\ngoogle/gemini-flash-1.5-8b | paid\ngoogle/gemini-pro-1.5 | paid\ngoogle/gemini-2.0-flash-001 | paid\ngoogle/gemini-2.0-flash-exp:free | free\ngoogle/gemini-2.0-flash-lite-001 | paid\ngoogle/gemini-2.5-flash | paid\ngoogle/gemini-2.5-flash-lite | paid\ngoogle/gemini-2.5-flash-lite-preview-06-17 | paid\ngoogle/gemini-2.5-pro | paid\ngoogle/gemini-2.5-pro-exp-03-25 | paid\ngoogle/gemini-2.5-pro-preview-05-06 | paid\ngoogle/gemini-2.5-pro-preview | paid\ngoogle/gemma-2-27b-it | paid\ngoogle/gemma-2-9b-it | paid\ngoogle/gemma-2-9b-it:free | free\ngoogle/gemma-3-12b-it | paid\ngoogle/gemma-3-12b-it:free | free\ngoogle/gemma-3-27b-it | paid\ngoogle/gemma-3-27b-it:free | free\ngoogle/gemma-3-4b-it | paid\ngoogle/gemma-3-4b-it:free | free\ngoogle/gemma-3n-e2b-it:free | free\ngoogle/gemma-3n-e4b-it | paid\ngoogle/gemma-3n-e4b-it:free | free\ninception/mercury | paid\ninception/mercury-coder | paid\ninfermatic/mn-inferor-12b | paid\ninflection/inflection-3-pi | paid\ninflection/inflection-3-productivity | paid\nmoonshotai/kimi-dev-72b:free | free\nliquid/lfm-3b | paid\nliquid/lfm-40b | paid\nliquid/lfm-7b | paid\nmeta-llama/llama-guard-3-8b | paid\nanthracite-org/magnum-v2-72b | paid\nanthracite-org/magnum-v4-72b | paid\nmancer/weaver | paid\nmeta-llama/llama-3-70b-instruct | paid\nmeta-llama/llama-3-8b-instruct | paid\nmeta-llama/llama-3.1-405b | paid\nmeta-llama/llama-3.1-405b-instruct | paid\nmeta-llama/llama-3.1-405b-instruct:free | free\nmeta-llama/llama-3.1-70b-instruct | paid\nmeta-llama/llama-3.1-8b-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct:free | free\nmeta-llama/llama-3.2-1b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct:free | free\nmeta-llama/llama-3.2-90b-vision-instruct | paid\nmeta-llama/llama-3.3-70b-instruct | paid\nmeta-llama/llama-3.3-70b-instruct:free | free\nmeta-llama/llama-4-maverick | paid\nmeta-llama/llama-4-scout | paid\nmeta-llama/llama-guard-4-12b | paid\nmeta-llama/llama-guard-2-8b | paid\nmicrosoft/mai-ds-r1 | paid\nmicrosoft/mai-ds-r1:free | free\nmicrosoft/phi-4 | paid\nmicrosoft/phi-4-multimodal-instruct | paid\nmicrosoft/phi-4-reasoning-plus | paid\nmicrosoft/phi-3-medium-128k-instruct | paid\nmicrosoft/phi-3-mini-128k-instruct | paid\nmicrosoft/phi-3.5-mini-128k-instruct | paid\nsophosympatheia/midnight-rose-70b | paid\nminimax/minimax-m1 | paid\nminimax/minimax-01 | paid\nmistralai/mistral-large | paid\nmistralai/mistral-large-2407 | paid\nmistralai/mistral-large-2411 | paid\nmistralai/mistral-small | paid\nmistralai/mistral-tiny | paid\nmistralai/codestral-2501 | paid\nmistralai/codestral-2508 | paid\nmistralai/devstral-medium | paid\nmistralai/devstral-small | paid\nmistralai/devstral-small-2505 | paid\nmistralai/devstral-small-2505:free | free\nmistralai/magistral-medium-2506 | paid\nmistralai/magistral-medium-2506:thinking | paid\nmistralai/magistral-small-2506 | paid\nmistralai/ministral-3b | paid\nmistralai/ministral-8b | paid\nmistralai/mistral-7b-instruct | paid\nmistralai/mistral-7b-instruct:free | free\nmistralai/mistral-7b-instruct-v0.1 | paid\nmistralai/mistral-7b-instruct-v0.2 | paid\nmistralai/mistral-7b-instruct-v0.3 | paid\nmistralai/mistral-medium-3 | paid\nmistralai/mistral-nemo | paid\nmistralai/mistral-nemo:free | free\nmistralai/mistral-small-24b-instruct-2501 | paid\nmistralai/mistral-small-24b-instruct-2501:free | free\nmistralai/mistral-small-3.1-24b-instruct | paid\nmistralai/mistral-small-3.1-24b-instruct:free | free\nmistralai/mistral-small-3.2-24b-instruct | paid\nmistralai/mistral-small-3.2-24b-instruct:free | free\nmistralai/mixtral-8x22b-instruct | paid\nmistralai/mixtral-8x7b-instruct | paid\nmistralai/pixtral-12b | paid\nmistralai/pixtral-large-2411 | paid\nmistralai/mistral-saba | paid\nmoonshotai/kimi-vl-a3b-thinking | paid\nmoonshotai/kimi-vl-a3b-thinking:free | free\nmoonshotai/kimi-k2 | paid\nmoonshotai/kimi-k2:free | free\nmorph/morph-v3-fast | paid\nmorph/morph-v3-large | paid\ngryphe/mythomax-l2-13b | paid\nneversleep/llama-3-lumimaid-70b | paid\nneversleep/llama-3.1-lumimaid-8b | paid\nneversleep/noromaid-20b | paid\nnousresearch/deephermes-3-llama-3-8b-preview:free | free\nnousresearch/deephermes-3-mistral-24b-preview | paid\nnousresearch/nous-hermes-2-mixtral-8x7b-dpo | paid\nnousresearch/hermes-3-llama-3.1-405b | paid\nnousresearch/hermes-3-llama-3.1-70b | paid\nnousresearch/hermes-2-pro-llama-3-8b | paid\nnvidia/llama-3.1-nemotron-70b-instruct | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1 | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1:free | free\nnvidia/llama-3.3-nemotron-super-49b-v1 | paid\nopenai/chatgpt-4o-latest | paid\nopenai/codex-mini | paid\nopenai/gpt-3.5-turbo | paid\nopenai/gpt-3.5-turbo-0613 | paid\nopenai/gpt-3.5-turbo-16k | paid\nopenai/gpt-3.5-turbo-instruct | paid\nopenai/gpt-4 | paid\nopenai/gpt-4-0314 | paid\nopenai/gpt-4-turbo | paid\nopenai/gpt-4-1106-preview | paid\nopenai/gpt-4-turbo-preview | paid\nopenai/gpt-4.1 | paid\nopenai/gpt-4.1-mini | paid\nopenai/gpt-4.1-nano | paid\nopenai/gpt-4o | paid\nopenai/gpt-4o-2024-05-13 | paid\nopenai/gpt-4o-2024-08-06 | paid\nopenai/gpt-4o-2024-11-20 | paid\nopenai/gpt-4o:extended | paid\nopenai/gpt-4o-search-preview | paid\nopenai/gpt-4o-mini | paid\nopenai/gpt-4o-mini-2024-07-18 | paid\nopenai/gpt-4o-mini-search-preview | paid\nopenai/gpt-5 | paid\nopenai/gpt-5-chat | paid\nopenai/gpt-5-mini | paid\nopenai/gpt-5-nano | paid\nopenai/gpt-oss-120b | paid\nopenai/gpt-oss-20b | paid\nopenai/gpt-oss-20b:free | free\nopenai/o1 | paid\nopenai/o1-mini | paid\nopenai/o1-mini-2024-09-12 | paid\nopenai/o1-pro | paid\nopenai/o3 | paid\nopenai/o3-mini | paid\nopenai/o3-mini-high | paid\nopenai/o3-pro | paid\nopenai/o4-mini | paid\nopenai/o4-mini-high | paid\nopengvlab/internvl3-14b | paid\nperplexity/r1-1776 | paid\nperplexity/sonar | paid\nperplexity/sonar-deep-research | paid\nperplexity/sonar-pro | paid\nperplexity/sonar-reasoning | paid\nperplexity/sonar-reasoning-pro | paid\npygmalionai/mythalion-13b | paid\nfeatherless/qwerky-72b:free | free\nqwen/qwen-2-72b-instruct | paid\nqwen/qwen-vl-max | paid\nqwen/qwen-vl-plus | paid\nqwen/qwen-max | paid\nqwen/qwen-plus | paid\nqwen/qwen-turbo | paid\nqwen/qwen2.5-vl-32b-instruct | paid\nqwen/qwen2.5-vl-32b-instruct:free | free\nqwen/qwen2.5-vl-72b-instruct | paid\nqwen/qwen2.5-vl-72b-instruct:free | free\nqwen/qwen-2.5-vl-7b-instruct | paid\nqwen/qwen3-14b | paid\nqwen/qwen3-14b:free | free\nqwen/qwen3-235b-a22b | paid\nqwen/qwen3-235b-a22b:free | free\nqwen/qwen3-235b-a22b-2507 | paid\nqwen/qwen3-235b-a22b-thinking-2507 | paid\nqwen/qwen3-30b-a3b | paid\nqwen/qwen3-30b-a3b:free | free\nqwen/qwen3-30b-a3b-instruct-2507 | paid\nqwen/qwen3-32b | paid\nqwen/qwen3-4b:free | free\nqwen/qwen3-8b | paid\nqwen/qwen3-8b:free | free\nqwen/qwen3-coder | paid\nqwen/qwq-32b | paid\nqwen/qwq-32b:free | free\nqwen/qwq-32b-preview | paid\nqwen/qwen-2.5-72b-instruct | paid\nqwen/qwen-2.5-72b-instruct:free | free\nqwen/qwen-2.5-7b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct:free | free\nrekaai/reka-flash-3:free | free\nundi95/remm-slerp-l2-13b | paid\nsao10k/l3-lunaris-8b | paid\nsao10k/l3-euryale-70b | paid\nsao10k/l3.1-euryale-70b | paid\nsao10k/l3.3-euryale-70b | paid\nsarvamai/sarvam-m:free | free\nshisa-ai/shisa-v2-llama3.3-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b:free | free\nraifle/sorcererlm-8x22b | paid\nswitchpoint/router | paid\ntencent/hunyuan-a13b-instruct | paid\ntencent/hunyuan-a13b-instruct:free | free\nthedrummer/anubis-70b-v1.1 | paid\nthedrummer/anubis-pro-105b-v1 | paid\nthedrummer/rocinante-12b | paid\nthedrummer/skyfall-36b-v2 | paid\nthedrummer/unslopnemo-12b | paid\nthedrummer/valkyrie-49b-v1 | paid\nthudm/glm-4-32b | paid\nthudm/glm-4.1v-9b-thinking | paid\nthudm/glm-z1-32b:free | free\ntngtech/deepseek-r1t-chimera | paid\ntngtech/deepseek-r1t-chimera:free | free\ntngtech/deepseek-r1t2-chimera:free | free\nscb10x/llama3.1-typhoon2-70b-instruct | paid\ncognitivecomputations/dolphin-mistral-24b-venice-edition:free | free\nmicrosoft/wizardlm-2-8x22b | paid\nx-ai/grok-2-1212 | paid\nx-ai/grok-2-vision-1212 | paid\nx-ai/grok-3 | paid\nx-ai/grok-3-beta | paid\nx-ai/grok-3-mini | paid\nx-ai/grok-3-mini-beta | paid\nx-ai/grok-4 | paid\nx-ai/grok-vision-beta | paid\nz-ai/glm-4-32b | paid\nz-ai/glm-4.5 | paid\nz-ai/glm-4.5-air | paid\nz-ai/glm-4.5-air:free | free\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenAI models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nbabbage-002\nchatgpt-4o-latest\ncodex-mini-latest\ndall-e-2\ndall-e-3\ndavinci-002\ngpt-3.5-turbo\ngpt-3.5-turbo-0125\ngpt-3.5-turbo-1106\ngpt-3.5-turbo-16k\ngpt-3.5-turbo-instruct\ngpt-3.5-turbo-instruct-0914\ngpt-4\ngpt-4-0125-preview\ngpt-4-0613\ngpt-4-1106-preview\ngpt-4-turbo\ngpt-4-turbo-2024-04-09\ngpt-4-turbo-preview\ngpt-4.1\ngpt-4.1-2025-04-14\ngpt-4.1-mini\ngpt-4.1-mini-2025-04-14\ngpt-4.1-nano\ngpt-4.1-nano-2025-04-14\ngpt-4o\ngpt-4o-2024-05-13\ngpt-4o-2024-08-06\ngpt-4o-2024-11-20\ngpt-4o-audio-preview\ngpt-4o-audio-preview-2024-10-01\ngpt-4o-audio-preview-2024-12-17\ngpt-4o-audio-preview-2025-06-03\ngpt-4o-mini\ngpt-4o-mini-2024-07-18\ngpt-4o-mini-audio-preview\ngpt-4o-mini-audio-preview-2024-12-17\ngpt-4o-mini-realtime-preview\ngpt-4o-mini-realtime-preview-2024-12-17\ngpt-4o-mini-search-preview\ngpt-4o-mini-search-preview-2025-03-11\ngpt-4o-mini-transcribe\ngpt-4o-mini-tts\ngpt-4o-realtime-preview\ngpt-4o-realtime-preview-2024-10-01\ngpt-4o-realtime-preview-2024-12-17\ngpt-4o-realtime-preview-2025-06-03\ngpt-4o-search-preview\ngpt-4o-search-preview-2025-03-11\ngpt-4o-transcribe\ngpt-5\ngpt-5-2025-08-07\ngpt-5-chat-latest\ngpt-5-mini\ngpt-5-mini-2025-08-07\ngpt-5-nano\ngpt-5-nano-2025-08-07\ngpt-image-1\no1\no1-2024-12-17\no1-mini\no1-mini-2024-09-12\no1-pro\no1-pro-2025-03-19\no3\no3-2025-04-16\no3-mini\no3-mini-2025-01-31\no4-mini\no4-mini-2025-04-16\no4-mini-deep-research\no4-mini-deep-research-2025-06-26\nomni-moderation-2024-09-26\nomni-moderation-latest\ntext-embedding-3-large\ntext-embedding-3-small\ntext-embedding-ada-002\ntts-1\ntts-1-1106\ntts-1-hd\ntts-1-hd-1106\nwhisper-1\n-----\n\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m Deepseek models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\ndeepseek-chat\ndeepseek-reasoner\n-----\n", "ui:title": "Model" }, "router": { @@ -128,6 +128,11 @@ "ui:title": "Stream", "ui:placeholder": false }, + "alt": { + "ui:description": "Use alternate tokenizer & instead of $", + "ui:title": "Alt", + "ui:placeholder": false + }, "env": { "ui:description": "Environment (in profile)", "ui:title": "Env", diff --git a/packages/kbot/src/commands/run-completion.ts b/packages/kbot/src/commands/run-completion.ts index 70fd247b..dc1f8ede 100644 --- a/packages/kbot/src/commands/run-completion.ts +++ b/packages/kbot/src/commands/run-completion.ts @@ -20,11 +20,10 @@ export const onCompletion = async (result: any = "", options: IKBotTask) => { MODEL: options.model ? path.parse(options.model).name : 'unknown_model', ROUTER: options.router || 'unknown_router', } - const dstPath = path.resolve(resolve(options.dst, false, vars)) + const dstPath = path.resolve(resolve(options.dst, options.alt, vars)) writeOrAppend(dstPath, result, options.append as E_AppendModeType) const action = options.append ? `${options.append} content to` : 'Wrote completion result to' options.logger?.debug(`${action} ${dstPath} : ${options.dst}`) - console.log(`wrote ${action} ${dstPath} : ${options.dst}`) } else { marked.use(markedTerminal({ emoji: false, diff --git a/packages/kbot/src/zod_schema.ts b/packages/kbot/src/zod_schema.ts index 3a3a64e9..f4942e80 100644 --- a/packages/kbot/src/zod_schema.ts +++ b/packages/kbot/src/zod_schema.ts @@ -229,6 +229,12 @@ export const OptionsSchema = (opts?: any): any => { .default(false) .describe('Enable streaming (verbose LLM output)') ) + .add( + 'alt', + z.boolean() + .default(false) + .describe('Use alternate tokenizer & instead of $') + ) .add( 'env', z.string() diff --git a/packages/kbot/src/zod_types.ts b/packages/kbot/src/zod_types.ts index 897e6b73..e2c4f309 100644 --- a/packages/kbot/src/zod_types.ts +++ b/packages/kbot/src/zod_types.ts @@ -33,8 +33,6 @@ export interface IKBotOptions {  agentica-org/deepcoder-14b-preview | paid agentica-org/deepcoder-14b-preview:free | free - ai21/jamba-1.6-large | paid - ai21/jamba-1.6-mini | paid aion-labs/aion-1.0 | paid aion-labs/aion-1.0-mini | paid aion-labs/aion-rp-llama-3.1-8b | paid @@ -102,7 +100,6 @@ export interface IKBotOptions { cognitivecomputations/dolphin3.0-r1-mistral-24b | paid cognitivecomputations/dolphin3.0-r1-mistral-24b:free | free eleutherai/llemma_7b | paid - sao10k/fimbulvetr-11b-v2 | paid alpindale/goliath-120b | paid google/gemini-flash-1.5 | paid google/gemini-flash-1.5-8b | paid @@ -129,7 +126,6 @@ export interface IKBotOptions { google/gemma-3n-e2b-it:free | free google/gemma-3n-e4b-it | paid google/gemma-3n-e4b-it:free | free - openrouter/horizon-beta | paid inception/mercury | paid inception/mercury-coder | paid infermatic/mn-inferor-12b | paid @@ -230,8 +226,6 @@ export interface IKBotOptions { nvidia/llama-3.3-nemotron-super-49b-v1 | paid openai/chatgpt-4o-latest | paid openai/codex-mini | paid - openai/gpt-oss-120b | paid - openai/gpt-oss-20b | paid openai/gpt-3.5-turbo | paid openai/gpt-3.5-turbo-0613 | paid openai/gpt-3.5-turbo-16k | paid @@ -253,6 +247,13 @@ export interface IKBotOptions { openai/gpt-4o-mini | paid openai/gpt-4o-mini-2024-07-18 | paid openai/gpt-4o-mini-search-preview | paid + openai/gpt-5 | paid + openai/gpt-5-chat | paid + openai/gpt-5-mini | paid + openai/gpt-5-nano | paid + openai/gpt-oss-120b | paid + openai/gpt-oss-20b | paid + openai/gpt-oss-20b:free | free openai/o1 | paid openai/o1-mini | paid openai/o1-mini-2024-09-12 | paid @@ -330,7 +331,6 @@ export interface IKBotOptions { tngtech/deepseek-r1t-chimera | paid tngtech/deepseek-r1t-chimera:free | free tngtech/deepseek-r1t2-chimera:free | free - undi95/toppy-m-7b | paid scb10x/llama3.1-typhoon2-70b-instruct | paid cognitivecomputations/dolphin-mistral-24b-venice-edition:free | free microsoft/wizardlm-2-8x22b | paid @@ -399,6 +399,13 @@ export interface IKBotOptions { gpt-4o-search-preview gpt-4o-search-preview-2025-03-11 gpt-4o-transcribe + gpt-5 + gpt-5-2025-08-07 + gpt-5-chat-latest + gpt-5-mini + gpt-5-mini-2025-08-07 + gpt-5-nano + gpt-5-nano-2025-08-07 gpt-image-1 o1 o1-2024-12-17 @@ -406,6 +413,8 @@ export interface IKBotOptions { o1-mini-2024-09-12 o1-pro o1-pro-2025-03-19 + o3 + o3-2025-04-16 o3-mini o3-mini-2025-01-31 o4-mini @@ -459,6 +468,8 @@ export interface IKBotOptions { logs?: string; /** Enable streaming (verbose LLM output) */ stream?: boolean; + /** Use alternate tokenizer & instead of $ */ + alt?: boolean; /** Environment (in profile) */ env?: string; variables?: { diff --git a/packages/media/commands/audio.js b/packages/media/commands/audio.js deleted file mode 100644 index da861d56..00000000 --- a/packages/media/commands/audio.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.register = exports.defaultOptions = void 0; -const __1 = require("../"); -const convert_1 = require("../lib/media/audio/convert"); -const _cli_1 = require("../_cli"); -const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }); -}; -exports.defaultOptions = defaultOptions; -let options = (yargs) => (0, exports.defaultOptions)(yargs); -const register = (cli) => { - return cli.command('video ', 'Convert video', options, (argv) => { - (0, _cli_1.defaults)(); - const options = (0, _cli_1.sanitizeVideo)(argv); - __1.logger.info("options " + argv.dst, options); - if (argv.verb = 'convert') { - return (0, convert_1.convert)(options); - } - }); -}; -exports.register = register; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29tbWFuZHMvYXVkaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkJBQTRCO0FBQzVCLHdEQUFvRDtBQUVwRCxrQ0FBaUQ7QUFHMUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQWZZLFFBQUEsY0FBYyxrQkFlMUI7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsSUFBQSxzQkFBYyxFQUFDLEtBQUssQ0FBQyxDQUFBO0FBRWpELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBbUIsRUFBRSxFQUFFO1FBQ2pGLElBQUEsZUFBUSxHQUFFLENBQUE7UUFDVixNQUFNLE9BQU8sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxDQUF5QixDQUFBO1FBQzNELFVBQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0MsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRTtZQUN2QixPQUFPLElBQUEsaUJBQU8sRUFBQyxPQUFPLENBQUMsQ0FBQTtTQUMxQjtJQUNMLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBVFksUUFBQSxRQUFRLFlBU3BCIn0= \ No newline at end of file diff --git a/packages/media/commands/common/sanitize-filename.d.ts b/packages/media/commands/common/sanitize-filename.d.ts deleted file mode 100644 index 48e5ab5d..00000000 --- a/packages/media/commands/common/sanitize-filename.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as CLI from 'yargs'; -export declare const register: (cli: CLI.Argv) => CLI.Argv<{ - input: string; -} & { - slugify: string; -} & { - debug: string; -} & { - dry: string; -}>; diff --git a/packages/media/commands/common/sanitize-filename.js b/packages/media/commands/common/sanitize-filename.js deleted file mode 100644 index e1d55b28..00000000 --- a/packages/media/commands/common/sanitize-filename.js +++ /dev/null @@ -1,69 +0,0 @@ -"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()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.register = void 0; -const path = require("path"); -const fs_1 = require("fs"); -const fs_2 = require("../../lib/fs"); -const __1 = require("../.."); -const sanitize = require("sanitize-filename"); -const filenamify = require('filenamify'); -const slugify = require('slugify'); -const defaultOptions = (yargs) => { - return yargs.option('input', { - default: './', - describe: 'The sources' - }).option('slugify', { - default: 'false', - describe: 'convert whitespaces to dashes, remove special ASCIs' - }).option('debug', { - default: 'false', - describe: 'debug messages' - }).option('dry', { - default: 'false', - describe: 'dry run, dont modify' - }); -}; -let options = (yargs) => defaultOptions(yargs); -const prep = (file) => { - const parts = path.parse(file); - const stats = (0, fs_1.lstatSync)(file); - if (stats.isFile()) { - console.log('p', parts); - // return parts.name.trim() + parts.ext.trim().split('.')[1].trim(); - return filenamify(parts.name + parts.ext); - } - return prep; -}; -// npm run build ; node ./build/main.js sanitize-filenames --input=. -const register = (cli) => { - return cli.command('sanitize-filename', 'Removes invalid chars in filenames', options, (argv) => __awaiter(void 0, void 0, void 0, function* () { - if (argv.help) { - return; - } - const _debug = argv.debug === 'true'; - const _dry = argv.dry === 'true'; - const src = path.resolve('' + argv.input); - _debug && __1.logger.info(`sanitize ${src}`); - if ((0, fs_1.existsSync)(src)) { - !_dry && sanitize(src); - if (argv.slugify === 'true') { - let _files = (0, fs_2.files)(src, '**/**').map(prep).map(slugify); - __1.logger.info('files', _files); - } - } - else { - _debug && __1.logger.error(`doesnt exists : ${src} `); - } - })); -}; -exports.register = register; -//# sourceMappingURL=sanitize-filename.js.map \ No newline at end of file diff --git a/packages/media/commands/common/sanitize-filename.js.map b/packages/media/commands/common/sanitize-filename.js.map deleted file mode 100644 index c79893c6..00000000 --- a/packages/media/commands/common/sanitize-filename.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sanitize-filename.js","sourceRoot":"","sources":["../../src/commands/common/sanitize-filename.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,6BAA6B;AAC7B,2BAA2C;AAC3C,qCAAqC;AAErC,6BAA+B;AAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACzC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAEnC,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,aAAa;KAC1B,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;QACjB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,qDAAqD;KAClE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;QACf,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,gBAAgB;KAC7B,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE;QACb,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,sBAAsB;KACnC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAEzD,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE;IAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,cAAS,EAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAC,KAAK,CAAC,CAAC;QAC/B,2EAA2E;QACnE,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;KAC7C;IACD,OAAO,IAAI,CAAC;AAChB,CAAC,CAAA;AAED,oEAAoE;AAC7D,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,oCAAoC,EAAE,OAAO,EAAE,CAAO,IAAmB,EAAE,EAAE;QACjH,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO;SAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,KAAM,MAAM,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,IAAI,UAAM,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;QACzC,IAAI,IAAA,eAAU,EAAC,GAAG,CAAC,EAAE;YAEjB,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE;gBACzB,IAAI,MAAM,GAAG,IAAA,UAAK,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxD,UAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;aAChC;SACJ;aAAM;YACH,MAAM,IAAI,UAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,GAAG,CAAC,CAAC;SACrD;IACL,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC;AAlBW,QAAA,QAAQ,YAkBnB"} \ No newline at end of file diff --git a/packages/media/commands/convert.js b/packages/media/commands/convert.js deleted file mode 100644 index f8458a99..00000000 --- a/packages/media/commands/convert.js +++ /dev/null @@ -1,42 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.register = exports.defaultOptions = void 0; -const __1 = require("../"); -const images_1 = require("../lib/media/images"); -const _cli_1 = require("../_cli"); -const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }); -}; -exports.defaultOptions = defaultOptions; -let options = (yargs) => (0, exports.defaultOptions)(yargs); -const register = (cli) => { - return cli.command('convert', 'Convert files', options, (argv) => { - (0, _cli_1.defaults)(); - const options = (0, _cli_1.sanitizeVideo)(argv); - options.debug && __1.logger.info("options " + argv.dst, options); - return (0, images_1.convert)(options); - }); -}; -exports.register = register; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kcy9jb252ZXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJCQUE0QjtBQUU1QixnREFFNEI7QUFFNUIsa0NBSWdCO0FBT1QsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUF2QlksUUFBQSxjQUFjLGtCQXVCMUI7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsSUFBQSxzQkFBYyxFQUFDLEtBQUssQ0FBQyxDQUFBO0FBRWpELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBbUIsRUFBRSxFQUFFO1FBQzVFLElBQUEsZUFBUSxHQUFFLENBQUE7UUFDVixNQUFNLE9BQU8sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxDQUFhLENBQUE7UUFDL0MsT0FBTyxDQUFDLEtBQUssSUFBSSxVQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzVELE9BQU8sSUFBQSxnQkFBTyxFQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNCLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBUFksUUFBQSxRQUFRLFlBT3BCIn0= \ No newline at end of file diff --git a/packages/media/commands/pdf2jpg.d.ts b/packages/media/commands/pdf2jpg.d.ts deleted file mode 100644 index e4aa7e05..00000000 --- a/packages/media/commands/pdf2jpg.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare const register: (cli: CLI.Argv) => any; diff --git a/packages/media/commands/pdf2jpg.js b/packages/media/commands/pdf2jpg.js deleted file mode 100644 index 05400291..00000000 --- a/packages/media/commands/pdf2jpg.js +++ /dev/null @@ -1,53 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.register = void 0; -const __1 = require("../"); -const path = require("path"); -const index_1 = require("../lib/process/index"); -const pMap = require("p-map"); -const fg = require('fast-glob'); -const defaultOptions = (yargs) => { - return yargs.option('input', { - default: './', - describe: 'The sources' - }).option('debug', { - default: 'false', - describe: 'Enable internal debug message' - }); -}; -let options = (yargs) => defaultOptions(yargs); -async function convertFiles(files) { - return pMap(files, (file) => { - const inParts = path.parse(file); - // magick convert leg.pdf -quality 100 -density 250 -trim -flatten -resize 200% -sharpen 0x1.0 leg.jpg - const promise = index_1.Helper.run(inParts.dir, 'convert', [ - `"${inParts.base}[0]"`, - '-quality 80', - '-density 250', - '-trim', - '-flatten', - '-sharpen 0x1.0', - `"${inParts.name}.jpg"` - ]); - return promise; - }, { concurrency: 1 }); -} -// node ./build/main.js pdf2jpg --input=../drawings -const register = (cli) => { - return cli.command('pdf2jpg', '', options, async (argv) => { - if (argv.help) { - return; - } - const src = path.resolve('' + argv.input); - if (argv.debug) { - __1.logger.debug(`Begin convert PDF files${src}`); - } - const files = fg.sync('*.pdf|*.PDF', { dot: true, cwd: src, absolute: true }); - await convertFiles(files); - if (argv.debug) { - __1.logger.debug(`Converted ${files.length} files`); - } - }); -}; -exports.register = register; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmMmpwZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kcy9wZGYyanBnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJCQUE0QjtBQUM1Qiw2QkFBNEI7QUFDNUIsZ0RBQTZDO0FBQzdDLDhCQUE2QjtBQUU3QixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7QUFFL0IsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUN2QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ3pCLE9BQU8sRUFBRSxJQUFJO1FBQ2IsUUFBUSxFQUFFLGFBQWE7S0FDMUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsT0FBTztRQUNoQixRQUFRLEVBQUUsK0JBQStCO0tBQzVDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQztBQUVGLElBQUksT0FBTyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFekQsS0FBSyxVQUFVLFlBQVksQ0FBQyxLQUFLO0lBQzdCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsc0dBQXNHO1FBQ3RHLE1BQU0sT0FBTyxHQUFHLGNBQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQ2pEO1lBQ0ksSUFBSSxPQUFPLENBQUMsSUFBSSxNQUFNO1lBQ3RCLGFBQWE7WUFDYixjQUFjO1lBQ2QsT0FBTztZQUNQLFVBQVU7WUFDVixnQkFBZ0I7WUFDaEIsSUFBSSxPQUFPLENBQUMsSUFBSSxPQUFPO1NBQzFCLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUMsRUFBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxtREFBbUQ7QUFDNUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUN0QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQW1CLEVBQUUsRUFBRTtRQUNyRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNaLFVBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDakQ7UUFDRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RSxNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDWixVQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUM7U0FDbkQ7SUFDTCxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQWJZLFFBQUEsUUFBUSxZQWFwQiJ9 \ No newline at end of file diff --git a/packages/media/commands/pdf2jpg.js.map b/packages/media/commands/pdf2jpg.js.map deleted file mode 100644 index fdde9d09..00000000 --- a/packages/media/commands/pdf2jpg.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pdf2jpg.js","sourceRoot":"","sources":["../src/commands/pdf2jpg.ts"],"names":[],"mappings":";;;AACA,2BAA6B;AAC7B,6BAA6B;AAC7B,gDAA8C;AAC9C,qCAAqC;AAErC,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEhC,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,aAAa;KAC1B,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;QACf,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,+BAA+B;KAC5C,CAAC,CAAA;AACN,CAAC,CAAC;AAEF,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAEzD,KAAK,UAAU,YAAY,CAAC,KAAK;IAC7B,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,sGAAsG;QACtG,MAAM,OAAO,GAAG,cAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EACjD;YACI,IAAI,OAAO,CAAC,IAAI,MAAM;YACtB,aAAa;YACb,cAAc;YACd,OAAO;YACP,UAAU;YACV,gBAAgB;YAChB,IAAI,OAAO,CAAC,IAAI,OAAO;SAC1B,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACnB,CAAC,EAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,mDAAmD;AAC5C,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE;QACrE,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO;SAAE;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,UAAM,CAAC,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;SACjD;QACD,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,UAAM,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;SACnD;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAbW,QAAA,QAAQ,YAanB"} \ No newline at end of file diff --git a/packages/media/commands/resize.d.ts b/packages/media/commands/resize.d.ts deleted file mode 100644 index 279bf080..00000000 --- a/packages/media/commands/resize.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare const defaultOptions: (yargs: CLI.Argv) => any; -export declare const register: (cli: CLI.Argv) => any; diff --git a/packages/media/commands/resize.js b/packages/media/commands/resize.js deleted file mode 100644 index d8e69519..00000000 --- a/packages/media/commands/resize.js +++ /dev/null @@ -1,71 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.register = exports.defaultOptions = void 0; -const index_1 = require("../index"); -const resize_1 = require("../lib/media/images/resize"); -const _cli_1 = require("../_cli"); -const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('percent', { - default: false, - describe: 'Resize image with percent', - type: 'number' - }).option('width', { - describe: 'Resize image with', - type: 'number' - }).option('height', { - describe: 'Resize image height', - type: 'number' - }).option('minHeight', { - describe: 'Resize image minimum height', - type: 'number' - }).option('minWidth', { - describe: 'Resize image minimum width', - type: 'number' - }).option('minSize', { - describe: 'Resize image size (bytes)', - type: 'number' - }).option('percent', { - describe: 'Resize image in percent (width)', - type: 'number' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }); -}; -exports.defaultOptions = defaultOptions; -let options = (yargs) => (0, exports.defaultOptions)(yargs); -const register = (cli) => { - return cli.command('resize', 'Resizes files', options, async (argv) => { - (0, _cli_1.defaults)(); - const options = (0, _cli_1.sanitize)(argv); - index_1.logger.setSettings({ - minLevel: options.logLevel - }); - index_1.logger.info("options " + argv.dst, options); - await (0, resize_1.resize)(options); - }); -}; -exports.register = register; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmRzL3Jlc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxvQ0FBaUM7QUFDakMsdURBRW1DO0FBRW5DLGtDQUdnQjtBQU1ULE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDOUMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUN2QixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFlBQVksRUFBRSxJQUFJO0tBQ3JCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsUUFBUSxFQUFFLGtCQUFrQjtLQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLGdDQUFnQztRQUMxQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHlDQUF5QztRQUNuRCxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNqQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx3QkFBd0I7UUFDbEMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDakIsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsMkJBQTJCO1FBQ3JDLElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUNoQixRQUFRLEVBQUUscUJBQXFCO1FBQy9CLElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO1FBQ25CLFFBQVEsRUFBRSw2QkFBNkI7UUFDdkMsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDbEIsUUFBUSxFQUFFLDRCQUE0QjtRQUN0QyxJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNqQixRQUFRLEVBQUUsMkJBQTJCO1FBQ3JDLElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLFFBQVEsRUFBRSxpQ0FBaUM7UUFDM0MsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDbEIsUUFBUSxFQUFFLHNDQUFzQztRQUNoRCxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxNQUFNO0tBQ2xCLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQWpEWSxRQUFBLGNBQWMsa0JBaUQxQjtBQUVELElBQUksT0FBTyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUUsQ0FBQyxJQUFBLHNCQUFjLEVBQUMsS0FBSyxDQUFDLENBQUE7QUFFakQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUN0QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQW1CLEVBQUUsRUFBRTtRQUNqRixJQUFBLGVBQVEsR0FBRSxDQUFBO1FBQ1YsTUFBTSxPQUFPLEdBQUcsSUFBQSxlQUFRLEVBQUMsSUFBSSxDQUFhLENBQUE7UUFDMUMsY0FBTSxDQUFDLFdBQVcsQ0FBQztZQUNmLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBZTtTQUNwQyxDQUFDLENBQUE7UUFDRixjQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzNDLE1BQU0sSUFBQSxlQUFNLEVBQUMsT0FBTyxDQUFDLENBQUE7SUFDekIsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFWWSxRQUFBLFFBQVEsWUFVcEIifQ== \ No newline at end of file diff --git a/packages/media/commands/svg2jpg.js b/packages/media/commands/svg2jpg.js deleted file mode 100644 index 015da15c..00000000 --- a/packages/media/commands/svg2jpg.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.register = void 0; -const debug_1 = require("@plastichub/core/debug"); -const path = require("path"); -const index_1 = require("../lib/process/index"); -const bluebird = require("bluebird"); -const fg = require('fast-glob'); -const defaultOptions = (yargs) => { - return yargs.option('input', { - default: './', - describe: 'The sources' - }).option('debug', { - default: 'false', - describe: 'Enable internal debug message' - }); -}; -let options = (yargs) => defaultOptions(yargs); -async function convertFiles(files) { - return bluebird.mapSeries(files, (file) => { - const inParts = path.parse(file); - const promise = index_1.Helper.run(inParts.dir, 'convert', [ - `"${inParts.base}"`, - '-quality 40', - '-sharpen 0x1.0', - `"${inParts.name}.jpg"` - ]); - return promise; - }); -} -//node ./build/main.js svg2jpg --input=../tests/svg/ -const register = (cli) => { - return cli.command('svg2jpg', '', options, async (argv) => { - if (argv.help) { - return; - } - const src = path.resolve('' + argv.input); - const files = fg.sync('*.svg|*.SVG', { dot: true, cwd: src, absolute: true }); - if (argv.debug) { - (0, debug_1.debug)(`Begin convert SVG files at ${src} ${files}`); - } - await convertFiles(files); - if (argv.debug) { - (0, debug_1.debug)(`Converted ${files.length} files`); - } - }); -}; -exports.register = register; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnMmpwZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kcy9zdmcyanBnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGtEQUE4QztBQUM5Qyw2QkFBNkI7QUFDN0IsZ0RBQThDO0FBQzlDLHFDQUFxQztBQUVyQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFaEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUN2QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ3pCLE9BQU8sRUFBRSxJQUFJO1FBQ2IsUUFBUSxFQUFFLGFBQWE7S0FDMUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsT0FBTztRQUNoQixRQUFRLEVBQUUsK0JBQStCO0tBQzVDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQztBQUVGLElBQUksT0FBTyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFekQsS0FBSyxVQUFVLFlBQVksQ0FBQyxLQUFLO0lBQzdCLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRTtRQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLGNBQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQ2pEO1lBQ0ksSUFBSSxPQUFPLENBQUMsSUFBSSxHQUFHO1lBQ25CLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIsSUFBSSxPQUFPLENBQUMsSUFBSSxPQUFPO1NBQzFCLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNELG9EQUFvRDtBQUU3QyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBbUIsRUFBRSxFQUFFO1FBQ3JFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUFFLE9BQU87U0FBRTtRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1osSUFBQSxhQUFLLEVBQUMsOEJBQThCLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsTUFBTSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1osSUFBQSxhQUFLLEVBQUMsYUFBYSxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQztTQUM1QztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBYlcsUUFBQSxRQUFRLFlBYW5CIn0= \ No newline at end of file diff --git a/packages/media/commands/svg2jpg.js.map b/packages/media/commands/svg2jpg.js.map deleted file mode 100644 index 29a7ba7e..00000000 --- a/packages/media/commands/svg2jpg.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"svg2jpg.js","sourceRoot":"","sources":["../src/commands/svg2jpg.ts"],"names":[],"mappings":";;;AACA,kDAA8C;AAC9C,6BAA6B;AAC7B,gDAA8C;AAC9C,qCAAqC;AAErC,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEhC,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,aAAa;KAC1B,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;QACf,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,+BAA+B;KAC5C,CAAC,CAAA;AACN,CAAC,CAAC;AAEF,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAEzD,KAAK,UAAU,YAAY,CAAC,KAAK;IAC7B,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,cAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EACjD;YACI,IAAI,OAAO,CAAC,IAAI,GAAG;YACnB,aAAa;YACb,gBAAgB;YAChB,IAAI,OAAO,CAAC,IAAI,OAAO;SAC1B,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;AACP,CAAC;AACD,oDAAoD;AAE7C,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE;QACrE,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO;SAAE;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAA,aAAK,EAAC,8BAA8B,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;SACvD;QACD,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAA,aAAK,EAAC,aAAa,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;SAC5C;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAbW,QAAA,QAAQ,YAanB"} \ No newline at end of file diff --git a/packages/media/commands/video.d.ts b/packages/media/commands/video.d.ts deleted file mode 100644 index 279bf080..00000000 --- a/packages/media/commands/video.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare const defaultOptions: (yargs: CLI.Argv) => any; -export declare const register: (cli: CLI.Argv) => any; diff --git a/packages/media/commands/video.js b/packages/media/commands/video.js deleted file mode 100644 index 3113cfdc..00000000 --- a/packages/media/commands/video.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.register = exports.defaultOptions = void 0; -const __1 = require("../"); -const video_1 = require("../lib/media/video"); -const _cli_1 = require("../_cli"); -const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }); -}; -exports.defaultOptions = defaultOptions; -let options = (yargs) => (0, exports.defaultOptions)(yargs); -const register = (cli) => { - return cli.command('video ', 'Convert video', options, async (argv) => { - (0, _cli_1.defaults)(); - const options = (0, _cli_1.sanitizeVideo)(argv); - __1.logger.info("options " + argv.dst, options); - if (options.verb == 'convert') { - return (0, video_1.convert)(options); - } - if (options.verb == 'merge') { - return (0, video_1.merge)(options); - } - }); -}; -exports.register = register; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29tbWFuZHMvdmlkZW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkJBQTRCO0FBQzVCLDhDQUFtRDtBQUNuRCxrQ0FBaUQ7QUFHMUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQWZZLFFBQUEsY0FBYyxrQkFlMUI7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsSUFBQSxzQkFBYyxFQUFDLEtBQUssQ0FBQyxDQUFBO0FBRWpELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFtQixFQUFFLEVBQUU7UUFDdkYsSUFBQSxlQUFRLEdBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLElBQUEsb0JBQWEsRUFBQyxJQUFJLENBQXlCLENBQUE7UUFDM0QsVUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFO1lBQzNCLE9BQU8sSUFBQSxlQUFPLEVBQUMsT0FBTyxDQUFDLENBQUE7U0FDMUI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFO1lBQ3pCLE9BQU8sSUFBQSxhQUFLLEVBQUMsT0FBTyxDQUFRLENBQUE7U0FDL0I7SUFDTCxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQVpZLFFBQUEsUUFBUSxZQVlwQiJ9 \ No newline at end of file diff --git a/packages/media/commands/watermark.d.ts b/packages/media/commands/watermark.d.ts deleted file mode 100644 index 279bf080..00000000 --- a/packages/media/commands/watermark.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare const defaultOptions: (yargs: CLI.Argv) => any; -export declare const register: (cli: CLI.Argv) => any; diff --git a/packages/media/commands/watermark.js b/packages/media/commands/watermark.js deleted file mode 100644 index 07db8bc8..00000000 --- a/packages/media/commands/watermark.js +++ /dev/null @@ -1,75 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.register = exports.defaultOptions = void 0; -const commons_1 = require("@polymech/commons"); -const index_1 = require("../index"); -const images_1 = require("../lib/media/images"); -const _cli_1 = require("../_cli"); -const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('percent', { - default: false, - describe: 'Resize image with percent', - type: 'number' - }).option('width', { - default: false, - describe: 'Resize image with', - type: 'number' - }).option('height', { - default: false, - describe: 'Resize image height', - type: 'number' - }).option('minHeight', { - describe: 'Resize image minimum height', - type: 'number' - }).option('minWidth', { - describe: 'Resize image minimum width', - type: 'number' - }).option('minSize', { - describe: 'Resize image size (bytes)', - type: 'number' - }).option('percent', { - describe: 'Resize image in percent (width)', - type: 'number' - }).option('key', { - describe: 'API Key', - type: 'string' - }); -}; -exports.defaultOptions = defaultOptions; -const options = (yargs) => (0, exports.defaultOptions)(yargs); -const register = (cli) => { - return cli.command('watermark', 'Remove watermark : FILE|GLOB', options, async (argv) => { - (0, _cli_1.defaults)(); - const options = (0, _cli_1.sanitize)(argv); - const config = (0, commons_1.CONFIG_DEFAULT)(); - if (!config.novita) { - index_1.logger.error("Novita key not found"); - return; - } - options.debug && index_1.logger.info("Watermark Options " + argv.dst, options); - return (0, images_1.watermark)({ ...options, key: config.novita.key }); - }); -}; -exports.register = register; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmRzL3dhdGVybWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FBa0Q7QUFFbEQsb0NBQWlDO0FBQ2pDLGdEQUU0QjtBQUU1QixrQ0FHZ0I7QUFNVCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ2hELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDekIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixZQUFZLEVBQUUsSUFBSTtLQUNuQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNmLFFBQVEsRUFBRSxrQkFBa0I7S0FDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDakIsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ25CLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNuQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSwyQkFBMkI7UUFDckMsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNqQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxtQkFBbUI7UUFDN0IsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUNsQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxxQkFBcUI7UUFDL0IsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUNyQixRQUFRLEVBQUUsNkJBQTZCO1FBQ3ZDLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDcEIsUUFBUSxFQUFFLDRCQUE0QjtRQUN0QyxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ25CLFFBQVEsRUFBRSwyQkFBMkI7UUFDckMsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNuQixRQUFRLEVBQUUsaUNBQWlDO1FBQzNDLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDZixRQUFRLEVBQUUsU0FBUztRQUNuQixJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQWxEWSxRQUFBLGNBQWMsa0JBa0QxQjtBQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUUsQ0FBQyxJQUFBLHNCQUFjLEVBQUMsS0FBSyxDQUFDLENBQUE7QUFFbkQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUN4QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLDhCQUE4QixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBbUIsRUFBRSxFQUFFO1FBQ3JHLElBQUEsZUFBUSxHQUFFLENBQUE7UUFDVixNQUFNLE9BQU8sR0FBRyxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQWEsQ0FBQTtRQUMxQyxNQUFNLE1BQU0sR0FBUSxJQUFBLHdCQUFjLEdBQUUsQ0FBQTtRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNsQixjQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDckMsT0FBTTtTQUNQO1FBQ0QsT0FBTyxDQUFDLEtBQUssSUFBSSxjQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDdEUsT0FBTyxJQUFBLGtCQUFTLEVBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQzFELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBWlksUUFBQSxRQUFRLFlBWXBCIn0= \ No newline at end of file diff --git a/packages/media/dist-in/commands/audio.d.ts b/packages/media/dist-in/commands/audio.d.ts index 3298fb71..e1914384 100644 --- a/packages/media/dist-in/commands/audio.d.ts +++ b/packages/media/dist-in/commands/audio.d.ts @@ -1,3 +1 @@ -import * as CLI from 'yargs'; -export declare const defaultOptions: (yargs: CLI.Argv) => any; -export declare const register: (cli: CLI.Argv) => any; +export declare const defaultOptions: (yargs: any) => any; diff --git a/packages/media/dist-in/commands/audio.js b/packages/media/dist-in/commands/audio.js index cba4ecbf..33e69bf4 100644 --- a/packages/media/dist-in/commands/audio.js +++ b/packages/media/dist-in/commands/audio.js @@ -1,6 +1,7 @@ -import { logger } from '../'; -import { convert } from '../lib/media/audio/convert'; -import { defaults, sanitizeVideo } from '../_cli'; +import { logger } from '../index.js'; +import { convert } from '../lib/media/audio/convert.js'; +import { cli } from '../main.js'; +import { defaults, sanitizeVideo } from '../_cli.js'; export const defaultOptions = (yargs) => { return yargs.option('src', { describe: 'FILE|FOLDER|GLOB', @@ -17,15 +18,12 @@ export const defaultOptions = (yargs) => { type: 'boolean' }); }; -let options = (yargs) => defaultOptions(yargs); -export const register = (cli) => { - return cli.command('video ', 'Convert video', options, (argv) => { - defaults(); - const options = sanitizeVideo(argv); - logger.info("options " + argv.dst, options); - if (argv.verb = 'convert') { - return convert(options); - } - }); -}; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYXVkaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFHakQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDOUMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUN2QixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFlBQVksRUFBRSxJQUFJO0tBQ3JCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsUUFBUSxFQUFFLGtCQUFrQjtLQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLGdDQUFnQztRQUMxQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHlDQUF5QztRQUNuRCxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXhELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtRQUNqRixRQUFRLEVBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQXlCLENBQUE7UUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzQyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDeEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0IsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBIn0= \ No newline at end of file +cli.command('video ', 'Convert video', defaultOptions, async (argv) => { + defaults(); + const options = sanitizeVideo(argv); + logger.info("options " + argv.dst, options); + if (options.verb == 'convert') { + return convert(options); + } +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYXVkaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNoQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUdwRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUNwQyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUVELEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO0lBQ3hFLFFBQVEsRUFBRSxDQUFBO0lBQ1YsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBeUIsQ0FBQTtJQUMzRCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzNDLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM1QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMzQixDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/packages/media/dist-in/commands/background-remove-bria.d.ts b/packages/media/dist-in/commands/background-remove-bria.d.ts index cf9c7b4b..fb79e26f 100644 --- a/packages/media/dist-in/commands/background-remove-bria.d.ts +++ b/packages/media/dist-in/commands/background-remove-bria.d.ts @@ -1,6 +1,6 @@ import * as CLI from 'yargs'; -export declare const defaultOptions: (yargs: CLI.Argv) => any; +export declare const defaultOptions: (yargs: CLI.Argv) => CLI.Argv; export declare const command = "background:remove:bria"; export declare const desc = "Remove background from images using Bria AI"; -export declare const builder: (yargs: CLI.Argv) => any; +export declare const builder: (yargs: CLI.Argv) => CLI.Argv; export declare function handler(argv: CLI.Arguments): Promise; diff --git a/packages/media/dist-in/commands/background-remove-bria.js b/packages/media/dist-in/commands/background-remove-bria.js index 516984fe..2031d234 100644 --- a/packages/media/dist-in/commands/background-remove-bria.js +++ b/packages/media/dist-in/commands/background-remove-bria.js @@ -2,56 +2,18 @@ import { CONFIG_DEFAULT } from '@polymech/commons'; import { logger } from '../index.js'; import { cli } from '../cli.js'; import { sanitize, defaults } from '../_cli.js'; -import { briaBackgroundRemove } from '../lib/media/images/background-remove-bria.js'; +import { toYargs } from '@polymech/commons'; +import { briaBackgroundRemove, BriaBackgroundRemoveOptionsSchema } from '../lib/media/images/background-remove-bria.js'; export const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }).option('cache', { - default: true, - describe: 'Skip processing if target file already exists', - type: 'boolean' - }).option('apiKey', { - describe: 'Bria API key (or set in config.bria.key)', - type: 'string' - }).option('sync', { - describe: 'Use synchronous processing (recommended)', - type: 'boolean', - default: true - }).option('contentModeration', { - describe: 'Enable content moderation', - type: 'boolean', - default: false - }).option('preserveAlpha', { - describe: 'Preserve alpha channel from input image', - type: 'boolean', - default: true - }).option('jpg', { - describe: 'Convert PNG output to JPG format and delete PNG', - type: 'boolean', - default: false + return toYargs(yargs, BriaBackgroundRemoveOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, { ...options, demandOption: true }); + default: + return yargs.option(key, options); + } + }) }); }; export const command = 'background:remove:bria'; @@ -59,7 +21,7 @@ export const desc = 'Remove background from images using Bria AI'; export const builder = defaultOptions; export async function handler(argv) { defaults(); - const options = sanitize(argv); + const options = BriaBackgroundRemoveOptionsSchema().parse(argv); logger.settings.minLevel = options.logLevel; const config = CONFIG_DEFAULT(); // Get API key from argument, environment variable, or config @@ -69,18 +31,15 @@ export async function handler(argv) { logger.info('Get your API key at: https://docs.bria.ai/'); process.exit(1); } - // Map CLI arguments to library options (using same names) - options.sync = argv.sync; - options.contentModeration = argv.contentModeration; - options.preserveAlpha = argv.preserveAlpha; - options.jpg = argv.jpg; + // The schema already parsed all the options correctly + const sanitizedOptions = sanitize(options); logger.info("Removing background with Bria AI options:", { - sync: options.sync, - contentModeration: options.contentModeration, - preserveAlpha: options.preserveAlpha, - files: options.srcInfo?.FILES?.length || 0 + sync: sanitizedOptions.sync, + contentModeration: sanitizedOptions.contentModeration, + preserveAlpha: sanitizedOptions.preserveAlpha, + files: sanitizedOptions.srcInfo?.FILES?.length || 0 }); - await briaBackgroundRemove(options); + await briaBackgroundRemove(sanitizedOptions); } cli.command(command, desc, builder, handler); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1yZW1vdmUtYnJpYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9iYWNrZ3JvdW5kLXJlbW92ZS1icmlhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDL0IsT0FBTyxFQUNILFFBQVEsRUFDUixRQUFRLEVBQ1gsTUFBTSxZQUFZLENBQUE7QUFFbkIsT0FBTyxFQUNILG9CQUFvQixFQUV2QixNQUFNLCtDQUErQyxDQUFBO0FBRXRELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQzlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDdkIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixZQUFZLEVBQUUsSUFBSTtLQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLFFBQVEsRUFBRSxrQkFBa0I7S0FDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxnQ0FBZ0M7UUFDMUMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx5Q0FBeUM7UUFDbkQsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx3QkFBd0I7UUFDbEMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDakIs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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1yZW1vdmUtYnJpYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9iYWNrZ3JvdW5kLXJlbW92ZS1icmlhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDL0IsT0FBTyxFQUNILFFBQVEsRUFDUixRQUFRLEVBQ1gsTUFBTSxZQUFZLENBQUE7QUFDbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRTNDLE9BQU8sRUFDSCxvQkFBb0IsRUFFcEIsaUNBQWlDLEVBQ3BDLE1BQU0sK0NBQStDLENBQUE7QUFFdEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDOUMsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLGlDQUFpQyxFQUFFLEVBQUU7UUFDdkQsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzVCLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ1YsS0FBSyxLQUFLO29CQUNOLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBQyxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtnQkFDbEU7b0JBQ0ksT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0tBQ0wsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDO0FBQ2hELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyw2Q0FBNkMsQ0FBQztBQUNsRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFDLElBQW1CO0lBQzdDLFFBQVEsRUFBRSxDQUFBO0lBQ1YsTUFBTSxPQUFPLEdBQUcsaUNBQWlDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFnQyxDQUFBO0lBQzlGLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFlLENBQUE7SUFDbEQsTUFBTSxNQUFNLEdBQVEsY0FBYyxFQUFFLENBQUE7SUFFcEMsNkRBQTZEO0lBQzdELE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQztJQUVuRixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0lBQXNJLENBQUMsQ0FBQztRQUNySixNQUFNLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBZ0MsQ0FBQTtJQUV6RSxNQUFNLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFO1FBQ3JELElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJO1FBQzNCLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLGlCQUFpQjtRQUNyRCxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsYUFBYTtRQUM3QyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztLQUN0RCxDQUFDLENBQUM7SUFFSCxNQUFNLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVELEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/packages/media/dist-in/commands/background-remove.d.ts b/packages/media/dist-in/commands/background-remove.d.ts index 0e1386be..2fbf5163 100644 --- a/packages/media/dist-in/commands/background-remove.d.ts +++ b/packages/media/dist-in/commands/background-remove.d.ts @@ -1,6 +1,6 @@ import * as CLI from 'yargs'; -export declare const defaultOptions: (yargs: CLI.Argv) => any; +export declare const defaultOptions: (yargs: CLI.Argv) => CLI.Argv; export declare const command = "background:remove"; export declare const desc = "Remove background from images using AI"; -export declare const builder: (yargs: CLI.Argv) => any; +export declare const builder: (yargs: CLI.Argv) => CLI.Argv; export declare function handler(argv: CLI.Arguments): Promise; diff --git a/packages/media/dist-in/commands/background-remove.js b/packages/media/dist-in/commands/background-remove.js index 9447cf09..b7379007 100644 --- a/packages/media/dist-in/commands/background-remove.js +++ b/packages/media/dist-in/commands/background-remove.js @@ -2,56 +2,18 @@ import { CONFIG_DEFAULT } from '@polymech/commons'; import { logger } from '../index.js'; import { cli } from '../cli.js'; import { sanitize, defaults } from '../_cli.js'; -import { backgroundRemove } from '../lib/media/images/background-remove.js'; +import { toYargs } from '@polymech/commons'; +import { backgroundRemove, BackgroundRemoveOptionsSchema } from '../lib/media/images/background-remove.js'; export const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }).option('apiKey', { - describe: 'Replicate API key (or set REPLICATE_API_TOKEN env var)', - type: 'string' - }).option('model', { - describe: 'Background removal model to use', - default: 'lucataco/remove-bg:95fcc2a26d3899cd6c2691c900465aaeff466285a65c14638cc5f36f34befaf1', - type: 'string' - }).option('alpha_matting', { - describe: 'Enable alpha matting for better edge refinement', - type: 'boolean', - default: false - }).option('alpha_matting_foreground_threshold', { - describe: 'Alpha matting foreground threshold', - type: 'number', - default: 270 - }).option('alpha_matting_background_threshold', { - describe: 'Alpha matting background threshold', - type: 'number', - default: 10 - }).option('alpha_matting_erode_size', { - describe: 'Alpha matting erode size', - type: 'number', - default: 10 + return toYargs(yargs, BackgroundRemoveOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, { ...options, demandOption: true }); + default: + return yargs.option(key, options); + } + }) }); }; export const command = 'background:remove'; @@ -59,7 +21,7 @@ export const desc = 'Remove background from images using AI'; export const builder = defaultOptions; export async function handler(argv) { defaults(); - const options = sanitize(argv); + const options = BackgroundRemoveOptionsSchema().parse(argv); logger.settings.minLevel = options.logLevel; const config = CONFIG_DEFAULT(); // Get API key from argument or environment variable @@ -69,18 +31,14 @@ export async function handler(argv) { logger.info('Get your API key at: https://replicate.com/account/api-tokens'); process.exit(1); } - // Map CLI arguments to library options (using same names) - options.model = argv.model; - options.alpha_matting = argv.alpha_matting; - options.alpha_matting_foreground_threshold = argv.alpha_matting_foreground_threshold; - options.alpha_matting_background_threshold = argv.alpha_matting_background_threshold; - options.alpha_matting_erode_size = argv.alpha_matting_erode_size; + // The schema already parsed all the options correctly + const sanitizedOptions = sanitize(options); logger.info("Removing background with options:", { - model: options.model, - alpha_matting: options.alpha_matting, - files: options.srcInfo?.FILES?.length || 0 + model: sanitizedOptions.model, + alpha_matting: sanitizedOptions.alpha_matting, + files: sanitizedOptions.srcInfo?.FILES?.length || 0 }); - await backgroundRemove(options); + await backgroundRemove(sanitizedOptions); } cli.command(command, desc, builder, handler); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1yZW1vdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYmFja2dyb3VuZC1yZW1vdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMvQixPQUFPLEVBQ0gsUUFBUSxFQUNSLFFBQVEsRUFDWCxNQUFNLFlBQVksQ0FBQTtBQUluQixPQUFPLEVBQ0gsZ0JBQWdCLEVBRW5CLE1BQU0sMENBQTBDLENBQUE7QUFFakQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDOUMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUN2QixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFlBQVksRUFBRSxJQUFJO0tBQ3JCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsUUFBUSxFQUFFLGtCQUFrQjtLQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLGdDQUFnQztRQUMxQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHlDQUF5QztRQUNuRCxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNqQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx3QkFBd0I7UUFDbEMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDbEIsUUFBUSxFQUFFLHNDQUFzQztRQUNoRCxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxNQUFNO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1FBQ2hCLFFBQVEsRUFBRSx3REFBd0Q7UUFDbEUsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixRQUFRLEVBQUUsaUNBQWlDO1FBQzNDLE9BQU8sRUFBRSxxRkFBcUY7UUFDOUYsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7UUFDdkIsUUFBUSxFQUFFLGlEQUFpRDtRQUMzRCxJQUFJLEVBQUUsU0FBUztRQUNmLE9BQU8sRUFBRSxLQUFLO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsb0NBQW9DLEVBQUU7UUFDNUMsUUFBUSxFQUFFLG9DQUFvQztRQUM5QyxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxHQUFHO0tBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxvQ0FBb0MsRUFBRTtRQUM1QyxRQUFRLEVBQUUsb0NBQW9DO1FBQzlDLElBQUksRUFBRSxRQUFRO1FBQ2QsT0FBTyxFQUFFLEVBQUU7S0FDZCxDQUFDLENBQUMsTUFBTSxDQUFDLDBCQUEwQixFQUFFO1FBQ2xDLFFBQVEsRUFBRSwwQkFBMEI7UUFDcEMsSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPLEVBQUUsRUFBRTtLQUNkLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsd0NBQXdDLENBQUM7QUFDN0QsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQztBQUV0QyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFtQjtJQUM3QyxRQUFRLEVBQUUsQ0FBQTtJQUNWLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQTRCLENBQUE7SUFDekQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQWUsQ0FBQTtJQUNsRCxNQUFNLE1BQU0sR0FBUSxjQUFjLEVBQUUsQ0FBQTtJQUVwQyxvREFBb0Q7SUFDcEQsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUM7SUFFN0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLGlIQUFpSCxDQUFDLENBQUM7UUFDaEksTUFBTSxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1FBQzdFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFlLENBQUM7SUFDckMsT0FBTyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBd0IsQ0FBQztJQUN0RCxPQUFPLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxDQUFDLGtDQUE0QyxDQUFDO0lBQy9GLE9BQU8sQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMsa0NBQTRDLENBQUM7SUFDL0YsT0FBTyxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyx3QkFBa0MsQ0FBQztJQUUzRSxNQUFNLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFO1FBQzdDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7UUFDcEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0tBQzdDLENBQUMsQ0FBQztJQUVILE1BQU0sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUEifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1yZW1vdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYmFja2dyb3VuZC1yZW1vdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMvQixPQUFPLEVBQ0gsUUFBUSxFQUNSLFFBQVEsRUFDWCxNQUFNLFlBQVksQ0FBQTtBQUNuQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxFQUNILGdCQUFnQixFQUVoQiw2QkFBNkIsRUFDaEMsTUFBTSwwQ0FBMEMsQ0FBQTtBQUVqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLE9BQU8sQ0FBQyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsRUFBRTtRQUNuRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDNUIsUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFDVixLQUFLLEtBQUs7b0JBQ04sT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFDLEdBQUcsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUNsRTtvQkFDSSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ3pDLENBQUM7UUFDTCxDQUFDLENBQUM7S0FDTCxDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLHdDQUF3QyxDQUFDO0FBQzdELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUM7QUFFdEMsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBbUI7SUFDN0MsUUFBUSxFQUFFLENBQUE7SUFDVixNQUFNLE9BQU8sR0FBRyw2QkFBNkIsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQTRCLENBQUE7SUFDdEYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQWUsQ0FBQTtJQUNsRCxNQUFNLE1BQU0sR0FBUSxjQUFjLEVBQUUsQ0FBQTtJQUVwQyxvREFBb0Q7SUFDcEQsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUM7SUFFN0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLGlIQUFpSCxDQUFDLENBQUM7UUFDaEksTUFBTSxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1FBQzdFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQTRCLENBQUE7SUFFckUsTUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztRQUM3QixhQUFhLEVBQUUsZ0JBQWdCLENBQUMsYUFBYTtRQUM3QyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztLQUN0RCxDQUFDLENBQUM7SUFFSCxNQUFNLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/packages/media/dist-in/commands/convert.js b/packages/media/dist-in/commands/convert.js index f7dc26c2..47aae693 100644 --- a/packages/media/dist-in/commands/convert.js +++ b/packages/media/dist-in/commands/convert.js @@ -1,6 +1,6 @@ -import { logger } from '../'; -import { convert } from '../lib/media/images'; -import { defaults, sanitizeVideo } from '../_cli'; +import { logger } from '../index.js'; +import { convert } from '../lib/media/images/index.js'; +import { defaults, sanitizeVideo } from '../_cli.js'; export const defaultOptions = (yargs) => { return yargs.option('src', { describe: 'FILE|FOLDER|GLOB', @@ -34,4 +34,4 @@ export const register = (cli) => { return convert(options); }); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9jb252ZXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFFNUIsT0FBTyxFQUNILE9BQU8sRUFDVixNQUFNLHFCQUFxQixDQUFBO0FBRTVCLE9BQU8sRUFFSCxRQUFRLEVBQ1IsYUFBYSxFQUNoQixNQUFNLFNBQVMsQ0FBQTtBQU9oQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXhELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtRQUM1RSxRQUFRLEVBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQWEsQ0FBQTtRQUMvQyxPQUFPLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDNUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDM0IsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUEifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9jb252ZXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFcEMsT0FBTyxFQUNILE9BQU8sRUFDVixNQUFNLDhCQUE4QixDQUFBO0FBRXJDLE9BQU8sRUFFSCxRQUFRLEVBQ1IsYUFBYSxFQUNoQixNQUFNLFlBQVksQ0FBQTtBQU9uQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXhELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtRQUM1RSxRQUFRLEVBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQWEsQ0FBQTtRQUMvQyxPQUFPLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDNUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDM0IsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/packages/media/dist-in/commands/crop-foreground.d.ts b/packages/media/dist-in/commands/crop-foreground.d.ts index bf7a31d6..4788c49b 100644 --- a/packages/media/dist-in/commands/crop-foreground.d.ts +++ b/packages/media/dist-in/commands/crop-foreground.d.ts @@ -1,6 +1,6 @@ import * as CLI from 'yargs'; -export declare const defaultOptions: (yargs: CLI.Argv) => any; +export declare const defaultOptions: (yargs: CLI.Argv) => CLI.Argv; export declare const command = "image-crop:foreground"; export declare const desc = "Crop foreground from images using Bria AI"; -export declare const builder: (yargs: CLI.Argv) => any; +export declare const builder: (yargs: CLI.Argv) => CLI.Argv; export declare function handler(argv: CLI.Arguments): Promise; diff --git a/packages/media/dist-in/commands/crop-foreground.js b/packages/media/dist-in/commands/crop-foreground.js index 99bebc14..35d55f24 100644 --- a/packages/media/dist-in/commands/crop-foreground.js +++ b/packages/media/dist-in/commands/crop-foreground.js @@ -2,48 +2,18 @@ import { CONFIG_DEFAULT } from '@polymech/commons'; import { logger } from '../index.js'; import { cli } from '../cli.js'; import { sanitize, defaults } from '../_cli.js'; -import { cropForeground } from '../lib/media/images/crop-foreground.js'; +import { toYargs } from '@polymech/commons'; +import { cropForeground, CropForegroundOptionsSchema } from '../lib/media/images/crop-foreground.js'; export const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }).option('apiKey', { - describe: 'Bria API key (or set in config.bria.key)', - type: 'string' - }).option('sync', { - describe: 'Use synchronous processing (recommended)', - type: 'boolean', - default: true - }).option('contentModeration', { - describe: 'Enable content moderation', - type: 'boolean', - default: false - }).option('preserveAlpha', { - describe: 'Preserve alpha channel from input image', - type: 'boolean', - default: true + return toYargs(yargs, CropForegroundOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, { ...options, demandOption: true }); + default: + return yargs.option(key, options); + } + }) }); }; export const command = 'image-crop:foreground'; @@ -51,7 +21,7 @@ export const desc = 'Crop foreground from images using Bria AI'; export const builder = defaultOptions; export async function handler(argv) { defaults(); - const options = sanitize(argv); + const options = CropForegroundOptionsSchema().parse(argv); logger.settings.minLevel = options.logLevel; const config = CONFIG_DEFAULT(); // Get API key from argument, environment variable, or config @@ -61,17 +31,15 @@ export async function handler(argv) { logger.info('Get your API key at: https://bria.ai/'); process.exit(1); } - // Map CLI arguments to library options - options.sync = argv.sync; - options.contentModeration = argv.contentModeration; - options.preserveAlpha = argv.preserveAlpha; + // The schema already parsed all the options correctly + const sanitizedOptions = sanitize(options); logger.info("Cropping foreground with Bria AI options:", { - sync: options.sync, - contentModeration: options.contentModeration, - preserveAlpha: options.preserveAlpha, - files: options.srcInfo?.FILES?.length || 0 + sync: sanitizedOptions.sync, + contentModeration: sanitizedOptions.contentModeration, + preserveAlpha: sanitizedOptions.preserveAlpha, + files: sanitizedOptions.srcInfo?.FILES?.length || 0 }); - await cropForeground(options); + await cropForeground(sanitizedOptions); } cli.command(command, desc, builder, handler); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC1mb3JlZ3JvdW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2Nyb3AtZm9yZWdyb3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQy9CLE9BQU8sRUFDSCxRQUFRLEVBQ1IsUUFBUSxFQUNYLE1BQU0sWUFBWSxDQUFBO0FBRW5CLE9BQU8sRUFDSCxjQUFjLEVBRWpCLE1BQU0sd0NBQXdDLENBQUE7QUFFL0MsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDOUMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUN2QixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFlBQVksRUFBRSxJQUFJO0tBQ3JCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsUUFBUSxFQUFFLGtCQUFrQjtLQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLGdDQUFnQztRQUMxQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHlDQUF5QztRQUNuRCxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNqQixPQUFPLEVBQUUsS0FBSztR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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC1mb3JlZ3JvdW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2Nyb3AtZm9yZWdyb3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQy9CLE9BQU8sRUFDSCxRQUFRLEVBQ1IsUUFBUSxFQUNYLE1BQU0sWUFBWSxDQUFBO0FBQ25CLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUUzQyxPQUFPLEVBQ0gsY0FBYyxFQUVkLDJCQUEyQixFQUM5QixNQUFNLHdDQUF3QyxDQUFBO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQzlDLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxFQUFFO1FBQ2pELEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM1QixRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNWLEtBQUssS0FBSztvQkFDTixPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUMsR0FBRyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7Z0JBQ2xFO29CQUNJLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDekMsQ0FBQztRQUNMLENBQUMsQ0FBQztLQUNMLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsMkNBQTJDLENBQUM7QUFDaEUsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQztBQUV0QyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFtQjtJQUM3QyxRQUFRLEVBQUUsQ0FBQTtJQUNWLE1BQU0sT0FBTyxHQUFHLDJCQUEyQixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBMEIsQ0FBQTtJQUNsRixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBZSxDQUFBO0lBQ2xELE1BQU0sTUFBTSxHQUFRLGNBQWMsRUFBRSxDQUFBO0lBRXBDLDZEQUE2RDtJQUM3RCxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUM7SUFFakYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLHVJQUF1SSxDQUFDLENBQUM7UUFDdEosTUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQTBCLENBQUE7SUFFbkUsTUFBTSxDQUFDLElBQUksQ0FBQywyQ0FBMkMsRUFBRTtRQUNyRCxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsSUFBSTtRQUMzQixpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxpQkFBaUI7UUFDckQsYUFBYSxFQUFFLGdCQUFnQixDQUFDLGFBQWE7UUFDN0MsS0FBSyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7S0FDdEQsQ0FBQyxDQUFDO0lBRUgsTUFBTSxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/packages/media/dist-in/commands/pdf2jpg.d.ts b/packages/media/dist-in/commands/pdf2jpg.d.ts index 413de464..f33e6b98 100644 --- a/packages/media/dist-in/commands/pdf2jpg.d.ts +++ b/packages/media/dist-in/commands/pdf2jpg.d.ts @@ -1,5 +1,5 @@ import * as CLI from 'yargs'; export declare const command = "pdf2jpg"; export declare const desc = "Convert PDF to images"; -export declare const builder: (yargs: CLI.Argv) => any; +export declare const builder: (yargs: CLI.Argv) => CLI.Argv; export declare function handler(argv: CLI.Arguments): Promise; diff --git a/packages/media/dist-in/commands/pdf2jpg.js b/packages/media/dist-in/commands/pdf2jpg.js index cef90f96..244aaac7 100644 --- a/packages/media/dist-in/commands/pdf2jpg.js +++ b/packages/media/dist-in/commands/pdf2jpg.js @@ -1,52 +1,34 @@ import { logger } from '../index.js'; import { existsSync } from 'node:fs'; import * as z from 'zod'; -import { runConversion } from '../lib/pdf/convert.js'; -import { ConvertCommandSchema } from '../lib/pdf/types.js'; +import { runConversion, Pdf2JpgOptionsSchema } from '../lib/pdf/convert.js'; +import { toYargs } from '@polymech/commons'; import { cli } from '../cli.js'; export const command = 'pdf2jpg'; export const desc = 'Convert PDF to images'; export const builder = (yargs) => { - return yargs - .option('input', { - alias: 'i', - describe: 'Path to the input PDF file', - demandOption: true, - type: 'string' - }) - .option('output', { - alias: 'o', - describe: 'Output path template (e.g., output/page_{PAGE}.png)', - type: 'string' - }) - .option('dpi', { - describe: 'Resolution for the output images', - default: 300, - type: 'number' - }) - .option('scale', { - describe: 'Scaling factor to apply before rendering (e.g., 2 for 2x size)', - default: 2, - type: 'number' - }) - .option('format', { - describe: 'Output image format', - choices: ['png', 'jpg'], - default: 'jpg', - type: 'string' - }) - .option('startPage', { - describe: 'First page to convert (1-based index)', - type: 'number' - }) - .option('endPage', { - describe: 'Last page to convert (1-based index)', - type: 'number' + return toYargs(yargs, Pdf2JpgOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'input': + return yargs.option(key, { ...options, alias: 'i', demandOption: true }); + case 'output': + return yargs.option(key, { ...options, alias: 'o' }); + default: + return yargs.option(key, options); + } + }) }); }; export async function handler(argv) { try { - const config = ConvertCommandSchema.parse(argv); + const config = Pdf2JpgOptionsSchema().parse(argv); + // Validate startPage and endPage relationship + if (config.startPage !== undefined && config.endPage !== undefined) { + if (config.startPage > config.endPage) { + throw new Error('startPage must be less than or equal to endPage'); + } + } if (!existsSync(config.input)) { throw new Error(`Input file ${config.input} does not exist`); } @@ -67,4 +49,4 @@ export async function handler(argv) { } } cli.command(command, desc, builder, handler); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmMmpwZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wZGYyanBnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUN6QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUF3QixvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ2hGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUNqQyxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDdkMsT0FBTyxLQUFLO1NBQ1AsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNiLEtBQUssRUFBRSxHQUFHO1FBQ1YsUUFBUSxFQUFFLDRCQUE0QjtRQUN0QyxZQUFZLEVBQUUsSUFBSTtRQUNsQixJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDO1NBQ0QsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUNkLEtBQUssRUFBRSxHQUFHO1FBQ1YsUUFBUSxFQUFFLHFEQUFxRDtRQUMvRCxJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDO1NBQ0QsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNYLFFBQVEsRUFBRSxrQ0FBa0M7UUFDNUMsT0FBTyxFQUFFLEdBQUc7UUFDWixJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDO1NBQ0QsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNiLFFBQVEsRUFBRSxnRUFBZ0U7UUFDMUUsT0FBTyxFQUFFLENBQUM7UUFDVixJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDO1NBQ0QsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUNkLFFBQVEsRUFBRSxxQkFBcUI7UUFDL0IsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztRQUN2QixPQUFPLEVBQUUsS0FBSztRQUNkLElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUM7U0FDRCxNQUFNLENBQUMsV0FBVyxFQUFFO1FBQ2pCLFFBQVEsRUFBRSx1Q0FBdUM7UUFDakQsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQztTQUNELE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDZixRQUFRLEVBQUUsc0NBQXNDO1FBQ2hELElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQTtBQUNWLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFDLElBQW1CO0lBQzdDLElBQUksQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQXlCLENBQUM7UUFDeEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsTUFBTSxDQUFDLEtBQUssaUJBQWlCLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sV0FBVyxHQUFHLE1BQU0sYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDakQsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxLQUFLLFlBQVksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkUsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztBQUNMLENBQUM7QUFFRCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmMmpwZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wZGYyanBnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUN6QixPQUFPLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFpQixNQUFNLHVCQUF1QixDQUFDO0FBQzNGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDakMsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLHVCQUF1QixDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3ZDLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxFQUFFO1FBQzFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM1QixRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNWLEtBQUssT0FBTztvQkFDUixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtnQkFDMUUsS0FBSyxRQUFRO29CQUNULE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQTtnQkFDdEQ7b0JBQ0ksT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0tBQ0wsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBbUI7SUFDN0MsSUFBSSxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQWtCLG9CQUFvQixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpFLDhDQUE4QztRQUM5QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakUsSUFBSSxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsTUFBTSxDQUFDLEtBQUssaUJBQWlCLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sV0FBVyxHQUFHLE1BQU0sYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDakQsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxLQUFLLFlBQVksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkUsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztBQUNMLENBQUM7QUFFRCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBIn0= \ No newline at end of file diff --git a/packages/media/dist-in/commands/resize.js b/packages/media/dist-in/commands/resize.js index 79a3f708..1eb11b45 100644 --- a/packages/media/dist-in/commands/resize.js +++ b/packages/media/dist-in/commands/resize.js @@ -1,63 +1,22 @@ import { logger } from '../index.js'; -import { resize } from '../lib/media/images/resize.js'; +import { resize, ResizeOptionsSchema } from '../lib/media/images/resize.js'; import { cli } from '../cli.js'; import { sanitize, defaults } from '../_cli.js'; +import { toYargs } from '@polymech/commons'; export const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { + return toYargs(yargs, ResizeOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, { ...options, demandOption: true }); + default: + return yargs.option(key, options); + } + }) + }).option('gui', { + boolean: true, default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('percent', { - default: false, - describe: 'Resize image with percent', - type: 'number' - }).option('width', { - describe: 'Resize image with', - type: 'number' - }).option('height', { - describe: 'Resize image height', - type: 'number' - }).option('minHeight', { - describe: 'Resize image minimum height', - type: 'number' - }).option('minWidth', { - describe: 'Resize image minimum width', - type: 'number' - }).option('minSize', { - describe: 'Resize image size (bytes)', - type: 'number' - }).option('percent', { - describe: 'Resize image in percent (width)', - type: 'number' - }).option('square', { - default: false, - describe: 'Fit image within width for 1:1 aspect ratio without cropping', - type: 'boolean' - }).option('fillColor', { - describe: 'Fill color for square backgrounds (default: white)', - type: 'string', - default: 'white' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' + describe: 'Launch interactive graphical user interface' }); }; export const command = 'resize'; @@ -67,8 +26,189 @@ export async function handler(argv) { defaults(); const options = sanitize(argv); logger.settings.minLevel = options.logLevel; - logger.info("options " + argv.dst, options); - await resize(options); + // Check if GUI mode is requested + if (options.gui) { + const { renderSchemaUI } = await import('../lib/ui/electron.js'); + const { ResizeOptionsSchema } = await import('../lib/media/images/resize.js'); + // Generate schema for UI + const schema = ResizeOptionsSchema(); + // Convert Zod schema to JSON Schema (enhanced) + const jsonSchema = { + type: 'object', + title: 'Resize Image Options', + properties: { + src: { + type: 'string', + title: 'Source Files', + description: 'Source file(s) or directory to resize (supports glob patterns)', + examples: ['image.jpg', '*.png', './photos/', 'images/**/*.jpg'] + }, + dst: { + type: 'string', + title: 'Destination', + description: 'Output directory or file pattern for resized images' + }, + width: { + type: 'integer', + title: 'Width (pixels)', + description: 'Target width in pixels', + minimum: 1, + maximum: 10000 + }, + height: { + type: 'integer', + title: 'Height (pixels)', + description: 'Target height in pixels', + minimum: 1, + maximum: 10000 + }, + percent: { + type: 'number', + title: 'Resize Percentage', + description: 'Resize by percentage (e.g., 50 for 50%)', + minimum: 1, + maximum: 1000 + }, + square: { + type: 'boolean', + title: 'Square Output', + description: 'Fit image within specified width to create 1:1 aspect ratio', + default: false + }, + fillColor: { + type: 'string', + title: 'Background Fill Color', + description: 'Color to use for background when creating square images', + default: 'white', + examples: ['white', 'black', 'transparent', '#FF0000'] + }, + fit: { + type: 'string', + title: 'Resize Fit Mode', + description: 'How the image should be resized to fit the dimensions', + enum: ['cover', 'contain', 'fill', 'inside', 'outside'], + default: 'cover' + }, + withoutEnlargement: { + type: 'boolean', + title: 'Prevent Enlargement', + description: 'Do not enlarge images that are smaller than target size', + default: false + }, + quality: { + type: 'integer', + title: 'Quality', + description: 'Output quality for JPEG images (1-100)', + minimum: 1, + maximum: 100, + default: 90 + } + }, + required: ['src'], + anyOf: [ + { + required: ['width'] + }, + { + required: ['height'] + }, + { + required: ['percent'] + } + ] + }; + const uiSchema = { + 'ui:order': ['src', 'dst', 'width', 'height', 'percent', 'fit', 'square', 'fillColor', 'withoutEnlargement', 'quality'], + src: { + 'ui:placeholder': 'e.g., *.jpg or ./photos/', + 'ui:help': 'Supports files, directories, and glob patterns', + 'ui:widget': 'textarea', + 'ui:options': { + rows: 2 + } + }, + dst: { + 'ui:placeholder': 'e.g., ./resized/ or output.jpg', + 'ui:help': 'Output directory or file pattern' + }, + width: { + 'ui:help': 'Leave empty to maintain aspect ratio' + }, + height: { + 'ui:help': 'Leave empty to maintain aspect ratio' + }, + percent: { + 'ui:help': 'Alternative to width/height - resize by percentage' + }, + fit: { + 'ui:help': 'How to fit image when both width and height are specified' + }, + fillColor: { + 'ui:help': 'Used when square mode creates padding', + 'ui:placeholder': 'white, black, transparent, #FF0000' + }, + square: { + 'ui:help': 'Creates square images by padding with fillColor' + }, + withoutEnlargement: { + 'ui:help': 'Prevents making small images larger' + }, + quality: { + 'ui:help': 'Only applies to JPEG output files' + } + }; + try { + // Extract CLI options that were provided + const cliOptions = {}; + if (options.src) + cliOptions.src = options.src; + if (options.dst) + cliOptions.dst = options.dst; + if (options.width) + cliOptions.width = options.width; + if (options.height) + cliOptions.height = options.height; + if (options.percent) + cliOptions.percent = options.percent; + if (options.square !== undefined) + cliOptions.square = options.square; + if (options.fillColor) + cliOptions.fillColor = options.fillColor; + if (options.fit) + cliOptions.fit = options.fit; + if (options.withoutEnlargement !== undefined) + cliOptions.withoutEnlargement = options.withoutEnlargement; + const result = await renderSchemaUI({ + schema: jsonSchema, + uiSchema, + title: 'Resize Images', + formData: { + fillColor: 'white', + square: false, + fit: 'cover', + withoutEnlargement: false, + quality: 90 + }, + cliOptions + }); + if (result && result.data) { + // Merge UI result with CLI options + const uiOptions = { ...options, ...result.data }; + await resize(uiOptions); + } + else { + logger.info('Operation cancelled by user'); + } + } + catch (error) { + logger.error('GUI Error:', error); + logger.info('Falling back to CLI mode...'); + await resize(options); + } + } + else { + await resize(options); + } } cli.command(command, desc, builder, handler); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3Jlc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sRUFDSCxNQUFNLEVBQ1QsTUFBTSwrQkFBK0IsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQy9CLE9BQU8sRUFDSCxRQUFRLEVBQ1IsUUFBUSxFQUNYLE1BQU0sWUFBWSxDQUFBO0FBTW5CLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQzlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDdkIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixZQUFZLEVBQUUsSUFBSTtLQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLFFBQVEsRUFBRSxrQkFBa0I7S0FDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxnQ0FBZ0M7UUFDMUMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx5Q0FBeUM7UUFDbkQsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx3QkFBd0I7UUFDbEMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDakIsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLDJCQUEyQjtRQUNyQyxJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLFFBQVEsRUFBRSxtQkFBbUI7UUFDN0IsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7UUFDaEIsUUFBUSxFQUFFLHFCQUFxQjtRQUMvQixJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUNuQixRQUFRLEVBQUUsNkJBQTZCO1FBQ3ZDLElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO1FBQ2xCLFFBQVEsRUFBRSw0QkFBNEI7UUFDdEMsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDakIsUUFBUSxFQUFFLDJCQUEyQjtRQUNyQyxJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNqQixRQUFRLEVBQUUsaUNBQWlDO1FBQzNDLElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1FBQ2hCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLDhEQUE4RDtRQUN4RSxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUNuQixRQUFRLEVBQUUsb0RBQW9EO1FBQzlELElBQUksRUFBRSxRQUFRO1FBQ2QsT0FBTyxFQUFFLE9BQU87S0FDbkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDbEIsUUFBUSxFQUFFLHNDQUFzQztRQUNoRCxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxNQUFNO0tBQ2xCLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQztBQUNwQyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFDLElBQW1CO0lBQzdDLFFBQVEsRUFBRSxDQUFBO0lBQ1YsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBYSxDQUFBO0lBQzFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFlLENBQUE7SUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUMzQyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUN6QixDQUFDO0FBRUQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3Jlc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sRUFDSCxNQUFNLEVBQ04sbUJBQW1CLEVBQ3RCLE1BQU0sK0JBQStCLENBQUE7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMvQixPQUFPLEVBQ0gsUUFBUSxFQUNSLFFBQVEsRUFDWCxNQUFNLFlBQVksQ0FBQTtBQUNuQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFPM0MsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDOUMsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEVBQUU7UUFDekMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzVCLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ1YsS0FBSyxLQUFLO29CQUNOLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBQyxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtnQkFDbEU7b0JBQ0ksT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0tBQ0wsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsSUFBSTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLDZDQUE2QztLQUMxRCxDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ2hD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 \ No newline at end of file diff --git a/packages/media/dist-in/commands/schemas.d.ts b/packages/media/dist-in/commands/schemas.d.ts new file mode 100644 index 00000000..1e48e278 --- /dev/null +++ b/packages/media/dist-in/commands/schemas.d.ts @@ -0,0 +1,5 @@ +import * as CLI from 'yargs'; +export declare const command = "schemas"; +export declare const desc = "Generate schema files (schemas.json and schema_ui.json)"; +export declare const builder: (yargs: CLI.Argv) => any; +export declare function handler(argv: CLI.Arguments): Promise; diff --git a/packages/media/dist-in/commands/schemas.js b/packages/media/dist-in/commands/schemas.js new file mode 100644 index 00000000..a13b6b85 --- /dev/null +++ b/packages/media/dist-in/commands/schemas.js @@ -0,0 +1,49 @@ +import { cli } from '../cli.js'; +import { schemas as resizeSchemas, types as resizeTypes } from '../lib/media/images/resize.js'; +import { schemas as pdf2jpgSchemas, types as pdf2jpgTypes } from '../lib/pdf/convert.js'; +import { schemas as watermarkSchemas, types as watermarkTypes } from '../lib/media/images/watermark.js'; +import { schemas as backgroundRemoveSchemas, types as backgroundRemoveTypes } from '../lib/media/images/background-remove.js'; +import { schemas as backgroundRemoveBriaSchemas, types as backgroundRemoveBriaTypes } from '../lib/media/images/background-remove-bria.js'; +import { schemas as cropForegroundSchemas, types as cropForegroundTypes } from '../lib/media/images/crop-foreground.js'; +export const command = 'schemas'; +export const desc = 'Generate schema files (schemas.json and schema_ui.json)'; +export const builder = (yargs) => { + return yargs.option('types', { + describe: 'Also generate TypeScript types', + type: 'boolean', + default: false + }); +}; +export async function handler(argv) { + console.log('Generating schemas...'); + // Generate resize schemas + resizeSchemas(); + console.log('✓ Generated resize schemas'); + // Generate pdf2jpg schemas + pdf2jpgSchemas(); + console.log('✓ Generated pdf2jpg schemas'); + // Generate watermark schemas + watermarkSchemas(); + console.log('✓ Generated watermark schemas'); + // Generate background-remove schemas + backgroundRemoveSchemas(); + console.log('✓ Generated background-remove schemas'); + // Generate background-remove-bria schemas + backgroundRemoveBriaSchemas(); + console.log('✓ Generated background-remove-bria schemas'); + // Generate crop-foreground schemas + cropForegroundSchemas(); + console.log('✓ Generated crop-foreground schemas'); + if (argv.types) { + resizeTypes(); + pdf2jpgTypes(); + watermarkTypes(); + backgroundRemoveTypes(); + backgroundRemoveBriaTypes(); + cropForegroundTypes(); + console.log('✓ Generated TypeScript types'); + } + console.log('Schema generation complete!'); +} +cli.command(command, desc, builder, handler); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9zY2hlbWFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDL0IsT0FBTyxFQUFFLE9BQU8sSUFBSSxhQUFhLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQzlGLE9BQU8sRUFBRSxPQUFPLElBQUksY0FBYyxFQUFFLEtBQUssSUFBSSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN4RixPQUFPLEVBQUUsT0FBTyxJQUFJLGdCQUFnQixFQUFFLEtBQUssSUFBSSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUN2RyxPQUFPLEVBQUUsT0FBTyxJQUFJLHVCQUF1QixFQUFFLEtBQUssSUFBSSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFBO0FBQzdILE9BQU8sRUFBRSxPQUFPLElBQUksMkJBQTJCLEVBQUUsS0FBSyxJQUFJLHlCQUF5QixFQUFFLE1BQU0sK0NBQStDLENBQUE7QUFDMUksT0FBTyxFQUFFLE9BQU8sSUFBSSxxQkFBcUIsRUFBRSxLQUFLLElBQUksbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUV2SCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFBO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyx5REFBeUQsQ0FBQTtBQUM3RSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUN2QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ3pCLFFBQVEsRUFBRSxnQ0FBZ0M7UUFDMUMsSUFBSSxFQUFFLFNBQVM7UUFDZixPQUFPLEVBQUUsS0FBSztLQUNqQixDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFtQjtJQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFFcEMsMEJBQTBCO0lBQzFCLGFBQWEsRUFBRSxDQUFBO0lBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO0lBRXpDLDJCQUEyQjtJQUMzQixjQUFjLEVBQUUsQ0FBQTtJQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUE7SUFFMUMsNkJBQTZCO0lBQzdCLGdCQUFnQixFQUFFLENBQUE7SUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0lBRTVDLHFDQUFxQztJQUNyQyx1QkFBdUIsRUFBRSxDQUFBO0lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtJQUVwRCwwQ0FBMEM7SUFDMUMsMkJBQTJCLEVBQUUsQ0FBQTtJQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7SUFFekQsbUNBQW1DO0lBQ25DLHFCQUFxQixFQUFFLENBQUE7SUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBRWxELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsV0FBVyxFQUFFLENBQUE7UUFDYixZQUFZLEVBQUUsQ0FBQTtRQUNkLGNBQWMsRUFBRSxDQUFBO1FBQ2hCLHFCQUFxQixFQUFFLENBQUE7UUFDdkIseUJBQXlCLEVBQUUsQ0FBQTtRQUMzQixtQkFBbUIsRUFBRSxDQUFBO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzlDLENBQUM7QUFFRCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBIn0= \ No newline at end of file diff --git a/packages/media/commands/audio.d.ts b/packages/media/dist-in/commands/thumbs.d.ts similarity index 79% rename from packages/media/commands/audio.d.ts rename to packages/media/dist-in/commands/thumbs.d.ts index 279bf080..3298fb71 100644 --- a/packages/media/commands/audio.d.ts +++ b/packages/media/dist-in/commands/thumbs.d.ts @@ -1,2 +1,3 @@ -export declare const defaultOptions: (yargs: CLI.Argv) => any; -export declare const register: (cli: CLI.Argv) => any; +import * as CLI from 'yargs'; +export declare const defaultOptions: (yargs: CLI.Argv) => any; +export declare const register: (cli: CLI.Argv) => any; diff --git a/packages/media/dist-in/commands/thumbs.js b/packages/media/dist-in/commands/thumbs.js new file mode 100644 index 00000000..f7f9d42a --- /dev/null +++ b/packages/media/dist-in/commands/thumbs.js @@ -0,0 +1,68 @@ +import { logger } from '../index'; +import { resize } from '../lib/media/images/resize'; +import { sanitize, defaults } from '../_cli'; +export const defaultOptions = (yargs) => { + return yargs.option('src', { + describe: 'FILE|FOLDER|GLOB', + demandOption: true + }).option('dst', { + describe: 'FILE|FOLDER|GLOB' + }).option('debug', { + default: false, + describe: 'Enable internal debug messages', + type: 'boolean' + }).option('alt', { + default: false, + describe: 'Use alternate tokenizer, & instead of $', + type: 'boolean' + }).option('dry', { + default: false, + describe: 'Run without conversion', + type: 'boolean' + }).option('verbose', { + default: false, + describe: 'Show internal messages', + type: 'boolean' + }).option('percent', { + default: false, + describe: 'Resize image with percent', + type: 'number' + }).option('width', { + default: false, + describe: 'Resize image with', + type: 'number' + }).option('height', { + default: false, + describe: 'Resize image height', + type: 'number' + }).option('minHeight', { + describe: 'Resize image minimum height', + type: 'number' + }).option('minWidth', { + describe: 'Resize image minimum width', + type: 'number' + }).option('minSize', { + describe: 'Resize image size (bytes)', + type: 'number' + }).option('percent', { + describe: 'Resize image in percent (width)', + type: 'number' + }).option('logLevel', { + describe: 'Log level : warn, info, debug, error', + type: 'string', + default: 'info' + }); +}; +let options = (yargs) => defaultOptions(yargs); +export const register = (cli) => { + return cli.command('thumbails', 'Create Thumbnail files', options, async (argv) => { + defaults(); + const options = sanitize(argv); + logger.setSettings({ + minLevel: options.logLevel + }); + logger.info("options " + argv.dst, options); + await resize(options); + }); +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGh1bWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3RodW1icy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ2pDLE9BQU8sRUFDSCxNQUFNLEVBQ1QsTUFBTSw0QkFBNEIsQ0FBQTtBQUVuQyxPQUFPLEVBQ0gsUUFBUSxFQUNSLFFBQVEsRUFDWCxNQUFNLFNBQVMsQ0FBQTtBQU1oQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNqQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSwyQkFBMkI7UUFDckMsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxtQkFBbUI7UUFDN0IsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7UUFDaEIsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUscUJBQXFCO1FBQy9CLElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO1FBQ25CLFFBQVEsRUFBRSw2QkFBNkI7UUFDdkMsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDbEIsUUFBUSxFQUFFLDRCQUE0QjtRQUN0QyxJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNqQixRQUFRLEVBQUUsMkJBQTJCO1FBQ3JDLElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLFFBQVEsRUFBRSxpQ0FBaUM7UUFDM0MsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDbEIsUUFBUSxFQUFFLHNDQUFzQztRQUNoRCxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxNQUFNO0tBQ2xCLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUVELElBQUksT0FBTyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7QUFFeEQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSx3QkFBd0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQW1CLEVBQUUsRUFBRTtRQUM3RixRQUFRLEVBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQWEsQ0FBQTtRQUMxQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ2YsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFlO1NBQ3BDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0MsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekIsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/packages/media/dist-in/commands/video.js b/packages/media/dist-in/commands/video.js index 6a4e892c..59e62150 100644 --- a/packages/media/dist-in/commands/video.js +++ b/packages/media/dist-in/commands/video.js @@ -1,6 +1,6 @@ -import { logger } from '../'; -import { convert, merge } from '../lib/media/video'; -import { defaults, sanitizeVideo } from '../_cli'; +import { logger } from '../index.js'; +import { convert, merge } from '../lib/media/video/index.js'; +import { defaults, sanitizeVideo } from '../_cli.js'; export const defaultOptions = (yargs) => { return yargs.option('src', { describe: 'FILE|FOLDER|GLOB', @@ -31,4 +31,4 @@ export const register = (cli) => { } }); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvdmlkZW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBR2pELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQzlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDdkIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixZQUFZLEVBQUUsSUFBSTtLQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLFFBQVEsRUFBRSxrQkFBa0I7S0FDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxnQ0FBZ0M7UUFDMUMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx5Q0FBeUM7UUFDbkQsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUV4RCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUN0QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQW1CLEVBQUUsRUFBRTtRQUN2RixRQUFRLEVBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQXlCLENBQUE7UUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0IsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQVEsQ0FBQTtRQUNoQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUEifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvdmlkZW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBR3BELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQzlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDdkIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixZQUFZLEVBQUUsSUFBSTtLQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLFFBQVEsRUFBRSxrQkFBa0I7S0FDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxnQ0FBZ0M7UUFDMUMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx5Q0FBeUM7UUFDbkQsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUV4RCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUN0QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQW1CLEVBQUUsRUFBRTtRQUN2RixRQUFRLEVBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQXlCLENBQUE7UUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0IsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQVEsQ0FBQTtRQUNoQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/packages/media/commands/convert.d.ts b/packages/media/dist-in/commands/watermark-rm.d.ts similarity index 79% rename from packages/media/commands/convert.d.ts rename to packages/media/dist-in/commands/watermark-rm.d.ts index 279bf080..3298fb71 100644 --- a/packages/media/commands/convert.d.ts +++ b/packages/media/dist-in/commands/watermark-rm.d.ts @@ -1,2 +1,3 @@ -export declare const defaultOptions: (yargs: CLI.Argv) => any; -export declare const register: (cli: CLI.Argv) => any; +import * as CLI from 'yargs'; +export declare const defaultOptions: (yargs: CLI.Argv) => any; +export declare const register: (cli: CLI.Argv) => any; diff --git a/packages/media/dist-in/commands/watermark-rm.js b/packages/media/dist-in/commands/watermark-rm.js new file mode 100644 index 00000000..4ba5a46c --- /dev/null +++ b/packages/media/dist-in/commands/watermark-rm.js @@ -0,0 +1,70 @@ +import { CONFIG_DEFAULT } from '@polymech/commons'; +import { logger } from '../index.js'; +import { watermark } from '../lib/media/images/watermark.js'; +import { sanitize, defaults } from '../_cli.js'; +export const defaultOptions = (yargs) => { + return yargs.option('src', { + describe: 'FILE|FOLDER|GLOB', + demandOption: true + }).option('dst', { + describe: 'FILE|FOLDER|GLOB' + }).option('debug', { + default: false, + describe: 'Enable internal debug messages', + type: 'boolean' + }).option('alt', { + default: false, + describe: 'Use alternate tokenizer, & instead of $', + type: 'boolean' + }).option('dry', { + default: false, + describe: 'Run without conversion', + type: 'boolean' + }).option('verbose', { + default: false, + describe: 'Show internal messages', + type: 'boolean' + }).option('percent', { + default: false, + describe: 'Resize image with percent', + type: 'number' + }).option('width', { + default: false, + describe: 'Resize image with', + type: 'number' + }).option('height', { + default: false, + describe: 'Resize image height', + type: 'number' + }).option('minHeight', { + describe: 'Resize image minimum height', + type: 'number' + }).option('minWidth', { + describe: 'Resize image minimum width', + type: 'number' + }).option('minSize', { + describe: 'Resize image size (bytes)', + type: 'number' + }).option('percent', { + describe: 'Resize image in percent (width)', + type: 'number' + }).option('key', { + describe: 'API Key', + type: 'string' + }); +}; +const options = (yargs) => defaultOptions(yargs); +export const register = (cli) => { + return cli.command('watermark', 'Remove watermark : FILE|GLOB', options, async (argv) => { + defaults(); + const options = sanitize(argv); + const config = CONFIG_DEFAULT(); + if (!config.novita) { + logger.error("Novita key not found"); + return; + } + options.debug && logger.info("Watermark Options " + argv.dst, options); + return watermark({ ...options, key: config.novita.key }); + }); +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLXJtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3dhdGVybWFyay1ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQ0wsU0FBUyxFQUNWLE1BQU0sa0NBQWtDLENBQUE7QUFFekMsT0FBTyxFQUNMLFFBQVEsRUFDUixRQUFRLEVBQ1QsTUFBTSxZQUFZLENBQUE7QUFNbkIsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDaEQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUN6QixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFlBQVksRUFBRSxJQUFJO0tBQ25CLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2YsUUFBUSxFQUFFLGtCQUFrQjtLQUM3QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNqQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxnQ0FBZ0M7UUFDMUMsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx5Q0FBeUM7UUFDbkQsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx3QkFBd0I7UUFDbEMsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDbkIsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ25CLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLDJCQUEyQjtRQUNyQyxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1FBQ2xCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHFCQUFxQjtRQUMvQixJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO1FBQ3JCLFFBQVEsRUFBRSw2QkFBNkI7UUFDdkMsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNwQixRQUFRLEVBQUUsNEJBQTRCO1FBQ3RDLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDbkIsUUFBUSxFQUFFLDJCQUEyQjtRQUNyQyxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ25CLFFBQVEsRUFBRSxpQ0FBaUM7UUFDM0MsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNmLFFBQVEsRUFBRSxTQUFTO1FBQ25CLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBRUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUUxRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUN4QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLDhCQUE4QixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBbUIsRUFBRSxFQUFFO1FBQ3JHLFFBQVEsRUFBRSxDQUFBO1FBQ1YsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBYSxDQUFBO1FBQzFDLE1BQU0sTUFBTSxHQUFRLGNBQWMsRUFBRSxDQUFBO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3JDLE9BQU07UUFDUixDQUFDO1FBQ0QsT0FBTyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDdEUsT0FBTyxTQUFTLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQzFELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBIn0= \ No newline at end of file diff --git a/packages/media/dist-in/commands/watermark.d.ts b/packages/media/dist-in/commands/watermark.d.ts index 4bc4fbe0..8e6affc7 100644 --- a/packages/media/dist-in/commands/watermark.d.ts +++ b/packages/media/dist-in/commands/watermark.d.ts @@ -1,8 +1,8 @@ import * as CLI from 'yargs'; export declare const command = "watermark"; export declare const desc = "Adds watermarks to images"; -export declare const defaultOptions: (yargs: CLI.Argv) => any; -export declare const builder: (yargs: CLI.Argv) => any; +export declare const defaultOptions: (yargs: CLI.Argv) => CLI.Argv; +export declare const builder: (yargs: CLI.Argv) => CLI.Argv; export declare function handler(argv: CLI.Arguments): Promise<{ src: string; dst: string; diff --git a/packages/media/dist-in/commands/watermark.js b/packages/media/dist-in/commands/watermark.js index 4ea5eb6c..fe6cba10 100644 --- a/packages/media/dist-in/commands/watermark.js +++ b/packages/media/dist-in/commands/watermark.js @@ -1,89 +1,32 @@ import { logger } from '../index.js'; import { cli } from '../cli.js'; import { sanitize, defaults } from '../_cli.js'; -import { watermark } from '../lib/media/images/watermark.js'; +import { toYargs } from '@polymech/commons'; +import { watermark, WatermarkOptionsSchema } from '../lib/media/images/watermark.js'; export const command = 'watermark'; export const desc = 'Adds watermarks to images'; export const defaultOptions = (yargs) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }).option('cache', { - default: true, - describe: 'Skip processing if target file already exists', - type: 'boolean' - }).option('watermark', { - describe: 'Watermark content: text string or path to image file (PNG, JPG, SVG)', - type: 'string', - demandOption: true - }).option('position', { - describe: 'Position of watermark', - choices: ['top-left', 'top-right', 'bottom-left', 'bottom-right', 'center'], - default: 'bottom-right' - }).option('margin', { - describe: 'Margin from edges in pixels', - type: 'number', - default: 24 - }).option('opacity', { - describe: 'Opacity of watermark (0-1)', - type: 'number', - default: 0.85 - }).option('sizePct', { - describe: 'Size of image watermark as percentage of base image width (0-1)', - type: 'number', - default: 0.2 - }).option('fontSize', { - describe: 'Font size for text watermark in pixels', - type: 'number', - default: 48 - }).option('color', { - describe: 'Text color (hex format, e.g., #ffffff)', - type: 'string', - default: '#ffffff' - }).option('fontFamily', { - describe: 'Font family for text watermark', - type: 'string', - default: 'Arial' - }).option('strokeColor', { - describe: 'Text stroke color (hex format, e.g., #000000)', - type: 'string', - default: '#000000' - }).option('strokeWidth', { - describe: 'Text stroke width in pixels', - type: 'number', - default: 2 + return toYargs(yargs, WatermarkOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, { ...options, demandOption: true }); + case 'watermark': + return yargs.option(key, { ...options, demandOption: true }); + default: + return yargs.option(key, options); + } + }) }); }; export const builder = defaultOptions; export async function handler(argv) { defaults(); - const options = sanitize(argv); + const options = WatermarkOptionsSchema().parse(argv); logger.settings.minLevel = options.logLevel; - // Pass raw watermark content and styling options to library - options.watermark = argv.watermark; - return await watermark(options); + // The watermark content is already parsed by the schema + const sanitizedOptions = sanitize(options); + return await watermark(sanitizedOptions); } cli.command(command, desc, builder, handler); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3dhdGVybWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDL0IsT0FBTyxFQUNILFFBQVEsRUFDUixRQUFRLEVBQ1gsTUFBTSxZQUFZLENBQUE7QUFFbkIsT0FBTyxFQUNILFNBQVMsRUFFWixNQUFNLGtDQUFrQyxDQUFBO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLDJCQUEyQixDQUFDO0FBRWhELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQzlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDdkIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixZQUFZLEVBQUUsSUFBSTtLQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLFFBQVEsRUFBRSxrQkFBa0I7S0FDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxnQ0FBZ0M7UUFDMUMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx5Q0FBeUM7UUFDbkQsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx3QkFBd0I7UUFDbEMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFT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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3dhdGVybWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDL0IsT0FBTyxFQUNILFFBQVEsRUFDUixRQUFRLEVBQ1gsTUFBTSxZQUFZLENBQUE7QUFDbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRTNDLE9BQU8sRUFDSCxTQUFTLEVBRVQsc0JBQXNCLEVBQ3pCLE1BQU0sa0NBQWtDLENBQUE7QUFFekMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDOUMsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLHNCQUFzQixFQUFFLEVBQUU7UUFDNUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzVCLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ1YsS0FBSyxLQUFLO29CQUNOLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBQyxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtnQkFDbEUsS0FBSyxXQUFXO29CQUNaLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtnQkFDOUQ7b0JBQ0ksT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0tBQ0wsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBQ0QsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQTtBQUNyQyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFtQjtJQUM3QyxRQUFRLEVBQUUsQ0FBQTtJQUNWLE1BQU0sT0FBTyxHQUFHLHNCQUFzQixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBcUIsQ0FBQTtJQUN4RSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBZSxDQUFBO0lBRWxELHdEQUF3RDtJQUN4RCxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQXFCLENBQUE7SUFFOUQsT0FBTyxNQUFNLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQzVDLENBQUM7QUFFRCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBIn0= \ No newline at end of file diff --git a/packages/media/dist-in/lib/fs/index.d.ts b/packages/media/dist-in/lib/fs/index.d.ts new file mode 100644 index 00000000..e1d27e68 --- /dev/null +++ b/packages/media/dist-in/lib/fs/index.d.ts @@ -0,0 +1,8 @@ +export { sync as read } from '@polymech/fs/read'; +export { sync as exists } from '@polymech/fs/exists'; +export { sync as dir } from '@polymech/fs/dir'; +export { sync as write } from '@polymech/fs/write'; +export declare const files: (dir: any, glob: any) => []; +export declare const images: (source: any) => any[]; +export declare const forward_slash: (path: any) => any; +export declare function resize_images(files: any): Promise; diff --git a/packages/media/dist-in/lib/fs/index.js b/packages/media/dist-in/lib/fs/index.js new file mode 100644 index 00000000..b9c9b6f1 --- /dev/null +++ b/packages/media/dist-in/lib/fs/index.js @@ -0,0 +1,33 @@ +import * as path from 'path'; +export { sync as read } from '@polymech/fs/read'; +export { sync as exists } from '@polymech/fs/exists'; +export { sync as dir } from '@polymech/fs/dir'; +export { sync as write } from '@polymech/fs/write'; +import { Helper } from '../process/index'; +import pMap from 'p-map'; +const IMAGES_GLOB = '*.+(JPG|jpg|png|PNG|gif)'; +import { filesEx } from '@polymech/commons/glob'; +export const files = (dir, glob) => filesEx(glob, { dot: true, cwd: dir, absolute: true }); +export const images = (source) => files(source, IMAGES_GLOB); +export const forward_slash = (path) => { + const isExtendedLengthPath = /^\\\\\?\\/.test(path); + const hasNonAscii = /[^\u0000-\u0080]+/.test(path); // eslint-disable-line no-control-regex + if (isExtendedLengthPath || hasNonAscii) { + return path; + } + return path.replace(/\\/g, '/'); +}; +export async function resize_images(files) { + return pMap(files, (file) => { + const inParts = path.parse(file); + const promise = Helper.run(inParts.dir, 'convert', [ + `"${inParts.base}"`, + '-quality 70', + '-resize 1980', + '-sharpen 0x1.0', + `"${inParts.name}${inParts.ext}"` + ]); + return promise; + }); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2ZzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUV6QixNQUFNLFdBQVcsR0FBRywwQkFBMEIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQU8sQ0FBQztBQUNqRyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFVLENBQUM7QUFDdEUsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7SUFDckMsTUFBTSxvQkFBb0IsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHVDQUF1QztJQUUzRixJQUFJLG9CQUFvQixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQUMsS0FBSztJQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRTtRQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQzdDO1lBQ0ksSUFBSSxPQUFPLENBQUMsSUFBSSxHQUFHO1lBQ25CLGFBQWE7WUFDYixjQUFjO1lBQ2QsZ0JBQWdCO1lBQ2hCLElBQUksT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHO1NBQ3BDLENBQUMsQ0FBQztRQUNQLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyJ9 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/audio/convert.d.ts b/packages/media/dist-in/lib/media/audio/convert.d.ts index 83ab31c3..7903b9de 100644 --- a/packages/media/dist-in/lib/media/audio/convert.d.ts +++ b/packages/media/dist-in/lib/media/audio/convert.d.ts @@ -1,13 +1,13 @@ -import { IConvertVideoOptions } from '../../../types'; -export declare const split: (src: string, dst: string, onNode: any, options: { - interval: number; -}) => Promise; -export declare const CONVERTERS: { - '.mp3': (src: string, dst: string, onNode: any, options: { - interval: number; - }) => Promise; -}; -export declare const converter: (file: string) => any; -export declare const convertFile: (file: any, target: any, onNode: (data: any) => void, options: IConvertVideoOptions) => Promise; -export declare function _convert(file: any, targets: string[], onNode: (data: any) => void, options: IConvertVideoOptions): Promise; -export declare const convert: (options: IConvertVideoOptions) => Promise; +import { IConvertVideoOptions } from '../../../types'; +export declare const split: (src: string, dst: string, onNode: any, options: { + interval: number; +}) => Promise; +export declare const CONVERTERS: { + '.mp3': (src: string, dst: string, onNode: any, options: { + interval: number; + }) => Promise; +}; +export declare const converter: (file: string) => any; +export declare const convertFile: (file: any, target: any, onNode: (data: any) => void, options: IConvertVideoOptions) => Promise; +export declare function _convert(file: any, targets: string[], onNode: (data: any) => void, options: IConvertVideoOptions): Promise; +export declare const convert: (options: IConvertVideoOptions) => Promise; diff --git a/packages/media/dist-in/lib/media/audio/convert.js b/packages/media/dist-in/lib/media/audio/convert.js index 3960adc5..e1316bb4 100644 --- a/packages/media/dist-in/lib/media/audio/convert.js +++ b/packages/media/dist-in/lib/media/audio/convert.js @@ -1,118 +1,87 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.convert = exports._convert = exports.convertFile = exports.converter = exports.CONVERTERS = exports.split = void 0; -const path = __importStar(require("path")); -const pMap = __importStar(require("p-map")); -const commons_1 = require("@polymech/commons"); -const exists_1 = require("@polymech/fs/exists"); -const dir_1 = require("@polymech/fs/dir"); -const lib_1 = require("@polymech/cache/lib"); -const __1 = require("../../"); -const __2 = require("../../.."); -const constants_1 = require("../../../constants"); -const ffmpeg_1 = require("../ffmpeg"); -const FfmpegCommand = require('fluent-ffmpeg'); -const extension = (file) => path.parse(file).ext; -const split = async (src, dst, onNode, options) => { - try { - const metadata = await (0, ffmpeg_1.meta)(src); - const duration = metadata.format.duration; - if (!duration) { - __2.logger.error('Unable to determine duration of the audio file.'); - return; - } - let startTime = 0; - let segmentIndex = 1; - while (startTime < duration) { - const outputFile = `${dst}/segment_${segmentIndex}.mp3`; - await new Promise((resolve, reject) => { - const ff = new FfmpegCommand(src) - .setStartTime(startTime) - .setDuration(options.interval) - .output(outputFile) - .on('end', () => { - __2.logger.info(`Segment ${segmentIndex} finished.`); - resolve(); - }) - .on('error', (error) => { - __2.logger.error(`Error while processing segment ${segmentIndex}:`, error.message); - reject(error); - }) - .run(); - }); - startTime += options.interval; - segmentIndex++; - } - } - catch (error) { - __2.logger.error('Error splitting audio file:', error); - } -}; -exports.split = split; -exports.CONVERTERS = { - '.mp3': exports.split -}; -const converter = (file) => exports.CONVERTERS[extension(file)]; -exports.converter = converter; -const convertFile = async (file, target, onNode = () => { }, options) => { - const osr_cache = (0, commons_1.OSR_CACHE)(); - const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })); - const cached = await (0, lib_1.get_cached)(file, ca_options, constants_1.MODULE_NAME); - const conv = (0, exports.converter)(target); - if (!conv) { - __2.logger.error(`No converter found for ${file}`); - return; - } - const dstParts = path.parse(target); - if (!(0, exists_1.sync)(dstParts.dir)) { - (0, dir_1.sync)(dstParts.dir); - } - const ret = await conv(file, target, onNode, options); - return ret; -}; -exports.convertFile = convertFile; -async function _convert(file, targets, onNode = () => { }, options) { - return pMap(targets, (target) => { - options.verbose && __2.logger.debug(`Convert ${file} to ${target}`); - if (options.dry) { - return; - } - return (0, exports.convertFile)(file, target, onNode, options); - }, { concurrency: 1 }); -} -exports._convert = _convert; -const convert = async (options) => { - let reports = []; - const onNode = (data) => { reports.push(data); }; - options.verbose && __2.logger.info(`Convert ${options.srcInfo.FILES.length} files `); - await pMap(options.srcInfo.FILES, (f) => { - const outputs = (0, __1.targets)(f, options); - options.verbose && __2.logger.info(`Convert ${f} to `, outputs); - return _convert(f, outputs, onNode, options); - }, { concurrency: 1 }); -}; -exports.convert = convert; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVkaWEvYXVkaW8vY29udmVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE0QjtBQUM1Qiw0Q0FBNkI7QUFDN0IsK0NBQTZDO0FBQzdDLGdEQUFvRDtBQUNwRCwwQ0FBOEM7QUFDOUMsNkNBQWdEO0FBQ2hELDhCQUFnQztBQUNoQyxnQ0FBaUM7QUFDakMsa0RBQWdEO0FBR2hELHNDQUFnQztBQUloQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7QUFFOUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFBO0FBRWpELE1BQU0sS0FBSyxHQUFHLEtBQUssRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLE1BQU0sRUFBRSxPQUE2QixFQUFpQixFQUFFO0lBQzFHLElBQUk7UUFDQSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsYUFBSSxFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFBO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxVQUFNLENBQUMsS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7WUFDaEUsT0FBTztTQUNWO1FBRUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO1FBQ2pCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQTtRQUVwQixPQUFPLFNBQVMsR0FBRyxRQUFRLEVBQUU7WUFDekIsTUFBTSxVQUFVLEdBQUcsR0FBRyxHQUFHLFlBQVksWUFBWSxNQUFNLENBQUM7WUFFeEQsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDeEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDO3FCQUM1QixZQUFZLENBQUMsU0FBUyxDQUFDO3FCQUN2QixXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztxQkFDN0IsTUFBTSxDQUFDLFVBQVUsQ0FBQztxQkFDbEIsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1osVUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLFlBQVksWUFBWSxDQUFDLENBQUM7b0JBQ2pELE9BQU8sRUFBRSxDQUFDO2dCQUNkLENBQUMsQ0FBQztxQkFDRCxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ25CLFVBQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLFlBQVksR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDL0UsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsQixDQUFDLENBQUM7cUJBQ0QsR0FBRyxFQUFFLENBQUM7WUFDZixDQUFDLENBQUMsQ0FBQztZQUVILFNBQVMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQzlCLFlBQVksRUFBRSxDQUFDO1NBQ2xCO0tBQ0o7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNaLFVBQU0sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUE7S0FDckQ7QUFDTCxDQUFDLENBQUE7QUFyQ1ksUUFBQSxLQUFLLFNBcUNqQjtBQUNZLFFBQUEsVUFBVSxHQUN2QjtJQUNJLE1BQU0sRUFBRSxhQUFLO0NBQ2hCLENBQUE7QUFFTSxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsa0JBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUF6RCxRQUFBLFNBQVMsYUFBZ0Q7QUFDL0QsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBOEIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQTZCLEVBQUUsRUFBRTtJQUN0SCxNQUFNLFNBQVMsR0FBRyxJQUFBLG1CQUFTLEdBQUUsQ0FBQTtJQUM3QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNqRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsZ0JBQVUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLHVCQUFXLENBQUMsQ0FBQTtJQUM5RCxNQUFNLElBQUksR0FBRyxJQUFBLGlCQUFTLEVBQUMsTUFBTSxDQUFDLENBQUE7SUFDOUIsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNQLFVBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLElBQUksRUFBRSxDQUFDLENBQUE7UUFDOUMsT0FBTTtLQUNUO0lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuQyxJQUFJLENBQUMsSUFBQSxhQUFNLEVBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZCLElBQUEsVUFBRyxFQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUNwQjtJQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3JELE9BQU8sR0FBRyxDQUFBO0FBQ2QsQ0FBQyxDQUFBO0FBZlksUUFBQSxXQUFXLGVBZXZCO0FBQ00sS0FBSyxVQUFVLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBaUIsRUFBRSxTQUE4QixHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBNkI7SUFDMUgsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDNUIsT0FBTyxDQUFDLE9BQU8sSUFBSSxVQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxPQUFPLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDL0QsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ2IsT0FBTTtTQUNUO1FBQ0QsT0FBTyxJQUFBLG1CQUFXLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEQsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDMUIsQ0FBQztBQVJELDRCQVFDO0FBRU0sTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLE9BQTZCLEVBQUUsRUFBRTtJQUMzRCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFDaEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUE7SUFDL0MsT0FBTyxDQUFDLE9BQU8sSUFBSSxVQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxTQUFTLENBQUMsQ0FBQTtJQUNoRixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUEsV0FBTyxFQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNuQyxPQUFPLENBQUMsT0FBTyxJQUFJLFVBQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzRCxPQUFPLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNoRCxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUMxQixDQUFDLENBQUE7QUFUWSxRQUFBLE9BQU8sV0FTbkIifQ== \ No newline at end of file +import * as path from 'path'; +import * as pMap from 'p-map'; +import { OSR_CACHE } from '@polymech/commons'; +import { sync as exists } from "@polymech/fs/exists"; +import { sync as dir } from "@polymech/fs/dir"; +import { get_cached } from '@polymech/cache/lib'; +import { targets } from '../../'; +import { logger } from '../../..'; +import { MODULE_NAME } from '../../../constants'; +import { meta } from '../ffmpeg'; +const FfmpegCommand = require('fluent-ffmpeg'); +const extension = (file) => path.parse(file).ext; +export const split = async (src, dst, onNode, options) => { + try { + const metadata = await meta(src); + const duration = metadata.format.duration; + if (!duration) { + logger.error('Unable to determine duration of the audio file.'); + return; + } + let startTime = 0; + let segmentIndex = 1; + while (startTime < duration) { + const outputFile = `${dst}/segment_${segmentIndex}.mp3`; + await new Promise((resolve, reject) => { + const ff = new FfmpegCommand(src) + .setStartTime(startTime) + .setDuration(options.interval) + .output(outputFile) + .on('end', () => { + logger.info(`Segment ${segmentIndex} finished.`); + resolve(); + }) + .on('error', (error) => { + logger.error(`Error while processing segment ${segmentIndex}:`, error.message); + reject(error); + }) + .run(); + }); + startTime += options.interval; + segmentIndex++; + } + } + catch (error) { + logger.error('Error splitting audio file:', error); + } +}; +export const CONVERTERS = { + '.mp3': split +}; +export const converter = (file) => CONVERTERS[extension(file)]; +export const convertFile = async (file, target, onNode = () => { }, options) => { + const osr_cache = OSR_CACHE(); + const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })); + const cached = await get_cached(file, ca_options, MODULE_NAME); + const conv = converter(target); + if (!conv) { + logger.error(`No converter found for ${file}`); + return; + } + const dstParts = path.parse(target); + if (!exists(dstParts.dir)) { + dir(dstParts.dir); + } + const ret = await conv(file, target, onNode, options); + return ret; +}; +export async function _convert(file, targets, onNode = () => { }, options) { + return pMap(targets, (target) => { + options.verbose && logger.debug(`Convert ${file} to ${target}`); + if (options.dry) { + return; + } + return convertFile(file, target, onNode, options); + }, { concurrency: 1 }); +} +export const convert = async (options) => { + let reports = []; + const onNode = (data) => { reports.push(data); }; + options.verbose && logger.info(`Convert ${options.srcInfo.FILES.length} files `); + await pMap(options.srcInfo.FILES, (f) => { + const outputs = targets(f, options); + options.verbose && logger.info(`Convert ${f} to `, outputs); + return _convert(f, outputs, onNode, options); + }, { concurrency: 1 }); +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVkaWEvYXVkaW8vY29udmVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUM1QixPQUFPLEtBQUssSUFBSSxNQUFNLE9BQU8sQ0FBQTtBQUM3QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDN0MsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBR2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFJaEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0FBRTlDLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQTtBQUV4RCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsTUFBTSxFQUFFLE9BQTZCLEVBQWlCLEVBQUU7SUFDMUcsSUFBSSxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDaEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUE7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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/ffmpeg.d.ts b/packages/media/dist-in/lib/media/ffmpeg.d.ts index 94eb8d0c..ef63fcc2 100644 --- a/packages/media/dist-in/lib/media/ffmpeg.d.ts +++ b/packages/media/dist-in/lib/media/ffmpeg.d.ts @@ -1,2 +1,2 @@ -import { FfprobeData } from 'fluent-ffmpeg'; -export declare const meta: (src: string) => Promise; +import { FfprobeData } from 'fluent-ffmpeg'; +export declare const meta: (src: string) => Promise; diff --git a/packages/media/dist-in/lib/media/ffmpeg.js b/packages/media/dist-in/lib/media/ffmpeg.js index 2eee9cca..5a009aa3 100644 --- a/packages/media/dist-in/lib/media/ffmpeg.js +++ b/packages/media/dist-in/lib/media/ffmpeg.js @@ -1,21 +1,17 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.meta = void 0; -const FfmpegCommand = require('fluent-ffmpeg'); -const meta = async (src) => { - return new Promise((resolve, reject) => { - const ff = new FfmpegCommand(src); - ff.ffprobe(src, (err, metadata) => { - if (err) { - //logger.error('Error retrieving metadata:', err) - reject(err); - } - else { - //logger.info('Successfully retrieved metadata.'); - resolve(metadata); - } - }); - }); -}; -exports.meta = meta; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZtcGVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9mZm1wZWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0FBRXZDLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFXLEVBQXdCLEVBQUU7SUFDNUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNqQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNoQyxJQUFJLEdBQUcsRUFBRTtnQkFDUCxpREFBaUQ7Z0JBQ2pELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNiO2lCQUFNO2dCQUNMLGtEQUFrRDtnQkFDbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQWJVLFFBQUEsSUFBSSxRQWFkIn0= \ No newline at end of file +const FfmpegCommand = require('fluent-ffmpeg'); +export const meta = async (src) => { + return new Promise((resolve, reject) => { + const ff = new FfmpegCommand(src); + ff.ffprobe(src, (err, metadata) => { + if (err) { + //logger.error('Error retrieving metadata:', err) + reject(err); + } + else { + //logger.info('Successfully retrieved metadata.'); + resolve(metadata); + } + }); + }); +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZtcGVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9mZm1wZWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBVyxFQUF3QixFQUFFO0lBQzVELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxFQUFFLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDakMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDaEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixpREFBaUQ7Z0JBQ2pELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLENBQUM7aUJBQU0sQ0FBQztnQkFDTixrREFBa0Q7Z0JBQ2xELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNuQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/images/background-remove-bria.d.ts b/packages/media/dist-in/lib/media/images/background-remove-bria.d.ts index 519b501c..98d66075 100644 --- a/packages/media/dist-in/lib/media/images/background-remove-bria.d.ts +++ b/packages/media/dist-in/lib/media/images/background-remove-bria.d.ts @@ -6,6 +6,9 @@ export interface BriaBackgroundRemoveOptions extends IOptions { preserveAlpha?: boolean; jpg?: boolean; } +export declare const BriaBackgroundRemoveOptionsSchema: (opts?: any) => any; +export declare const types: () => void; +export declare const schemas: () => void; export declare function removeBriaBackground(inputPath: string, outputPath: string, options: BriaBackgroundRemoveOptions): Promise; export declare const briaBackgroundRemove: (options: BriaBackgroundRemoveOptions) => Promise<{ src: string; diff --git a/packages/media/dist-in/lib/media/images/background-remove-bria.js b/packages/media/dist-in/lib/media/images/background-remove-bria.js index 48dd02e3..157fef8b 100644 --- a/packages/media/dist-in/lib/media/images/background-remove-bria.js +++ b/packages/media/dist-in/lib/media/images/background-remove-bria.js @@ -2,9 +2,74 @@ import * as fs from 'fs'; import * as path from 'path'; import sharp from 'sharp'; import pMap from 'p-map'; +import { z } from 'zod'; import { logger } from '../../../index.js'; import { targets } from '../../index.js'; import { sync as mkdir } from '@polymech/fs/dir'; +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons'; +// Zod Schema for Bria background remove options +let schemaMap; +export const BriaBackgroundRemoveOptionsSchema = (opts) => { + schemaMap = ZodMetaMap.create(); + schemaMap.add('src', z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to remove background from')) + .add('dst', z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for processed files')) + .add('debug', z.boolean() + .default(false) + .describe('Enable internal debug messages')) + .add('alt', z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $')) + .add('dry', z.boolean() + .default(false) + .describe('Run without conversion')) + .add('verbose', z.boolean() + .default(false) + .describe('Show internal messages')) + .add('logLevel', z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error')) + .add('cache', z.boolean() + .default(true) + .describe('Skip processing if target file already exists')) + .add('apiKey', z.string() + .optional() + .describe('Bria API key (or set in config.bria.key)')) + .add('sync', z.boolean() + .default(true) + .describe('Use synchronous processing (recommended)')) + .add('contentModeration', z.boolean() + .default(false) + .describe('Enable content moderation')) + .add('preserveAlpha', z.boolean() + .default(true) + .describe('Preserve alpha channel from input image')) + .add('jpg', z.boolean() + .default(false) + .describe('Convert PNG output to JPG format and delete PNG')); + return schemaMap.root() + .passthrough() + .describe('IBriaBackgroundRemoveOptions'); +}; +export const types = () => { + generate_interfaces([BriaBackgroundRemoveOptionsSchema()], 'src/zod_types_background_remove_bria.ts'); + schemas(); +}; +export const schemas = () => { + const schema = BriaBackgroundRemoveOptionsSchema(); + write([schema], 'schemas_background_remove_bria.json', 'background-remove-bria', {}); + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_background_remove_bria.json', JSON.stringify(schemaMap.getUISchema(), null, 2)); + }).catch(err => { + console.warn('Could not write UI schema:', err.message); + }); + } +}; // Read image file as buffer for Bria API function readImageFile(filePath) { return fs.readFileSync(filePath); @@ -135,4 +200,4 @@ export const briaBackgroundRemove = async (options) => { return []; } }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1yZW1vdmUtYnJpYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVkaWEvaW1hZ2VzL2JhY2tncm91bmQtcmVtb3ZlLWJyaWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFVakQseUNBQXlDO0FBQ3pDLFNBQVMsYUFBYSxDQUFDLFFBQWdCO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsMkNBQTJDO0FBQzNDLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO0lBQ3RFLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUV4QyxpQ0FBaUM7SUFDakMsS0FB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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1yZW1vdmUtYnJpYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVkaWEvaW1hZ2VzL2JhY2tncm91bmQtcmVtb3ZlLWJyaWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUN6QixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBVTNFLGdEQUFnRDtBQUNoRCxJQUFJLFNBQVMsQ0FBQTtBQUViLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLENBQUMsSUFBVSxFQUFPLEVBQUU7SUFDakUsU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUUvQixTQUFTLENBQUMsR0FBRyxDQUNULEtBQUssRUFDTCxDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNOLFFBQVEsQ0FBQyw2REFBNkQsQ0FBQyxDQUMvRTtTQUNBLEdBQUcsQ0FDQSxLQUFLLEVBQ0wsQ0FBQyxDQUFDLE1BQU0sRUFBRTtTQUNMLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyxvREFBb0QsQ0FBQyxDQUN0RTtTQUNBLEdBQUcsQ0FDQSxPQUFPLEVBQ1AsQ0FB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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/images/background-remove.d.ts b/packages/media/dist-in/lib/media/images/background-remove.d.ts index afc5ef9c..709cb7da 100644 --- a/packages/media/dist-in/lib/media/images/background-remove.d.ts +++ b/packages/media/dist-in/lib/media/images/background-remove.d.ts @@ -7,5 +7,8 @@ export interface BackgroundRemoveOptions extends IOptions { alpha_matting_background_threshold?: number; alpha_matting_erode_size?: number; } +export declare const BackgroundRemoveOptionsSchema: (opts?: any) => any; +export declare const types: () => void; +export declare const schemas: () => void; export declare function removeBackgroundFile(inputPath: string, outputPath: string, options: BackgroundRemoveOptions): Promise; export declare const backgroundRemove: (options: BackgroundRemoveOptions) => Promise; diff --git a/packages/media/dist-in/lib/media/images/background-remove.js b/packages/media/dist-in/lib/media/images/background-remove.js index dde83484..684d23d0 100644 --- a/packages/media/dist-in/lib/media/images/background-remove.js +++ b/packages/media/dist-in/lib/media/images/background-remove.js @@ -1,9 +1,83 @@ import * as fs from 'fs'; import * as path from 'path'; import pMap from 'p-map'; +import { z } from 'zod'; import { logger } from '../../../index.js'; import { targets } from '../../index.js'; import { sync as mkdir } from '@polymech/fs/dir'; +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons'; +// Zod Schema for background remove options +let schemaMap; +export const BackgroundRemoveOptionsSchema = (opts) => { + schemaMap = ZodMetaMap.create(); + schemaMap.add('src', z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to remove background from')) + .add('dst', z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for processed files')) + .add('debug', z.boolean() + .default(false) + .describe('Enable internal debug messages')) + .add('alt', z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $')) + .add('dry', z.boolean() + .default(false) + .describe('Run without conversion')) + .add('verbose', z.boolean() + .default(false) + .describe('Show internal messages')) + .add('logLevel', z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error')) + .add('apiKey', z.string() + .optional() + .describe('Replicate API key (or set REPLICATE_API_TOKEN env var)')) + .add('model', z.string() + .default('lucataco/remove-bg:95fcc2a26d3899cd6c2691c900465aaeff466285a65c14638cc5f36f34befaf1') + .describe('Background removal model to use')) + .add('alpha_matting', z.boolean() + .default(false) + .describe('Enable alpha matting for better edge refinement')) + .add('alpha_matting_foreground_threshold', z.number() + .int() + .min(0) + .max(500) + .default(270) + .describe('Alpha matting foreground threshold')) + .add('alpha_matting_background_threshold', z.number() + .int() + .min(0) + .max(100) + .default(10) + .describe('Alpha matting background threshold')) + .add('alpha_matting_erode_size', z.number() + .int() + .min(0) + .max(50) + .default(10) + .describe('Alpha matting erode size')); + return schemaMap.root() + .passthrough() + .describe('IBackgroundRemoveOptions'); +}; +export const types = () => { + generate_interfaces([BackgroundRemoveOptionsSchema()], 'src/zod_types_background_remove.ts'); + schemas(); +}; +export const schemas = () => { + const schema = BackgroundRemoveOptionsSchema(); + write([schema], 'schemas_background_remove.json', 'background-remove', {}); + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_background_remove.json', JSON.stringify(schemaMap.getUISchema(), null, 2)); + }).catch(err => { + console.warn('Could not write UI schema:', err.message); + }); + } +}; // Base64 encode image file function encodeImageToBase64(filePath) { const imageBuffer = fs.readFileSync(filePath); @@ -101,4 +175,4 @@ export const backgroundRemove = async (options) => { options.debug && logger.error(`Invalid source info`); } }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1yZW1vdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lZGlhL2ltYWdlcy9iYWNrZ3JvdW5kLXJlbW92ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLElBQUksTUFBTSxPQUFPLENBQUM7QUFDekIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBWWpELDJCQUEyQjtBQUMzQixTQUFTLG1CQUFtQixDQUFDLFFBQWdCO0lBQzNDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsT0FBTyxjQUFjLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUNsRyxDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxNQUFXLEVBQUUsVUFBa0I7SUFDaEUsaUNBQWlDO0lBQ2pDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFaEMsdUNBQXVDO0lBQ3ZDLElBQUksTUFBTSxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMvQyw2Q0FBNkM7UUFDN0MsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQs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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1yZW1vdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lZGlhL2ltYWdlcy9iYWNrZ3JvdW5kLXJlbW92ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLElBQUksTUFBTSxPQUFPLENBQUM7QUFDekIsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVkzRSwyQ0FBMkM7QUFDM0MsSUFBSSxTQUFTLENBQUE7QUFFYixNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLElBQVUsRUFBTyxFQUFFO0lBQzdELFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUE7SUFFL0IsU0FBUyxDQUFDLEdBQUcsQ0FDVCxLQUFLLEVBQ0wsQ0FBQyxDQUFDLE1BQU0sRUFBRTtTQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDTixRQUFRLENBQUMsNkRBQTZELENBQUMsQ0FDL0U7U0FDQSxHQUFHLENBQ0EsS0FBSyxFQUNMLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDTCxRQUFRLEVBQUU7U0FDVixRQUFRLENBQUMsb0RBQW9ELENBQUMsQ0FDdEU7U0FDQSxHQUFHLENBQ0EsT0FBTyxFQUNQLENBQUMsQ0FBQyxPQUFPLEVBQUU7U0FDTixPQUFPLENBQUMsS0FBSyxDQUFD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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/images/crop-foreground.d.ts b/packages/media/dist-in/lib/media/images/crop-foreground.d.ts index fb75b13f..8c1dfac5 100644 --- a/packages/media/dist-in/lib/media/images/crop-foreground.d.ts +++ b/packages/media/dist-in/lib/media/images/crop-foreground.d.ts @@ -5,4 +5,7 @@ export interface CropForegroundOptions extends IOptions { contentModeration?: boolean; preserveAlpha?: boolean; } +export declare const CropForegroundOptionsSchema: (opts?: any) => any; +export declare const types: () => void; +export declare const schemas: () => void; export declare function cropForeground(options: CropForegroundOptions): Promise; diff --git a/packages/media/dist-in/lib/media/images/crop-foreground.js b/packages/media/dist-in/lib/media/images/crop-foreground.js index 45aae4fb..c7f0f98d 100644 --- a/packages/media/dist-in/lib/media/images/crop-foreground.js +++ b/packages/media/dist-in/lib/media/images/crop-foreground.js @@ -1,9 +1,68 @@ import * as fs from 'fs'; import * as path from 'path'; import pMap from 'p-map'; +import { z } from 'zod'; import { logger } from '../../../index.js'; import { sync as mkdir } from '@polymech/fs/dir'; import { targets } from '../../index.js'; +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons'; +// Zod Schema for crop foreground options +let schemaMap; +export const CropForegroundOptionsSchema = (opts) => { + schemaMap = ZodMetaMap.create(); + schemaMap.add('src', z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to crop foreground from')) + .add('dst', z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for processed files')) + .add('debug', z.boolean() + .default(false) + .describe('Enable internal debug messages')) + .add('alt', z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $')) + .add('dry', z.boolean() + .default(false) + .describe('Run without conversion')) + .add('verbose', z.boolean() + .default(false) + .describe('Show internal messages')) + .add('logLevel', z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error')) + .add('apiKey', z.string() + .optional() + .describe('Bria API key (or set in config.bria.key)')) + .add('sync', z.boolean() + .default(true) + .describe('Use synchronous processing (recommended)')) + .add('contentModeration', z.boolean() + .default(false) + .describe('Enable content moderation')) + .add('preserveAlpha', z.boolean() + .default(true) + .describe('Preserve alpha channel from input image')); + return schemaMap.root() + .passthrough() + .describe('ICropForegroundOptions'); +}; +export const types = () => { + generate_interfaces([CropForegroundOptionsSchema()], 'src/zod_types_crop_foreground.ts'); + schemas(); +}; +export const schemas = () => { + const schema = CropForegroundOptionsSchema(); + write([schema], 'schemas_crop_foreground.json', 'crop-foreground', {}); + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_crop_foreground.json', JSON.stringify(schemaMap.getUISchema(), null, 2)); + }).catch(err => { + console.warn('Could not write UI schema:', err.message); + }); + } +}; // Read image file as buffer for Bria API function readImageFile(filePath) { return fs.readFileSync(filePath); @@ -92,4 +151,4 @@ export async function cropForeground(options) { }, { concurrency: 1 }); }, { concurrency: 2 }); } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC1mb3JlZ3JvdW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9pbWFnZXMvY3JvcC1mb3JlZ3JvdW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFTekMseUNBQXlDO0FBQ3pDLFNBQVMsYUFBYSxDQUFDLFFBQWdCO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsMkNBQTJDO0FBQzNDLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO0lBQ3RFLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFaEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FB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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC1mb3JlZ3JvdW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9pbWFnZXMvY3JvcC1mb3JlZ3JvdW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUN6QixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBUzNFLHlDQUF5QztBQUN6QyxJQUFJLFNBQVMsQ0FBQTtBQUViLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQUMsSUFBVSxFQUFPLEVBQUU7SUFDM0QsU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUUvQixTQUFTLENBQUMsR0FBRyxDQUNULEtBQUssRUFDTCxDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNOLFFBQVEsQ0FBQywyREFBMkQsQ0FBQyxDQUM3RTtTQUNBLEdBQUcsQ0FDQSxLQUFLLEVBQ0wsQ0FBQyxDQUFDLE1BQU0sRUFBRTtTQUNMLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyxvREFBb0QsQ0FBQyxDQUN0RTtTQUNBLEdBQUcsQ0FDQSxPQUFPLEVBQ1AsQ0FBQyxDQUFDLE9BQU8sRUFBRTtTQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUM7U0FD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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/images/index.d.ts b/packages/media/dist-in/lib/media/images/index.d.ts index 5ecb0ee6..970a7b39 100644 --- a/packages/media/dist-in/lib/media/images/index.d.ts +++ b/packages/media/dist-in/lib/media/images/index.d.ts @@ -1,6 +1,5 @@ export * from './resize.js'; export * from './convert.js'; -export * from './watermark.js'; import sharp from 'sharp'; import { IResizeOptions } from '../../../index.js'; export declare const GLOB_BASIC = "png|jpg|tiff|jpeg|webp"; diff --git a/packages/media/dist-in/lib/media/images/index.js b/packages/media/dist-in/lib/media/images/index.js index e21607fa..b0045bf6 100644 --- a/packages/media/dist-in/lib/media/images/index.js +++ b/packages/media/dist-in/lib/media/images/index.js @@ -1,6 +1,6 @@ export * from './resize.js'; export * from './convert.js'; -export * from './watermark.js'; +// export * from './watermark.js' // Commented out to avoid naming conflicts with schemas/types functions import pMap from 'p-map'; import * as path from 'path'; import * as fs from 'fs'; @@ -133,4 +133,4 @@ export const resizeSharp = async (patterns) => { }); }); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lZGlhL2ltYWdlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGFBQWEsQ0FBQTtBQUMzQixjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLGdCQUFnQixDQUFBO0FBQzlCLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQTtBQUN4QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUM1QixPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQTtBQUN4QixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFJekIsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFM0IsT0FBTyxFQUFrQixNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFM0Msa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQTtBQUVsRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsK0JBQStCLENBQUE7QUFFdkQsT0FBTyxFQUFFLE1BQU0sSUFBSSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFHckQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO0lBQ3RDLE9BQU8sQ0FBQztZQUNKLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxNQUFNLElBQUksUUFBUSxFQUFFO1lBQ25DLElBQUksRUFBRSxHQUFHLEdBQUcsSUFBSSxNQUFNLE9BQU87WUFDN0IsTUFBTSxFQUFFLE1BQU07U0FD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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lZGlhL2ltYWdlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGFBQWEsQ0FBQTtBQUMzQixjQUFjLGNBQWMsQ0FBQTtBQUM1Qix5R0FBeUc7QUFDekcsT0FBTyxJQUFJLE1BQU0sT0FBTyxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUl6QixPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFaEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUUzQixPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUUzQyxrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLHdCQUF3QixDQUFBO0FBRWxELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRywrQkFBK0IsQ0FBQTtBQUV2RCxPQUFPLEVBQUUsTUFBTSxJQUFJLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUdyRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxDQUFDO1lBQ0osR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLE1BQU0sSUFBSSxRQUFRLEVBQUU7WUFDbkMsSUFBSSxFQUFFLEdBQUcsR0FBRyxJQUFJLE1BQU0sT0FBTztZQUM3QixNQUFNLEVBQUUsTUFBTTtTQUNqQixDQUFDLENB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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/images/resize.d.ts b/packages/media/dist-in/lib/media/images/resize.d.ts index 907fdc46..baa7cd84 100644 --- a/packages/media/dist-in/lib/media/images/resize.d.ts +++ b/packages/media/dist-in/lib/media/images/resize.d.ts @@ -1,5 +1,8 @@ import sharp from 'sharp'; import { IOptions, IResizeOptions } from '../../../index.js'; +export declare const ResizeOptionsSchema: (opts?: any) => any; +export declare const types: () => void; +export declare const schemas: () => void; export declare const resizeFile: (source: string, target: string, onNode: (data: sharp.Sharp) => void, options: IResizeOptions) => Promise; export declare const _resize: (file: any, targets: string[], onNode: (data: any) => void, options: IOptions) => Promise<(void | sharp.Sharp)[]>; export declare const resize: (options: IResizeOptions) => Promise; diff --git a/packages/media/dist-in/lib/media/images/resize.js b/packages/media/dist-in/lib/media/images/resize.js index 6206b492..69208257 100644 --- a/packages/media/dist-in/lib/media/images/resize.js +++ b/packages/media/dist-in/lib/media/images/resize.js @@ -1,13 +1,117 @@ import * as path from 'path'; import pMap from 'p-map'; import sharp from 'sharp'; +import { z } from 'zod'; import { sync as exists } from "@polymech/fs/exists"; import { async as move } from "@polymech/fs/move"; import { sync as dir } from "@polymech/fs/dir"; import { createItem as toNode } from "@polymech/fs/inspect"; +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons'; import { logger, ERR_PERM_RETRY_DELAY, ERR_PERM_RETRY_MAX } from '../../../index.js'; import { targetsNext } from '../../index.js'; import { meta } from './lib.js'; +// Zod Schema for resize options +let schemaMap; +export const ResizeOptionsSchema = (opts) => { + schemaMap = ZodMetaMap.create(); + schemaMap.add('src', z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to resize')) + .add('dst', z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for resized files')) + .add('debug', z.boolean() + .default(false) + .describe('Enable internal debug messages')) + .add('alt', z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $')) + .add('dry', z.boolean() + .default(false) + .describe('Run without conversion')) + .add('verbose', z.boolean() + .default(false) + .describe('Show internal messages')) + .add('width', z.number() + .positive() + .optional() + .describe('Resize image width')) + .add('height', z.number() + .positive() + .optional() + .describe('Resize image height')) + .add('minHeight', z.number() + .positive() + .optional() + .describe('Resize image minimum height')) + .add('minWidth', z.number() + .positive() + .optional() + .describe('Resize image minimum width')) + .add('minSize', z.number() + .positive() + .optional() + .describe('Resize image size (bytes)')) + .add('percent', z.number() + .positive() + .max(1000) + .optional() + .describe('Resize image in percent (width)')) + .add('square', z.boolean() + .default(false) + .describe('Fit image within width for 1:1 aspect ratio without cropping')) + .add('fillColor', z.string() + .default('white') + .describe('Fill color for square backgrounds (default: white)')) + .add('logLevel', z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error')) + .add('fit', z.enum(['cover', 'contain', 'fill', 'inside', 'outside']) + .optional() + .describe('How the image should be resized to fit both provided dimensions')) + .add('position', z.union([z.number(), z.string()]) + .optional() + .describe('Position, gravity or strategy to use when fit is cover or contain')) + .add('background', z.union([z.string(), z.object({ + r: z.number().min(0).max(255), + g: z.number().min(0).max(255), + b: z.number().min(0).max(255), + alpha: z.number().min(0).max(1).optional() + })]) + .optional() + .describe('Background color when using a fit of contain')) + .add('kernel', z.enum(['nearest', 'cubic', 'mitchell', 'lanczos2', 'lanczos3']) + .optional() + .describe('The kernel to use for image reduction')) + .add('withoutEnlargement', z.boolean() + .default(false) + .describe('Do not enlarge if the width or height are already less than the specified dimensions')) + .add('withoutReduction', z.boolean() + .default(false) + .describe('Do not reduce if the width or height are already greater than the specified dimensions')) + .add('fastShrinkOnLoad', z.boolean() + .default(true) + .describe('Take greater advantage of the JPEG and WebP shrink-on-load feature')); + return schemaMap.root() + .passthrough() + .describe('IResizeOptions'); +}; +export const types = () => { + generate_interfaces([ResizeOptionsSchema()], 'src/zod_types_resize.ts'); + schemas(); +}; +export const schemas = () => { + const schema = ResizeOptionsSchema(); + write([schema], 'schemas_resize.json', 'resize', {}); + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_resize.json', JSON.stringify(schemaMap.getUISchema(), null, 2)); + }).catch(err => { + console.warn('Could not write UI schema:', err.message); + }); + } +}; export const resizeFile = async (source, target, onNode = () => { }, options) => { //const osr_cache = OSR_CACHE() //const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })) @@ -173,4 +277,4 @@ export const resize = async (options) => { } return reports; }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9pbWFnZXMvcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQTtBQUN4QixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFFekIsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2pELE9BQU8sRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDOUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUUzRCxPQUFPLEVBQ0gsTUFBTSxFQUNOLG9CQUFvQixFQUNwQixrQkFBa0IsRUFHckIsTUFBTSxtQkFBbUIsQ0FBQTtBQUUxQixPQUFPLEVBQ0gsV0FBVyxFQUNkLE1BQU0sZ0JBQWdCLENBQUE7QUFFdkIsT0FBTyxFQUNILElBQUksRUFDUCxNQUFNLFVBQVUsQ0FBQTtBQUVqQixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBRSxNQUFjLEVBQUUsU0FBc0MsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQXVCLEVBQW9DLEVBQUU7SUFDM0ssK0JBQStCO0lBQy9CLG1GQUFtRjtJQUNuRixnRUFBZ0U7SUFDaEUsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQTtJQUM3QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNo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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9pbWFnZXMvcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQTtBQUN4QixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDekIsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUV2QixPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDakQsT0FBTyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM5QyxPQUFPLEVBQUUsVUFBVSxJQUFJLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFMUUsT0FBTyxFQUNILE1BQU0sRUFDTixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBR3JCLE1BQU0sbUJBQW1CLENBQUE7QUFFMUIsT0FBTyxFQUNILFdBQVcsRUFDZCxNQUFNLGdCQUFnQixDQUFBO0FBRXZCLE9BQU8sRUFDSCxJQUFJLEVBQ1AsTUFBTSxVQUFVLENBQUE7QUFFakIsZ0NBQWdDO0FBQ2hDLElBQUksU0FBUyxDQUFBO0FBRWIsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxJQUFVLEVBQU8sRUFBRTtJQUNuRCxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBRS9CLFNBQVMsQ0FBQyxHQUFHLENBQ1QsS0FBSyxFQUNMLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDTCxHQUFHLENBQUMsQ0FBQyxD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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/images/watermark.d.ts b/packages/media/dist-in/lib/media/images/watermark.d.ts index 95911753..59dc7910 100644 --- a/packages/media/dist-in/lib/media/images/watermark.d.ts +++ b/packages/media/dist-in/lib/media/images/watermark.d.ts @@ -36,6 +36,9 @@ export interface WatermarkOptions extends IOptions { textOptions?: TextWatermarkOptions; imageOptions?: LogoWatermarkOptions; } +export declare const WatermarkOptionsSchema: (opts?: any) => any; +export declare const types: () => void; +export declare const schemas: () => void; export declare function addLogoWatermark(inputPath: string, logoPath: string, outputPath: string, opts?: LogoWatermarkOptions): Promise; export declare function addTextWatermark(inputPath: string, text: string, outputPath: string, opts?: TextWatermarkOptions): Promise; export declare const watermark: (options: WatermarkOptions) => Promise<{ diff --git a/packages/media/dist-in/lib/media/images/watermark.js b/packages/media/dist-in/lib/media/images/watermark.js index c0ccd12c..bff06e13 100644 --- a/packages/media/dist-in/lib/media/images/watermark.js +++ b/packages/media/dist-in/lib/media/images/watermark.js @@ -2,10 +2,102 @@ import sharp from "sharp"; import * as path from 'path'; import * as fs from 'fs'; import pMap from 'p-map'; +import { z } from 'zod'; import { logger } from '../../../index.js'; import { targets } from '../../index.js'; import { sync as mkdir } from '@polymech/fs/dir'; +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons'; import { resolve } from '@polymech/commons'; +// Zod Schema for watermark options +let schemaMap; +export const WatermarkOptionsSchema = (opts) => { + schemaMap = ZodMetaMap.create(); + schemaMap.add('src', z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to add watermark to')) + .add('dst', z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for watermarked files')) + .add('debug', z.boolean() + .default(false) + .describe('Enable internal debug messages')) + .add('alt', z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $')) + .add('dry', z.boolean() + .default(false) + .describe('Run without conversion')) + .add('verbose', z.boolean() + .default(false) + .describe('Show internal messages')) + .add('logLevel', z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error')) + .add('cache', z.boolean() + .default(true) + .describe('Skip processing if target file already exists')) + .add('watermark', z.string() + .min(1) + .describe('Watermark content: text string or path to image file (PNG, JPG, SVG)')) + .add('position', z.enum(['top-left', 'top-right', 'bottom-left', 'bottom-right', 'center']) + .default('bottom-right') + .describe('Position of watermark')) + .add('margin', z.number() + .int() + .min(0) + .default(24) + .describe('Margin from edges in pixels')) + .add('opacity', z.number() + .min(0) + .max(1) + .default(0.85) + .describe('Opacity of watermark (0-1)')) + .add('sizePct', z.number() + .min(0) + .max(1) + .default(0.2) + .describe('Size of image watermark as percentage of base image width (0-1)')) + .add('fontSize', z.number() + .int() + .positive() + .default(48) + .describe('Font size for text watermark in pixels')) + .add('color', z.string() + .regex(/^#[0-9a-fA-F]{6}$/) + .default('#ffffff') + .describe('Text color (hex format, e.g., #ffffff)')) + .add('fontFamily', z.string() + .default('Arial') + .describe('Font family for text watermark')) + .add('strokeColor', z.string() + .regex(/^#[0-9a-fA-F]{6}$/) + .default('#000000') + .describe('Text stroke color (hex format, e.g., #000000)')) + .add('strokeWidth', z.number() + .int() + .min(0) + .default(2) + .describe('Text stroke width in pixels')); + return schemaMap.root() + .passthrough() + .describe('IWatermarkOptions'); +}; +export const types = () => { + generate_interfaces([WatermarkOptionsSchema()], 'src/zod_types_watermark.ts'); + schemas(); +}; +export const schemas = () => { + const schema = WatermarkOptionsSchema(); + write([schema], 'schemas_watermark.json', 'watermark', {}); + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_watermark.json', JSON.stringify(schemaMap.getUISchema(), null, 2)); + }).catch(err => { + console.warn('Could not write UI schema:', err.message); + }); + } +}; export async function addLogoWatermark(inputPath, logoPath, outputPath, opts = {}) { const { position = "bottom-right", margin = 24, sizePct = 0.2, opacity = 0.85, blend = "over", } = opts; const base = sharp(inputPath); @@ -226,4 +318,4 @@ export const watermark = async (options) => { return []; } }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9pbWFnZXMvd2F0ZXJtYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBeUIsTUFBTSxPQUFPLENBQUM7QUFDOUMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxJQUFJLE1BQU0sT0FBTyxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFnRDNDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLFNBQWlCLEVBQ2pCLFFBQWdCLEVBQ2hCLFVBQWtCLEVBQ2xCLE9BQTZCLEVBQUU7SUFFL0IsTUFBTSxFQUNKLFFBQVEsR0FBRyxjQUFjLEVBQ3pCLE1BQU0sR0FBRyxFQUFFLEVBQ1gsT0FBTyxHQUFHLEdBQUcsRUFDYixPQUFPLEdBQUcsSUFBSSxFQUNkLEtBQUssR0FBRyxNQUFNLEdBQ2YsR0FBRyxJQUFJLENBQUM7SUFFVCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENB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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9pbWFnZXMvd2F0ZXJtYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBeUIsTUFBTSxPQUFPLENBQUM7QUFDOUMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxJQUFJLE1BQU0sT0FBTyxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFMUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBZ0QzQyxtQ0FBbUM7QUFDbkMsSUFBSSxTQUFTLENBQUE7QUFFYixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQVUsRUFBTyxFQUFFO0lBQ3RELFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUE7SUFFL0IsU0FBUyxDQUFDLEdBQUcsQ0FDVCxLQUFLLEVBQ0wsQ0FBQyxDQUFDLE1BQU0sRUFBRTtTQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDTixRQUFRLENBQUMsdURBQXVELENBQUMsQ0FDekU7U0FDQSxHQUFHLENBQ0EsS0FBSyxFQUNMLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDTCxRQUFRLEVBQUU7U0FDVixRQUFRLENBQUMsc0RBQXNELENBQUMsQ0FDeEU7U0FDQSxHQUFH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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/video/convert.d.ts b/packages/media/dist-in/lib/media/video/convert.d.ts index 1cc747e1..a28f6642 100644 --- a/packages/media/dist-in/lib/media/video/convert.d.ts +++ b/packages/media/dist-in/lib/media/video/convert.d.ts @@ -1,23 +1,23 @@ -import { IConvertVideoOptions } from '../../../types'; -import { E_AudioCodec, E_Codec, E_Format } from '../video'; -export declare const frames: (src: any, dst: any, onNode: any, options?: { - fps: number; -}) => Promise; -export declare const CONVERTERS: { - '.mp3': (inputPath: string, outputPath: string) => Promise; - '.jpg': (src: any, dst: any, onNode: any, options?: { - fps: number; - }) => Promise; -}; -export declare const converter: (file: string) => any; -export declare const convertFile: (file: any, target: any, onNode: (data: any) => void, options: IConvertVideoOptions) => Promise; -export declare function _convert(file: any, targets: string[], onNode: (data: any) => void, options: IConvertVideoOptions): Promise; -export declare const convert: (options: IConvertVideoOptions) => Promise; -export declare const merge: (options: IConvertVideoOptions) => Promise; -export interface VideoOptions { - frameRate?: number; - videoCodec?: keyof typeof E_Codec; - audioCodec?: keyof typeof E_AudioCodec; - format?: keyof typeof E_Format; -} -export declare const createVideoFromImages: (src: string, target: any, onNode: any, audio: any, { frameRate, videoCodec, audioCodec, format, }: VideoOptions) => Promise; +import { IConvertVideoOptions } from '../../../types'; +import { E_AudioCodec, E_Codec, E_Format } from '../video'; +export declare const frames: (src: any, dst: any, onNode: any, options?: { + fps: number; +}) => Promise; +export declare const CONVERTERS: { + '.mp3': (inputPath: string, outputPath: string) => Promise; + '.jpg': (src: any, dst: any, onNode: any, options?: { + fps: number; + }) => Promise; +}; +export declare const converter: (file: string) => any; +export declare const convertFile: (file: any, target: any, onNode: (data: any) => void, options: IConvertVideoOptions) => Promise; +export declare function _convert(file: any, targets: string[], onNode: (data: any) => void, options: IConvertVideoOptions): Promise; +export declare const convert: (options: IConvertVideoOptions) => Promise; +export declare const merge: (options: IConvertVideoOptions) => Promise; +export interface VideoOptions { + frameRate?: number; + videoCodec?: keyof typeof E_Codec; + audioCodec?: keyof typeof E_AudioCodec; + format?: keyof typeof E_Format; +} +export declare const createVideoFromImages: (src: string, target: any, onNode: any, audio: any, { frameRate, videoCodec, audioCodec, format, }: VideoOptions) => Promise; diff --git a/packages/media/dist-in/lib/media/video/convert.js b/packages/media/dist-in/lib/media/video/convert.js index d5170400..e19f8e4d 100644 --- a/packages/media/dist-in/lib/media/video/convert.js +++ b/packages/media/dist-in/lib/media/video/convert.js @@ -1,153 +1,120 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createVideoFromImages = exports.merge = exports.convert = exports._convert = exports.convertFile = exports.converter = exports.CONVERTERS = exports.frames = void 0; -const path = __importStar(require("path")); -const pMap = __importStar(require("p-map")); -const commons_1 = require("@polymech/commons"); -const exists_1 = require("@polymech/fs/exists"); -const dir_1 = require("@polymech/fs/dir"); -const lib_1 = require("@polymech/cache/lib"); -const __1 = require("../../"); -const __2 = require("../../.."); -const constants_1 = require("../../../constants"); -const video_1 = require("../video"); -const FfmpegCommand = require('fluent-ffmpeg'); -const extension = (file) => path.parse(file).ext; -const mp3 = async (inputPath, outputPath) => { - return new Promise((resolve, reject) => { - const ff = new FfmpegCommand(inputPath); - ff.noVideo() - .audioCodec('libmp3lame') - .format('mp3') - .on('end', () => { - resolve(); - }) - .on('error', (error) => { - reject(error); - }) - .save(outputPath); - }); -}; -const frames = async (src, dst, onNode, options = { fps: 60 }) => { - const outputDir = path.dirname(dst); - if (!(0, exists_1.sync)(outputDir)) { - (0, dir_1.sync)(outputDir); - } - return new Promise((resolve, reject) => { - const ff = new FfmpegCommand(src); - ff.outputOptions([`-vf fps=${options.fps}`]) - .output(dst) - .on('end', () => { - resolve(); - }) - .on('error', (err) => { - reject(err); - }) - .run(); - }); -}; -exports.frames = frames; -exports.CONVERTERS = { - '.mp3': mp3, - '.jpg': exports.frames, -}; -const converter = (file) => exports.CONVERTERS[extension(file)]; -exports.converter = converter; -const convertFile = async (file, target, onNode = () => { }, options) => { - const osr_cache = (0, commons_1.OSR_CACHE)(); - const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })); - const cached = await (0, lib_1.get_cached)(file, ca_options, constants_1.MODULE_NAME); - const conv = (0, exports.converter)(target); - if (!conv) { - __2.logger.error(`No converter found for ${file}`); - return; - } - const dstParts = path.parse(target); - if (!(0, exists_1.sync)(dstParts.dir)) { - (0, dir_1.sync)(dstParts.dir); - } - const ret = await conv(file, target, onNode, options); - return ret; -}; -exports.convertFile = convertFile; -async function _convert(file, targets, onNode = () => { }, options) { - return pMap(targets, (target) => { - options.verbose && __2.logger.debug(`Convert ${file} to ${target}`); - if (options.dry) { - return; - } - return (0, exports.convertFile)(file, target, onNode, options); - }, { concurrency: 1 }); -} -exports._convert = _convert; -const convert = async (options) => { - let reports = []; - const onNode = (data) => { reports.push(data); }; - options.verbose && __2.logger.info(`Convert ${options.srcInfo.FILES.length} files `); - await pMap(options.srcInfo.FILES, (f) => { - const outputs = (0, __1.targets)(f, options); - options.verbose && __2.logger.info(`Convert ${f} to `, outputs); - return _convert(f, outputs, onNode, options); - }, { concurrency: 1 }); -}; -exports.convert = convert; -//ffmpeg -r 30 -i tt-1-audio.mp3 -i tt-1-%03d.jpg out.mp4 -const merge = async (options) => { - let reports = []; - const onNode = (data) => { reports.push(data); }; - __2.logger.info(`Merge ${options.srcInfo.FILES.length} files `); - return await (0, exports.createVideoFromImages)(options.srcInfo.PATH, options.dst, onNode, options.audio, {}); -}; -exports.merge = merge; -const createVideoFromImages = async (src, target, onNode, audio, { frameRate = 30, videoCodec = 'LIBX264', audioCodec = 'AAC', format = 'MP4', }) => { - return new Promise((resolve, reject) => { - const dstParts = path.parse(target); - if (!(0, exists_1.sync)(dstParts.dir)) { - (0, dir_1.sync)(dstParts.dir); - } - const ff = new FfmpegCommand(src); - //src.forEach((file) => ff.input(file)) - ff.inputOptions('-framerate', 24); - ff.inputOptions('-pattern_type', 'glob'); - ff.on('progress', (err) => { - __2.logger.debug('progress:', err); - }).on('error', (err) => { - __2.logger.error('Error:', err); - }).on('end', () => { - __2.logger.info('Video has been created successfully.'); - resolve(ff); - }); - audio && ff.addInput(audio); - ff.videoCodec(video_1.E_Codec[videoCodec]) - .output(target) - //.outputOptions(['-pix_fmt yuv420p']) - //.audioCodec(E_AudioCodec[audioCodec]) - .format(video_1.E_Format[format]) - .run(); - }); -}; -exports.createVideoFromImages = createVideoFromImages; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVkaWEvdmlkZW8vY29udmVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE0QjtBQUM1Qiw0Q0FBNkI7QUFDN0IsK0NBQTZDO0FBQzdDLGdEQUFvRDtBQUNwRCwwQ0FBOEM7QUFDOUMsNkNBQWdEO0FBR2hELDhCQUFnQztBQUNoQyxnQ0FBaUM7QUFDakMsa0RBQWdEO0FBRWhELG9DQUEwRDtBQUUxRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7QUFFOUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFBO0FBQ3hELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxTQUFpQixFQUFFLFVBQWtCLEVBQWlCLEVBQUU7SUFDdkUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2QyxFQUFFLENBQUMsT0FBTyxFQUFFO2FBQ1AsVUFBVSxDQUFDLFlBQVksQ0FBQzthQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2IsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDWixPQUFPLEVBQUUsQ0FBQTtRQUNiLENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakIsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3pCLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBRU0sTUFB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 \ No newline at end of file +import * as path from 'path'; +import * as pMap from 'p-map'; +import { OSR_CACHE } from '@polymech/commons'; +import { sync as exists } from "@polymech/fs/exists"; +import { sync as dir } from "@polymech/fs/dir"; +import { get_cached } from '@polymech/cache/lib'; +import { targets } from '../../'; +import { logger } from '../../..'; +import { MODULE_NAME } from '../../../constants'; +import { E_Codec, E_Format } from '../video'; +const FfmpegCommand = require('fluent-ffmpeg'); +const extension = (file) => path.parse(file).ext; +const mp3 = async (inputPath, outputPath) => { + return new Promise((resolve, reject) => { + const ff = new FfmpegCommand(inputPath); + ff.noVideo() + .audioCodec('libmp3lame') + .format('mp3') + .on('end', () => { + resolve(); + }) + .on('error', (error) => { + reject(error); + }) + .save(outputPath); + }); +}; +export const frames = async (src, dst, onNode, options = { fps: 60 }) => { + const outputDir = path.dirname(dst); + if (!exists(outputDir)) { + dir(outputDir); + } + return new Promise((resolve, reject) => { + const ff = new FfmpegCommand(src); + ff.outputOptions([`-vf fps=${options.fps}`]) + .output(dst) + .on('end', () => { + resolve(); + }) + .on('error', (err) => { + reject(err); + }) + .run(); + }); +}; +export const CONVERTERS = { + '.mp3': mp3, + '.jpg': frames, +}; +export const converter = (file) => CONVERTERS[extension(file)]; +export const convertFile = async (file, target, onNode = () => { }, options) => { + const osr_cache = OSR_CACHE(); + const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })); + const cached = await get_cached(file, ca_options, MODULE_NAME); + const conv = converter(target); + if (!conv) { + logger.error(`No converter found for ${file}`); + return; + } + const dstParts = path.parse(target); + if (!exists(dstParts.dir)) { + dir(dstParts.dir); + } + const ret = await conv(file, target, onNode, options); + return ret; +}; +export async function _convert(file, targets, onNode = () => { }, options) { + return pMap(targets, (target) => { + options.verbose && logger.debug(`Convert ${file} to ${target}`); + if (options.dry) { + return; + } + return convertFile(file, target, onNode, options); + }, { concurrency: 1 }); +} +export const convert = async (options) => { + let reports = []; + const onNode = (data) => { reports.push(data); }; + options.verbose && logger.info(`Convert ${options.srcInfo.FILES.length} files `); + await pMap(options.srcInfo.FILES, (f) => { + const outputs = targets(f, options); + options.verbose && logger.info(`Convert ${f} to `, outputs); + return _convert(f, outputs, onNode, options); + }, { concurrency: 1 }); +}; +//ffmpeg -r 30 -i tt-1-audio.mp3 -i tt-1-%03d.jpg out.mp4 +export const merge = async (options) => { + let reports = []; + const onNode = (data) => { reports.push(data); }; + logger.info(`Merge ${options.srcInfo.FILES.length} files `); + return await createVideoFromImages(options.srcInfo.PATH, options.dst, onNode, options.audio, {}); +}; +export const createVideoFromImages = async (src, target, onNode, audio, { frameRate = 30, videoCodec = 'LIBX264', audioCodec = 'AAC', format = 'MP4', }) => { + return new Promise((resolve, reject) => { + const dstParts = path.parse(target); + if (!exists(dstParts.dir)) { + dir(dstParts.dir); + } + const ff = new FfmpegCommand(src); + //src.forEach((file) => ff.input(file)) + ff.inputOptions('-framerate', 24); + ff.inputOptions('-pattern_type', 'glob'); + ff.on('progress', (err) => { + logger.debug('progress:', err); + }).on('error', (err) => { + logger.error('Error:', err); + }).on('end', () => { + logger.info('Video has been created successfully.'); + resolve(ff); + }); + audio && ff.addInput(audio); + ff.videoCodec(E_Codec[videoCodec]) + .output(target) + //.outputOptions(['-pix_fmt yuv420p']) + //.audioCodec(E_AudioCodec[audioCodec]) + .format(E_Format[format]) + .run(); + }); +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVkaWEvdmlkZW8vY29udmVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUM1QixPQUFPLEtBQUssSUFBSSxNQUFNLE9BQU8sQ0FBQTtBQUM3QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDN0MsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUdoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRWhELE9BQU8sRUFBZ0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUUxRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7QUFFOUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFBO0FBQ3hELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxTQUFpQixFQUFFLFVBQWtCLEVBQWlCLEVBQUU7SUFDdkUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2QyxFQUFFLENBQUMsT0FBTyxFQUFFO2FB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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/video/index.d.ts b/packages/media/dist-in/lib/media/video/index.d.ts index d5dc7a8d..84a1500b 100644 --- a/packages/media/dist-in/lib/media/video/index.d.ts +++ b/packages/media/dist-in/lib/media/video/index.d.ts @@ -1,133 +1,133 @@ -import { z } from 'zod'; -export declare const GLOB_BASIC = "png|jpg|tiff|jpeg|webp"; -export * from './resize'; -export * from './convert'; -export declare const E_Format: { - readonly MP4: "mp4"; - readonly MKV: "mkv"; - readonly MOV: "mov"; - readonly AVI: "avi"; - readonly FLV: "flv"; - readonly WMV: "wmv"; - readonly WEBM: "webm"; - readonly MP3: "mp3"; - readonly OGG: "ogg"; - readonly WAV: "wav"; -}; -export declare const E_LogLevel: { - readonly QUIET: "quiet"; - readonly PANIC: "panic"; - readonly FATAL: "fatal"; - readonly ERROR: "error"; - readonly WARNING: "warning"; - readonly INFO: "info"; - readonly VERBOSE: "verbose"; - readonly DEBUG: "debug"; - readonly TRACE: "trace"; -}; -export declare const E_AudioCodec: { - readonly AAC: "aac"; - readonly MP3: "mp3"; - readonly VORBIS: "vorbis"; - readonly FLAC: "flac"; - readonly OPUS: "opus"; - readonly WAV: "wav"; -}; -export declare const E_Codec: { - readonly LIBX264: "libx264"; - readonly LIBX265: "libx265"; - readonly LIBVP9: "libvpx-vp9"; - readonly LIBAOM: "libaom-av1"; - readonly LIBTHEORA: "libtheora"; - readonly MPEG2VIDEO: "mpeg2video"; - readonly COPY: "copy"; -}; -declare const ffmpegOptionsSchema: z.ZodObject<{ - input: z.ZodString; - output: z.ZodString; - codec: z.ZodDefault>>; - bitrate: z.ZodOptional; - framerate: z.ZodDefault>; - resolution: z.ZodOptional; - audioCodec: z.ZodDefault>>; - audioBitrate: z.ZodOptional; - audioChannels: z.ZodDefault>; - preset: z.ZodDefault>; - crf: z.ZodDefault>; - format: z.ZodDefault>>; - startTime: z.ZodOptional; - duration: z.ZodOptional; - overwrite: z.ZodDefault>; - loglevel: z.ZodDefault>>; -}, "strip", z.ZodTypeAny, { - audioCodec?: "aac" | "mp3" | "vorbis" | "flac" | "opus" | "wav"; - format?: "mp3" | "wav" | "mp4" | "mkv" | "mov" | "avi" | "flv" | "wmv" | "webm" | "ogg"; - input?: string; - output?: string; - codec?: "libx264" | "libx265" | "libvpx-vp9" | "libaom-av1" | "libtheora" | "mpeg2video" | "copy"; - bitrate?: string; - framerate?: number; - resolution?: string; - audioBitrate?: string; - audioChannels?: number; - preset?: string; - crf?: number; - startTime?: string; - duration?: string; - overwrite?: boolean; - loglevel?: "debug" | "verbose" | "error" | "quiet" | "panic" | "fatal" | "warning" | "info" | "trace"; -}, { - audioCodec?: "aac" | "mp3" | "vorbis" | "flac" | "opus" | "wav"; - format?: "mp3" | "wav" | "mp4" | "mkv" | "mov" | "avi" | "flv" | "wmv" | "webm" | "ogg"; - input?: string; - output?: string; - codec?: "libx264" | "libx265" | "libvpx-vp9" | "libaom-av1" | "libtheora" | "mpeg2video" | "copy"; - bitrate?: string; - framerate?: number; - resolution?: string; - audioBitrate?: string; - audioChannels?: number; - preset?: string; - crf?: number; - startTime?: string; - duration?: string; - overwrite?: boolean; - loglevel?: "debug" | "verbose" | "error" | "quiet" | "panic" | "fatal" | "warning" | "info" | "trace"; -}>; -export type FFmpegOptions = z.infer; +import { z } from 'zod'; +export declare const GLOB_BASIC = "png|jpg|tiff|jpeg|webp"; +export * from './resize'; +export * from './convert'; +export declare const E_Format: { + readonly MP4: "mp4"; + readonly MKV: "mkv"; + readonly MOV: "mov"; + readonly AVI: "avi"; + readonly FLV: "flv"; + readonly WMV: "wmv"; + readonly WEBM: "webm"; + readonly MP3: "mp3"; + readonly OGG: "ogg"; + readonly WAV: "wav"; +}; +export declare const E_LogLevel: { + readonly QUIET: "quiet"; + readonly PANIC: "panic"; + readonly FATAL: "fatal"; + readonly ERROR: "error"; + readonly WARNING: "warning"; + readonly INFO: "info"; + readonly VERBOSE: "verbose"; + readonly DEBUG: "debug"; + readonly TRACE: "trace"; +}; +export declare const E_AudioCodec: { + readonly AAC: "aac"; + readonly MP3: "mp3"; + readonly VORBIS: "vorbis"; + readonly FLAC: "flac"; + readonly OPUS: "opus"; + readonly WAV: "wav"; +}; +export declare const E_Codec: { + readonly LIBX264: "libx264"; + readonly LIBX265: "libx265"; + readonly LIBVP9: "libvpx-vp9"; + readonly LIBAOM: "libaom-av1"; + readonly LIBTHEORA: "libtheora"; + readonly MPEG2VIDEO: "mpeg2video"; + readonly COPY: "copy"; +}; +declare const ffmpegOptionsSchema: z.ZodObject<{ + input: z.ZodString; + output: z.ZodString; + codec: z.ZodDefault>>; + bitrate: z.ZodOptional; + framerate: z.ZodDefault>; + resolution: z.ZodOptional; + audioCodec: z.ZodDefault>>; + audioBitrate: z.ZodOptional; + audioChannels: z.ZodDefault>; + preset: z.ZodDefault>; + crf: z.ZodDefault>; + format: z.ZodDefault>>; + startTime: z.ZodOptional; + duration: z.ZodOptional; + overwrite: z.ZodDefault>; + loglevel: z.ZodDefault>>; +}, "strip", z.ZodTypeAny, { + input?: string; + output?: string; + format?: "mp4" | "mkv" | "mov" | "avi" | "flv" | "wmv" | "webm" | "mp3" | "ogg" | "wav"; + codec?: "libx264" | "libx265" | "libvpx-vp9" | "libaom-av1" | "libtheora" | "mpeg2video" | "copy"; + bitrate?: string; + framerate?: number; + resolution?: string; + audioCodec?: "mp3" | "wav" | "aac" | "vorbis" | "flac" | "opus"; + audioBitrate?: string; + audioChannels?: number; + preset?: string; + crf?: number; + startTime?: string; + duration?: string; + overwrite?: boolean; + loglevel?: "debug" | "verbose" | "info" | "error" | "quiet" | "panic" | "fatal" | "warning" | "trace"; +}, { + input?: string; + output?: string; + format?: "mp4" | "mkv" | "mov" | "avi" | "flv" | "wmv" | "webm" | "mp3" | "ogg" | "wav"; + codec?: "libx264" | "libx265" | "libvpx-vp9" | "libaom-av1" | "libtheora" | "mpeg2video" | "copy"; + bitrate?: string; + framerate?: number; + resolution?: string; + audioCodec?: "mp3" | "wav" | "aac" | "vorbis" | "flac" | "opus"; + audioBitrate?: string; + audioChannels?: number; + preset?: string; + crf?: number; + startTime?: string; + duration?: string; + overwrite?: boolean; + loglevel?: "debug" | "verbose" | "info" | "error" | "quiet" | "panic" | "fatal" | "warning" | "trace"; +}>; +export type FFmpegOptions = z.infer; diff --git a/packages/media/dist-in/lib/media/video/index.js b/packages/media/dist-in/lib/media/video/index.js index 8c950a58..ef3a6473 100644 --- a/packages/media/dist-in/lib/media/video/index.js +++ b/packages/media/dist-in/lib/media/video/index.js @@ -1,85 +1,68 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.E_Codec = exports.E_AudioCodec = exports.E_LogLevel = exports.E_Format = exports.GLOB_BASIC = void 0; -const zod_1 = require("zod"); -const FfmpegCommand = require('fluent-ffmpeg'); -exports.GLOB_BASIC = 'png|jpg|tiff|jpeg|webp'; -__exportStar(require("./resize"), exports); -__exportStar(require("./convert"), exports); -exports.E_Format = { - MP4: 'mp4', - MKV: 'mkv', - MOV: 'mov', - AVI: 'avi', - FLV: 'flv', - WMV: 'wmv', - WEBM: 'webm', - MP3: 'mp3', - OGG: 'ogg', - WAV: 'wav' -}; -exports.E_LogLevel = { - QUIET: 'quiet', - PANIC: 'panic', - FATAL: 'fatal', - ERROR: 'error', - WARNING: 'warning', - INFO: 'info', - VERBOSE: 'verbose', - DEBUG: 'debug', - TRACE: 'trace' -}; -exports.E_AudioCodec = { - AAC: 'aac', - MP3: 'mp3', - VORBIS: 'vorbis', - FLAC: 'flac', - OPUS: 'opus', - WAV: 'wav' -}; -exports.E_Codec = { - LIBX264: 'libx264', - LIBX265: 'libx265', - LIBVP9: 'libvpx-vp9', - LIBAOM: 'libaom-av1', - LIBTHEORA: 'libtheora', - MPEG2VIDEO: 'mpeg2video', - COPY: 'copy' -}; -const formatEnum = zod_1.z.nativeEnum(exports.E_Format); -const loglevelEnum = zod_1.z.nativeEnum(exports.E_LogLevel); -const audioCodecEnum = zod_1.z.nativeEnum(exports.E_AudioCodec); -const codecEnum = zod_1.z.nativeEnum(exports.E_Codec); -const ffmpegOptionsSchema = zod_1.z.object({ - input: zod_1.z.string().describe("Path to the input file"), - output: zod_1.z.string().describe("Path to the output file"), - codec: codecEnum.optional().describe("Codec to be used for encoding (e.g., 'libx264', 'aac')").default(exports.E_Codec.LIBX264), - bitrate: zod_1.z.string().optional().describe("Bitrate for encoding (e.g., '500k', '2M')"), - framerate: zod_1.z.number().optional().describe("Frames per second (e.g., 30, 60)").default(30), - resolution: zod_1.z.string().optional().describe("Resolution of the output (e.g., '1920x1080', '1280x720')"), - audioCodec: audioCodecEnum.optional().describe("Audio codec to be used for encoding (e.g., 'aac', 'mp3')").default(exports.E_AudioCodec.AAC), - audioBitrate: zod_1.z.string().optional().describe("Bitrate for audio encoding (e.g., '128k', '256k')"), - audioChannels: zod_1.z.number().optional().describe("Number of audio channels (e.g., 1 for mono, 2 for stereo)").default(2), - preset: zod_1.z.string().optional().describe("Encoding preset to use for balancing speed and quality (e.g., 'ultrafast', 'medium', 'slow')").default('medium'), - crf: zod_1.z.number().optional().describe("Constant Rate Factor for controlling quality (lower values mean higher quality, range: 0-51)").default(23), - format: formatEnum.optional().describe("Container format for output file (e.g., 'mp4', 'mkv', 'mov')").default(exports.E_Format.MP4), - startTime: zod_1.z.string().optional().describe("Start time of the input file (e.g., '00:01:30' for 1 minute 30 seconds)"), - duration: zod_1.z.string().optional().describe("Duration of the output (e.g., '00:05:00' for 5 minutes)"), - overwrite: zod_1.z.boolean().optional().describe("Whether to overwrite the output file if it already exists").default(false), - loglevel: loglevelEnum.optional().describe("Logging level for ffmpeg output").default(exports.E_LogLevel.INFO), -}); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lZGlhL3ZpZGVvL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsNkJBQXVCO0FBRXZCLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtBQUVqQyxRQUFBLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQTtBQUNsRCwyQ0FBd0I7QUFDeEIsNENBQXlCO0FBRVosUUFBQSxRQUFRLEdBQUc7SUFDcEIsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsSUFBSSxFQUFFLE1BQU07SUFDWixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7Q0FDRixDQUFDO0FBRUUsUUFBQSxVQUFVLEdBQUc7SUFDeEIsS0FBSyxFQUFFLE9BQU87SUFDZCxLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsS0FBSyxFQUFFLE9BQU87SUFDZCxPQUFPLEVBQUUsU0FBUztJQUNsQixJQUFJLEVBQUUsTUFBTTtJQUNaLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBRUUsUUFBQSxZQUFZLEdBQUc7SUFDMUIsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBSSxFQUFFLE1BQU07SUFDWixHQUFHLEVBQUUsS0FBSztDQUNGLENBQUM7QUFFRSxRQUFBLE9BQU8sR0FBRztJQUNyQixPQUFPLEVBQUUsU0FBUztJQUNs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 \ No newline at end of file +import { z } from 'zod'; +const FfmpegCommand = require('fluent-ffmpeg'); +export const GLOB_BASIC = 'png|jpg|tiff|jpeg|webp'; +export * from './resize'; +export * from './convert'; +export const E_Format = { + MP4: 'mp4', + MKV: 'mkv', + MOV: 'mov', + AVI: 'avi', + FLV: 'flv', + WMV: 'wmv', + WEBM: 'webm', + MP3: 'mp3', + OGG: 'ogg', + WAV: 'wav' +}; +export const E_LogLevel = { + QUIET: 'quiet', + PANIC: 'panic', + FATAL: 'fatal', + ERROR: 'error', + WARNING: 'warning', + INFO: 'info', + VERBOSE: 'verbose', + DEBUG: 'debug', + TRACE: 'trace' +}; +export const E_AudioCodec = { + AAC: 'aac', + MP3: 'mp3', + VORBIS: 'vorbis', + FLAC: 'flac', + OPUS: 'opus', + WAV: 'wav' +}; +export const E_Codec = { + LIBX264: 'libx264', + LIBX265: 'libx265', + LIBVP9: 'libvpx-vp9', + LIBAOM: 'libaom-av1', + LIBTHEORA: 'libtheora', + MPEG2VIDEO: 'mpeg2video', + COPY: 'copy' +}; +const formatEnum = z.nativeEnum(E_Format); +const loglevelEnum = z.nativeEnum(E_LogLevel); +const audioCodecEnum = z.nativeEnum(E_AudioCodec); +const codecEnum = z.nativeEnum(E_Codec); +const ffmpegOptionsSchema = z.object({ + input: z.string().describe("Path to the input file"), + output: z.string().describe("Path to the output file"), + codec: codecEnum.optional().describe("Codec to be used for encoding (e.g., 'libx264', 'aac')").default(E_Codec.LIBX264), + bitrate: z.string().optional().describe("Bitrate for encoding (e.g., '500k', '2M')"), + framerate: z.number().optional().describe("Frames per second (e.g., 30, 60)").default(30), + resolution: z.string().optional().describe("Resolution of the output (e.g., '1920x1080', '1280x720')"), + audioCodec: audioCodecEnum.optional().describe("Audio codec to be used for encoding (e.g., 'aac', 'mp3')").default(E_AudioCodec.AAC), + audioBitrate: z.string().optional().describe("Bitrate for audio encoding (e.g., '128k', '256k')"), + audioChannels: z.number().optional().describe("Number of audio channels (e.g., 1 for mono, 2 for stereo)").default(2), + preset: z.string().optional().describe("Encoding preset to use for balancing speed and quality (e.g., 'ultrafast', 'medium', 'slow')").default('medium'), + crf: z.number().optional().describe("Constant Rate Factor for controlling quality (lower values mean higher quality, range: 0-51)").default(23), + format: formatEnum.optional().describe("Container format for output file (e.g., 'mp4', 'mkv', 'mov')").default(E_Format.MP4), + startTime: z.string().optional().describe("Start time of the input file (e.g., '00:01:30' for 1 minute 30 seconds)"), + duration: z.string().optional().describe("Duration of the output (e.g., '00:05:00' for 5 minutes)"), + overwrite: z.boolean().optional().describe("Whether to overwrite the output file if it already exists").default(false), + loglevel: loglevelEnum.optional().describe("Logging level for ffmpeg output").default(E_LogLevel.INFO), +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lZGlhL3ZpZGVvL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFFdkIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQTtBQUNsRCxjQUFjLFVBQVUsQ0FBQTtBQUN4QixjQUFjLFdBQVcsQ0FBQTtBQUV6QixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUc7SUFDcEIsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsSUFBSSxFQUFFLE1BQU07SUFDWixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7Q0FDRixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLEtBQUssRUFBRSxPQUFPO0lBQ2QsS0FBSyxFQUFFLE9BQU87SUFDZCxLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLE1BQU07SUFDWixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0NBQ04sQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsTUFBTSxFQUFFLFFBQVE7SUFDaEIsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsTUFBTTtJQUNaLEdB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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/video/lib.d.ts b/packages/media/dist-in/lib/media/video/lib.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/packages/media/dist-in/lib/media/video/lib.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/media/dist-in/lib/media/video/lib.js b/packages/media/dist-in/lib/media/video/lib.js new file mode 100644 index 00000000..8ef18b54 --- /dev/null +++ b/packages/media/dist-in/lib/media/video/lib.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS92aWRlby9saWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/video/merge.d.ts b/packages/media/dist-in/lib/media/video/merge.d.ts new file mode 100644 index 00000000..e06fdc4b --- /dev/null +++ b/packages/media/dist-in/lib/media/video/merge.d.ts @@ -0,0 +1,14 @@ +import { IConvertVideoOptions } from '../../../types'; +export declare const frames: (src: any, dst: any, onNode: any, options?: { + interval: number; +}) => Promise; +export declare const CONVERTERS: { + '.mp3': (inputPath: string, outputPath: string) => Promise; + '.jpg': (src: any, dst: any, onNode: any, options?: { + interval: number; + }) => Promise; +}; +export declare const converter: (file: string) => any; +export declare const convertFile: (file: any, target: any, onNode: (data: any) => void, options: IConvertVideoOptions) => Promise; +export declare function _convert(file: any, targets: string[], onNode: (data: any) => void, options: IConvertVideoOptions): Promise; +export declare const convert: (options: IConvertVideoOptions) => Promise; diff --git a/packages/media/dist-in/lib/media/video/merge.js b/packages/media/dist-in/lib/media/video/merge.js new file mode 100644 index 00000000..f9e620ae --- /dev/null +++ b/packages/media/dist-in/lib/media/video/merge.js @@ -0,0 +1,98 @@ +import * as path from 'path'; +import * as pMap from 'p-map'; +import { OSR_CACHE } from '@polymech/commons'; +import { sync as exists } from "@polymech/fs/exists"; +import { sync as dir } from "@polymech/fs/dir"; +import { get_cached } from '@polymech/cache/lib'; +import { targets } from '../../'; +import { logger } from '../../..'; +import { MODULE_NAME } from '../../../constants'; +const FfmpegCommand = require('fluent-ffmpeg'); +const meta = (src) => { + return new Promise((resolve, reject) => { + const ff = new FfmpegCommand(src); + ff.ffprobe(src, (err, metadata) => { + if (err) { + reject(err); + } + else { + resolve(metadata); + } + }); + }); +}; +const extension = (file) => path.parse(file).ext; +const mp3 = async (inputPath, outputPath) => { + return new Promise((resolve, reject) => { + const ff = new FfmpegCommand(inputPath); + ff.noVideo() + .audioCodec('libmp3lame') + .format('mp3') + .on('end', () => { + resolve(); + }) + .on('error', (error) => { + reject(error); + }) + .save(outputPath); + }); +}; +export const frames = async (src, dst, onNode, options = { interval: 1 }) => { + const outputDir = path.dirname(dst); + if (!exists(outputDir)) { + dir(outputDir); + } + return new Promise((resolve, reject) => { + const ff = new FfmpegCommand(src); + ff.outputOptions([`-vf fps=1/${options.interval}`]) + .output(dst) + .on('end', () => { + resolve(); + }) + .on('error', (err) => { + reject(err); + }) + .run(); + }); +}; +export const CONVERTERS = { + '.mp3': mp3, + '.jpg': frames, +}; +export const converter = (file) => CONVERTERS[extension(file)]; +export const convertFile = async (file, target, onNode = () => { }, options) => { + const osr_cache = OSR_CACHE(); + const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })); + const cached = await get_cached(file, ca_options, MODULE_NAME); + const conv = converter(target); + if (!conv) { + logger.error(`No converter found for ${file}`); + return; + } + const dstParts = path.parse(target); + if (!exists(dstParts.dir)) { + dir(dstParts.dir); + } + const ret = await conv(file, target, onNode, options); + return ret; +}; +export async function _convert(file, targets, onNode = () => { }, options) { + return pMap(targets, (target) => { + options.verbose && logger.debug(`Convert ${file} to ${target}`); + if (options.dry) { + return; + } + return convertFile(file, target, onNode, options); + }, { concurrency: 1 }); +} +export const convert = async (options) => { + let reports = []; + const onNode = (data) => { reports.push(data); }; + options.verbose && logger.info(`Convert ${options.srcInfo.FILES.length} files `); + await pMap(options.srcInfo.FILES, (f) => { + const outputs = targets(f, options); + options.verbose && logger.info(`Convert ${f} to `, outputs); + return _convert(f, outputs, onNode, options); + }, { concurrency: 1 }); +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lZGlhL3ZpZGVvL21lcmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxJQUFJLE1BQU0sT0FBTyxDQUFBO0FBQzdCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBR2hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFJaEQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0FBRTlDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBVyxFQUF3QixFQUFFO0lBQy9DLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDakMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDOUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNyQixDQUFDO1FBQ0ws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RCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFDaEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUE7SUFDL0MsT0FBTyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxTQUFTLENBQUMsQ0FBQTtJQUNoRixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbkMsT0FBTyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0QsT0FBTyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDaEQsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDMUIsQ0FBQyxDQUFBIn0= \ No newline at end of file diff --git a/packages/media/dist-in/lib/media/video/resize.d.ts b/packages/media/dist-in/lib/media/video/resize.d.ts index 3c30cc32..07d03126 100644 --- a/packages/media/dist-in/lib/media/video/resize.d.ts +++ b/packages/media/dist-in/lib/media/video/resize.d.ts @@ -1,6 +1,6 @@ -import * as sharp from 'sharp'; -import { IOptions, IResizeOptions } from '../../../types'; -export declare const meta: (file: any, image: sharp.Sharp) => Promise; -export declare const resizeFile: (file: any, target: any, onNode: (data: any) => void, options: IResizeOptions) => Promise; -export declare const _resize: (file: any, targets: string[], onNode: (data: any) => void, options: IOptions) => Promise; -export declare const resize: (options: IOptions) => Promise; +import * as sharp from 'sharp'; +import { IOptions, IResizeOptions } from '../../../types'; +export declare const meta: (file: any, image: sharp.Sharp) => Promise; +export declare const resizeFile: (file: any, target: any, onNode: (data: any) => void, options: IResizeOptions) => Promise; +export declare const _resize: (file: any, targets: string[], onNode: (data: any) => void, options: IOptions) => Promise; +export declare const resize: (options: IOptions) => Promise; diff --git a/packages/media/dist-in/lib/media/video/resize.js b/packages/media/dist-in/lib/media/video/resize.js index f5670473..97e9eea2 100644 --- a/packages/media/dist-in/lib/media/video/resize.js +++ b/packages/media/dist-in/lib/media/video/resize.js @@ -1,183 +1,153 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.resize = exports._resize = exports.resizeFile = exports.meta = void 0; -const path = __importStar(require("path")); -const bluebird = __importStar(require("bluebird")); -const bluebird_1 = require("bluebird"); -const sharp = __importStar(require("sharp")); -const __1 = require("../../.."); -const exists_1 = require("@polymech/fs/exists"); -const move_1 = require("@polymech/fs/move"); -const dir_1 = require("@polymech/fs/dir"); -const inspect_1 = require("@polymech/fs/inspect"); -const lib_1 = require("@polymech/cache/lib"); -const constants_1 = require("../../../constants"); -const commons_1 = require("@polymech/commons"); -const __2 = require("../../"); -const meta = (file, image) => { - return new Promise((resolve, reject) => { - image.metadata().then((meta) => { - resolve(meta); - }).catch((e) => { - __1.logger.error(`Error creating meta data ${file}`); - resolve(null); - }); - }); -}; -exports.meta = meta; -const resizeFile = async (file, target, onNode = () => { }, options) => { - const osr_cache = (0, commons_1.OSR_CACHE)(); - const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })); - const cached = await (0, lib_1.get_cached)(file, ca_options, constants_1.MODULE_NAME); - const targetOri = '' + target; - let inPlace = false; - if (path.resolve(file) === path.resolve(target)) { - const parts = path.parse(target); - target = path.join(parts.dir, parts.name + '_tmp' + parts.ext); - inPlace = true; - } - let image; - try { - image = sharp(file); - } - catch (e) { - __1.logger.error(`Error reading file, ${file}`, e); - return null; - } - onNode(image); - let metaData = await (0, exports.meta)(file, image) || {}; - const percent = options.percent; - const srcParts = path.parse(file); - const dstParts = path.parse(target); - const node = (0, inspect_1.createItem)(file, { - size: true, - mime: true - }); - if (!(0, exists_1.sync)(dstParts.dir)) { - (0, dir_1.sync)(dstParts.dir); - } - if (options.width <= options.minWidth) { - __1.logger.error(`Error resizing : options.width <= options.minWidth`); - return; - } - if (metaData.width && options.width && options.minWidth) { - if (metaData.width < options.minWidth) { - return image; - } - } - if (metaData.height && options.height && options.minHeight) { - if (metaData.height < options.minHeight) { - return image; - } - } - if (options.minSize && options.minSize > node.size) { - return image; - } - if (percent && metaData.width) { - image = image.resize({ - width: Math.round(metaData.width * (percent / 100)), - fastShrinkOnLoad: options.fastShrinkOnLoad, - withoutEnlargement: options.withoutEnlargement, - withoutReduction: options.withoutReduction, - fit: options.fit, - position: options.position - }); - } - else if (options.width || options.height) { - image = image.resize({ - width: options.width, - height: options.height, - fastShrinkOnLoad: options.fastShrinkOnLoad, - withoutEnlargement: options.withoutEnlargement, - withoutReduction: options.withoutReduction, - fit: options.fit, - position: options.position - }); - } - else { - __1.logger.error(`Error resizing, invalid options for ${file} - no width, height or percent`); - return image; - } - if (metaData.width) { - await image.withMetadata().toFile(target); - } - else { - try { - await image.toFile(target); - } - catch (e) { - __1.logger.error(`Error writing file out, ${file}`, e); - return null; - } - } - if (inPlace) { - const timeout = async (retry) => new Promise((resolve) => { - setTimeout(resolve, 500 * retry); - }); - const moveRetry = async (src, dst, retry = 0) => { - if (retry > 6) { - __1.logger.error(`Error moving file failed, max retries reached ${src}`); - return; - } - try { - await (0, move_1.async)(target, targetOri); - } - catch (e) { - if (e.code === 'EPERM') { - __1.logger.warn(`Error moving file out, retry ${file}`, e); - await timeout(retry); - moveRetry(src, dst, retry + 1); - } - } - }; - await moveRetry(file, targetOri); - } - options.debug && __1.logger.debug(`Resized Image ${file} to ${targetOri}`); - return image; -}; -exports.resizeFile = resizeFile; -const _resize = async (file, targets, onNode = () => { }, options) => { - return bluebird_1.Promise.resolve(targets).map((target) => { - options.verbose && __1.logger.debug(`Resizing ${file} to ${target}`); - if (options.dry) { - return bluebird.resolve(); - } - return (0, exports.resizeFile)(file, target, onNode, options); - }, { concurrency: 1 }); -}; -exports._resize = _resize; -const resize = async (options) => { - let reports = []; - const onNode = (data) => { reports.push(data); }; - options.verbose && __1.logger.info(`Convert ${options.srcInfo.FILES.length} files `); - await bluebird_1.Promise.resolve(options.srcInfo.FILES).map((f) => { - const outputs = (0, __2.targets)(f, options); - options.verbose && __1.logger.info(`Convert ${f} to `, outputs); - return (0, exports._resize)(f, outputs, onNode, options); - }, { concurrency: 1 }); -}; -exports.resize = resize; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS92aWRlby9yZXNpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNEI7QUFDNUIsbURBQW9DO0FBQ3BDLHVDQUE4QztBQUM5Qyw2Q0FBOEI7QUFFOUIsZ0NBQWlDO0FBRWpDLGdEQUFvRDtBQUNwRCw0Q0FBaUQ7QUFDakQsMENBQThDO0FBQzlDLGtEQUEyRDtBQUUzRCw2Q0FFNEI7QUFFNUIsa0RBRTJCO0FBRTNCLCtDQUE2QztBQUU3Qyw4QkFFZTtBQUVSLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQWtCLEVBQTJCLEVBQUU7SUFDdEUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ1gsVUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQVRZLFFBQUEsSUFBSSxRQVNoQjtBQUVNLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQThCLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUF1QixFQUF3QixFQUFFO0lBRXJJLE1BQU0sU0FBUyxHQUFHLElBQUEsbUJBQVMsR0FBRSxDQUFBO0lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2pGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxnQkFBVSxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsdUJBQVcsQ0FBQyxDQUFBO0lBRTlELE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUE7SUFDN0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFBO0lBRW5CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDaEMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDOUQsT0FBTyxHQUFHLElBQUksQ0FBQTtLQUNqQjtJQUVELElBQUksS0FBSyxDQUFBO0lBQ1QsSUFBSTtRQUNBLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7S0FDdEI7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNSLFVBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzlDLE9BQU8sSUFBSSxDQUFBO0tBQ2Q7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFYixJQUFJLFFBQVEsR0FBUSxNQUFNLElBQUEsWUFBSSxFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFakQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQTtJQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFbkMsTUFBTSxJQUFJLEdBQUcsSUFBQSxvQkFBTSxFQUFDLElBQUksRUFBRTtRQUN0QixJQUFJLEVBQUUsSUFBSTtRQUNWLElBQUksRUFBRSxJQUFJO0tBQ2IsQ0FBQyxDQUFBO0lBR0YsSUFBSSxDQUFDLElBQUEsYUFBTSxFQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN2QixJQUFBLFVBQUcsRUFBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7S0FDcEI7SUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtRQUNuQyxVQUFNLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUE7UUFDbEUsT0FBTTtLQUNUO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtRQUNyRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUNuQyxPQUFPLEtBQUssQ0FBQTtTQUNmO0tBQ0o7SUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO1FBQ3hELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3JDLE9BQU8sS0FBSyxDQUFBO1NBQ2Y7S0FDSjtJQUVELElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDaEQsT0FBTyxLQUFLLENBQUE7S0FDZjtJQUVELElBQUksT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUU7UUFDM0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNuRCxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxrQkFBa0I7WUFDOUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtZQUMxQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1NBQzdCLENBQUMsQ0FBQTtLQUVMO1NBQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDeEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxrQkFBa0I7WUFDOUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtZQUMxQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1NBQzdCLENBQUMsQ0FBQTtLQUNMO1NBQU07UUFDSCxVQUFNLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxJQUFJLGdDQUFnQyxDQUFDLENBQUE7UUFDekYsT0FBTyxLQUFLLENBQUE7S0FDZjtJQUVELElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtRQUNoQixNQUFNLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7S0FDNUM7U0FBTTtRQUNILElBQUk7WUFDQSxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDN0I7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLFVBQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ2xELE9BQU8sSUFBSSxDQUFBO1NBQ2Q7S0FDSjtJQUVELElBQUksT0FBTyxFQUFFO1FBQ1QsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNyRCxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQTtRQUNwQyxDQUFDLENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRTtZQUM1QyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsVUFBTSxDQUFDLEtBQUssQ0FBQyxpREFBaUQsR0FBRyxFQUFFLENBQUMsQ0FBQTtnQkFDcEUsT0FBTTthQUNUO1lBQ0QsSUFBSTtnQkFDQSxNQUFNLElBQUEsWUFBSSxFQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQTthQUNoQztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNSLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7b0JBQ3BCLFVBQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO29CQUN0RCxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDcEIsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBO2lCQUNqQzthQUNKO1FBQ0wsQ0FBQyxDQUFBO1FBQ0QsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0tBQ25DO0lBRUQsT0FBTyxDQUFDLEtBQUssSUFBSSxVQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQTtJQUV0RSxPQUFPLEtBQUssQ0FBQTtBQUNoQixDQUFDLENBQUE7QUE1SFksUUFBQSxVQUFVLGNBNEh0QjtBQUdNLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBaUIsRUFBRSxTQUE4QixHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBaUIsRUFBRSxFQUFFO0lBQ2pILE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDNUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxVQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxPQUFPLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDaEUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ2IsT0FBTyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUE7U0FDNUI7UUFDRCxPQUFPLElBQUEsa0JBQVUsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUMxQixDQUFDLENBQUE7QUFSWSxRQUFBLE9BQU8sV0FRbkI7QUFFTSxNQUFNLE1BQU0sR0FBRyxLQUFLLEVBQUUsT0FBaUIsRUFBRSxFQUFFO0lBQzlDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUNoQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQTtJQUUvQyxPQUFPLENBQUMsT0FBTyxJQUFJLFVBQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLFNBQVMsQ0FBQyxDQUFBO0lBQ2hGLE1BQU0sa0JBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFBLFdBQU8sRUFBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbkMsT0FBTyxDQUFDLE9BQU8sSUFBSSxVQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0QsT0FBTyxJQUFBLGVBQU8sRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUMvQyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUMxQixDQUFDLENBQUE7QUFWWSxRQUFBLE1BQU0sVUFVbEIifQ== \ No newline at end of file +import * as path from 'path'; +import * as bluebird from 'bluebird'; +import { Promise as BPromise } from 'bluebird'; +import * as sharp from 'sharp'; +import { logger } from '../../..'; +import { sync as exists } from "@polymech/fs/exists"; +import { async as move } from "@polymech/fs/move"; +import { sync as dir } from "@polymech/fs/dir"; +import { createItem as toNode } from "@polymech/fs/inspect"; +import { get_cached } from '@polymech/cache/lib'; +import { MODULE_NAME } from '../../../constants'; +import { OSR_CACHE } from '@polymech/commons'; +import { targets } from '../../'; +export const meta = (file, image) => { + return new Promise((resolve, reject) => { + image.metadata().then((meta) => { + resolve(meta); + }).catch((e) => { + logger.error(`Error creating meta data ${file}`); + resolve(null); + }); + }); +}; +export const resizeFile = async (file, target, onNode = () => { }, options) => { + const osr_cache = OSR_CACHE(); + const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })); + const cached = await get_cached(file, ca_options, MODULE_NAME); + const targetOri = '' + target; + let inPlace = false; + if (path.resolve(file) === path.resolve(target)) { + const parts = path.parse(target); + target = path.join(parts.dir, parts.name + '_tmp' + parts.ext); + inPlace = true; + } + let image; + try { + image = sharp(file); + } + catch (e) { + logger.error(`Error reading file, ${file}`, e); + return null; + } + onNode(image); + let metaData = await meta(file, image) || {}; + const percent = options.percent; + const srcParts = path.parse(file); + const dstParts = path.parse(target); + const node = toNode(file, { + size: true, + mime: true + }); + if (!exists(dstParts.dir)) { + dir(dstParts.dir); + } + if (options.width <= options.minWidth) { + logger.error(`Error resizing : options.width <= options.minWidth`); + return; + } + if (metaData.width && options.width && options.minWidth) { + if (metaData.width < options.minWidth) { + return image; + } + } + if (metaData.height && options.height && options.minHeight) { + if (metaData.height < options.minHeight) { + return image; + } + } + if (options.minSize && options.minSize > node.size) { + return image; + } + if (percent && metaData.width) { + image = image.resize({ + width: Math.round(metaData.width * (percent / 100)), + fastShrinkOnLoad: options.fastShrinkOnLoad, + withoutEnlargement: options.withoutEnlargement, + withoutReduction: options.withoutReduction, + fit: options.fit, + position: options.position + }); + } + else if (options.width || options.height) { + image = image.resize({ + width: options.width, + height: options.height, + fastShrinkOnLoad: options.fastShrinkOnLoad, + withoutEnlargement: options.withoutEnlargement, + withoutReduction: options.withoutReduction, + fit: options.fit, + position: options.position + }); + } + else { + logger.error(`Error resizing, invalid options for ${file} - no width, height or percent`); + return image; + } + if (metaData.width) { + await image.withMetadata().toFile(target); + } + else { + try { + await image.toFile(target); + } + catch (e) { + logger.error(`Error writing file out, ${file}`, e); + return null; + } + } + if (inPlace) { + const timeout = async (retry) => new Promise((resolve) => { + setTimeout(resolve, 500 * retry); + }); + const moveRetry = async (src, dst, retry = 0) => { + if (retry > 6) { + logger.error(`Error moving file failed, max retries reached ${src}`); + return; + } + try { + await move(target, targetOri); + } + catch (e) { + if (e.code === 'EPERM') { + logger.warn(`Error moving file out, retry ${file}`, e); + await timeout(retry); + moveRetry(src, dst, retry + 1); + } + } + }; + await moveRetry(file, targetOri); + } + options.debug && logger.debug(`Resized Image ${file} to ${targetOri}`); + return image; +}; +export const _resize = async (file, targets, onNode = () => { }, options) => { + return BPromise.resolve(targets).map((target) => { + options.verbose && logger.debug(`Resizing ${file} to ${target}`); + if (options.dry) { + return bluebird.resolve(); + } + return resizeFile(file, target, onNode, options); + }, { concurrency: 1 }); +}; +export const resize = async (options) => { + let reports = []; + const onNode = (data) => { reports.push(data); }; + options.verbose && logger.info(`Convert ${options.srcInfo.FILES.length} files `); + await BPromise.resolve(options.srcInfo.FILES).map((f) => { + const outputs = targets(f, options); + options.verbose && logger.info(`Convert ${f} to `, outputs); + return _resize(f, outputs, onNode, options); + }, { concurrency: 1 }); +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS92aWRlby9yZXNpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUE7QUFDNUIsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUE7QUFDcEMsT0FBTyxFQUFFLE9BQU8sSUFBSSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDOUMsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUE7QUFFOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUVqQyxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDakQsT0FBTyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM5QyxPQUFPLEVBQUUsVUFBVSxJQUFJLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRTNELE9BQU8sRUFDSCxVQUFVLEVBQ2IsTUFBTSxxQkFBcUIsQ0FBQTtBQUU1QixPQUFPLEVBQ0gsV0FBVyxFQUNkLE1BQU0sb0JBQW9CLENBQUE7QUFFM0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRTdDLE9BQU8sRUFDSCxPQUFPLEVBQ1YsTUFBTSxRQUFRLENBQUE7QUFFZixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBa0IsRUFBMkIsRUFBRTtJQUN0RSxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ25DLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQixPQUFPLENB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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/pdf/convert.d.ts b/packages/media/dist-in/lib/pdf/convert.d.ts index 2969c07f..c33b567d 100644 --- a/packages/media/dist-in/lib/pdf/convert.d.ts +++ b/packages/media/dist-in/lib/pdf/convert.d.ts @@ -1,7 +1,10 @@ import { Logger } from 'tslog'; +import { z } from 'zod'; import { Buffer } from 'node:buffer'; -import { ConvertCommandConfig } from "./types.js"; export declare const DEFAULT_OUTPUT_TEMPLATE = "${SRC_DIR}/${SRC_NAME}/${SRC_NAME}_${PAGE}.${FORMAT}"; +export declare const Pdf2JpgOptionsSchema: (opts?: any) => any; +export declare const types: () => void; +export declare const schemas: () => void; export type ImageFormat = 'png' | 'jpg'; export interface PdfToImageOptions { baseVariables: Record; @@ -14,6 +17,7 @@ export interface PdfToImageOptions { logger?: Logger; } export declare function convertPdfToImages(pdfData: Buffer, options: PdfToImageOptions): Promise; +export type Pdf2JpgConfig = z.infer>; /** * Runs the PDF to images conversion process. * Generates variables, determines output path, reads PDF, and calls the conversion engine. @@ -21,4 +25,4 @@ export declare function convertPdfToImages(pdfData: Buffer, options: PdfToImageO * @param logger - The logger instance to use for logging. * @returns A promise that resolves with an array of generated image file paths. */ -export declare function runConversion(config: ConvertCommandConfig, logger: Logger): Promise; +export declare function runConversion(config: Pdf2JpgConfig, logger: Logger): Promise; diff --git a/packages/media/dist-in/lib/pdf/convert.js b/packages/media/dist-in/lib/pdf/convert.js index b1e84c30..dc9a0e1d 100644 --- a/packages/media/dist-in/lib/pdf/convert.js +++ b/packages/media/dist-in/lib/pdf/convert.js @@ -1,7 +1,8 @@ import * as mupdf from 'mupdf'; import { Logger } from 'tslog'; +import { z } from 'zod'; import { dirname } from 'node:path'; -import { resolveVariables, pathInfoEx } from '@polymech/commons'; +import { resolveVariables, pathInfoEx, generate_interfaces, write, ZodMetaMap } from '@polymech/commons'; import { sync as mkdir } from '@polymech/fs/dir'; import { writeFileSync } from 'node:fs'; import { Buffer } from 'node:buffer'; @@ -10,6 +11,58 @@ import { sep, resolve as pathResolve, parse as pathParse, relative as pathRelati import { readFile } from "node:fs/promises"; import { DEFAULT_ROOTS, DEFAULT_VARS } from "@polymech/commons"; export const DEFAULT_OUTPUT_TEMPLATE = "\${SRC_DIR}/\${SRC_NAME}/\${SRC_NAME}_\${PAGE}.\${FORMAT}"; +// Zod Schema for PDF to JPG conversion options +let schemaMap; +export const Pdf2JpgOptionsSchema = (opts) => { + schemaMap = ZodMetaMap.create(); + schemaMap.add('input', z.string() + .min(1) + .describe('Path to the input PDF file')) + .add('output', z.string() + .optional() + .describe('Output path template (e.g., output/page_{PAGE}.png)')) + .add('dpi', z.number() + .int() + .positive() + .default(300) + .describe('Resolution for the output images')) + .add('scale', z.number() + .positive() + .default(2) + .describe('Scaling factor to apply before rendering (e.g., 2 for 2x size)')) + .add('format', z.enum(['png', 'jpg']) + .default('jpg') + .describe('Output image format')) + .add('startPage', z.number() + .int() + .positive() + .optional() + .describe('First page to convert (1-based index)')) + .add('endPage', z.number() + .int() + .positive() + .optional() + .describe('Last page to convert (1-based index)')); + return schemaMap.root() + .passthrough() + .describe('IPdf2JpgOptions'); +}; +export const types = () => { + generate_interfaces([Pdf2JpgOptionsSchema()], 'src/zod_types_pdf2jpg.ts'); + schemas(); +}; +export const schemas = () => { + const schema = Pdf2JpgOptionsSchema(); + write([schema], 'schemas_pdf2jpg.json', 'pdf2jpg', {}); + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_pdf2jpg.json', JSON.stringify(schemaMap.getUISchema(), null, 2)); + }).catch(err => { + console.warn('Could not write UI schema:', err.message); + }); + } +}; // Helper function to convert object-like image data to Buffer function imageDataObjectToBuffer(imageDataObject) { const keys = Object.keys(imageDataObject).map(Number).sort((a, b) => a - b); @@ -192,4 +245,4 @@ export async function runConversion(config, logger) { }); return outputFiles; } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcGRmL2NvbnZlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUU5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsMkRBQTJELENBQUM7QUFFbkcsOERBQThEO0FBQzlELFNBQVMsdUJBQXVCLENBQUMsZUFBdUM7SUFDdEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFD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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcGRmL2NvbnZlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUM5QixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDeEcsT0FBTyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxRQUFRLElBQUksWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLDJEQUEyRCxDQUFDO0FBRW5HLCtDQUErQztBQUMvQyxJQUFJLFNBQVMsQ0FBQTtBQUViLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsSUFBVSxFQUFPLEVBQUU7SUFDcEQsU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVB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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/pdf/split.d.ts b/packages/media/dist-in/lib/pdf/split.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/packages/media/dist-in/lib/pdf/split.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/media/dist-in/lib/pdf/split.js b/packages/media/dist-in/lib/pdf/split.js new file mode 100644 index 00000000..74453ae3 --- /dev/null +++ b/packages/media/dist-in/lib/pdf/split.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3BkZi9zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0= \ No newline at end of file diff --git a/packages/media/dist-in/lib/ui/electron.d.ts b/packages/media/dist-in/lib/ui/electron.d.ts new file mode 100644 index 00000000..78c86cee --- /dev/null +++ b/packages/media/dist-in/lib/ui/electron.d.ts @@ -0,0 +1,16 @@ +export interface Result { + editBoxValue: string; + selectedTemplate: string; + selectedFiles: string[]; + selectedModel: string; +} +export declare const web_prompt: (prompt: string, dst: string, variables?: any) => Promise; +export declare const renderSchemaUI: (options: { + schema: any; + uiSchema?: any; + formData?: any; + title?: string; + width?: number; + height?: number; + cliOptions?: any; +}) => Promise; diff --git a/packages/media/dist-in/lib/ui/electron.js b/packages/media/dist-in/lib/ui/electron.js new file mode 100644 index 00000000..db46e758 --- /dev/null +++ b/packages/media/dist-in/lib/ui/electron.js @@ -0,0 +1,55 @@ +import * as path from 'path'; +import { sync as write } from '@polymech/fs/write'; +import { sync as read } from '@polymech/fs/read'; +import { substitute } from '@polymech/commons'; +const htmlFilePathIn = path.resolve('./web-ui/_prompt.html'); +const htmlFilePathOut = path.resolve('./web-ui/prompt.html'); +import { Helper } from './../process/index.js'; +// Legacy function for backward compatibility +export const web_prompt = async (prompt, dst, variables = {}) => { + write(htmlFilePathOut, substitute(false, read(htmlFilePathIn), { + QUERY: prompt, + DST: dst, + ...variables + })); + const electronPath = path.join(process.cwd(), './node_modules/electron/dist/electron.exe'); + const mainPath = path.join(process.cwd(), 'dist-in/lib/ui/electron/main.js'); + const p = await Helper.runBin(process.cwd(), electronPath, '', [`"${mainPath}"`]); + const content = p.messages.find((m) => m.type === 'content'); + return content; +}; +// New schema-based UI function +export const renderSchemaUI = async (options) => { + // Write config to a temporary file that main process can read + const configPath = path.resolve('./web-ui/temp-config.json'); + const config = { + schema: options.schema, + uiSchema: options.uiSchema || {}, + formData: options.formData || {}, + title: options.title || 'Configuration', + cliOptions: options.cliOptions || {} + }; + write(configPath, JSON.stringify(config, null, 2)); + const electronPath = path.join(process.cwd(), './node_modules/electron/dist/electron.exe'); + const mainPath = path.join(process.cwd(), 'dist-in/lib/ui/electron/main.js'); + console.log('renderSchemaUI: Starting Electron...'); + console.log('electronPath:', electronPath); + console.log('mainPath:', mainPath); + console.log('configPath:', configPath); + console.log('config:', config); + const p = await Helper.runBin('', electronPath, '', [`"${mainPath}"`, `--config="${configPath}"`]); + console.log('renderSchemaUI: Electron process result:', p); + const content = p.messages.find((m) => m.type === 'content'); + // Cleanup temp file + try { + const fs = await import('fs'); + if (fs.existsSync(configPath)) { + fs.unlinkSync(configPath); + } + } + catch (e) { + // Ignore cleanup errors + } + return content; +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlY3Ryb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3VpL2VsZWN0cm9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBRTVCLE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDbEQsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0FBQzVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtBQUU1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFVOUMsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFFLEdBQVUsRUFBRSxZQUFnQixFQUFFLEVBQUUsRUFBRTtJQUUvRSxLQUFLLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBVyxFQUN2RTtRQUNJLEtBQUssRUFBRSxNQUFNO1FBQ2IsR0FBRyxFQUFFLEdBQUc7UUFDUixHQUFHLFNBQVM7S0FDZixDQUFDLENBQUMsQ0FBQTtJQUNILE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLDJDQUEyQyxDQUFDLENBQUE7SUFDMUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUM3RSxNQUFNLENBQUMsR0FBRyxNQUFNLE1BQU0s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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/ui/electron/main.d.ts b/packages/media/dist-in/lib/ui/electron/main.d.ts new file mode 100644 index 00000000..593bcc6b --- /dev/null +++ b/packages/media/dist-in/lib/ui/electron/main.d.ts @@ -0,0 +1 @@ +export declare const setUIConfig: (config: any) => void; diff --git a/packages/media/dist-in/lib/ui/electron/main.js b/packages/media/dist-in/lib/ui/electron/main.js new file mode 100644 index 00000000..3ef7808f --- /dev/null +++ b/packages/media/dist-in/lib/ui/electron/main.js @@ -0,0 +1,182 @@ +//https://rjsf-team.github.io/react-jsonschema-form/ +import { app, BrowserWindow, ipcMain } from 'electron'; +import * as path from 'path'; +import * as fs from 'fs'; +import { dialog } from 'electron'; +let _files = []; +let _dst = ''; +let _config = {}; +function createWindow() { + console.log('Creating Electron window...'); + // Try with minimal options first + const mainWindow = new BrowserWindow({ + width: 900, + height: 800, + show: false, // Start hidden, show after load + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + webSecurity: true + }, + }); + console.log('Window created successfully!'); + // Check if we have a built React app + const reactDistPath = path.resolve('./web-ui/dist/index.html'); + const legacyHtmlPath = path.resolve('./web-ui/prompt.html'); + if (fs.existsSync(reactDistPath)) { + console.log('Loading React app from:', reactDistPath); + mainWindow.loadFile(reactDistPath); + } + else if (fs.existsSync(legacyHtmlPath)) { + console.log('Loading legacy HTML from:', legacyHtmlPath); + mainWindow.loadFile(legacyHtmlPath); + } + else { + console.log('No UI files found, trying dev server...'); + // Try to load dev server + mainWindow.loadURL('http://localhost:5173').catch((error) => { + console.log('Dev server not available, showing error page'); + // If dev server not available, show error + mainWindow.loadURL('data:text/html;charset=utf-8,' + encodeURIComponent(` + + +

UI Not Available

+

React app not built and dev server not running.

+

Please build the React app:

+
cd web-ui && npm run build
+

or start the dev server:

+
cd web-ui && npm run dev
+

Error: ${error.message}

+ + + `)); + }); + } + // Add event listeners to see what's happening + mainWindow.webContents.on('did-finish-load', () => { + console.log('Page loaded successfully'); + mainWindow.show(); + mainWindow.focus(); + mainWindow.webContents.openDevTools(); // Open dev tools to see what's happening + }); + mainWindow.webContents.on('did-fail-load', (event, errorCode, errorDescription) => { + console.log('Page failed to load:', errorCode, errorDescription); + mainWindow.show(); // Show window even on error + }); + // Force window to be visible immediately + mainWindow.show(); + mainWindow.focus(); + // Prevent window from closing immediately + mainWindow.on('close', (event) => { + console.log('Window is trying to close'); + }); + return mainWindow; + // Handle React app config requests + ipcMain.on('request-config', (event) => { + event.reply('app-config', _config); + }); + // Handle form submission from React app + ipcMain.on('content', (_event, content) => { + console.log(JSON.stringify({ + type: 'content', + ...content, + files: _files, + target: _dst + })); + mainWindow.close(); + app.exit(); + }); + // Handle cancel from React app + ipcMain.on('cancel', () => { + console.log(JSON.stringify({ type: 'cancelled' })); + mainWindow.close(); + app.exit(); + }); + // Keep window open for at least 5 seconds for debugging + setTimeout(() => { + console.log('Window has been open for 5 seconds'); + }, 5000); + // New IPC handlers for file dialogs + ipcMain.handle('showFileDialog', async (event, options) => { + console.log('File dialog requested with options:', options); + try { + const result = await dialog.showOpenDialog(mainWindow, options); + console.log('File dialog result:', result); + if (!result.canceled) { + _files = result.filePaths; + return result.filePaths; + } + return []; + } + catch (error) { + console.error('File dialog error:', error); + return []; + } + }); + ipcMain.handle('showSaveDialog', async (event, options) => { + console.log('Save dialog requested with options:', options); + try { + const result = await dialog.showSaveDialog(mainWindow, options); + console.log('Save dialog result:', result); + if (!result.canceled) { + _dst = result.filePath; + return result.filePath; + } + return null; + } + catch (error) { + console.error('Save dialog error:', error); + return null; + } + }); + // Legacy handlers for backward compatibility + ipcMain.on('filePicker', (_event, content) => { + const files = dialog.showOpenDialog({ properties: ['openFile', 'multiSelections'] }); + files.then((fp) => { + _files = fp.filePaths; + }); + return files; + }); +} +console.log('Electron app starting...'); +app.whenReady().then(() => { + console.log('Electron app ready'); + // Check for config file argument + const args = process.argv; + console.log('Args:', args); + const configArg = args.find(arg => arg.startsWith('--config=')); + if (configArg) { + const configPath = configArg.split('=')[1].replace(/"/g, ''); + console.log('Loading config from:', configPath); + try { + if (fs.existsSync(configPath)) { + const configData = fs.readFileSync(configPath, 'utf8'); + _config = JSON.parse(configData); + console.log('Loaded config:', _config); + } + else { + console.log('Config file not found:', configPath); + } + } + catch (e) { + console.error('Error loading config:', e); + } + } + else { + console.log('No config argument provided'); + } + createWindow(); + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) + createWindow(); + }); +}); +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') + app.quit(); +}); +// Export function to set config from external calls +export const setUIConfig = (config) => { + _config = config; +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdWkvZWxlY3Ryb24vbWFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvREFBb0Q7QUFFcEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3RELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFakMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFBO0FBQ2YsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFBO0FBQ2IsSUFBSSxPQUFPLEdBQVEsRUFBRSxDQUFBO0FBRXJCLFNBQVMsWUFBWTtJQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFFM0MsaUNBQWlDO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksYUFBYSxDQUFDO1FBQ2pDLEtBQUssRUFBRSxHQUFHO1FBQ1YsTUFBTSxFQUFFLEdBQUc7UUFDWCxJQUFJLEVBQUUsS0FBSyxFQUFFLGdDQUFnQztRQUM3QyxjQUFjLEVBQUU7WUFDWixlQUFlLEVBQUUsS0FBSztZQUN0QixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLFdBQVcsRUFBRSxJQUFJO1NBQ3BCO0tBQ0osQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBRTVDLHFDQUFxQztJQUNyQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFDOUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0lBRTNELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxD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 \ No newline at end of file diff --git a/packages/media/dist-in/lib/ui/electron/preload.d.ts b/packages/media/dist-in/lib/ui/electron/preload.d.ts new file mode 100644 index 00000000..4b7656fa --- /dev/null +++ b/packages/media/dist-in/lib/ui/electron/preload.d.ts @@ -0,0 +1 @@ +export declare const noop = 2; diff --git a/packages/media/dist-in/lib/ui/electron/preload.js b/packages/media/dist-in/lib/ui/electron/preload.js new file mode 100644 index 00000000..94e3d817 --- /dev/null +++ b/packages/media/dist-in/lib/ui/electron/preload.js @@ -0,0 +1,56 @@ +import { contextBridge, ipcRenderer } from 'electron'; +console.log('Preload script starting...'); +try { + console.log('Exposing electronAPI to main world...'); + // Expose APIs for React app + contextBridge.exposeInMainWorld('electronAPI', { + submitContent: (content) => ipcRenderer.send('content', content), + showFileDialog: (options) => ipcRenderer.invoke('showFileDialog', options), + showSaveDialog: (options) => ipcRenderer.invoke('showSaveDialog', options) + }); + console.log('electronAPI exposed successfully'); + // Legacy support for old HTML template + window.addEventListener("DOMContentLoaded", () => { + const okButton = document.getElementById("okButton"); + const filePicker = document.getElementById("_filePicker"); + if (okButton) { + okButton.addEventListener("click", () => { + console.log('Legacy OK button clicked'); + }); + } + if (filePicker) { + filePicker.addEventListener("click", () => { + console.log('Legacy file picker clicked'); + ipcHandler.send('filePicker'); + }); + } + }); +} +catch (e) { + console.error('error preload', e); +} +const ipcHandler = { + send(channel, ...args) { + ipcRenderer.send(channel, ...args); + }, + invoke(channel, ...args) { + return ipcRenderer.invoke(channel, ...args); + }, + once(channel, callback) { + ipcRenderer.once(channel, (_event, ...args) => callback(...args)); + }, + on(channel, callback) { + const subscription = (_event, ...args) => callback(...args); + ipcRenderer.on(channel, subscription); + return () => { + ipcRenderer.removeListener(channel, subscription); + }; + }, + clear(channel) { + ipcRenderer.removeAllListeners(channel); + } +}; +contextBridge.exposeInMainWorld('ipc', ipcHandler); +window.ipcHandler = ipcHandler; +export const noop = 2; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlbG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdWkvZWxlY3Ryb24vcHJlbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUVyRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7QUFFMUMsSUFBSSxDQUFDO0lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ3JELDRCQUE0QjtJQUM1QixhQUFhLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFO1FBQzdDLGFBQWEsRUFBRSxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDO1FBQ3JFLGNBQWMsRUFBRSxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7UUFDL0UsY0FBYyxFQUFFLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQztLQUNoRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFFaEQsdUNBQXVDO0lBQ3ZDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDL0MsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTFELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixVQUFVLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUMxQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBRUwsQ0FBQztBQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBQyxDQUFDLENBQUMsQ0FBQTtBQUNsQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLEdBQUc7SUFDakIsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUk7UUFDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUk7UUFDbkIsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVE7UUFDbEIsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUTtRQUNoQixNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFDM0QsV0FBVyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdEMsT0FBTyxHQUFHLEVBQUU7WUFDUixXQUFXLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsS0FBSyxDQUFDLE9BQU87UUFDVCxXQUFXLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGLENBQUM7QUFDRixhQUFhLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2xELE1BQWMsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/packages/media/dist-in/lib/ui/electron/renderer.d.ts b/packages/media/dist-in/lib/ui/electron/renderer.d.ts new file mode 100644 index 00000000..ff222b8e --- /dev/null +++ b/packages/media/dist-in/lib/ui/electron/renderer.d.ts @@ -0,0 +1 @@ +export declare const t = 2; diff --git a/packages/media/dist-in/lib/ui/electron/renderer.js b/packages/media/dist-in/lib/ui/electron/renderer.js new file mode 100644 index 00000000..fe7745ab --- /dev/null +++ b/packages/media/dist-in/lib/ui/electron/renderer.js @@ -0,0 +1,6 @@ +export const t = 2; +document.getElementById('okButton')?.addEventListener('click', () => { + const textareaContent = document.getElementById('textarea').value; + window.electronAPI.submitContent(textareaContent); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3VpL2VsZWN0cm9uL3JlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO0lBQ2hFLE1BQU0sZUFBZSxHQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUF5QixDQUFDLEtBQUssQ0FBQztJQUMxRixNQUFjLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUMvRCxDQUFDLENBQUMsQ0FBQyJ9 \ No newline at end of file diff --git a/packages/media/dist-in/lib/ui/types.d.ts b/packages/media/dist-in/lib/ui/types.d.ts new file mode 100644 index 00000000..939a10e7 --- /dev/null +++ b/packages/media/dist-in/lib/ui/types.d.ts @@ -0,0 +1,12 @@ +export interface Button { + text: string; + onClick: () => void; +} +export interface Label { + text: string; +} +export interface Window { + title: string; + width: number; + height: number; +} diff --git a/packages/media/dist-in/lib/ui/types.js b/packages/media/dist-in/lib/ui/types.js new file mode 100644 index 00000000..0ed6847c --- /dev/null +++ b/packages/media/dist-in/lib/ui/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3VpL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/packages/media/dist-in/main.d.ts b/packages/media/dist-in/main.d.ts index 3bf1036c..42c14a42 100644 --- a/packages/media/dist-in/main.d.ts +++ b/packages/media/dist-in/main.d.ts @@ -6,5 +6,6 @@ import './commands/background-remove.js'; import './commands/background-remove-bria.js'; import './commands/crop-foreground.js'; import './commands/salamander.js'; +import './commands/schemas.js'; import './commands/register-commands.js'; import './commands/register-explorer.js'; diff --git a/packages/media/dist-in/main.js b/packages/media/dist-in/main.js index 46b29369..da18d696 100644 --- a/packages/media/dist-in/main.js +++ b/packages/media/dist-in/main.js @@ -9,6 +9,7 @@ import './commands/background-remove.js'; import './commands/background-remove-bria.js'; import './commands/crop-foreground.js'; import './commands/salamander.js'; +import './commands/schemas.js'; import './commands/register-commands.js'; import './commands/register-explorer.js'; const argv = cli.argv; @@ -19,4 +20,4 @@ if (argv.h || argv.help) { else if (argv.v || argv.version) { process.exit(); } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQUMsUUFBUSxFQUFFLENBQUE7QUFFaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUU5QixPQUFPLHNCQUFzQixDQUFBO0FBQzdCLE9BQU8sdUJBQXVCLENBQUE7QUFDOUIsT0FBTyx5QkFBeUIsQ0FBQTtBQUNoQyxPQUFPLGlDQUFpQyxDQUFBO0FBQ3hDLE9BQU8sc0NBQXNDLENBQUE7QUFDN0MsT0FBTywrQkFBK0IsQ0FBQTtBQUN0QyxPQUFPLDBCQUEwQixDQUFBO0FBQ2pDLE9BQU8saUNBQWlDLENBQUE7QUFDeEMsT0FBTyxpQ0FBaUMsQ0FBQTtBQUV4QyxNQUFNLElBQUksR0FBUSxHQUFHLENBQUMsSUFBSSxDQUFDO0FBRTNCLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ25CLENBQUM7S0FBTSxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNuQixDQUFDIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQUMsUUFBUSxFQUFFLENBQUE7QUFFaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUU5QixPQUFPLHNCQUFzQixDQUFBO0FBQzdCLE9BQU8sdUJBQXVCLENBQUE7QUFDOUIsT0FBTyx5QkFBeUIsQ0FBQTtBQUNoQyxPQUFPLGlDQUFpQyxDQUFBO0FBQ3hDLE9BQU8sc0NBQXNDLENBQUE7QUFDN0MsT0FBTywrQkFBK0IsQ0FBQTtBQUN0QyxPQUFPLDBCQUEwQixDQUFBO0FBQ2pDLE9BQU8sdUJBQXVCLENBQUE7QUFDOUIsT0FBTyxpQ0FBaUMsQ0FBQTtBQUN4QyxPQUFPLGlDQUFpQyxDQUFBO0FBRXhDLE1BQU0sSUFBSSxHQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFFM0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDZixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkIsQ0FBQztLQUFNLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ25CLENBQUMifQ== \ No newline at end of file diff --git a/packages/media/commands/svg2jpg.d.ts b/packages/media/dist-in/ref/chatgpt-ex.d.ts similarity index 64% rename from packages/media/commands/svg2jpg.d.ts rename to packages/media/dist-in/ref/chatgpt-ex.d.ts index e4aa7e05..ca73784e 100644 --- a/packages/media/commands/svg2jpg.d.ts +++ b/packages/media/dist-in/ref/chatgpt-ex.d.ts @@ -1 +1,2 @@ -export declare const register: (cli: CLI.Argv) => any; +import * as CLI from 'yargs'; +export declare const register: (cli: CLI.Argv) => any; diff --git a/packages/media/dist-in/ref/chatgpt-ex.js b/packages/media/dist-in/ref/chatgpt-ex.js new file mode 100644 index 00000000..d09ee21c --- /dev/null +++ b/packages/media/dist-in/ref/chatgpt-ex.js @@ -0,0 +1,181 @@ +import * as path from 'path'; +import { sync as read } from '@plastichub/fs/read'; +import { sync as write } from '@plastichub/fs/write'; +import { sync as exists } from '@plastichub/fs/exists'; +import { CONFIG_DEFAULT } from '@plastichub/osr-commons'; +import { resolve as resolvePath } from '@plastichub/osr-commons'; +import { logger } from '../'; +import { defaults } from '../_cli'; +import { Filters } from '../lib/filters'; +import { readPipedInput } from '../lib/args'; +import { queryEx, transcribe } from '../lib/openai'; +import { isString } from '@plastichub/core/primitives'; +const defaultOptions = (yargs) => { + yargs.parserConfiguration({ + "camel-case-expansion": false + }); + return yargs.option('debug', { + default: false, + describe: 'debug messages', + type: 'boolean' + }).option('append', { + default: false, + describe: 'append to file instead of overwriting', + type: 'boolean' + }).option('showPrompt', { + default: false, + describe: 'insert prompt in output', + type: 'boolean' + }).option('cache', { + default: true, + describe: 'Enable cache', + type: 'boolean' + }).option('alt', { + default: false, + describe: 'Use alternative path variable token separator', + type: 'boolean' + }).option('query', { + description: 'query', + default: "list all towns of barcelona, as typescript enum, with gps coords, as strings" + }).option('dst', { + description: 'Destination output path', + _default: './tests/chatgpt/last.ts' + }).option('env_key', { + default: 'OSR-CONFIG', + describe: 'Environment key to the config path' + }).option('api_key', { + describe: 'OpenAI key' + }).option('model', { + describe: 'OpenAI Model', + default: "gpt-4o" + }).option('system', { + describe: 'Path to system instructions' + }).option('source', { + describe: 'Path to a source file' + }).option('response_format', { + describe: 'Format of the response (for transcribe)', + default: "text" + }).option('filters', { + describe: `An array of filters to apply to the response: JSON : ${Object.keys(Filters)} `, + default: "" + }).option('files', { + describe: `List of files to attach to the query: String|Glob` + }).option('logLevel', { + describe: `Log level: warn|info|trace|debug|error|fatal`, + default: 'info' + }).option('gui', { + describe: `GUI: electron|puppeteer`, + default: false + }).option('prompts', { + describe: `Path to prompts file, JSON - Array`, + default: '${OSR_ROOT}/osr-ai-templates/prompts/documents.json', + type: 'string' + }); +}; +let options = (yargs) => defaultOptions(yargs); +export const register = (cli) => { + return cli.command('chatgpt-ex ', 'Prompt ChatGPT - Ex', options, async (argv) => { + defaults(); + if (argv.help) { + return; + } + const args = argv; + const verb = args.verb || 'prompt'; + const config = CONFIG_DEFAULT(args.env_key); + if (!config) { + logger.warn('No config found!'); + return; + } + if (config && !config.openai.key) { + logger.warn('No OpenAI key found in config!'); + return; + } + const variables = Object.assign({}, ...Object.keys(argv).filter((k) => k.startsWith('var-')).map((k) => { + return { + [k.replace('var-', '')]: argv[k] + }; + })); + const opts = { + query: argv.query, + ...argv, + dst: args.dst, + source: argv.source ? path.resolve(resolvePath(args.source)) : undefined, + system: argv.system ? path.resolve(resolvePath(args.system)) : undefined, + api_key: argv.openai_key || process.env.OPENAI_API_KEY || config.openai.key, + variables + }; + logger.debug('Options', opts); + const filters = (opts.filters || "").split(','); + opts.filters = []; + filters.forEach((f) => { + if (Filters[f]) { + (opts.filters).push(Filters[f]); + } + }); + if (opts.cache === true && exists(opts.dst)) { + logger.debug('Output file already exists, skipping'); + return; + } + if (!opts.api_key) { + logger.error('No OpenAI key found in config or options!'); + return; + } + if (!opts.query) { + logger.error('No query specified'); + return; + } + logger.debug('Options', opts); + return new Promise(async (resolve, reject) => { + switch (verb) { + case 'prompt': { + if (opts.source && !exists(opts.source)) { + logger.error('Source specified but file not found', opts.source); + return; + } + const src = opts.source && exists(opts.source) ? read(opts.source, 'string') : ''; + const stdin = await readPipedInput() || src || ''; + let q = stdin ? `${opts.query} : "${stdin}"` : opts.query; + const queryPath = path.resolve(resolvePath(opts.query)); + if (exists(queryPath)) { + q = read(queryPath); + } + opts.query = `${opts.query} : ${src}`; + let ret = await queryEx(opts.api_key, opts); + if (opts.filters) { + opts.filters.forEach((f) => { + let _ret = f(ret); + if (isString(_ret) && _ret.length > 0) { + ret = _ret; + } + }); + } + if (opts.dst) { + let header = `${argv.showPrompt ? `// ${q}` : ''}\n`; + let content = `${argv.append ? read(opts.dst) || '' : ''}\n${header}${ret}`; + write(opts.dst, content); + } + if (isString(ret) || Buffer.isBuffer(ret)) { + process.stdout.write(ret); + } + else { + logger.warn('Invalid response: not a string or buffer'); + } + break; + } + case 'transcribe': { + const ret = await transcribe(opts.query, opts.api_key, opts.dst, { + ...opts + }); + if (ret && opts.dst) { + write(opts.dst, ret); + } + process.stdout.write(ret); + break; + } + } + resolve(); + process.exit(0); + }); + }); +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdGdwdC1leC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWYvY2hhdGdwdC1leC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUU1QixPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDcEQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDeEQsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUVoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQzVCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFNUMsT0FBTyxFQUFvQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3JFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUV0RCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3ZDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztRQUN0QixzQkFBc0IsRUFBRSxLQUFLO0tBQ2hDLENBQUMsQ0FBQTtJQUNGLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDekIsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0JBQWdCO1FBQzFCLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFN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 \ No newline at end of file diff --git a/packages/media/dist-in/ref/query.d.ts b/packages/media/dist-in/ref/query.d.ts new file mode 100644 index 00000000..481f0a3f --- /dev/null +++ b/packages/media/dist-in/ref/query.d.ts @@ -0,0 +1,11 @@ +import { OpenAI } from "openai"; +import { IOptions } from '../..'; +export declare const deepMerge: (target: string, source: any) => Promise; +export declare const mergers: { + deepMerge: (target: string, source: any) => Promise; +}; +export declare const onCompletion: (query: string, ret: string, opts: IOptions) => Promise; +export declare const createOpenAIFile: (client: OpenAI, filePath: string, purpose?: string) => Promise; +export declare const queryEx: (api_key: string, options: IOptions) => Promise; +export declare const query: (query: string, api_key: string, dst: string, options: IOptions) => Promise; +export declare const transcribe: (query: string, api_key: string, dst: string, options: any) => Promise; diff --git a/packages/media/dist-in/ref/query.js b/packages/media/dist-in/ref/query.js new file mode 100644 index 00000000..dfe37ac0 --- /dev/null +++ b/packages/media/dist-in/ref/query.js @@ -0,0 +1,272 @@ +import * as path from 'path'; +import * as fs from 'fs'; +import { OpenAI, toFile } from "openai"; +import { isString } from '@plastichub/core/primitives'; +import { sync as write } from '@plastichub/fs/write'; +import { sync as read } from '@plastichub/fs/read'; +import { sync as exists } from '@plastichub/fs/exists'; +import { resolve } from '@plastichub/osr-commons'; +import { dumpAsScript, logger, toImages } from '../..'; +import { Typescript, Commons, Markdown, Documents, Rust } from './system'; +import { Filters } from '../filters'; +import { parse } from './options'; +import { web_prompt as eprompt } from '../ui/electron'; +import { deepmerge as merge } from 'deepmerge-ts'; +export const deepMerge = async (target, source) => { + if (!isString(target) || !source) { + logger.error(`Invalid deepmerge parameters:`, target, source); + return source; + } + target = read(target, 'json') || []; + try { + source = isString(source) ? JSON.parse(source) : source; + } + catch (e) { + logger.error('Error parsing completion:', e); + return source; + } + try { + const ret = merge(target, source); + return JSON.stringify(ret, null, 2); + } + catch (error) { + logger.error('Error merging completion:', error); + } + return target; +}; +export const mergers = { deepMerge }; +export const onCompletion = async (query, ret, opts) => { + if (!isString(ret)) { + logger.warn(`Invalid response :${query}`); + return; + } + const filters = opts.filters.split(','); + opts.filters = []; + filters.forEach((f) => { + if (Filters[f]) { + (opts.filters).push(Filters[f]); + } + }); + if (opts.filters) { + opts.filters.forEach((f) => { ret = f(ret); }); + } + if (opts.append && mergers[opts.append] && opts.dst) { + ret = await mergers[opts.append](opts.dst, ret); + } + if (opts.dst) { + let header = `${opts.showPrompt ? `// ${opts.query}` : ''}\n`; + let content = `${header}${ret}`; + write(opts.dst, content); + } + else { + process.stdout.write(ret); + } + return ret; +}; +export const createOpenAIFile = async (client, filePath, purpose = 'assistants') => { + return client.files.create({ + file: fs.createReadStream(filePath), + purpose: purpose + }); +}; +export const queryEx = async (api_key, options) => { + let ui_opts = null; + let ui_opts_variables = {}; + if (options.gui === 'electron') { + const promptsFile = path.resolve(resolve(options.prompts)); + const prompts = JSON.stringify(read(promptsFile, 'json') || []); + ui_opts = await eprompt(options.query, options.dst, { ...ui_opts_variables, PROMPTS: prompts, MODELS: [] }); + } + options = parse(options); + if (ui_opts) { + if (ui_opts.files && ui_opts.files.length > 0) { + options.files = ui_opts.files; + } + if (ui_opts.textAreaValue !== options.query) { + options.query = ui_opts.textAreaValue; + } + if (ui_opts.target.length && ui_opts.target !== options.dst) { + options.dst = ui_opts.target; + } + } + const client = new OpenAI({ apiKey: api_key }); + let messages = []; + let defaults = [...Typescript(), ...Documents()]; + if (options.system && exists(options.system)) { + options.debug && logger.debug('Reading system instructions from', options.system); + try { + const system = read(options.system, 'json'); + if (system) { + messages = [...system]; + } + } + catch (error) { + logger.error('Error reading system instructions', error); + messages = defaults; + } + } + else { + messages = defaults; + } + const attachments = await Promise.all(options.files.map(async (file) => { + const file_id = await createOpenAIFile(client, file); + return { + file_id: file_id.id, + tools: [{ type: "file_search" }] + }; + })); + const assistant = await client.beta.assistants.create({ + name: "Documents Assistant", + instructions: "You are an expert data analyst.", + model: "gpt-4o", + tools: [{ type: "file_search" }], + }); + const thread = await client.beta.threads.create({ + messages: [ + { + role: "user", + content: options.query, + attachments + } + ] + }); + return new Promise((resolve, reject) => { + try { + const stream = client.beta.threads.runs + .stream(thread.id, { + assistant_id: assistant.id, + }) + .on("textCreated", () => console.log("assistant >")) + .on("toolCallCreated", (event) => console.log("assistant " + event.type)) + .on("messageDone", async (event) => { + if (event.content[0].type === "text") { + const { text } = event.content[0]; + const { annotations } = text; + const citations = []; + let index = 0; + /* + for (let annotation of annotations) { + text.value = text.value.replace(annotation.text, "[" + index + "]"); + const { file_citation } = annotation; + if (file_citation) { + const citedFile = await openai.files.retrieve(file_citation.file_id); + citations.push("[" + index + "]" + citedFile.filename); + } + index++; + }*/ + logger.debug('OpenAI response:', text.value); + resolve(text.value); + } + }); + return stream; + } + catch (error) { + reject(error); + } + }); +}; +export const query = async (query, api_key, dst, options) => { + const client = new OpenAI({ apiKey: api_key }); + let messages = []; + let defaults = [...Typescript(), ...Markdown(), ...Commons(), ...Rust()]; + if (options.system && exists(options.system)) { + logger.debug('Reading system instructions from', options.system); + try { + const system = read(options.system, 'json'); + if (system) { + messages = [...system]; + } + } + catch (error) { + logger.error('Error reading system instructions', error); + messages = defaults; + } + } + else { + messages = defaults; + } + const requestMessage = { + role: "user", + content: query + }; + messages.push(requestMessage); + if (options.files && options.filesInfo.FILES) { + const images = toImages(options.filesInfo.FILES).map((image) => { + return { + role: "user", + content: [{ ...image }] + }; + }); + messages = [...messages, ...images]; + } + const tools = [ + { + type: "function", + function: { + name: "list_files", + description: "List files in a given directory.", + parameters: { + type: "object", + properties: { + order_id: { + type: "string", + description: "The directory to list files in.", + }, + }, + required: ["dir"], + additionalProperties: false + } + } + } + ]; + const completion = await client.chat.completions.create({ + model: options.model || "gpt-4o", + messages: messages, + //tools: tools as any + }); + if (completion.choices.length === 0) { + logger.error('OpenAI response is empty'); + return; + } + let ret = completion.choices[0].message.content; + ret = await onCompletion(query, ret, options); + dumpAsScript(options); + return ret; +}; +const createBuffer = (path) => { + try { + const buffer = fs.readFileSync(path); + return buffer; + } + catch (error) { + console.error('Error creating buffer:', error); + return null; + } +}; +export const transcribe = async (query, api_key, dst, options) => { + const client = new OpenAI({ + apiKey: api_key + }); + if (!exists(options.source)) { + logger.error('Source file does not exist', options.source); + return; + } + const file = await toFile(createBuffer(options.source), 'audio.mp3', { type: 'audio/mpeg' }); + if (!file) { + logger.error('Error converting source to file'); + return; + } + const completion = await client.audio.transcriptions.create({ + model: 'whisper-1', + file: file, + response_format: options.response_format || "verbose_json", + }); + if (!completion) { + logger.error('OpenAI response is empty'); + return; + } + const ret = completion; + logger.debug('OpenAI Transcribe response:', ret); + return ret; +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVmL3F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQVksTUFBTSw2QkFBNkIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDbEQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUV0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFBO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsVUFBVSxJQUFJLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXRELE9BQU8sRUFBRSxTQUFTLElBQUksS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBR2pELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFO0lBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxD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 \ No newline at end of file diff --git a/packages/media/dist-in/types.d.ts b/packages/media/dist-in/types.d.ts index b0a31e0c..08b0517a 100644 --- a/packages/media/dist-in/types.d.ts +++ b/packages/media/dist-in/types.d.ts @@ -18,6 +18,7 @@ export type IOptions = { variables?: Record; key?: string; logLevel?: string; + gui?: boolean; }; export interface IResizeOptionsSharp { /** Alternative means of specifying width. If both are present this takes priority. */ diff --git a/packages/media/dist-in/zod_types_background_remove.d.ts b/packages/media/dist-in/zod_types_background_remove.d.ts new file mode 100644 index 00000000..252fccaa --- /dev/null +++ b/packages/media/dist-in/zod_types_background_remove.d.ts @@ -0,0 +1,28 @@ +export interface IBackgroundRemoveOptions { + /** FILE|FOLDER|GLOB - Source file(s) to remove background from */ + src: string; + /** FILE|FOLDER|GLOB - Destination for processed files */ + dst?: string | undefined; + /** Enable internal debug messages */ + debug?: boolean; + /** Use alternate tokenizer, & instead of $ */ + alt?: boolean; + /** Run without conversion */ + dry?: boolean; + /** Show internal messages */ + verbose?: boolean; + /** Log level: warn, info, debug, error */ + logLevel?: "warn" | "info" | "debug" | "error"; + /** Replicate API key (or set REPLICATE_API_TOKEN env var) */ + apiKey?: string | undefined; + /** Background removal model to use */ + model?: string; + /** Enable alpha matting for better edge refinement */ + alpha_matting?: boolean; + /** Alpha matting foreground threshold */ + alpha_matting_foreground_threshold?: number; + /** Alpha matting background threshold */ + alpha_matting_background_threshold?: number; + /** Alpha matting erode size */ + alpha_matting_erode_size?: number; +} diff --git a/packages/media/dist-in/zod_types_background_remove.js b/packages/media/dist-in/zod_types_background_remove.js new file mode 100644 index 00000000..2a851e51 --- /dev/null +++ b/packages/media/dist-in/zod_types_background_remove.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kX3R5cGVzX2JhY2tncm91bmRfcmVtb3ZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3pvZF90eXBlc19iYWNrZ3JvdW5kX3JlbW92ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0= \ No newline at end of file diff --git a/packages/media/dist-in/zod_types_background_remove_bria.d.ts b/packages/media/dist-in/zod_types_background_remove_bria.d.ts new file mode 100644 index 00000000..ef2f8c65 --- /dev/null +++ b/packages/media/dist-in/zod_types_background_remove_bria.d.ts @@ -0,0 +1,28 @@ +export interface IBriaBackgroundRemoveOptions { + /** FILE|FOLDER|GLOB - Source file(s) to remove background from */ + src: string; + /** FILE|FOLDER|GLOB - Destination for processed files */ + dst?: string | undefined; + /** Enable internal debug messages */ + debug?: boolean; + /** Use alternate tokenizer, & instead of $ */ + alt?: boolean; + /** Run without conversion */ + dry?: boolean; + /** Show internal messages */ + verbose?: boolean; + /** Log level: warn, info, debug, error */ + logLevel?: "warn" | "info" | "debug" | "error"; + /** Skip processing if target file already exists */ + cache?: boolean; + /** Bria API key (or set in config.bria.key) */ + apiKey?: string | undefined; + /** Use synchronous processing (recommended) */ + sync?: boolean; + /** Enable content moderation */ + contentModeration?: boolean; + /** Preserve alpha channel from input image */ + preserveAlpha?: boolean; + /** Convert PNG output to JPG format and delete PNG */ + jpg?: boolean; +} diff --git a/packages/media/dist-in/zod_types_background_remove_bria.js b/packages/media/dist-in/zod_types_background_remove_bria.js new file mode 100644 index 00000000..b365f6bc --- /dev/null +++ b/packages/media/dist-in/zod_types_background_remove_bria.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kX3R5cGVzX2JhY2tncm91bmRfcmVtb3ZlX2JyaWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvem9kX3R5cGVzX2JhY2tncm91bmRfcmVtb3ZlX2JyaWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/media/dist-in/zod_types_crop_foreground.d.ts b/packages/media/dist-in/zod_types_crop_foreground.d.ts new file mode 100644 index 00000000..0f632cbe --- /dev/null +++ b/packages/media/dist-in/zod_types_crop_foreground.d.ts @@ -0,0 +1,24 @@ +export interface ICropForegroundOptions { + /** FILE|FOLDER|GLOB - Source file(s) to crop foreground from */ + src: string; + /** FILE|FOLDER|GLOB - Destination for processed files */ + dst?: string | undefined; + /** Enable internal debug messages */ + debug?: boolean; + /** Use alternate tokenizer, & instead of $ */ + alt?: boolean; + /** Run without conversion */ + dry?: boolean; + /** Show internal messages */ + verbose?: boolean; + /** Log level: warn, info, debug, error */ + logLevel?: "warn" | "info" | "debug" | "error"; + /** Bria API key (or set in config.bria.key) */ + apiKey?: string | undefined; + /** Use synchronous processing (recommended) */ + sync?: boolean; + /** Enable content moderation */ + contentModeration?: boolean; + /** Preserve alpha channel from input image */ + preserveAlpha?: boolean; +} diff --git a/packages/media/dist-in/zod_types_crop_foreground.js b/packages/media/dist-in/zod_types_crop_foreground.js new file mode 100644 index 00000000..705a6e77 --- /dev/null +++ b/packages/media/dist-in/zod_types_crop_foreground.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kX3R5cGVzX2Nyb3BfZm9yZWdyb3VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy96b2RfdHlwZXNfY3JvcF9mb3JlZ3JvdW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/packages/media/dist-in/zod_types_pdf2jpg.d.ts b/packages/media/dist-in/zod_types_pdf2jpg.d.ts new file mode 100644 index 00000000..fee875d0 --- /dev/null +++ b/packages/media/dist-in/zod_types_pdf2jpg.d.ts @@ -0,0 +1,16 @@ +export interface IPdf2JpgOptions { + /** Path to the input PDF file */ + input: string; + /** Output path template (e.g., output/page_{PAGE}.png) */ + output?: string | undefined; + /** Resolution for the output images */ + dpi?: number; + /** Scaling factor to apply before rendering (e.g., 2 for 2x size) */ + scale?: number; + /** Output image format */ + format?: "png" | "jpg"; + /** First page to convert (1-based index) */ + startPage?: number | undefined; + /** Last page to convert (1-based index) */ + endPage?: number | undefined; +} diff --git a/packages/media/dist-in/zod_types_pdf2jpg.js b/packages/media/dist-in/zod_types_pdf2jpg.js new file mode 100644 index 00000000..7d20434f --- /dev/null +++ b/packages/media/dist-in/zod_types_pdf2jpg.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kX3R5cGVzX3BkZjJqcGcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvem9kX3R5cGVzX3BkZjJqcGcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/media/dist-in/zod_types_resize.d.ts b/packages/media/dist-in/zod_types_resize.d.ts new file mode 100644 index 00000000..15b017b4 --- /dev/null +++ b/packages/media/dist-in/zod_types_resize.d.ts @@ -0,0 +1,51 @@ +export interface IResizeOptions { + /** FILE|FOLDER|GLOB - Source file(s) to resize */ + src: string; + /** FILE|FOLDER|GLOB - Destination for resized files */ + dst?: string | undefined; + /** Enable internal debug messages */ + debug?: boolean; + /** Use alternate tokenizer, & instead of $ */ + alt?: boolean; + /** Run without conversion */ + dry?: boolean; + /** Show internal messages */ + verbose?: boolean; + /** Resize image width */ + width?: number | undefined; + /** Resize image height */ + height?: number | undefined; + /** Resize image minimum height */ + minHeight?: number | undefined; + /** Resize image minimum width */ + minWidth?: number | undefined; + /** Resize image size (bytes) */ + minSize?: number | undefined; + /** Resize image in percent (width) */ + percent?: number | undefined; + /** Fit image within width for 1:1 aspect ratio without cropping */ + square?: boolean; + /** Fill color for square backgrounds (default: white) */ + fillColor?: string; + /** Log level: warn, info, debug, error */ + logLevel?: "warn" | "info" | "debug" | "error"; + /** How the image should be resized to fit both provided dimensions */ + fit?: ("cover" | "contain" | "fill" | "inside" | "outside") | undefined; + /** Position, gravity or strategy to use when fit is cover or contain */ + position?: (number | string) | undefined; + /** Background color when using a fit of contain */ + background?: (string | { + r: number; + g: number; + b: number; + alpha?: number | undefined; + }) | undefined; + /** The kernel to use for image reduction */ + kernel?: ("nearest" | "cubic" | "mitchell" | "lanczos2" | "lanczos3") | undefined; + /** Do not enlarge if the width or height are already less than the specified dimensions */ + withoutEnlargement?: boolean; + /** Do not reduce if the width or height are already greater than the specified dimensions */ + withoutReduction?: boolean; + /** Take greater advantage of the JPEG and WebP shrink-on-load feature */ + fastShrinkOnLoad?: boolean; +} diff --git a/packages/media/dist-in/zod_types_resize.js b/packages/media/dist-in/zod_types_resize.js new file mode 100644 index 00000000..e068d8b8 --- /dev/null +++ b/packages/media/dist-in/zod_types_resize.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kX3R5cGVzX3Jlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy96b2RfdHlwZXNfcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/packages/media/dist-in/zod_types_watermark.d.ts b/packages/media/dist-in/zod_types_watermark.d.ts new file mode 100644 index 00000000..66388234 --- /dev/null +++ b/packages/media/dist-in/zod_types_watermark.d.ts @@ -0,0 +1,38 @@ +export interface IWatermarkOptions { + /** FILE|FOLDER|GLOB - Source file(s) to add watermark to */ + src: string; + /** FILE|FOLDER|GLOB - Destination for watermarked files */ + dst?: string | undefined; + /** Enable internal debug messages */ + debug?: boolean; + /** Use alternate tokenizer, & instead of $ */ + alt?: boolean; + /** Run without conversion */ + dry?: boolean; + /** Show internal messages */ + verbose?: boolean; + /** Log level: warn, info, debug, error */ + logLevel?: "warn" | "info" | "debug" | "error"; + /** Skip processing if target file already exists */ + cache?: boolean; + /** Watermark content: text string or path to image file (PNG, JPG, SVG) */ + watermark: string; + /** Position of watermark */ + position?: "top-left" | "top-right" | "bottom-left" | "bottom-right" | "center"; + /** Margin from edges in pixels */ + margin?: number; + /** Opacity of watermark (0-1) */ + opacity?: number; + /** Size of image watermark as percentage of base image width (0-1) */ + sizePct?: number; + /** Font size for text watermark in pixels */ + fontSize?: number; + /** Text color (hex format, e.g., #ffffff) */ + color?: string; + /** Font family for text watermark */ + fontFamily?: string; + /** Text stroke color (hex format, e.g., #000000) */ + strokeColor?: string; + /** Text stroke width in pixels */ + strokeWidth?: number; +} diff --git a/packages/media/dist-in/zod_types_watermark.js b/packages/media/dist-in/zod_types_watermark.js new file mode 100644 index 00000000..87bb07a3 --- /dev/null +++ b/packages/media/dist-in/zod_types_watermark.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kX3R5cGVzX3dhdGVybWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy96b2RfdHlwZXNfd2F0ZXJtYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/packages/media/docs/ui.md b/packages/media/docs/ui.md new file mode 100644 index 00000000..cb7bddcf --- /dev/null +++ b/packages/media/docs/ui.md @@ -0,0 +1,376 @@ +# UI Proposal: Electron-based Dynamic Form Renderer + +## Overview + +This proposal outlines the implementation of a dynamic UI system for rendering Zod schema-based forms using Electron, React JSON Schema Form (RJSF), and shadcn/ui components. The goal is to replace the current static HTML template with a flexible, schema-driven form generator. + +## Current State Analysis + +### Existing Implementation +- **Template System**: `web-ui/_prompt.html` with basic variable substitution +- **Electron Setup**: Basic main process in `lib/ui/electron/main.ts` +- **Schema System**: `ZodMetaMap` class with `getUISchema()` method +- **File Handling**: Basic file picker functionality via IPC + +### Limitations +- Static HTML template requiring manual updates for new options +- Basic variable substitution not suitable for complex schemas +- No type safety between schema and UI +- Limited file picker functionality + +## Proposed Architecture + +### 1. React-based UI Application + +**New Structure:** +``` +media/ +├── web-ui/ +│ ├── src/ +│ │ ├── components/ +│ │ │ ├── SchemaForm.tsx # Main RJSF form component +│ │ │ ├── FilePickerField.tsx # Custom file picker widget +│ │ │ ├── ui/ # shadcn/ui components +│ │ │ └── FormTheme.tsx # RJSF shadcn theme +│ │ ├── hooks/ +│ │ │ ├── useElectronIPC.ts # IPC communication +│ │ │ └── useSchemaForm.ts # Form state management +│ │ ├── types/ +│ │ │ └── electron.d.ts # Electron API types +│ │ ├── App.tsx # Main app component +│ │ └── main.tsx # React entry point +│ ├── package.json # React app dependencies +│ ├── vite.config.ts # Vite build config +│ └── dist/ # Built React app +``` + +### 2. Enhanced Electron Integration + +**Updated Electron Structure:** +```typescript +// lib/ui/electron/main.ts +interface UIOptions { + schema: any; // JSON schema from ZodMetaMap + uiSchema: any; // UI schema from getUISchema() + formData?: any; // Default form values + title?: string; // Window title + width?: number; // Window dimensions + height?: number; +} + +export const renderSchemaForm = async (options: UIOptions): Promise => { + // Create Electron window with React app + // Pass schema and configuration via IPC + // Return form submission result +} +``` + +### 3. ZodMetaMap Enhancements + +**Enhanced Schema Generation:** +```typescript +// In ZodMetaMap class +getJSONSchema(): any { + // Convert Zod schema to JSON Schema for RJSF +} + +getUISchemaEnhanced(): any { + // Enhanced UI schema with: + // - File picker widgets for file/directory fields + // - Custom validators + // - Field dependencies + // - Layout hints +} +``` + +### 4. File Picker Integration + +**Custom RJSF Widget:** +```typescript +// components/FilePickerField.tsx +interface FilePickerProps { + value: string | string[]; + onChange: (value: string | string[]) => void; + schema: any; + uiSchema: any; +} + +const FilePickerField: React.FC = ({ + value, + onChange, + schema, + uiSchema +}) => { + // Determine picker type from schema: + // - Single file vs multiple files + // - File vs directory + // - File filters based on extensions + + const handleFilePicker = async () => { + const result = await window.electronAPI.showFileDialog({ + properties: getPickerProperties(schema, uiSchema), + filters: getFileFilters(schema) + }); + onChange(result); + }; + + return ( +
+ + +
+ ); +}; +``` + +## Implementation Plan + +### Phase 1: Core Infrastructure (Week 1) + +1. **Setup React Application** + ```bash + cd media/web-ui + npm init -y + npm install react react-dom @rjsf/core @rjsf/utils @rjsf/validator-ajv8 + npm install -D vite @vitejs/plugin-react typescript @types/react @types/react-dom + ``` + +2. **Install shadcn/ui** + ```bash + npx shadcn-ui@latest init + npx shadcn-ui@latest add button input textarea select checkbox switch + ``` + +3. **Create RJSF Theme** + - Map RJSF widgets to shadcn/ui components + - Implement custom field templates + - Style validation errors and help text + +### Phase 2: Schema Integration (Week 2) + +1. **Enhance ZodMetaMap** + - Add `toJSONSchema()` method + - Enhance `getUISchema()` with file picker hints + - Add field dependency support + +2. **Custom Widgets** + - File picker widget for `src` field + - Directory picker widget for `dst` field + - Number input with validation + - Enum select with descriptions + +3. **IPC Communication** + - Schema passing from main to renderer + - Form submission handling + - File dialog integration + +### Phase 3: Advanced Features (Week 3) + +1. **Dynamic Schema Loading** + ```typescript + // lib/ui/schema-renderer.ts + export const renderSchema = async ( + schemaFn: () => any, + options: RenderOptions = {} + ): Promise => { + const schema = schemaFn(); + const zodMap = new ZodMetaMap(); + // Configure zodMap based on schema + const jsonSchema = zodMap.toJSONSchema(); + const uiSchema = zodMap.getUISchemaEnhanced(); + + return renderSchemaForm({ + schema: jsonSchema, + uiSchema, + title: options.title || 'Configuration', + ...options + }); + }; + ``` + +2. **File Management** + - Drag & drop support + - File preview thumbnails + - Batch file selection + - Recent files/directories + +3. **Validation & Preview** + - Real-time validation feedback + - Command preview generation + - Estimated processing time + - Storage space calculations + +### Phase 4: Integration (Week 4) + +1. **Command Integration** + ```typescript + // commands/resize.ts - Updated handler + export async function handler(argv: CLI.Arguments) { + if (argv.ui || (!argv.src && process.env.NODE_ENV !== 'test')) { + // Launch UI mode + const result = await renderSchema(ResizeOptionsSchema, { + title: 'Resize Images', + width: 900, + height: 700 + }); + + if (!result) return; // User cancelled + + // Merge CLI args with UI result + const options = { ...argv, ...result }; + await resize(options); + } else { + // Traditional CLI mode + const options = sanitize(argv) as IOptions; + await resize(options); + } + } + ``` + +2. **CLI Flag Addition** + ```typescript + // Add --ui flag to all commands + .option('ui', { + boolean: true, + default: false, + describe: 'Launch interactive UI' + }) + ``` + +## Technical Specifications + +### Dependencies + +**New Dependencies:** +```json +{ + "dependencies": { + "@rjsf/core": "^5.15.0", + "@rjsf/utils": "^5.15.0", + "@rjsf/validator-ajv8": "^5.15.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "tailwind-merge": "^2.0.0", + "lucide-react": "^0.294.0" + }, + "devDependencies": { + "vite": "^5.0.0", + "@vitejs/plugin-react": "^4.2.0", + "tailwindcss": "^3.3.0", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.32" + } +} +``` + +### File Structure Changes + +**Updated web_prompt Function:** +```typescript +// lib/ui/electron.ts +export const web_prompt = async ( + schema: any, + uiSchema: any, + options: { + title?: string; + formData?: any; + width?: number; + height?: number; + } = {} +): Promise => { + // Write schema and config to temporary files + const configPath = path.join(os.tmpdir(), `schema-${Date.now()}.json`); + write(configPath, JSON.stringify({ + schema, + uiSchema, + formData: options.formData || {}, + title: options.title || 'Configuration' + })); + + const electronPath = path.join(process.cwd(), './node_modules/electron/dist/electron.exe'); + const mainPath = path.join(process.cwd(), 'lib/ui/electron/main.js'); + + const p = await Helper.runBin( + '', + electronPath, + '', + [`"${mainPath}"`, `--config="${configPath}"`] + ); + + const content = p.messages.find((m) => m.type === 'content'); + + // Cleanup + if (exists(configPath)) { + fs.unlinkSync(configPath); + } + + return content?.data; +}; +``` + +## Benefits + +### For Developers +- **Type Safety**: Full TypeScript support from schema to UI +- **Maintainability**: Single source of truth for form structure +- **Extensibility**: Easy to add new field types and validation +- **Consistency**: Uniform UI across all commands + +### For Users +- **Intuitive Interface**: Modern, responsive UI with proper validation +- **File Management**: Drag & drop, thumbnails, batch operations +- **Real-time Feedback**: Immediate validation and preview +- **Accessibility**: Screen reader support, keyboard navigation + +### For the Project +- **Reduced Maintenance**: No manual HTML template updates +- **Faster Development**: New commands automatically get UI support +- **Better UX**: Professional interface increases adoption +- **Future-Proof**: Extensible architecture for new features + +## Migration Strategy + +1. **Parallel Development**: Build new system alongside existing one +2. **Gradual Migration**: Start with resize command, then expand +3. **Backward Compatibility**: Keep CLI-only mode working +4. **User Testing**: Beta test with existing users +5. **Documentation**: Update all docs with UI screenshots + +## Challenges & Mitigations + +### Complex Schema Mapping +- **Challenge**: Converting Zod schemas to JSON Schema +- **Mitigation**: Use `zod-to-json-schema` library or custom converter + +### File Picker UX +- **Challenge**: Handling complex file selection scenarios +- **Mitigation**: Custom widgets with clear visual feedback + +### Electron Bundle Size +- **Challenge**: React app increases bundle size +- **Mitigation**: Code splitting, lazy loading, production builds + +### Cross-Platform Compatibility +- **Challenge**: File dialogs behave differently across OS +- **Mitigation**: Extensive testing, OS-specific adaptations + +## Success Metrics + +- **Developer Experience**: Time to add UI to new command < 10 minutes +- **User Adoption**: >50% of users prefer UI mode over CLI +- **Error Reduction**: 80% fewer invalid parameter combinations +- **Maintenance**: 90% reduction in UI-related bug reports + +## Future Enhancements + +- **Presets**: Save/load common configurations +- **Batch Processing**: Queue multiple operations +- **Progress Tracking**: Real-time operation progress +- **Plugin System**: Third-party UI extensions +- **Web Version**: Browser-based version for remote access + +This proposal provides a comprehensive roadmap for transforming the current static UI into a dynamic, schema-driven system that will significantly improve both developer and user experience. diff --git a/packages/media/media.code-workspace b/packages/media/media.code-workspace new file mode 100644 index 00000000..c7cea028 --- /dev/null +++ b/packages/media/media.code-workspace @@ -0,0 +1,11 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "../kbot" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/packages/media/output/image_1.png b/packages/media/output/image_1.png deleted file mode 100644 index 4a2adcec..00000000 --- a/packages/media/output/image_1.png +++ /dev/null @@ -1 +0,0 @@ -mock-png-data \ No newline at end of file diff --git a/packages/media/output/image_2.png b/packages/media/output/image_2.png deleted file mode 100644 index 4a2adcec..00000000 --- a/packages/media/output/image_2.png +++ /dev/null @@ -1 +0,0 @@ -mock-png-data \ No newline at end of file diff --git a/packages/media/output/image_3.png b/packages/media/output/image_3.png deleted file mode 100644 index 4a2adcec..00000000 --- a/packages/media/output/image_3.png +++ /dev/null @@ -1 +0,0 @@ -mock-png-data \ No newline at end of file diff --git a/packages/media/output/image_4.png b/packages/media/output/image_4.png deleted file mode 100644 index 4a2adcec..00000000 --- a/packages/media/output/image_4.png +++ /dev/null @@ -1 +0,0 @@ -mock-png-data \ No newline at end of file diff --git a/packages/media/output/image_5.png b/packages/media/output/image_5.png deleted file mode 100644 index 4a2adcec..00000000 --- a/packages/media/output/image_5.png +++ /dev/null @@ -1 +0,0 @@ -mock-png-data \ No newline at end of file diff --git a/packages/media/package-lock.json b/packages/media/package-lock.json index b14dd578..9f71e38e 100644 --- a/packages/media/package-lock.json +++ b/packages/media/package-lock.json @@ -18,10 +18,12 @@ "@types/node": "^24.0.10", "bluebird": "^3.7.2", "download": "^8.0.0", + "electron": "^37.2.6", "fast-glob": "^3.3.2", "fluent-ffmpeg": "^2.1.3", "glob": "^11.0.0", "js-beautify": "^1.14.6", + "lucide-react": "^0.539.0", "mupdf": "^1.3.3", "novita-sdk": "^1.0.37", "p-map": "^7.0.3", @@ -277,6 +279,230 @@ "node": ">=14.17.0" } }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@electron/get/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/get/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/@electron/get/node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@electron/get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/@electron/get/node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/@electron/get/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/@electron/get/node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/@electron/get/node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/@electron/get/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@electron/get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@electron/get/node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@emnapi/runtime": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", @@ -1593,6 +1819,18 @@ "node": ">=14.16" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/chai": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", @@ -1670,7 +1908,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { @@ -1680,6 +1917,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -1696,6 +1942,15 @@ "undici-types": "~7.8.0" } }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/showdown": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.6.tgz", @@ -1764,6 +2019,16 @@ "node": ">= 12" } }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@vitest/expect": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", @@ -2627,6 +2892,14 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "optional": true + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -3471,7 +3744,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -3494,6 +3766,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3511,6 +3801,13 @@ "node": ">=8" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT", + "optional": true + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3586,6 +3883,24 @@ "editorconfig": "bin/editorconfig" } }, + "node_modules/electron": { + "version": "37.2.6", + "resolved": "https://registry.npmjs.org/electron/-/electron-37.2.6.tgz", + "integrity": "sha512-Ns6xyxE+hIK5UlujtRlw7w4e2Ju/ImCWXf1Q/PoOhc0N3/6SN6YW7+ujCarsHbxWnolbW+1RlkHtdklUJpjbPA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^22.7.7", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.199", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.199.tgz", @@ -3593,6 +3908,21 @@ "dev": true, "license": "ISC" }, + "node_modules/electron/node_modules/@types/node": { + "version": "22.17.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.1.tgz", + "integrity": "sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/electron/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", @@ -3622,6 +3952,15 @@ "node": ">=10.13.0" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/envinfo": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", @@ -3672,6 +4011,13 @@ "node": ">= 0.4" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "license": "MIT", + "optional": true + }, "node_modules/esbuild": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", @@ -3843,6 +4189,41 @@ "node": ">=4" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4132,6 +4513,20 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4285,6 +4680,54 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -4899,6 +5342,22 @@ "dev": true, "license": "MIT" }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC", + "optional": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", @@ -5074,6 +5533,15 @@ "yallist": "^2.1.2" } }, + "node_modules/lucide-react": { + "version": "0.539.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.539.0.tgz", + "integrity": "sha512-VVISr+VF2krO91FeuCrm1rSOLACQUYVy7NQkzrOty52Y8TlTPcXcMdQFj9bYzBgXbWCiywlwSZ3Z8u6a+6bMlg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", @@ -5097,6 +5565,32 @@ "node": ">=6" } }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -5629,6 +6123,16 @@ "node": ">=0.10.0" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6019,6 +6523,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -6082,7 +6595,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -6101,6 +6613,16 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -6226,7 +6748,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, "license": "MIT" }, "node_modules/resolve-cwd": { @@ -6356,6 +6877,24 @@ "node": "*" } }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/rollup": { "version": "4.44.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz", @@ -6498,6 +7037,29 @@ "semver": "bin/semver" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -6743,6 +7305,13 @@ "source-map": "^0.6.0" } }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause", + "optional": true + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -6928,6 +7497,18 @@ "node": ">=0.10.0" } }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -7352,6 +7933,19 @@ "node": "*" } }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -7419,6 +8013,15 @@ "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "license": "MIT" }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -8138,6 +8741,149 @@ "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true }, + "@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^3.0.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" + }, + "cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==" + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, "@emnapi/runtime": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", @@ -8839,6 +9585,17 @@ "defer-to-connect": "^2.0.1" } }, + "@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "@types/chai": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", @@ -8907,8 +9664,7 @@ "@types/http-cache-semantics": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" }, "@types/json-schema": { "version": "7.0.15", @@ -8916,6 +9672,14 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "requires": { + "@types/node": "*" + } + }, "@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -8930,6 +9694,14 @@ "undici-types": "~7.8.0" } }, + "@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "requires": { + "@types/node": "*" + } + }, "@types/showdown": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.6.tgz", @@ -8990,6 +9762,15 @@ } } }, + "@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@vitest/expect": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", @@ -9615,6 +10396,12 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, + "boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "optional": true + }, "brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -10195,8 +10982,7 @@ "defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, "define-data-property": { "version": "1.1.4", @@ -10208,6 +10994,17 @@ "gopd": "^1.0.1" } }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "optional": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -10218,6 +11015,12 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==" }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "optional": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -10276,6 +11079,31 @@ "sigmund": "^1.0.1" } }, + "electron": { + "version": "37.2.6", + "resolved": "https://registry.npmjs.org/electron/-/electron-37.2.6.tgz", + "integrity": "sha512-Ns6xyxE+hIK5UlujtRlw7w4e2Ju/ImCWXf1Q/PoOhc0N3/6SN6YW7+ujCarsHbxWnolbW+1RlkHtdklUJpjbPA==", + "requires": { + "@electron/get": "^2.0.0", + "@types/node": "^22.7.7", + "extract-zip": "^2.0.1" + }, + "dependencies": { + "@types/node": { + "version": "22.17.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.1.tgz", + "integrity": "sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==", + "requires": { + "undici-types": "~6.21.0" + } + }, + "undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + } + } + }, "electron-to-chromium": { "version": "1.5.199", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.199.tgz", @@ -10305,6 +11133,11 @@ "tapable": "^2.2.0" } }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, "envinfo": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", @@ -10335,6 +11168,12 @@ "es-errors": "^1.3.0" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "optional": true + }, "esbuild": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", @@ -10455,6 +11294,27 @@ "sort-keys-length": "^1.0.0" } }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -10647,6 +11507,16 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -10744,6 +11614,38 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "optional": true, + "requires": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "dependencies": { + "semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "optional": true + } + } + }, + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "optional": true, + "requires": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -11145,6 +12047,20 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "optional": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", @@ -11286,6 +12202,12 @@ "yallist": "^2.1.2" } }, + "lucide-react": { + "version": "0.539.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.539.0.tgz", + "integrity": "sha512-VVISr+VF2krO91FeuCrm1rSOLACQUYVy7NQkzrOty52Y8TlTPcXcMdQFj9bYzBgXbWCiywlwSZ3Z8u6a+6bMlg==", + "requires": {} + }, "magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", @@ -11304,6 +12226,23 @@ "semver": "^5.6.0" } }, + "matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "optional": true, + "requires": { + "escape-string-regexp": "^4.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "optional": true + } + } + }, "math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -11643,6 +12582,12 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "optional": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -11889,6 +12834,11 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -11931,8 +12881,7 @@ "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, "randombytes": { "version": "2.1.0", @@ -11943,6 +12892,12 @@ "safe-buffer": "^5.1.0" } }, + "react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "peer": true + }, "readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -12033,8 +12988,7 @@ "resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, "resolve-cwd": { "version": "3.0.0", @@ -12127,6 +13081,20 @@ } } }, + "roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "optional": true, + "requires": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + } + }, "rollup": { "version": "4.44.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz", @@ -12207,6 +13175,21 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "optional": true + }, + "serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "optional": true, + "requires": { + "type-fest": "^0.13.1" + } + }, "serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -12377,6 +13360,12 @@ "source-map": "^0.6.0" } }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "optional": true + }, "stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -12505,6 +13494,14 @@ "escape-string-regexp": "^1.0.2" } }, + "sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "requires": { + "debug": "^4.1.0" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -12788,6 +13785,12 @@ "safe-buffer": "^5.0.1" } }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "optional": true + }, "typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -12828,6 +13831,11 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==" }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", diff --git a/packages/media/package.json b/packages/media/package.json index cb5df8e2..4091b89b 100644 --- a/packages/media/package.json +++ b/packages/media/package.json @@ -22,10 +22,12 @@ "@types/node": "^24.0.10", "bluebird": "^3.7.2", "download": "^8.0.0", + "electron": "^37.2.6", "fast-glob": "^3.3.2", "fluent-ffmpeg": "^2.1.3", "glob": "^11.0.0", "js-beautify": "^1.14.6", + "lucide-react": "^0.539.0", "mupdf": "^1.3.3", "novita-sdk": "^1.0.37", "p-map": "^7.0.3", diff --git a/packages/media/schema_ui_background_remove.json b/packages/media/schema_ui_background_remove.json new file mode 100644 index 00000000..9a6eba9e --- /dev/null +++ b/packages/media/schema_ui_background_remove.json @@ -0,0 +1,72 @@ +{ + "ui:submitButtonOptions": { + "props": { + "disabled": false, + "className": "btn btn-info" + }, + "norender": false, + "submitText": "Submit" + }, + "src": { + "ui:description": "FILE|FOLDER|GLOB - Source file(s) to remove background from", + "ui:title": "Src" + }, + "dst": { + "ui:description": "FILE|FOLDER|GLOB - Destination for processed files", + "ui:title": "Dst" + }, + "debug": { + "ui:description": "Enable internal debug messages", + "ui:title": "Debug", + "ui:placeholder": false + }, + "alt": { + "ui:description": "Use alternate tokenizer, & instead of $", + "ui:title": "Alt", + "ui:placeholder": false + }, + "dry": { + "ui:description": "Run without conversion", + "ui:title": "Dry", + "ui:placeholder": false + }, + "verbose": { + "ui:description": "Show internal messages", + "ui:title": "Verbose", + "ui:placeholder": false + }, + "logLevel": { + "ui:description": "Log level: warn, info, debug, error", + "ui:title": "Loglevel", + "ui:placeholder": "info" + }, + "apiKey": { + "ui:description": "Replicate API key (or set REPLICATE_API_TOKEN env var)", + "ui:title": "Apikey" + }, + "model": { + "ui:description": "Background removal model to use", + "ui:title": "Model", + "ui:placeholder": "lucataco/remove-bg:95fcc2a26d3899cd6c2691c900465aaeff466285a65c14638cc5f36f34befaf1" + }, + "alpha_matting": { + "ui:description": "Enable alpha matting for better edge refinement", + "ui:title": "Alpha_matting", + "ui:placeholder": false + }, + "alpha_matting_foreground_threshold": { + "ui:description": "Alpha matting foreground threshold", + "ui:title": "Alpha_matting_foreground_threshold", + "ui:placeholder": 270 + }, + "alpha_matting_background_threshold": { + "ui:description": "Alpha matting background threshold", + "ui:title": "Alpha_matting_background_threshold", + "ui:placeholder": 10 + }, + "alpha_matting_erode_size": { + "ui:description": "Alpha matting erode size", + "ui:title": "Alpha_matting_erode_size", + "ui:placeholder": 10 + } +} \ No newline at end of file diff --git a/packages/media/schema_ui_background_remove_bria.json b/packages/media/schema_ui_background_remove_bria.json new file mode 100644 index 00000000..1bd6f8ec --- /dev/null +++ b/packages/media/schema_ui_background_remove_bria.json @@ -0,0 +1,72 @@ +{ + "ui:submitButtonOptions": { + "props": { + "disabled": false, + "className": "btn btn-info" + }, + "norender": false, + "submitText": "Submit" + }, + "src": { + "ui:description": "FILE|FOLDER|GLOB - Source file(s) to remove background from", + "ui:title": "Src" + }, + "dst": { + "ui:description": "FILE|FOLDER|GLOB - Destination for processed files", + "ui:title": "Dst" + }, + "debug": { + "ui:description": "Enable internal debug messages", + "ui:title": "Debug", + "ui:placeholder": false + }, + "alt": { + "ui:description": "Use alternate tokenizer, & instead of $", + "ui:title": "Alt", + "ui:placeholder": false + }, + "dry": { + "ui:description": "Run without conversion", + "ui:title": "Dry", + "ui:placeholder": false + }, + "verbose": { + "ui:description": "Show internal messages", + "ui:title": "Verbose", + "ui:placeholder": false + }, + "logLevel": { + "ui:description": "Log level: warn, info, debug, error", + "ui:title": "Loglevel", + "ui:placeholder": "info" + }, + "cache": { + "ui:description": "Skip processing if target file already exists", + "ui:title": "Cache", + "ui:placeholder": true + }, + "apiKey": { + "ui:description": "Bria API key (or set in config.bria.key)", + "ui:title": "Apikey" + }, + "sync": { + "ui:description": "Use synchronous processing (recommended)", + "ui:title": "Sync", + "ui:placeholder": true + }, + "contentModeration": { + "ui:description": "Enable content moderation", + "ui:title": "Contentmoderation", + "ui:placeholder": false + }, + "preserveAlpha": { + "ui:description": "Preserve alpha channel from input image", + "ui:title": "Preservealpha", + "ui:placeholder": true + }, + "jpg": { + "ui:description": "Convert PNG output to JPG format and delete PNG", + "ui:title": "Jpg", + "ui:placeholder": false + } +} \ No newline at end of file diff --git a/packages/media/schema_ui_crop_foreground.json b/packages/media/schema_ui_crop_foreground.json new file mode 100644 index 00000000..557d6e4a --- /dev/null +++ b/packages/media/schema_ui_crop_foreground.json @@ -0,0 +1,62 @@ +{ + "ui:submitButtonOptions": { + "props": { + "disabled": false, + "className": "btn btn-info" + }, + "norender": false, + "submitText": "Submit" + }, + "src": { + "ui:description": "FILE|FOLDER|GLOB - Source file(s) to crop foreground from", + "ui:title": "Src" + }, + "dst": { + "ui:description": "FILE|FOLDER|GLOB - Destination for processed files", + "ui:title": "Dst" + }, + "debug": { + "ui:description": "Enable internal debug messages", + "ui:title": "Debug", + "ui:placeholder": false + }, + "alt": { + "ui:description": "Use alternate tokenizer, & instead of $", + "ui:title": "Alt", + "ui:placeholder": false + }, + "dry": { + "ui:description": "Run without conversion", + "ui:title": "Dry", + "ui:placeholder": false + }, + "verbose": { + "ui:description": "Show internal messages", + "ui:title": "Verbose", + "ui:placeholder": false + }, + "logLevel": { + "ui:description": "Log level: warn, info, debug, error", + "ui:title": "Loglevel", + "ui:placeholder": "info" + }, + "apiKey": { + "ui:description": "Bria API key (or set in config.bria.key)", + "ui:title": "Apikey" + }, + "sync": { + "ui:description": "Use synchronous processing (recommended)", + "ui:title": "Sync", + "ui:placeholder": true + }, + "contentModeration": { + "ui:description": "Enable content moderation", + "ui:title": "Contentmoderation", + "ui:placeholder": false + }, + "preserveAlpha": { + "ui:description": "Preserve alpha channel from input image", + "ui:title": "Preservealpha", + "ui:placeholder": true + } +} \ No newline at end of file diff --git a/packages/media/schema_ui_pdf2jpg.json b/packages/media/schema_ui_pdf2jpg.json new file mode 100644 index 00000000..70af7a94 --- /dev/null +++ b/packages/media/schema_ui_pdf2jpg.json @@ -0,0 +1,41 @@ +{ + "ui:submitButtonOptions": { + "props": { + "disabled": false, + "className": "btn btn-info" + }, + "norender": false, + "submitText": "Submit" + }, + "input": { + "ui:description": "Path to the input PDF file", + "ui:title": "Input" + }, + "output": { + "ui:description": "Output path template (e.g., output/page_{PAGE}.png)", + "ui:title": "Output" + }, + "dpi": { + "ui:description": "Resolution for the output images", + "ui:title": "Dpi", + "ui:placeholder": 300 + }, + "scale": { + "ui:description": "Scaling factor to apply before rendering (e.g., 2 for 2x size)", + "ui:title": "Scale", + "ui:placeholder": 2 + }, + "format": { + "ui:description": "Output image format", + "ui:title": "Format", + "ui:placeholder": "jpg" + }, + "startPage": { + "ui:description": "First page to convert (1-based index)", + "ui:title": "Startpage" + }, + "endPage": { + "ui:description": "Last page to convert (1-based index)", + "ui:title": "Endpage" + } +} \ No newline at end of file diff --git a/packages/media/schema_ui_resize.json b/packages/media/schema_ui_resize.json new file mode 100644 index 00000000..7148fc45 --- /dev/null +++ b/packages/media/schema_ui_resize.json @@ -0,0 +1,108 @@ +{ + "ui:submitButtonOptions": { + "props": { + "disabled": false, + "className": "btn btn-info" + }, + "norender": false, + "submitText": "Submit" + }, + "src": { + "ui:description": "FILE|FOLDER|GLOB - Source file(s) to resize", + "ui:title": "Src" + }, + "dst": { + "ui:description": "FILE|FOLDER|GLOB - Destination for resized files", + "ui:title": "Dst" + }, + "debug": { + "ui:description": "Enable internal debug messages", + "ui:title": "Debug", + "ui:placeholder": false + }, + "alt": { + "ui:description": "Use alternate tokenizer, & instead of $", + "ui:title": "Alt", + "ui:placeholder": false + }, + "dry": { + "ui:description": "Run without conversion", + "ui:title": "Dry", + "ui:placeholder": false + }, + "verbose": { + "ui:description": "Show internal messages", + "ui:title": "Verbose", + "ui:placeholder": false + }, + "width": { + "ui:description": "Resize image width", + "ui:title": "Width" + }, + "height": { + "ui:description": "Resize image height", + "ui:title": "Height" + }, + "minHeight": { + "ui:description": "Resize image minimum height", + "ui:title": "Minheight" + }, + "minWidth": { + "ui:description": "Resize image minimum width", + "ui:title": "Minwidth" + }, + "minSize": { + "ui:description": "Resize image size (bytes)", + "ui:title": "Minsize" + }, + "percent": { + "ui:description": "Resize image in percent (width)", + "ui:title": "Percent" + }, + "square": { + "ui:description": "Fit image within width for 1:1 aspect ratio without cropping", + "ui:title": "Square", + "ui:placeholder": false + }, + "fillColor": { + "ui:description": "Fill color for square backgrounds (default: white)", + "ui:title": "Fillcolor", + "ui:placeholder": "white" + }, + "logLevel": { + "ui:description": "Log level: warn, info, debug, error", + "ui:title": "Loglevel", + "ui:placeholder": "info" + }, + "fit": { + "ui:description": "How the image should be resized to fit both provided dimensions", + "ui:title": "Fit" + }, + "position": { + "ui:description": "Position, gravity or strategy to use when fit is cover or contain", + "ui:title": "Position" + }, + "background": { + "ui:description": "Background color when using a fit of contain", + "ui:title": "Background" + }, + "kernel": { + "ui:description": "The kernel to use for image reduction", + "ui:title": "Kernel" + }, + "withoutEnlargement": { + "ui:description": "Do not enlarge if the width or height are already less than the specified dimensions", + "ui:title": "Withoutenlargement", + "ui:placeholder": false + }, + "withoutReduction": { + "ui:description": "Do not reduce if the width or height are already greater than the specified dimensions", + "ui:title": "Withoutreduction", + "ui:placeholder": false + }, + "fastShrinkOnLoad": { + "ui:description": "Take greater advantage of the JPEG and WebP shrink-on-load feature", + "ui:title": "Fastshrinkonload", + "ui:placeholder": true + } +} \ No newline at end of file diff --git a/packages/media/schema_ui_watermark.json b/packages/media/schema_ui_watermark.json new file mode 100644 index 00000000..d284253e --- /dev/null +++ b/packages/media/schema_ui_watermark.json @@ -0,0 +1,97 @@ +{ + "ui:submitButtonOptions": { + "props": { + "disabled": false, + "className": "btn btn-info" + }, + "norender": false, + "submitText": "Submit" + }, + "src": { + "ui:description": "FILE|FOLDER|GLOB - Source file(s) to add watermark to", + "ui:title": "Src" + }, + "dst": { + "ui:description": "FILE|FOLDER|GLOB - Destination for watermarked files", + "ui:title": "Dst" + }, + "debug": { + "ui:description": "Enable internal debug messages", + "ui:title": "Debug", + "ui:placeholder": false + }, + "alt": { + "ui:description": "Use alternate tokenizer, & instead of $", + "ui:title": "Alt", + "ui:placeholder": false + }, + "dry": { + "ui:description": "Run without conversion", + "ui:title": "Dry", + "ui:placeholder": false + }, + "verbose": { + "ui:description": "Show internal messages", + "ui:title": "Verbose", + "ui:placeholder": false + }, + "logLevel": { + "ui:description": "Log level: warn, info, debug, error", + "ui:title": "Loglevel", + "ui:placeholder": "info" + }, + "cache": { + "ui:description": "Skip processing if target file already exists", + "ui:title": "Cache", + "ui:placeholder": true + }, + "watermark": { + "ui:description": "Watermark content: text string or path to image file (PNG, JPG, SVG)", + "ui:title": "Watermark" + }, + "position": { + "ui:description": "Position of watermark", + "ui:title": "Position", + "ui:placeholder": "bottom-right" + }, + "margin": { + "ui:description": "Margin from edges in pixels", + "ui:title": "Margin", + "ui:placeholder": 24 + }, + "opacity": { + "ui:description": "Opacity of watermark (0-1)", + "ui:title": "Opacity", + "ui:placeholder": 0.85 + }, + "sizePct": { + "ui:description": "Size of image watermark as percentage of base image width (0-1)", + "ui:title": "Sizepct", + "ui:placeholder": 0.2 + }, + "fontSize": { + "ui:description": "Font size for text watermark in pixels", + "ui:title": "Fontsize", + "ui:placeholder": 48 + }, + "color": { + "ui:description": "Text color (hex format, e.g., #ffffff)", + "ui:title": "Color", + "ui:placeholder": "#ffffff" + }, + "fontFamily": { + "ui:description": "Font family for text watermark", + "ui:title": "Fontfamily", + "ui:placeholder": "Arial" + }, + "strokeColor": { + "ui:description": "Text stroke color (hex format, e.g., #000000)", + "ui:title": "Strokecolor", + "ui:placeholder": "#000000" + }, + "strokeWidth": { + "ui:description": "Text stroke width in pixels", + "ui:title": "Strokewidth", + "ui:placeholder": 2 + } +} \ No newline at end of file diff --git a/packages/media/schemas_background_remove.json b/packages/media/schemas_background_remove.json new file mode 100644 index 00000000..b630f18d --- /dev/null +++ b/packages/media/schemas_background_remove.json @@ -0,0 +1,93 @@ +[ + { + "$ref": "#/definitions/background-remove", + "definitions": { + "background-remove": { + "type": "object", + "properties": { + "src": { + "type": "string", + "minLength": 1, + "description": "FILE|FOLDER|GLOB - Source file(s) to remove background from" + }, + "dst": { + "type": "string", + "description": "FILE|FOLDER|GLOB - Destination for processed files" + }, + "debug": { + "type": "boolean", + "default": false, + "description": "Enable internal debug messages" + }, + "alt": { + "type": "boolean", + "default": false, + "description": "Use alternate tokenizer, & instead of $" + }, + "dry": { + "type": "boolean", + "default": false, + "description": "Run without conversion" + }, + "verbose": { + "type": "boolean", + "default": false, + "description": "Show internal messages" + }, + "logLevel": { + "type": "string", + "enum": [ + "warn", + "info", + "debug", + "error" + ], + "default": "info", + "description": "Log level: warn, info, debug, error" + }, + "apiKey": { + "type": "string", + "description": "Replicate API key (or set REPLICATE_API_TOKEN env var)" + }, + "model": { + "type": "string", + "default": "lucataco/remove-bg:95fcc2a26d3899cd6c2691c900465aaeff466285a65c14638cc5f36f34befaf1", + "description": "Background removal model to use" + }, + "alpha_matting": { + "type": "boolean", + "default": false, + "description": "Enable alpha matting for better edge refinement" + }, + "alpha_matting_foreground_threshold": { + "type": "integer", + "minimum": 0, + "maximum": 500, + "default": 270, + "description": "Alpha matting foreground threshold" + }, + "alpha_matting_background_threshold": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "default": 10, + "description": "Alpha matting background threshold" + }, + "alpha_matting_erode_size": { + "type": "integer", + "minimum": 0, + "maximum": 50, + "default": 10, + "description": "Alpha matting erode size" + } + }, + "required": [ + "src" + ], + "additionalProperties": true, + "description": "IBackgroundRemoveOptions" + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" + } +] \ No newline at end of file diff --git a/packages/media/schemas_background_remove_bria.json b/packages/media/schemas_background_remove_bria.json new file mode 100644 index 00000000..2646b593 --- /dev/null +++ b/packages/media/schemas_background_remove_bria.json @@ -0,0 +1,87 @@ +[ + { + "$ref": "#/definitions/background-remove-bria", + "definitions": { + "background-remove-bria": { + "type": "object", + "properties": { + "src": { + "type": "string", + "minLength": 1, + "description": "FILE|FOLDER|GLOB - Source file(s) to remove background from" + }, + "dst": { + "type": "string", + "description": "FILE|FOLDER|GLOB - Destination for processed files" + }, + "debug": { + "type": "boolean", + "default": false, + "description": "Enable internal debug messages" + }, + "alt": { + "type": "boolean", + "default": false, + "description": "Use alternate tokenizer, & instead of $" + }, + "dry": { + "type": "boolean", + "default": false, + "description": "Run without conversion" + }, + "verbose": { + "type": "boolean", + "default": false, + "description": "Show internal messages" + }, + "logLevel": { + "type": "string", + "enum": [ + "warn", + "info", + "debug", + "error" + ], + "default": "info", + "description": "Log level: warn, info, debug, error" + }, + "cache": { + "type": "boolean", + "default": true, + "description": "Skip processing if target file already exists" + }, + "apiKey": { + "type": "string", + "description": "Bria API key (or set in config.bria.key)" + }, + "sync": { + "type": "boolean", + "default": true, + "description": "Use synchronous processing (recommended)" + }, + "contentModeration": { + "type": "boolean", + "default": false, + "description": "Enable content moderation" + }, + "preserveAlpha": { + "type": "boolean", + "default": true, + "description": "Preserve alpha channel from input image" + }, + "jpg": { + "type": "boolean", + "default": false, + "description": "Convert PNG output to JPG format and delete PNG" + } + }, + "required": [ + "src" + ], + "additionalProperties": true, + "description": "IBriaBackgroundRemoveOptions" + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" + } +] \ No newline at end of file diff --git a/packages/media/schemas_crop_foreground.json b/packages/media/schemas_crop_foreground.json new file mode 100644 index 00000000..f5558b9b --- /dev/null +++ b/packages/media/schemas_crop_foreground.json @@ -0,0 +1,77 @@ +[ + { + "$ref": "#/definitions/crop-foreground", + "definitions": { + "crop-foreground": { + "type": "object", + "properties": { + "src": { + "type": "string", + "minLength": 1, + "description": "FILE|FOLDER|GLOB - Source file(s) to crop foreground from" + }, + "dst": { + "type": "string", + "description": "FILE|FOLDER|GLOB - Destination for processed files" + }, + "debug": { + "type": "boolean", + "default": false, + "description": "Enable internal debug messages" + }, + "alt": { + "type": "boolean", + "default": false, + "description": "Use alternate tokenizer, & instead of $" + }, + "dry": { + "type": "boolean", + "default": false, + "description": "Run without conversion" + }, + "verbose": { + "type": "boolean", + "default": false, + "description": "Show internal messages" + }, + "logLevel": { + "type": "string", + "enum": [ + "warn", + "info", + "debug", + "error" + ], + "default": "info", + "description": "Log level: warn, info, debug, error" + }, + "apiKey": { + "type": "string", + "description": "Bria API key (or set in config.bria.key)" + }, + "sync": { + "type": "boolean", + "default": true, + "description": "Use synchronous processing (recommended)" + }, + "contentModeration": { + "type": "boolean", + "default": false, + "description": "Enable content moderation" + }, + "preserveAlpha": { + "type": "boolean", + "default": true, + "description": "Preserve alpha channel from input image" + } + }, + "required": [ + "src" + ], + "additionalProperties": true, + "description": "ICropForegroundOptions" + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" + } +] \ No newline at end of file diff --git a/packages/media/schemas_pdf2jpg.json b/packages/media/schemas_pdf2jpg.json new file mode 100644 index 00000000..4e1ed20e --- /dev/null +++ b/packages/media/schemas_pdf2jpg.json @@ -0,0 +1,58 @@ +[ + { + "$ref": "#/definitions/pdf2jpg", + "definitions": { + "pdf2jpg": { + "type": "object", + "properties": { + "input": { + "type": "string", + "minLength": 1, + "description": "Path to the input PDF file" + }, + "output": { + "type": "string", + "description": "Output path template (e.g., output/page_{PAGE}.png)" + }, + "dpi": { + "type": "integer", + "exclusiveMinimum": 0, + "default": 300, + "description": "Resolution for the output images" + }, + "scale": { + "type": "number", + "exclusiveMinimum": 0, + "default": 2, + "description": "Scaling factor to apply before rendering (e.g., 2 for 2x size)" + }, + "format": { + "type": "string", + "enum": [ + "png", + "jpg" + ], + "default": "jpg", + "description": "Output image format" + }, + "startPage": { + "type": "integer", + "exclusiveMinimum": 0, + "description": "First page to convert (1-based index)" + }, + "endPage": { + "type": "integer", + "exclusiveMinimum": 0, + "description": "Last page to convert (1-based index)" + } + }, + "required": [ + "input" + ], + "additionalProperties": true, + "description": "IPdf2JpgOptions" + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" + } +] \ No newline at end of file diff --git a/packages/media/schemas_resize.json b/packages/media/schemas_resize.json new file mode 100644 index 00000000..64ea519b --- /dev/null +++ b/packages/media/schemas_resize.json @@ -0,0 +1,182 @@ +[ + { + "$ref": "#/definitions/resize", + "definitions": { + "resize": { + "type": "object", + "properties": { + "src": { + "type": "string", + "minLength": 1, + "description": "FILE|FOLDER|GLOB - Source file(s) to resize" + }, + "dst": { + "type": "string", + "description": "FILE|FOLDER|GLOB - Destination for resized files" + }, + "debug": { + "type": "boolean", + "default": false, + "description": "Enable internal debug messages" + }, + "alt": { + "type": "boolean", + "default": false, + "description": "Use alternate tokenizer, & instead of $" + }, + "dry": { + "type": "boolean", + "default": false, + "description": "Run without conversion" + }, + "verbose": { + "type": "boolean", + "default": false, + "description": "Show internal messages" + }, + "width": { + "type": "number", + "exclusiveMinimum": 0, + "description": "Resize image width" + }, + "height": { + "type": "number", + "exclusiveMinimum": 0, + "description": "Resize image height" + }, + "minHeight": { + "type": "number", + "exclusiveMinimum": 0, + "description": "Resize image minimum height" + }, + "minWidth": { + "type": "number", + "exclusiveMinimum": 0, + "description": "Resize image minimum width" + }, + "minSize": { + "type": "number", + "exclusiveMinimum": 0, + "description": "Resize image size (bytes)" + }, + "percent": { + "type": "number", + "exclusiveMinimum": 0, + "maximum": 1000, + "description": "Resize image in percent (width)" + }, + "square": { + "type": "boolean", + "default": false, + "description": "Fit image within width for 1:1 aspect ratio without cropping" + }, + "fillColor": { + "type": "string", + "default": "white", + "description": "Fill color for square backgrounds (default: white)" + }, + "logLevel": { + "type": "string", + "enum": [ + "warn", + "info", + "debug", + "error" + ], + "default": "info", + "description": "Log level: warn, info, debug, error" + }, + "fit": { + "type": "string", + "enum": [ + "cover", + "contain", + "fill", + "inside", + "outside" + ], + "description": "How the image should be resized to fit both provided dimensions" + }, + "position": { + "type": [ + "number", + "string" + ], + "description": "Position, gravity or strategy to use when fit is cover or contain" + }, + "background": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "r": { + "type": "number", + "minimum": 0, + "maximum": 255 + }, + "g": { + "type": "number", + "minimum": 0, + "maximum": 255 + }, + "b": { + "type": "number", + "minimum": 0, + "maximum": 255 + }, + "alpha": { + "type": "number", + "minimum": 0, + "maximum": 1 + } + }, + "required": [ + "r", + "g", + "b" + ], + "additionalProperties": false + } + ], + "description": "Background color when using a fit of contain" + }, + "kernel": { + "type": "string", + "enum": [ + "nearest", + "cubic", + "mitchell", + "lanczos2", + "lanczos3" + ], + "description": "The kernel to use for image reduction" + }, + "withoutEnlargement": { + "type": "boolean", + "default": false, + "description": "Do not enlarge if the width or height are already less than the specified dimensions" + }, + "withoutReduction": { + "type": "boolean", + "default": false, + "description": "Do not reduce if the width or height are already greater than the specified dimensions" + }, + "fastShrinkOnLoad": { + "type": "boolean", + "default": true, + "description": "Take greater advantage of the JPEG and WebP shrink-on-load feature" + } + }, + "required": [ + "src" + ], + "additionalProperties": true, + "description": "IResizeOptions" + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" + } +] \ No newline at end of file diff --git a/packages/media/schemas_watermark.json b/packages/media/schemas_watermark.json new file mode 100644 index 00000000..2c3a94a5 --- /dev/null +++ b/packages/media/schemas_watermark.json @@ -0,0 +1,130 @@ +[ + { + "$ref": "#/definitions/watermark", + "definitions": { + "watermark": { + "type": "object", + "properties": { + "src": { + "type": "string", + "minLength": 1, + "description": "FILE|FOLDER|GLOB - Source file(s) to add watermark to" + }, + "dst": { + "type": "string", + "description": "FILE|FOLDER|GLOB - Destination for watermarked files" + }, + "debug": { + "type": "boolean", + "default": false, + "description": "Enable internal debug messages" + }, + "alt": { + "type": "boolean", + "default": false, + "description": "Use alternate tokenizer, & instead of $" + }, + "dry": { + "type": "boolean", + "default": false, + "description": "Run without conversion" + }, + "verbose": { + "type": "boolean", + "default": false, + "description": "Show internal messages" + }, + "logLevel": { + "type": "string", + "enum": [ + "warn", + "info", + "debug", + "error" + ], + "default": "info", + "description": "Log level: warn, info, debug, error" + }, + "cache": { + "type": "boolean", + "default": true, + "description": "Skip processing if target file already exists" + }, + "watermark": { + "type": "string", + "minLength": 1, + "description": "Watermark content: text string or path to image file (PNG, JPG, SVG)" + }, + "position": { + "type": "string", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right", + "center" + ], + "default": "bottom-right", + "description": "Position of watermark" + }, + "margin": { + "type": "integer", + "minimum": 0, + "default": 24, + "description": "Margin from edges in pixels" + }, + "opacity": { + "type": "number", + "minimum": 0, + "maximum": 1, + "default": 0.85, + "description": "Opacity of watermark (0-1)" + }, + "sizePct": { + "type": "number", + "minimum": 0, + "maximum": 1, + "default": 0.2, + "description": "Size of image watermark as percentage of base image width (0-1)" + }, + "fontSize": { + "type": "integer", + "exclusiveMinimum": 0, + "default": 48, + "description": "Font size for text watermark in pixels" + }, + "color": { + "type": "string", + "pattern": "^#[0-9a-fA-F]{6}$", + "default": "#ffffff", + "description": "Text color (hex format, e.g., #ffffff)" + }, + "fontFamily": { + "type": "string", + "default": "Arial", + "description": "Font family for text watermark" + }, + "strokeColor": { + "type": "string", + "pattern": "^#[0-9a-fA-F]{6}$", + "default": "#000000", + "description": "Text stroke color (hex format, e.g., #000000)" + }, + "strokeWidth": { + "type": "integer", + "minimum": 0, + "default": 2, + "description": "Text stroke width in pixels" + } + }, + "required": [ + "src", + "watermark" + ], + "additionalProperties": true, + "description": "IWatermarkOptions" + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" + } +] \ No newline at end of file diff --git a/packages/media/src/commands/background-remove-bria.ts b/packages/media/src/commands/background-remove-bria.ts index d3c39f9c..da939f8a 100644 --- a/packages/media/src/commands/background-remove-bria.ts +++ b/packages/media/src/commands/background-remove-bria.ts @@ -6,61 +6,24 @@ import { sanitize, defaults } from '../_cli.js' +import { toYargs } from '@polymech/commons' import { briaBackgroundRemove, - BriaBackgroundRemoveOptions + BriaBackgroundRemoveOptions, + BriaBackgroundRemoveOptionsSchema } from '../lib/media/images/background-remove-bria.js' export const defaultOptions = (yargs: CLI.Argv) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }).option('cache', { - default: true, - describe: 'Skip processing if target file already exists', - type: 'boolean' - }).option('apiKey', { - describe: 'Bria API key (or set in config.bria.key)', - type: 'string' - }).option('sync', { - describe: 'Use synchronous processing (recommended)', - type: 'boolean', - default: true - }).option('contentModeration', { - describe: 'Enable content moderation', - type: 'boolean', - default: false - }).option('preserveAlpha', { - describe: 'Preserve alpha channel from input image', - type: 'boolean', - default: true - }).option('jpg', { - describe: 'Convert PNG output to JPG format and delete PNG', - type: 'boolean', - default: false + return toYargs(yargs, BriaBackgroundRemoveOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, {...options, demandOption: true}) + default: + return yargs.option(key, options) + } + }) }) } @@ -70,7 +33,7 @@ export const builder = defaultOptions; export async function handler(argv: CLI.Arguments) { defaults() - const options = sanitize(argv) as BriaBackgroundRemoveOptions + const options = BriaBackgroundRemoveOptionsSchema().parse(argv) as BriaBackgroundRemoveOptions logger.settings.minLevel = options.logLevel as any const config: any = CONFIG_DEFAULT() @@ -83,20 +46,17 @@ export async function handler(argv: CLI.Arguments) { process.exit(1); } - // Map CLI arguments to library options (using same names) - options.sync = argv.sync as boolean; - options.contentModeration = argv.contentModeration as boolean; - options.preserveAlpha = argv.preserveAlpha as boolean; - options.jpg = argv.jpg as boolean; + // The schema already parsed all the options correctly + const sanitizedOptions = sanitize(options) as BriaBackgroundRemoveOptions logger.info("Removing background with Bria AI options:", { - sync: options.sync, - contentModeration: options.contentModeration, - preserveAlpha: options.preserveAlpha, - files: options.srcInfo?.FILES?.length || 0 + sync: sanitizedOptions.sync, + contentModeration: sanitizedOptions.contentModeration, + preserveAlpha: sanitizedOptions.preserveAlpha, + files: sanitizedOptions.srcInfo?.FILES?.length || 0 }); - await briaBackgroundRemove(options); + await briaBackgroundRemove(sanitizedOptions); } cli.command(command, desc, builder, handler) diff --git a/packages/media/src/commands/background-remove.ts b/packages/media/src/commands/background-remove.ts index f28e0ef3..8168a6b3 100644 --- a/packages/media/src/commands/background-remove.ts +++ b/packages/media/src/commands/background-remove.ts @@ -6,63 +6,23 @@ import { sanitize, defaults } from '../_cli.js' - -import download from 'download' - +import { toYargs } from '@polymech/commons' import { backgroundRemove, - BackgroundRemoveOptions + BackgroundRemoveOptions, + BackgroundRemoveOptionsSchema } from '../lib/media/images/background-remove.js' export const defaultOptions = (yargs: CLI.Argv) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }).option('apiKey', { - describe: 'Replicate API key (or set REPLICATE_API_TOKEN env var)', - type: 'string' - }).option('model', { - describe: 'Background removal model to use', - default: 'lucataco/remove-bg:95fcc2a26d3899cd6c2691c900465aaeff466285a65c14638cc5f36f34befaf1', - type: 'string' - }).option('alpha_matting', { - describe: 'Enable alpha matting for better edge refinement', - type: 'boolean', - default: false - }).option('alpha_matting_foreground_threshold', { - describe: 'Alpha matting foreground threshold', - type: 'number', - default: 270 - }).option('alpha_matting_background_threshold', { - describe: 'Alpha matting background threshold', - type: 'number', - default: 10 - }).option('alpha_matting_erode_size', { - describe: 'Alpha matting erode size', - type: 'number', - default: 10 + return toYargs(yargs, BackgroundRemoveOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, {...options, demandOption: true}) + default: + return yargs.option(key, options) + } + }) }) } @@ -72,7 +32,7 @@ export const builder = defaultOptions; export async function handler(argv: CLI.Arguments) { defaults() - const options = sanitize(argv) as BackgroundRemoveOptions + const options = BackgroundRemoveOptionsSchema().parse(argv) as BackgroundRemoveOptions logger.settings.minLevel = options.logLevel as any const config: any = CONFIG_DEFAULT() @@ -85,20 +45,16 @@ export async function handler(argv: CLI.Arguments) { process.exit(1); } - // Map CLI arguments to library options (using same names) - options.model = argv.model as string; - options.alpha_matting = argv.alpha_matting as boolean; - options.alpha_matting_foreground_threshold = argv.alpha_matting_foreground_threshold as number; - options.alpha_matting_background_threshold = argv.alpha_matting_background_threshold as number; - options.alpha_matting_erode_size = argv.alpha_matting_erode_size as number; + // The schema already parsed all the options correctly + const sanitizedOptions = sanitize(options) as BackgroundRemoveOptions logger.info("Removing background with options:", { - model: options.model, - alpha_matting: options.alpha_matting, - files: options.srcInfo?.FILES?.length || 0 + model: sanitizedOptions.model, + alpha_matting: sanitizedOptions.alpha_matting, + files: sanitizedOptions.srcInfo?.FILES?.length || 0 }); - await backgroundRemove(options); + await backgroundRemove(sanitizedOptions); } cli.command(command, desc, builder, handler) diff --git a/packages/media/src/commands/crop-foreground.ts b/packages/media/src/commands/crop-foreground.ts index 24cd615d..9d0f30a5 100644 --- a/packages/media/src/commands/crop-foreground.ts +++ b/packages/media/src/commands/crop-foreground.ts @@ -6,53 +6,24 @@ import { sanitize, defaults } from '../_cli.js' +import { toYargs } from '@polymech/commons' import { cropForeground, - CropForegroundOptions + CropForegroundOptions, + CropForegroundOptionsSchema } from '../lib/media/images/crop-foreground.js' export const defaultOptions = (yargs: CLI.Argv) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }).option('apiKey', { - describe: 'Bria API key (or set in config.bria.key)', - type: 'string' - }).option('sync', { - describe: 'Use synchronous processing (recommended)', - type: 'boolean', - default: true - }).option('contentModeration', { - describe: 'Enable content moderation', - type: 'boolean', - default: false - }).option('preserveAlpha', { - describe: 'Preserve alpha channel from input image', - type: 'boolean', - default: true + return toYargs(yargs, CropForegroundOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, {...options, demandOption: true}) + default: + return yargs.option(key, options) + } + }) }) } @@ -62,7 +33,7 @@ export const builder = defaultOptions; export async function handler(argv: CLI.Arguments) { defaults() - const options = sanitize(argv) as CropForegroundOptions + const options = CropForegroundOptionsSchema().parse(argv) as CropForegroundOptions logger.settings.minLevel = options.logLevel as any const config: any = CONFIG_DEFAULT() @@ -75,19 +46,17 @@ export async function handler(argv: CLI.Arguments) { process.exit(1); } - // Map CLI arguments to library options - options.sync = argv.sync as boolean; - options.contentModeration = argv.contentModeration as boolean; - options.preserveAlpha = argv.preserveAlpha as boolean; + // The schema already parsed all the options correctly + const sanitizedOptions = sanitize(options) as CropForegroundOptions logger.info("Cropping foreground with Bria AI options:", { - sync: options.sync, - contentModeration: options.contentModeration, - preserveAlpha: options.preserveAlpha, - files: options.srcInfo?.FILES?.length || 0 + sync: sanitizedOptions.sync, + contentModeration: sanitizedOptions.contentModeration, + preserveAlpha: sanitizedOptions.preserveAlpha, + files: sanitizedOptions.srcInfo?.FILES?.length || 0 }); - await cropForeground(options); + await cropForeground(sanitizedOptions); } cli.command(command, desc, builder, handler) diff --git a/packages/media/src/commands/pdf2jpg.ts b/packages/media/src/commands/pdf2jpg.ts index 43a11daa..57b72bda 100644 --- a/packages/media/src/commands/pdf2jpg.ts +++ b/packages/media/src/commands/pdf2jpg.ts @@ -2,55 +2,39 @@ import * as CLI from 'yargs' import { logger } from '../index.js' import { existsSync } from 'node:fs'; import * as z from 'zod'; -import { runConversion } from '../lib/pdf/convert.js'; -import { ConvertCommandConfig, ConvertCommandSchema } from '../lib/pdf/types.js' +import { runConversion, Pdf2JpgOptionsSchema, Pdf2JpgConfig } from '../lib/pdf/convert.js'; +import { toYargs } from '@polymech/commons'; import { cli } from '../cli.js'; export const command = 'pdf2jpg'; export const desc = 'Convert PDF to images'; export const builder = (yargs: CLI.Argv) => { - return yargs - .option('input', { - alias: 'i', - describe: 'Path to the input PDF file', - demandOption: true, - type: 'string' - }) - .option('output', { - alias: 'o', - describe: 'Output path template (e.g., output/page_{PAGE}.png)', - type: 'string' - }) - .option('dpi', { - describe: 'Resolution for the output images', - default: 300, - type: 'number' - }) - .option('scale', { - describe: 'Scaling factor to apply before rendering (e.g., 2 for 2x size)', - default: 2, - type: 'number' - }) - .option('format', { - describe: 'Output image format', - choices: ['png', 'jpg'], - default: 'jpg', - type: 'string' - }) - .option('startPage', { - describe: 'First page to convert (1-based index)', - type: 'number' - }) - .option('endPage', { - describe: 'Last page to convert (1-based index)', - type: 'number' + return toYargs(yargs, Pdf2JpgOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'input': + return yargs.option(key, {...options, alias: 'i', demandOption: true}) + case 'output': + return yargs.option(key, {...options, alias: 'o'}) + default: + return yargs.option(key, options) + } }) + }) } export async function handler(argv: CLI.Arguments) { try { - const config = ConvertCommandSchema.parse(argv) as ConvertCommandConfig; + const config: Pdf2JpgConfig = Pdf2JpgOptionsSchema().parse(argv); + + // Validate startPage and endPage relationship + if (config.startPage !== undefined && config.endPage !== undefined) { + if (config.startPage > config.endPage) { + throw new Error('startPage must be less than or equal to endPage'); + } + } + if (!existsSync(config.input)) { throw new Error(`Input file ${config.input} does not exist`); } diff --git a/packages/media/src/commands/resize.ts b/packages/media/src/commands/resize.ts index 96594260..127127cd 100644 --- a/packages/media/src/commands/resize.ts +++ b/packages/media/src/commands/resize.ts @@ -1,87 +1,224 @@ -import * as CLI from 'yargs' -import { logger } from '../index.js' -import { - resize -} from '../lib/media/images/resize.js' -import { cli } from '../cli.js' -import { - sanitize, - defaults -} from '../_cli.js' - -import { - IOptions -} from '../types.js' - -export const defaultOptions = (yargs: CLI.Argv) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('percent', { - default: false, - describe: 'Resize image with percent', - type: 'number' - }).option('width', { - describe: 'Resize image with', - type: 'number' - }).option('height', { - describe: 'Resize image height', - type: 'number' - }).option('minHeight', { - describe: 'Resize image minimum height', - type: 'number' - }).option('minWidth', { - describe: 'Resize image minimum width', - type: 'number' - }).option('minSize', { - describe: 'Resize image size (bytes)', - type: 'number' - }).option('percent', { - describe: 'Resize image in percent (width)', - type: 'number' - }).option('square', { - default: false, - describe: 'Fit image within width for 1:1 aspect ratio without cropping', - type: 'boolean' - }).option('fillColor', { - describe: 'Fill color for square backgrounds (default: white)', - type: 'string', - default: 'white' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }) -} - -export const command = 'resize'; -export const desc = 'Resizes files'; -export const builder = defaultOptions; - -export async function handler(argv: CLI.Arguments) { - defaults() - const options = sanitize(argv) as IOptions - logger.settings.minLevel = options.logLevel as any - logger.info("options " + argv.dst, options) - await resize(options) -} - -cli.command(command, desc, builder, handler) +import * as CLI from 'yargs' +import { logger } from '../index.js' +import { + resize, + ResizeOptionsSchema +} from '../lib/media/images/resize.js' +import { cli } from '../cli.js' +import { + sanitize, + defaults +} from '../_cli.js' +import { toYargs } from '@polymech/commons' + +import { + IOptions, + IResizeOptions +} from '../types.js' + +export const defaultOptions = (yargs: CLI.Argv) => { + return toYargs(yargs, ResizeOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, {...options, demandOption: true}) + default: + return yargs.option(key, options) + } + }) + }).option('gui', { + boolean: true, + default: false, + describe: 'Launch interactive graphical user interface' + }) +} + +export const command = 'resize'; +export const desc = 'Resizes files'; +export const builder = defaultOptions; + +export async function handler(argv: CLI.Arguments) { + defaults() + const options = sanitize(argv) as IOptions & IResizeOptions + logger.settings.minLevel = options.logLevel as any + + // Check if GUI mode is requested + if (options.gui) { + const { renderSchemaUI } = await import('../lib/ui/electron.js') + const { ResizeOptionsSchema } = await import('../lib/media/images/resize.js') + + // Generate schema for UI + const schema = ResizeOptionsSchema() + + // Convert Zod schema to JSON Schema (enhanced) + const jsonSchema = { + type: 'object', + title: 'Resize Image Options', + properties: { + src: { + type: 'string', + title: 'Source Files', + description: 'Source file(s) or directory to resize (supports glob patterns)', + examples: ['image.jpg', '*.png', './photos/', 'images/**/*.jpg'] + }, + dst: { + type: 'string', + title: 'Destination', + description: 'Output directory or file pattern for resized images' + }, + width: { + type: 'integer', + title: 'Width (pixels)', + description: 'Target width in pixels', + minimum: 1, + maximum: 10000 + }, + height: { + type: 'integer', + title: 'Height (pixels)', + description: 'Target height in pixels', + minimum: 1, + maximum: 10000 + }, + percent: { + type: 'number', + title: 'Resize Percentage', + description: 'Resize by percentage (e.g., 50 for 50%)', + minimum: 1, + maximum: 1000 + }, + square: { + type: 'boolean', + title: 'Square Output', + description: 'Fit image within specified width to create 1:1 aspect ratio', + default: false + }, + fillColor: { + type: 'string', + title: 'Background Fill Color', + description: 'Color to use for background when creating square images', + default: 'white', + examples: ['white', 'black', 'transparent', '#FF0000'] + }, + fit: { + type: 'string', + title: 'Resize Fit Mode', + description: 'How the image should be resized to fit the dimensions', + enum: ['cover', 'contain', 'fill', 'inside', 'outside'], + default: 'cover' + }, + withoutEnlargement: { + type: 'boolean', + title: 'Prevent Enlargement', + description: 'Do not enlarge images that are smaller than target size', + default: false + }, + quality: { + type: 'integer', + title: 'Quality', + description: 'Output quality for JPEG images (1-100)', + minimum: 1, + maximum: 100, + default: 90 + } + }, + required: ['src'], + anyOf: [ + { + required: ['width'] + }, + { + required: ['height'] + }, + { + required: ['percent'] + } + ] + } + + const uiSchema = { + 'ui:order': ['src', 'dst', 'width', 'height', 'percent', 'fit', 'square', 'fillColor', 'withoutEnlargement', 'quality'], + src: { + 'ui:placeholder': 'e.g., *.jpg or ./photos/', + 'ui:help': 'Supports files, directories, and glob patterns', + 'ui:widget': 'textarea', + 'ui:options': { + rows: 2 + } + }, + dst: { + 'ui:placeholder': 'e.g., ./resized/ or output.jpg', + 'ui:help': 'Output directory or file pattern' + }, + width: { + 'ui:help': 'Leave empty to maintain aspect ratio' + }, + height: { + 'ui:help': 'Leave empty to maintain aspect ratio' + }, + percent: { + 'ui:help': 'Alternative to width/height - resize by percentage' + }, + fit: { + 'ui:help': 'How to fit image when both width and height are specified' + }, + fillColor: { + 'ui:help': 'Used when square mode creates padding', + 'ui:placeholder': 'white, black, transparent, #FF0000' + }, + square: { + 'ui:help': 'Creates square images by padding with fillColor' + }, + withoutEnlargement: { + 'ui:help': 'Prevents making small images larger' + }, + quality: { + 'ui:help': 'Only applies to JPEG output files' + } + } + + try { + // Extract CLI options that were provided + const cliOptions: any = {}; + if (options.src) cliOptions.src = options.src; + if (options.dst) cliOptions.dst = options.dst; + if (options.width) cliOptions.width = options.width; + if (options.height) cliOptions.height = options.height; + if (options.percent) cliOptions.percent = options.percent; + if (options.square !== undefined) cliOptions.square = options.square; + if (options.fillColor) cliOptions.fillColor = options.fillColor; + if (options.fit) cliOptions.fit = options.fit; + if (options.withoutEnlargement !== undefined) cliOptions.withoutEnlargement = options.withoutEnlargement; + + const result = await renderSchemaUI({ + schema: jsonSchema, + uiSchema, + title: 'Resize Images', + formData: { + fillColor: 'white', + square: false, + fit: 'cover', + withoutEnlargement: false, + quality: 90 + }, + cliOptions + }) + + if (result && result.data) { + // Merge UI result with CLI options + const uiOptions = { ...options, ...result.data } + await resize(uiOptions) + } else { + logger.info('Operation cancelled by user') + } + } catch (error) { + logger.error('GUI Error:', error) + logger.info('Falling back to CLI mode...') + await resize(options) + } + } else { + await resize(options) + } +} + +cli.command(command, desc, builder, handler) diff --git a/packages/media/src/commands/schemas.ts b/packages/media/src/commands/schemas.ts new file mode 100644 index 00000000..f24f7327 --- /dev/null +++ b/packages/media/src/commands/schemas.ts @@ -0,0 +1,60 @@ +import * as CLI from 'yargs' +import { cli } from '../cli.js' +import { schemas as resizeSchemas, types as resizeTypes } from '../lib/media/images/resize.js' +import { schemas as pdf2jpgSchemas, types as pdf2jpgTypes } from '../lib/pdf/convert.js' +import { schemas as watermarkSchemas, types as watermarkTypes } from '../lib/media/images/watermark.js' +import { schemas as backgroundRemoveSchemas, types as backgroundRemoveTypes } from '../lib/media/images/background-remove.js' +import { schemas as backgroundRemoveBriaSchemas, types as backgroundRemoveBriaTypes } from '../lib/media/images/background-remove-bria.js' +import { schemas as cropForegroundSchemas, types as cropForegroundTypes } from '../lib/media/images/crop-foreground.js' + +export const command = 'schemas' +export const desc = 'Generate schema files (schemas.json and schema_ui.json)' +export const builder = (yargs: CLI.Argv) => { + return yargs.option('types', { + describe: 'Also generate TypeScript types', + type: 'boolean', + default: false + }) +} + +export async function handler(argv: CLI.Arguments) { + console.log('Generating schemas...') + + // Generate resize schemas + resizeSchemas() + console.log('✓ Generated resize schemas') + + // Generate pdf2jpg schemas + pdf2jpgSchemas() + console.log('✓ Generated pdf2jpg schemas') + + // Generate watermark schemas + watermarkSchemas() + console.log('✓ Generated watermark schemas') + + // Generate background-remove schemas + backgroundRemoveSchemas() + console.log('✓ Generated background-remove schemas') + + // Generate background-remove-bria schemas + backgroundRemoveBriaSchemas() + console.log('✓ Generated background-remove-bria schemas') + + // Generate crop-foreground schemas + cropForegroundSchemas() + console.log('✓ Generated crop-foreground schemas') + + if (argv.types) { + resizeTypes() + pdf2jpgTypes() + watermarkTypes() + backgroundRemoveTypes() + backgroundRemoveBriaTypes() + cropForegroundTypes() + console.log('✓ Generated TypeScript types') + } + + console.log('Schema generation complete!') +} + +cli.command(command, desc, builder, handler) diff --git a/packages/media/src/commands/watermark.ts b/packages/media/src/commands/watermark.ts index 4f633239..fcce560e 100644 --- a/packages/media/src/commands/watermark.ts +++ b/packages/media/src/commands/watermark.ts @@ -5,97 +5,41 @@ import { sanitize, defaults } from '../_cli.js' +import { toYargs } from '@polymech/commons' import { watermark, - WatermarkOptions + WatermarkOptions, + WatermarkOptionsSchema } from '../lib/media/images/watermark.js' export const command = 'watermark'; export const desc = 'Adds watermarks to images'; export const defaultOptions = (yargs: CLI.Argv) => { - return yargs.option('src', { - describe: 'FILE|FOLDER|GLOB', - demandOption: true - }).option('dst', { - describe: 'FILE|FOLDER|GLOB' - }).option('debug', { - default: false, - describe: 'Enable internal debug messages', - type: 'boolean' - }).option('alt', { - default: false, - describe: 'Use alternate tokenizer, & instead of $', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Run without conversion', - type: 'boolean' - }).option('verbose', { - default: false, - describe: 'Show internal messages', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }).option('cache', { - default: true, - describe: 'Skip processing if target file already exists', - type: 'boolean' - }).option('watermark', { - describe: 'Watermark content: text string or path to image file (PNG, JPG, SVG)', - type: 'string', - demandOption: true - }).option('position', { - describe: 'Position of watermark', - choices: ['top-left', 'top-right', 'bottom-left', 'bottom-right', 'center'], - default: 'bottom-right' - }).option('margin', { - describe: 'Margin from edges in pixels', - type: 'number', - default: 24 - }).option('opacity', { - describe: 'Opacity of watermark (0-1)', - type: 'number', - default: 0.85 - }).option('sizePct', { - describe: 'Size of image watermark as percentage of base image width (0-1)', - type: 'number', - default: 0.2 - }).option('fontSize', { - describe: 'Font size for text watermark in pixels', - type: 'number', - default: 48 - }).option('color', { - describe: 'Text color (hex format, e.g., #ffffff)', - type: 'string', - default: '#ffffff' - }).option('fontFamily', { - describe: 'Font family for text watermark', - type: 'string', - default: 'Arial' - }).option('strokeColor', { - describe: 'Text stroke color (hex format, e.g., #000000)', - type: 'string', - default: '#000000' - }).option('strokeWidth', { - describe: 'Text stroke width in pixels', - type: 'number', - default: 2 + return toYargs(yargs, WatermarkOptionsSchema(), { + onKey: ((yargs, key, options) => { + switch (key) { + case 'src': + return yargs.positional(key, {...options, demandOption: true}) + case 'watermark': + return yargs.option(key, {...options, demandOption: true}) + default: + return yargs.option(key, options) + } + }) }) } export const builder = defaultOptions export async function handler(argv: CLI.Arguments) { defaults() - const options = sanitize(argv) as WatermarkOptions + const options = WatermarkOptionsSchema().parse(argv) as WatermarkOptions logger.settings.minLevel = options.logLevel as any - // Pass raw watermark content and styling options to library - options.watermark = argv.watermark as string; + // The watermark content is already parsed by the schema + const sanitizedOptions = sanitize(options) as WatermarkOptions - return await watermark(options) + return await watermark(sanitizedOptions) } cli.command(command, desc, builder, handler) \ No newline at end of file diff --git a/packages/media/src/lib/media/images/background-remove-bria.ts b/packages/media/src/lib/media/images/background-remove-bria.ts index 1888b1e8..6761651b 100644 --- a/packages/media/src/lib/media/images/background-remove-bria.ts +++ b/packages/media/src/lib/media/images/background-remove-bria.ts @@ -2,10 +2,12 @@ import * as fs from 'fs'; import * as path from 'path'; import sharp from 'sharp'; import pMap from 'p-map'; +import { z } from 'zod'; import { logger } from '../../../index.js'; import { IOptions } from '../../../types.js'; import { targets } from '../../index.js'; import { sync as mkdir } from '@polymech/fs/dir'; +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons'; export interface BriaBackgroundRemoveOptions extends IOptions { apiKey?: string; @@ -15,6 +17,114 @@ export interface BriaBackgroundRemoveOptions extends IOptions { jpg?: boolean; } +// Zod Schema for Bria background remove options +let schemaMap + +export const BriaBackgroundRemoveOptionsSchema = (opts?: any): any => { + schemaMap = ZodMetaMap.create() + + schemaMap.add( + 'src', + z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to remove background from') + ) + .add( + 'dst', + z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for processed files') + ) + .add( + 'debug', + z.boolean() + .default(false) + .describe('Enable internal debug messages') + ) + .add( + 'alt', + z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $') + ) + .add( + 'dry', + z.boolean() + .default(false) + .describe('Run without conversion') + ) + .add( + 'verbose', + z.boolean() + .default(false) + .describe('Show internal messages') + ) + .add( + 'logLevel', + z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error') + ) + .add( + 'cache', + z.boolean() + .default(true) + .describe('Skip processing if target file already exists') + ) + .add( + 'apiKey', + z.string() + .optional() + .describe('Bria API key (or set in config.bria.key)') + ) + .add( + 'sync', + z.boolean() + .default(true) + .describe('Use synchronous processing (recommended)') + ) + .add( + 'contentModeration', + z.boolean() + .default(false) + .describe('Enable content moderation') + ) + .add( + 'preserveAlpha', + z.boolean() + .default(true) + .describe('Preserve alpha channel from input image') + ) + .add( + 'jpg', + z.boolean() + .default(false) + .describe('Convert PNG output to JPG format and delete PNG') + ) + + return schemaMap.root() + .passthrough() + .describe('IBriaBackgroundRemoveOptions') +} + +export const types = () => { + generate_interfaces([BriaBackgroundRemoveOptionsSchema()], 'src/zod_types_background_remove_bria.ts') + schemas() +} + +export const schemas = () => { + const schema = BriaBackgroundRemoveOptionsSchema() + write([schema], 'schemas_background_remove_bria.json', 'background-remove-bria', {}) + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_background_remove_bria.json', JSON.stringify(schemaMap.getUISchema(), null, 2)) + }).catch(err => { + console.warn('Could not write UI schema:', err.message) + }) + } +} + // Read image file as buffer for Bria API function readImageFile(filePath: string): Buffer { return fs.readFileSync(filePath); diff --git a/packages/media/src/lib/media/images/background-remove.ts b/packages/media/src/lib/media/images/background-remove.ts index c98eb3c5..014b175d 100644 --- a/packages/media/src/lib/media/images/background-remove.ts +++ b/packages/media/src/lib/media/images/background-remove.ts @@ -1,10 +1,12 @@ import * as fs from 'fs'; import * as path from 'path'; import pMap from 'p-map'; +import { z } from 'zod'; import { logger } from '../../../index.js'; import { IOptions } from '../../../types.js'; import { targets } from '../../index.js'; import { sync as mkdir } from '@polymech/fs/dir'; +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons'; // https://replicate.com/cjwbw/rembg export interface BackgroundRemoveOptions extends IOptions { @@ -16,6 +18,123 @@ export interface BackgroundRemoveOptions extends IOptions { alpha_matting_erode_size?: number; } +// Zod Schema for background remove options +let schemaMap + +export const BackgroundRemoveOptionsSchema = (opts?: any): any => { + schemaMap = ZodMetaMap.create() + + schemaMap.add( + 'src', + z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to remove background from') + ) + .add( + 'dst', + z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for processed files') + ) + .add( + 'debug', + z.boolean() + .default(false) + .describe('Enable internal debug messages') + ) + .add( + 'alt', + z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $') + ) + .add( + 'dry', + z.boolean() + .default(false) + .describe('Run without conversion') + ) + .add( + 'verbose', + z.boolean() + .default(false) + .describe('Show internal messages') + ) + .add( + 'logLevel', + z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error') + ) + .add( + 'apiKey', + z.string() + .optional() + .describe('Replicate API key (or set REPLICATE_API_TOKEN env var)') + ) + .add( + 'model', + z.string() + .default('lucataco/remove-bg:95fcc2a26d3899cd6c2691c900465aaeff466285a65c14638cc5f36f34befaf1') + .describe('Background removal model to use') + ) + .add( + 'alpha_matting', + z.boolean() + .default(false) + .describe('Enable alpha matting for better edge refinement') + ) + .add( + 'alpha_matting_foreground_threshold', + z.number() + .int() + .min(0) + .max(500) + .default(270) + .describe('Alpha matting foreground threshold') + ) + .add( + 'alpha_matting_background_threshold', + z.number() + .int() + .min(0) + .max(100) + .default(10) + .describe('Alpha matting background threshold') + ) + .add( + 'alpha_matting_erode_size', + z.number() + .int() + .min(0) + .max(50) + .default(10) + .describe('Alpha matting erode size') + ) + + return schemaMap.root() + .passthrough() + .describe('IBackgroundRemoveOptions') +} + +export const types = () => { + generate_interfaces([BackgroundRemoveOptionsSchema()], 'src/zod_types_background_remove.ts') + schemas() +} + +export const schemas = () => { + const schema = BackgroundRemoveOptionsSchema() + write([schema], 'schemas_background_remove.json', 'background-remove', {}) + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_background_remove.json', JSON.stringify(schemaMap.getUISchema(), null, 2)) + }).catch(err => { + console.warn('Could not write UI schema:', err.message) + }) + } +} + // Base64 encode image file function encodeImageToBase64(filePath: string): string { const imageBuffer = fs.readFileSync(filePath); diff --git a/packages/media/src/lib/media/images/crop-foreground.ts b/packages/media/src/lib/media/images/crop-foreground.ts index 103241b2..9e25c493 100644 --- a/packages/media/src/lib/media/images/crop-foreground.ts +++ b/packages/media/src/lib/media/images/crop-foreground.ts @@ -1,10 +1,12 @@ import * as fs from 'fs'; import * as path from 'path'; import pMap from 'p-map'; +import { z } from 'zod'; import { logger } from '../../../index.js'; import { sync as mkdir } from '@polymech/fs/dir'; import { IOptions } from '../../../types.js'; import { targets } from '../../index.js'; +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons'; export interface CropForegroundOptions extends IOptions { apiKey: string; @@ -13,6 +15,102 @@ export interface CropForegroundOptions extends IOptions { preserveAlpha?: boolean; } +// Zod Schema for crop foreground options +let schemaMap + +export const CropForegroundOptionsSchema = (opts?: any): any => { + schemaMap = ZodMetaMap.create() + + schemaMap.add( + 'src', + z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to crop foreground from') + ) + .add( + 'dst', + z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for processed files') + ) + .add( + 'debug', + z.boolean() + .default(false) + .describe('Enable internal debug messages') + ) + .add( + 'alt', + z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $') + ) + .add( + 'dry', + z.boolean() + .default(false) + .describe('Run without conversion') + ) + .add( + 'verbose', + z.boolean() + .default(false) + .describe('Show internal messages') + ) + .add( + 'logLevel', + z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error') + ) + .add( + 'apiKey', + z.string() + .optional() + .describe('Bria API key (or set in config.bria.key)') + ) + .add( + 'sync', + z.boolean() + .default(true) + .describe('Use synchronous processing (recommended)') + ) + .add( + 'contentModeration', + z.boolean() + .default(false) + .describe('Enable content moderation') + ) + .add( + 'preserveAlpha', + z.boolean() + .default(true) + .describe('Preserve alpha channel from input image') + ) + + return schemaMap.root() + .passthrough() + .describe('ICropForegroundOptions') +} + +export const types = () => { + generate_interfaces([CropForegroundOptionsSchema()], 'src/zod_types_crop_foreground.ts') + schemas() +} + +export const schemas = () => { + const schema = CropForegroundOptionsSchema() + write([schema], 'schemas_crop_foreground.json', 'crop-foreground', {}) + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_crop_foreground.json', JSON.stringify(schemaMap.getUISchema(), null, 2)) + }).catch(err => { + console.warn('Could not write UI schema:', err.message) + }) + } +} + // Read image file as buffer for Bria API function readImageFile(filePath: string): Buffer { return fs.readFileSync(filePath); diff --git a/packages/media/src/lib/media/images/index.ts b/packages/media/src/lib/media/images/index.ts index 6f1ad229..a6286939 100644 --- a/packages/media/src/lib/media/images/index.ts +++ b/packages/media/src/lib/media/images/index.ts @@ -1,6 +1,6 @@ export * from './resize.js' export * from './convert.js' -export * from './watermark.js' +// export * from './watermark.js' // Commented out to avoid naming conflicts with schemas/types functions import pMap from 'p-map' import * as path from 'path' import * as fs from 'fs' diff --git a/packages/media/src/lib/media/images/resize.ts b/packages/media/src/lib/media/images/resize.ts index 5816f535..2362912d 100644 --- a/packages/media/src/lib/media/images/resize.ts +++ b/packages/media/src/lib/media/images/resize.ts @@ -1,194 +1,370 @@ -import * as path from 'path' -import pMap from 'p-map' -import sharp from 'sharp' - -import { sync as exists } from "@polymech/fs/exists" -import { async as move } from "@polymech/fs/move" -import { sync as dir } from "@polymech/fs/dir" -import { createItem as toNode } from "@polymech/fs/inspect" - -import { - logger, - ERR_PERM_RETRY_DELAY, - ERR_PERM_RETRY_MAX, - IOptions, - IResizeOptions -} from '../../../index.js' - -import { - targetsNext -} from '../../index.js' - -import { - meta -} from './lib.js' - -export const resizeFile = async (source: string, target: string, onNode: (data: sharp.Sharp) => void = () => { }, options: IResizeOptions): Promise => { - //const osr_cache = OSR_CACHE() - //const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })) - //const cached = await get_cached(file, ca_options, MODULE_NAME) - const targetOri = '' + target - let inPlace = false - if (path.resolve(source) === path.resolve(target)) { - const parts = path.parse(target) - target = path.join(parts.dir, parts.name + '_tmp' + parts.ext) - inPlace = true - } - - let image: sharp.Sharp - try { - image = sharp(source) - } catch (e) { - logger.error(`Error reading file, ${source}`, e) - return - } - - onNode(image) - let metaData: any = await meta(source, image) || {} - const percent = options.percent - - const dstParts = path.parse(target) - const node = toNode(source, { - size: true, - mime: true - }) - if (!exists(dstParts.dir)) { - dir(dstParts.dir) - } - if (options.width && options.minWidth && options.width <= options.minWidth) { - logger.error(`Error resizing : options.width <= options.minWidth`) - return - } - if (metaData.width && options.width && options.minWidth) { - if (metaData.width <= options.minWidth) { - return image - } - } - if (metaData.height && options.height && options.minHeight) { - if (metaData.height <= options.minHeight) { - return image - } - } - if (options.minSize && node.size && options.minSize >= node.size) { - return image - } - const resizeOptions = { - height: options.height, - fastShrinkOnLoad: options.fastShrinkOnLoad, - withoutEnlargement: options.withoutEnlargement, - withoutReduction: options.withoutReduction, - fit: options.fit, - position: options.position, - background: options.background || 'white' - } - if (percent && metaData.width) { - image = image.resize({ - width: Math.round(metaData.width * (percent / 100)), - ...resizeOptions - - }) - - } else if (options.width || options.height) { - if (options.square && options.width) { - // For square mode, fit image within width maintaining aspect ratio - // then center on square canvas with fill color - const squareSize = options.width - const fillColor = options.fillColor || 'white' - - // First resize to fit within the square while maintaining aspect ratio - image = image.resize({ - width: squareSize, - height: squareSize, - fit: 'inside', // Fit within bounds without cropping - background: { r: 255, g: 255, b: 255, alpha: 0 } // Transparent background initially - }) - - // Then extend to exact square size with fill color background - image = image.extend({ - top: 0, - bottom: 0, - left: 0, - right: 0, - background: fillColor - }).resize({ - width: squareSize, - height: squareSize, - fit: 'contain', // Center the image - background: fillColor - }) - } else { - image = image.resize({ - width: options.width, - ...resizeOptions - }) - } - } else { - logger.error(`Error resizing, invalid options for ${source} - no width, height or percent`) - return image - } - - if(dstParts.ext.toLowerCase() === '.webp' || - dstParts.ext.toLowerCase() === '.png') { - image = image.rotate() - } - - if (metaData.width) { - await image.withMetadata().toFile(target) - } else { - try { - await image.toFile(target) - } catch (e) { - logger.error(`Error writing file out, ${source}`, e) - return - } - } - - if (inPlace) { - const timeout = async (retry) => new Promise((resolve) => - setTimeout(resolve, ERR_PERM_RETRY_DELAY * retry) - ) - const moveRetry = async (src, dst, retry = 0) => { - if (retry > ERR_PERM_RETRY_MAX) { - logger.error(`Error moving file failed, max retries reached ${src}`) - return - } - try { - await move(target, targetOri) - } catch (e) { - if (e.code === 'EPERM') { - logger.warn(`Error moving file out, retry ${source}`, e) - await timeout(retry) - moveRetry(src, dst, retry + 1) - } - } - } - await moveRetry(source, targetOri) - } - logger.debug(`Resized Image ${source} to ${targetOri}`) - return image -} -export const _resize = async (file, targets: string[], onNode: (data: any) => void = () => { }, options: IOptions) => { - return pMap(targets, async (target) => { - logger.debug(`Resizing ${file} to ${target}`) - if (options.dry) { - return Promise.resolve() - } - return resizeFile(file, target, onNode, options); - }, { concurrency: 1 }) -} -export const resize = async (options: IResizeOptions) => { - let reports: any = [] - logger.settings.minLevel = options.logLevel || 'info' as any - const onNode = (data: any) => reports.push(data) - if (options.srcInfo) { - logger.debug(`Convert ${options.srcInfo.FILES.length} files`) - return await pMap(options.srcInfo.FILES, async (f) => { - const outputs = targetsNext(f, options) - logger.debug(`Convert ${f} to `, outputs) - return _resize(f, outputs, onNode, options) - }, { concurrency: 1 }) - } else { - logger.error(`Invalid source info`) - } - return reports +import * as path from 'path' +import pMap from 'p-map' +import sharp from 'sharp' +import { z } from 'zod' + +import { sync as exists } from "@polymech/fs/exists" +import { async as move } from "@polymech/fs/move" +import { sync as dir } from "@polymech/fs/dir" +import { createItem as toNode } from "@polymech/fs/inspect" +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons' + +import { + logger, + ERR_PERM_RETRY_DELAY, + ERR_PERM_RETRY_MAX, + IOptions, + IResizeOptions +} from '../../../index.js' + +import { + targetsNext +} from '../../index.js' + +import { + meta +} from './lib.js' + +// Zod Schema for resize options +let schemaMap + +export const ResizeOptionsSchema = (opts?: any): any => { + schemaMap = ZodMetaMap.create() + + schemaMap.add( + 'src', + z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to resize') + ) + .add( + 'dst', + z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for resized files') + ) + .add( + 'debug', + z.boolean() + .default(false) + .describe('Enable internal debug messages') + ) + .add( + 'alt', + z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $') + ) + .add( + 'dry', + z.boolean() + .default(false) + .describe('Run without conversion') + ) + .add( + 'verbose', + z.boolean() + .default(false) + .describe('Show internal messages') + ) + .add( + 'width', + z.number() + .positive() + .optional() + .describe('Resize image width') + ) + .add( + 'height', + z.number() + .positive() + .optional() + .describe('Resize image height') + ) + .add( + 'minHeight', + z.number() + .positive() + .optional() + .describe('Resize image minimum height') + ) + .add( + 'minWidth', + z.number() + .positive() + .optional() + .describe('Resize image minimum width') + ) + .add( + 'minSize', + z.number() + .positive() + .optional() + .describe('Resize image size (bytes)') + ) + .add( + 'percent', + z.number() + .positive() + .max(1000) + .optional() + .describe('Resize image in percent (width)') + ) + .add( + 'square', + z.boolean() + .default(false) + .describe('Fit image within width for 1:1 aspect ratio without cropping') + ) + .add( + 'fillColor', + z.string() + .default('white') + .describe('Fill color for square backgrounds (default: white)') + ) + .add( + 'logLevel', + z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error') + ) + .add( + 'fit', + z.enum(['cover', 'contain', 'fill', 'inside', 'outside']) + .optional() + .describe('How the image should be resized to fit both provided dimensions') + ) + .add( + 'position', + z.union([z.number(), z.string()]) + .optional() + .describe('Position, gravity or strategy to use when fit is cover or contain') + ) + .add( + 'background', + z.union([z.string(), z.object({ + r: z.number().min(0).max(255), + g: z.number().min(0).max(255), + b: z.number().min(0).max(255), + alpha: z.number().min(0).max(1).optional() + })]) + .optional() + .describe('Background color when using a fit of contain') + ) + .add( + 'kernel', + z.enum(['nearest', 'cubic', 'mitchell', 'lanczos2', 'lanczos3']) + .optional() + .describe('The kernel to use for image reduction') + ) + .add( + 'withoutEnlargement', + z.boolean() + .default(false) + .describe('Do not enlarge if the width or height are already less than the specified dimensions') + ) + .add( + 'withoutReduction', + z.boolean() + .default(false) + .describe('Do not reduce if the width or height are already greater than the specified dimensions') + ) + .add( + 'fastShrinkOnLoad', + z.boolean() + .default(true) + .describe('Take greater advantage of the JPEG and WebP shrink-on-load feature') + ) + + return schemaMap.root() + .passthrough() + .describe('IResizeOptions') +} + +export const types = () => { + generate_interfaces([ResizeOptionsSchema()], 'src/zod_types_resize.ts') + schemas() +} + +export const schemas = () => { + const schema = ResizeOptionsSchema() + write([schema], 'schemas_resize.json', 'resize', {}) + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_resize.json', JSON.stringify(schemaMap.getUISchema(), null, 2)) + }).catch(err => { + console.warn('Could not write UI schema:', err.message) + }) + } +} + +export const resizeFile = async (source: string, target: string, onNode: (data: sharp.Sharp) => void = () => { }, options: IResizeOptions): Promise => { + //const osr_cache = OSR_CACHE() + //const ca_options = JSON.parse(JSON.stringify({ ...options, target, skip: null })) + //const cached = await get_cached(file, ca_options, MODULE_NAME) + const targetOri = '' + target + let inPlace = false + if (path.resolve(source) === path.resolve(target)) { + const parts = path.parse(target) + target = path.join(parts.dir, parts.name + '_tmp' + parts.ext) + inPlace = true + } + + let image: sharp.Sharp + try { + image = sharp(source) + } catch (e) { + logger.error(`Error reading file, ${source}`, e) + return + } + + onNode(image) + let metaData: any = await meta(source, image) || {} + const percent = options.percent + + const dstParts = path.parse(target) + const node = toNode(source, { + size: true, + mime: true + }) + if (!exists(dstParts.dir)) { + dir(dstParts.dir) + } + if (options.width && options.minWidth && options.width <= options.minWidth) { + logger.error(`Error resizing : options.width <= options.minWidth`) + return + } + if (metaData.width && options.width && options.minWidth) { + if (metaData.width <= options.minWidth) { + return image + } + } + if (metaData.height && options.height && options.minHeight) { + if (metaData.height <= options.minHeight) { + return image + } + } + if (options.minSize && node.size && options.minSize >= node.size) { + return image + } + const resizeOptions = { + height: options.height, + fastShrinkOnLoad: options.fastShrinkOnLoad, + withoutEnlargement: options.withoutEnlargement, + withoutReduction: options.withoutReduction, + fit: options.fit, + position: options.position, + background: options.background || 'white' + } + if (percent && metaData.width) { + image = image.resize({ + width: Math.round(metaData.width * (percent / 100)), + ...resizeOptions + + }) + + } else if (options.width || options.height) { + if (options.square && options.width) { + // For square mode, fit image within width maintaining aspect ratio + // then center on square canvas with fill color + const squareSize = options.width + const fillColor = options.fillColor || 'white' + + // First resize to fit within the square while maintaining aspect ratio + image = image.resize({ + width: squareSize, + height: squareSize, + fit: 'inside', // Fit within bounds without cropping + background: { r: 255, g: 255, b: 255, alpha: 0 } // Transparent background initially + }) + + // Then extend to exact square size with fill color background + image = image.extend({ + top: 0, + bottom: 0, + left: 0, + right: 0, + background: fillColor + }).resize({ + width: squareSize, + height: squareSize, + fit: 'contain', // Center the image + background: fillColor + }) + } else { + image = image.resize({ + width: options.width, + ...resizeOptions + }) + } + } else { + logger.error(`Error resizing, invalid options for ${source} - no width, height or percent`) + return image + } + + if(dstParts.ext.toLowerCase() === '.webp' || + dstParts.ext.toLowerCase() === '.png') { + image = image.rotate() + } + + if (metaData.width) { + await image.withMetadata().toFile(target) + } else { + try { + await image.toFile(target) + } catch (e) { + logger.error(`Error writing file out, ${source}`, e) + return + } + } + + if (inPlace) { + const timeout = async (retry) => new Promise((resolve) => + setTimeout(resolve, ERR_PERM_RETRY_DELAY * retry) + ) + const moveRetry = async (src, dst, retry = 0) => { + if (retry > ERR_PERM_RETRY_MAX) { + logger.error(`Error moving file failed, max retries reached ${src}`) + return + } + try { + await move(target, targetOri) + } catch (e) { + if (e.code === 'EPERM') { + logger.warn(`Error moving file out, retry ${source}`, e) + await timeout(retry) + moveRetry(src, dst, retry + 1) + } + } + } + await moveRetry(source, targetOri) + } + logger.debug(`Resized Image ${source} to ${targetOri}`) + return image +} +export const _resize = async (file, targets: string[], onNode: (data: any) => void = () => { }, options: IOptions) => { + return pMap(targets, async (target) => { + logger.debug(`Resizing ${file} to ${target}`) + if (options.dry) { + return Promise.resolve() + } + return resizeFile(file, target, onNode, options); + }, { concurrency: 1 }) +} +export const resize = async (options: IResizeOptions) => { + let reports: any = [] + logger.settings.minLevel = options.logLevel || 'info' as any + const onNode = (data: any) => reports.push(data) + if (options.srcInfo) { + logger.debug(`Convert ${options.srcInfo.FILES.length} files`) + return await pMap(options.srcInfo.FILES, async (f) => { + const outputs = targetsNext(f, options) + logger.debug(`Convert ${f} to `, outputs) + return _resize(f, outputs, onNode, options) + }, { concurrency: 1 }) + } else { + logger.error(`Invalid source info`) + } + return reports } \ No newline at end of file diff --git a/packages/media/src/lib/media/images/watermark.ts b/packages/media/src/lib/media/images/watermark.ts index a62f37bc..fe46330d 100644 --- a/packages/media/src/lib/media/images/watermark.ts +++ b/packages/media/src/lib/media/images/watermark.ts @@ -3,10 +3,12 @@ import * as path from 'path'; import * as fs from 'fs'; import { glob } from 'glob'; import pMap from 'p-map'; +import { z } from 'zod'; import { logger } from '../../../index.js'; import { IOptions } from '../../../types.js'; import { targets } from '../../index.js'; import { sync as mkdir } from '@polymech/fs/dir' +import { generate_interfaces, write, ZodMetaMap } from '@polymech/commons' import { resolve } from '@polymech/commons' @@ -56,6 +58,156 @@ export interface WatermarkOptions extends IOptions { imageOptions?: LogoWatermarkOptions; } +// Zod Schema for watermark options +let schemaMap + +export const WatermarkOptionsSchema = (opts?: any): any => { + schemaMap = ZodMetaMap.create() + + schemaMap.add( + 'src', + z.string() + .min(1) + .describe('FILE|FOLDER|GLOB - Source file(s) to add watermark to') + ) + .add( + 'dst', + z.string() + .optional() + .describe('FILE|FOLDER|GLOB - Destination for watermarked files') + ) + .add( + 'debug', + z.boolean() + .default(false) + .describe('Enable internal debug messages') + ) + .add( + 'alt', + z.boolean() + .default(false) + .describe('Use alternate tokenizer, & instead of $') + ) + .add( + 'dry', + z.boolean() + .default(false) + .describe('Run without conversion') + ) + .add( + 'verbose', + z.boolean() + .default(false) + .describe('Show internal messages') + ) + .add( + 'logLevel', + z.enum(['warn', 'info', 'debug', 'error']) + .default('info') + .describe('Log level: warn, info, debug, error') + ) + .add( + 'cache', + z.boolean() + .default(true) + .describe('Skip processing if target file already exists') + ) + .add( + 'watermark', + z.string() + .min(1) + .describe('Watermark content: text string or path to image file (PNG, JPG, SVG)') + ) + .add( + 'position', + z.enum(['top-left', 'top-right', 'bottom-left', 'bottom-right', 'center']) + .default('bottom-right') + .describe('Position of watermark') + ) + .add( + 'margin', + z.number() + .int() + .min(0) + .default(24) + .describe('Margin from edges in pixels') + ) + .add( + 'opacity', + z.number() + .min(0) + .max(1) + .default(0.85) + .describe('Opacity of watermark (0-1)') + ) + .add( + 'sizePct', + z.number() + .min(0) + .max(1) + .default(0.2) + .describe('Size of image watermark as percentage of base image width (0-1)') + ) + .add( + 'fontSize', + z.number() + .int() + .positive() + .default(48) + .describe('Font size for text watermark in pixels') + ) + .add( + 'color', + z.string() + .regex(/^#[0-9a-fA-F]{6}$/) + .default('#ffffff') + .describe('Text color (hex format, e.g., #ffffff)') + ) + .add( + 'fontFamily', + z.string() + .default('Arial') + .describe('Font family for text watermark') + ) + .add( + 'strokeColor', + z.string() + .regex(/^#[0-9a-fA-F]{6}$/) + .default('#000000') + .describe('Text stroke color (hex format, e.g., #000000)') + ) + .add( + 'strokeWidth', + z.number() + .int() + .min(0) + .default(2) + .describe('Text stroke width in pixels') + ) + + return schemaMap.root() + .passthrough() + .describe('IWatermarkOptions') +} + +export const types = () => { + generate_interfaces([WatermarkOptionsSchema()], 'src/zod_types_watermark.ts') + schemas() +} + +export const schemas = () => { + const schema = WatermarkOptionsSchema() + write([schema], 'schemas_watermark.json', 'watermark', {}) + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_watermark.json', JSON.stringify(schemaMap.getUISchema(), null, 2)) + }).catch(err => { + console.warn('Could not write UI schema:', err.message) + }) + } +} + export async function addLogoWatermark( inputPath: string, logoPath: string, diff --git a/packages/media/src/lib/pdf/convert.ts b/packages/media/src/lib/pdf/convert.ts index dfd90e1d..e6ebb47d 100644 --- a/packages/media/src/lib/pdf/convert.ts +++ b/packages/media/src/lib/pdf/convert.ts @@ -1,8 +1,9 @@ import * as mupdf from 'mupdf' import { Logger } from 'tslog' +import { z } from 'zod' import { dirname } from 'node:path' -import { resolveVariables, pathInfoEx } from '@polymech/commons' +import { resolveVariables, pathInfoEx, generate_interfaces, write, ZodMetaMap } from '@polymech/commons' import { sync as mkdir } from '@polymech/fs/dir' import { writeFileSync } from 'node:fs' import { Buffer } from 'node:buffer' @@ -10,10 +11,88 @@ import { statSync } from "node:fs"; import { sep, resolve as pathResolve, parse as pathParse, relative as pathRelative } from "node:path"; import { readFile } from "node:fs/promises"; import { DEFAULT_ROOTS, DEFAULT_VARS } from "@polymech/commons"; -import { ConvertCommandConfig } from "./types.js"; export const DEFAULT_OUTPUT_TEMPLATE = "\${SRC_DIR}/\${SRC_NAME}/\${SRC_NAME}_\${PAGE}.\${FORMAT}"; +// Zod Schema for PDF to JPG conversion options +let schemaMap + +export const Pdf2JpgOptionsSchema = (opts?: any): any => { + schemaMap = ZodMetaMap.create() + + schemaMap.add( + 'input', + z.string() + .min(1) + .describe('Path to the input PDF file') + ) + .add( + 'output', + z.string() + .optional() + .describe('Output path template (e.g., output/page_{PAGE}.png)') + ) + .add( + 'dpi', + z.number() + .int() + .positive() + .default(300) + .describe('Resolution for the output images') + ) + .add( + 'scale', + z.number() + .positive() + .default(2) + .describe('Scaling factor to apply before rendering (e.g., 2 for 2x size)') + ) + .add( + 'format', + z.enum(['png', 'jpg']) + .default('jpg') + .describe('Output image format') + ) + .add( + 'startPage', + z.number() + .int() + .positive() + .optional() + .describe('First page to convert (1-based index)') + ) + .add( + 'endPage', + z.number() + .int() + .positive() + .optional() + .describe('Last page to convert (1-based index)') + ) + + return schemaMap.root() + .passthrough() + .describe('IPdf2JpgOptions') +} + +export const types = () => { + generate_interfaces([Pdf2JpgOptionsSchema()], 'src/zod_types_pdf2jpg.ts') + schemas() +} + +export const schemas = () => { + const schema = Pdf2JpgOptionsSchema() + write([schema], 'schemas_pdf2jpg.json', 'pdf2jpg', {}) + // Note: schema_ui.json would need ZodMetaMap.getUISchema() implementation + if (schemaMap && typeof schemaMap.getUISchema === 'function') { + import('fs').then(fs => { + fs.writeFileSync('schema_ui_pdf2jpg.json', JSON.stringify(schemaMap.getUISchema(), null, 2)) + }).catch(err => { + console.warn('Could not write UI schema:', err.message) + }) + } +} + // Helper function to convert object-like image data to Buffer function imageDataObjectToBuffer(imageDataObject: Record): Buffer { const keys = Object.keys(imageDataObject).map(Number).sort((a, b) => a - b); @@ -120,6 +199,9 @@ export async function convertPdfToImages( } } +// Type inference from new schema +export type Pdf2JpgConfig = z.infer> + /** * Runs the PDF to images conversion process. * Generates variables, determines output path, reads PDF, and calls the conversion engine. @@ -127,7 +209,7 @@ export async function convertPdfToImages( * @param logger - The logger instance to use for logging. * @returns A promise that resolves with an array of generated image file paths. */ -export async function runConversion(config: ConvertCommandConfig, logger: Logger): Promise { +export async function runConversion(config: Pdf2JpgConfig, logger: Logger): Promise { const inputPath = pathResolve(config.input); let srcInfo: any = {}; try { diff --git a/packages/media/src/lib/salamander/index.ts b/packages/media/src/lib/salamander/index.ts index 0a198b96..02b1e76d 100644 --- a/packages/media/src/lib/salamander/index.ts +++ b/packages/media/src/lib/salamander/index.ts @@ -1,501 +1,501 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import regedit from 'regedit'; - -const promisified = regedit.promisified; - -export interface SalamanderMenuItem { - name: string; - command?: string; - arguments?: string; - initialDirectory?: string; - executeThoughShell?: boolean; - closeShellWindow?: boolean; - openShellWindow?: boolean; - icon?: string; - showInToolbar?: boolean; - type?: 'command' | 'submenu' | 'submenu-end'; - children?: SalamanderMenuItem[]; -} - -export interface SalamanderMenuConfig { - baseKey: string; - startIndex: number; - items: SalamanderMenuItem[]; -} - -export interface RegistryEntry { - key: string; - values: Record; -} - -export class SalamanderMenuGenerator { - private baseKey: string = 'HKEY_CURRENT_USER\\Software\\Altap\\Altap Salamander 4.0\\User Menu'; - - constructor(private config: SalamanderMenuConfig) { - if (config.baseKey) { - this.baseKey = config.baseKey; - } - } - - /** - * Parse existing registry file to find the highest menu index - */ - static parseExistingRegistry(registryPath: string): number { - if (!fs.existsSync(registryPath)) { - return 0; - } - - const content = fs.readFileSync(registryPath, 'utf8'); - const lines = content.split('\n'); - let maxIndex = 0; - - for (const line of lines) { - const match = line.match(/\\User Menu\\(\d+)\]/); - if (match) { - const index = parseInt(match[1], 10); - if (index > maxIndex) { - maxIndex = index; - } - } - } - - return maxIndex; - } - - /** - * Generate registry entries from menu configuration - */ - generateRegistryEntries(): RegistryEntry[] { - const entries: RegistryEntry[] = []; - let currentIndex = this.config.startIndex; - - const processItems = (items: SalamanderMenuItem[], isSubMenu = false) => { - for (const item of items) { - if (item.children && item.children.length > 0) { - // Submenu start - entries.push({ - key: `[${this.baseKey}\\${currentIndex}]`, - values: this.itemToRegistryValues(item, 'submenu') - }); - currentIndex++; - - // Process children - processItems(item.children, true); - - // Submenu end - entries.push({ - key: `[${this.baseKey}\\${currentIndex}]`, - values: { - '"Item Name"': '"(Submenu End)"', - '"Command"': '""', - '"Arguments"': '""', - '"Initial Directory"': '""', - '"Execute Through Shell"': 'dword:00000000', - '"Close Shell Window"': 'dword:00000000', - '"Open Shell Window"': 'dword:00000000', - '"Icon"': '""', - '"Type"': 'dword:00000002', - '"Show In Toolbar"': 'dword:00000000' - } - }); - currentIndex++; - } else { - // Regular command - entries.push({ - key: `[${this.baseKey}\\${currentIndex}]`, - values: this.itemToRegistryValues(item, 'command') - }); - currentIndex++; - } - } - }; - - processItems(this.config.items); - return entries; - } - - /** - * Convert menu item to registry values - */ - private itemToRegistryValues(item: SalamanderMenuItem, type: 'command' | 'submenu'): Record { - const values: Record = { - '"Item Name"': `"${item.name}"`, - '"Command"': `"${item.command || ''}"`, - '"Arguments"': `"${this.escapeArguments(item.arguments || '')}"`, - '"Initial Directory"': `"${item.initialDirectory || ''}"`, - '"Execute Through Shell"': item.executeThoughShell !== false ? 'dword:00000001' : 'dword:00000000', - '"Close Shell Window"': item.closeShellWindow === true ? 'dword:00000001' : 'dword:00000000', - '"Open Shell Window"': item.openShellWindow !== false ? 'dword:00000001' : 'dword:00000000', - '"Icon"': `"${item.icon || ''}"`, - '"Type"': type === 'submenu' ? 'dword:00000001' : 'dword:00000000', - '"Show In Toolbar"': item.showInToolbar !== false ? 'dword:00000001' : 'dword:00000000' - }; - - return values; - } - - /** - * Escape arguments for registry format - */ - private escapeArguments(args: string): string { - return args - .replace(/\\/g, '\\\\') // Escape backslashes - .replace(/"/g, '\\\\"'); // Escape quotes - } - - /** - * Generate registry file content - */ - generateRegistryFile(): string { - const entries = this.generateRegistryEntries(); - let content = 'REGEDIT4\n\n'; - - for (const entry of entries) { - content += `${entry.key}\n`; - - for (const [key, value] of Object.entries(entry.values)) { - content += `${key}=${value}\n`; - } - - content += '\n'; - } - - return content; - } - - /** - * Save registry file to disk - */ - saveRegistryFile(outputPath: string): void { - const content = this.generateRegistryFile(); - - // Ensure output directory exists - const dir = path.dirname(outputPath); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); - } - - fs.writeFileSync(outputPath, content, 'utf8'); - } - - /** - * Load menu configuration from JSON file - */ - static loadFromJson(jsonPath: string): SalamanderMenuConfig { - if (!fs.existsSync(jsonPath)) { - throw new Error(`JSON configuration file not found: ${jsonPath}`); - } - - const content = fs.readFileSync(jsonPath, 'utf8'); - return JSON.parse(content) as SalamanderMenuConfig; - } - - /** - * Find insertion point in existing registry - */ - static findInsertionPoint(registryPath: string, groupName?: string): number { - if (!fs.existsSync(registryPath)) { - return 1; // Start at index 1 if no existing registry - } - - const maxIndex = this.parseExistingRegistry(registryPath); - - if (!groupName) { - return maxIndex + 1; - } - - // Find group and insert before submenu end - const content = fs.readFileSync(registryPath, 'utf8'); - const lines = content.split('\n'); - - let inTargetGroup = false; - let groupStartIndex = -1; - - for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - - // Check for menu entry - const menuMatch = line.match(/\\User Menu\\(\d+)\]/); - if (menuMatch) { - const index = parseInt(menuMatch[1], 10); - - // Look for item name in next few lines - for (let j = i + 1; j < Math.min(i + 10, lines.length); j++) { - const nameLine = lines[j]; - if (nameLine.includes('"Item Name"')) { - const nameMatch = nameLine.match(/"Item Name"="([^"]+)"/); - if (nameMatch) { - const itemName = nameMatch[1]; - - if (itemName === groupName) { - inTargetGroup = true; - groupStartIndex = index; - } else if (itemName === '(Submenu End)' && inTargetGroup) { - return index; // Insert before submenu end - } - } - break; - } - } - } - } - - return maxIndex + 1; // Fallback to end - } -} - -/** - * Windows Registry helper for direct registry operations using regedit package - */ -export class WindowsRegistry { - private static isWindows(): boolean { - return process.platform === 'win32' && promisified !== null; - } - - private static ensureRegedit(): void { - if (!this.isWindows()) { - throw new Error('Registry operations are only supported on Windows with regedit package installed'); - } - } - - /** - * Read all User Menu entries from registry - */ - static async readUserMenuEntries(baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise> { - this.ensureRegedit(); - - try { - const result = await promisified.list([baseKey]); - return result[baseKey] || { exists: false, keys: [], values: {} }; - } catch (error) { - return { exists: false, keys: [], values: {} }; - } - } - - /** - * Read specific menu entry by index - */ - static async readMenuEntry(index: number, baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise> { - this.ensureRegedit(); - - const keyPath = `${baseKey}\\${index}`; - try { - const result = await promisified.list([keyPath]); - return result[keyPath] || { exists: false, keys: [], values: {} }; - } catch (error) { - return { exists: false, keys: [], values: {} }; - } - } - - /** - * Get all existing menu indices - */ - static async getExistingMenuIndices(baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { - this.ensureRegedit(); - - const menuData = await this.readUserMenuEntries(baseKey); - if (!menuData.exists) { - return []; - } - - return menuData.keys - .map((key: string) => parseInt(key, 10)) - .filter((index: number) => !isNaN(index)) - .sort((a: number, b: number) => a - b); - } - - /** - * Get next available menu index - */ - static async getNextMenuIndex(baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { - const indices = await this.getExistingMenuIndices(baseKey); - return indices.length > 0 ? Math.max(...indices) + 1 : 1; - } - - /** - * Find insertion point for a specific group - */ - static async findGroupInsertionPoint(groupName: string, baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { - this.ensureRegedit(); - - const indices = await this.getExistingMenuIndices(baseKey); - - let inTargetGroup = false; - - for (const index of indices) { - const entry = await this.readMenuEntry(index, baseKey); - - if (entry.exists && entry.values['Item Name']) { - const itemName = entry.values['Item Name'].value; - - if (itemName === groupName) { - inTargetGroup = true; - } else if (itemName === '(Submenu End)' && inTargetGroup) { - return index; // Insert before submenu end - } - } - } - - return await this.getNextMenuIndex(baseKey); // Fallback to end - } - - /** - * Write registry values for a menu entry - */ - static async writeMenuEntry(index: number, values: Record, baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { - this.ensureRegedit(); - - const keyPath = `${baseKey}\\${index}`; - - // First create the key - await promisified.createKey([keyPath]); - - // Then write the values - const valuesToWrite: Record = {}; - valuesToWrite[keyPath] = {}; - - for (const [valueName, valueData] of Object.entries(values)) { - const cleanValueName = valueName.replace(/"/g, ''); - let cleanValueData = String(valueData); - let valueType = 'REG_SZ'; - - if (cleanValueData.startsWith('dword:')) { - valueType = 'REG_DWORD'; - cleanValueData = parseInt(cleanValueData.replace('dword:', ''), 16).toString(); - } else { - // Only strip quotes for non-Arguments fields to preserve command-line quoting - if (cleanValueName !== 'Arguments') { - cleanValueData = cleanValueData.replace(/"/g, ''); - } - } - - valuesToWrite[keyPath][cleanValueName] = { - value: cleanValueData, - type: valueType - }; - } - - await promisified.putValue(valuesToWrite); - } - - /** - * Delete a menu entry - */ - static async deleteMenuEntry(index: number, baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { - this.ensureRegedit(); - - const keyPath = `${baseKey}\\${index}`; - - try { - await promisified.deleteKey([keyPath]); - } catch (error) { - // Key might not exist, ignore error - } - } - - /** - * List all menu entries with their details - */ - static async listAllMenuEntries(baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise> { - const indices = await this.getExistingMenuIndices(baseKey); - const entries = []; - - for (const index of indices) { - const entry = await this.readMenuEntry(index, baseKey); - - if (entry.exists && entry.values['Item Name']) { - const name = entry.values['Item Name'].value; - const type = entry.values['Type'] ? entry.values['Type'].value : 0; - const command = entry.values['Command'] ? entry.values['Command'].value : ''; - const args = entry.values['Arguments'] ? entry.values['Arguments'].value : ''; - - let typeString = 'command'; - if (type === 1 || type === '0x00000001') typeString = 'submenu'; - if (type === 2 || type === '0x00000002') typeString = 'submenu-end'; - - entries.push({ - index, - name, - type: typeString, - command: command || undefined, - arguments: args || undefined - }); - } - } - - return entries; - } -} - -/** - * Extended Salamander Menu Generator with direct registry support - */ -export class SalamanderMenuGeneratorRegistry extends SalamanderMenuGenerator { - - /** - * Apply menu configuration directly to Windows registry - */ - async applyToRegistry(): Promise { - if (process.platform !== 'win32') { - throw new Error('Direct registry operations are only supported on Windows'); - } - - const entries = this.generateRegistryEntries(); - - for (const entry of entries) { - // Extract menu index from key - const keyMatch = entry.key.match(/\\User Menu\\(\d+)\]/); - if (!keyMatch) continue; - - const menuIndex = parseInt(keyMatch[1], 10); - - await WindowsRegistry.writeMenuEntry(menuIndex, entry.values); - } - } - - /** - * Remove menu entries from Windows registry - */ - async removeFromRegistry(): Promise { - if (process.platform !== 'win32') { - throw new Error('Direct registry operations are only supported on Windows'); - } - - const entries = this.generateRegistryEntries(); - - // Remove in reverse order to avoid index issues - for (let i = entries.length - 1; i >= 0; i--) { - const entry = entries[i]; - const keyMatch = entry.key.match(/\\User Menu\\(\d+)\]/); - if (keyMatch) { - const menuIndex = parseInt(keyMatch[1], 10); - await WindowsRegistry.deleteMenuEntry(menuIndex); - } - } - } - - /** - * Auto-detect insertion point from Windows registry - */ - static async autoDetectInsertionPoint(groupName?: string): Promise { - if (process.platform !== 'win32') { - throw new Error('Registry operations are only supported on Windows'); - } - - if (groupName) { - return await WindowsRegistry.findGroupInsertionPoint(groupName); - } else { - return await WindowsRegistry.getNextMenuIndex(); - } - } - - /** - * List current menu entries from registry - */ - static async listCurrentMenuEntries(): Promise> { - return await WindowsRegistry.listAllMenuEntries(); - } -} - -export default SalamanderMenuGenerator; +import * as fs from 'fs'; +import * as path from 'path'; +import regedit from 'regedit'; + +const promisified = regedit.promisified; + +export interface SalamanderMenuItem { + name: string; + command?: string; + arguments?: string; + initialDirectory?: string; + executeThoughShell?: boolean; + closeShellWindow?: boolean; + openShellWindow?: boolean; + icon?: string; + showInToolbar?: boolean; + type?: 'command' | 'submenu' | 'submenu-end'; + children?: SalamanderMenuItem[]; +} + +export interface SalamanderMenuConfig { + baseKey: string; + startIndex: number; + items: SalamanderMenuItem[]; +} + +export interface RegistryEntry { + key: string; + values: Record; +} + +export class SalamanderMenuGenerator { + private baseKey: string = 'HKEY_CURRENT_USER\\Software\\Altap\\Altap Salamander 4.0\\User Menu'; + + constructor(private config: SalamanderMenuConfig) { + if (config.baseKey) { + this.baseKey = config.baseKey; + } + } + + /** + * Parse existing registry file to find the highest menu index + */ + static parseExistingRegistry(registryPath: string): number { + if (!fs.existsSync(registryPath)) { + return 0; + } + + const content = fs.readFileSync(registryPath, 'utf8'); + const lines = content.split('\n'); + let maxIndex = 0; + + for (const line of lines) { + const match = line.match(/\\User Menu\\(\d+)\]/); + if (match) { + const index = parseInt(match[1], 10); + if (index > maxIndex) { + maxIndex = index; + } + } + } + + return maxIndex; + } + + /** + * Generate registry entries from menu configuration + */ + generateRegistryEntries(): RegistryEntry[] { + const entries: RegistryEntry[] = []; + let currentIndex = this.config.startIndex; + + const processItems = (items: SalamanderMenuItem[], isSubMenu = false) => { + for (const item of items) { + if (item.children && item.children.length > 0) { + // Submenu start + entries.push({ + key: `[${this.baseKey}\\${currentIndex}]`, + values: this.itemToRegistryValues(item, 'submenu') + }); + currentIndex++; + + // Process children + processItems(item.children, true); + + // Submenu end + entries.push({ + key: `[${this.baseKey}\\${currentIndex}]`, + values: { + '"Item Name"': '"(Submenu End)"', + '"Command"': '""', + '"Arguments"': '""', + '"Initial Directory"': '""', + '"Execute Through Shell"': 'dword:00000000', + '"Close Shell Window"': 'dword:00000000', + '"Open Shell Window"': 'dword:00000000', + '"Icon"': '""', + '"Type"': 'dword:00000002', + '"Show In Toolbar"': 'dword:00000000' + } + }); + currentIndex++; + } else { + // Regular command + entries.push({ + key: `[${this.baseKey}\\${currentIndex}]`, + values: this.itemToRegistryValues(item, 'command') + }); + currentIndex++; + } + } + }; + + processItems(this.config.items); + return entries; + } + + /** + * Convert menu item to registry values + */ + private itemToRegistryValues(item: SalamanderMenuItem, type: 'command' | 'submenu'): Record { + const values: Record = { + '"Item Name"': `"${item.name}"`, + '"Command"': `"${item.command || ''}"`, + '"Arguments"': `"${this.escapeArguments(item.arguments || '')}"`, + '"Initial Directory"': `"${item.initialDirectory || ''}"`, + '"Execute Through Shell"': item.executeThoughShell !== false ? 'dword:00000001' : 'dword:00000000', + '"Close Shell Window"': item.closeShellWindow === true ? 'dword:00000001' : 'dword:00000000', + '"Open Shell Window"': item.openShellWindow !== false ? 'dword:00000001' : 'dword:00000000', + '"Icon"': `"${item.icon || ''}"`, + '"Type"': type === 'submenu' ? 'dword:00000001' : 'dword:00000000', + '"Show In Toolbar"': item.showInToolbar !== false ? 'dword:00000001' : 'dword:00000000' + }; + + return values; + } + + /** + * Escape arguments for registry format + */ + private escapeArguments(args: string): string { + return args + .replace(/\\/g, '\\\\') // Escape backslashes + .replace(/"/g, '\\\\"'); // Escape quotes + } + + /** + * Generate registry file content + */ + generateRegistryFile(): string { + const entries = this.generateRegistryEntries(); + let content = 'REGEDIT4\n\n'; + + for (const entry of entries) { + content += `${entry.key}\n`; + + for (const [key, value] of Object.entries(entry.values)) { + content += `${key}=${value}\n`; + } + + content += '\n'; + } + + return content; + } + + /** + * Save registry file to disk + */ + saveRegistryFile(outputPath: string): void { + const content = this.generateRegistryFile(); + + // Ensure output directory exists + const dir = path.dirname(outputPath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + + fs.writeFileSync(outputPath, content, 'utf8'); + } + + /** + * Load menu configuration from JSON file + */ + static loadFromJson(jsonPath: string): SalamanderMenuConfig { + if (!fs.existsSync(jsonPath)) { + throw new Error(`JSON configuration file not found: ${jsonPath}`); + } + + const content = fs.readFileSync(jsonPath, 'utf8'); + return JSON.parse(content) as SalamanderMenuConfig; + } + + /** + * Find insertion point in existing registry + */ + static findInsertionPoint(registryPath: string, groupName?: string): number { + if (!fs.existsSync(registryPath)) { + return 1; // Start at index 1 if no existing registry + } + + const maxIndex = this.parseExistingRegistry(registryPath); + + if (!groupName) { + return maxIndex + 1; + } + + // Find group and insert before submenu end + const content = fs.readFileSync(registryPath, 'utf8'); + const lines = content.split('\n'); + + let inTargetGroup = false; + let groupStartIndex = -1; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + + // Check for menu entry + const menuMatch = line.match(/\\User Menu\\(\d+)\]/); + if (menuMatch) { + const index = parseInt(menuMatch[1], 10); + + // Look for item name in next few lines + for (let j = i + 1; j < Math.min(i + 10, lines.length); j++) { + const nameLine = lines[j]; + if (nameLine.includes('"Item Name"')) { + const nameMatch = nameLine.match(/"Item Name"="([^"]+)"/); + if (nameMatch) { + const itemName = nameMatch[1]; + + if (itemName === groupName) { + inTargetGroup = true; + groupStartIndex = index; + } else if (itemName === '(Submenu End)' && inTargetGroup) { + return index; // Insert before submenu end + } + } + break; + } + } + } + } + + return maxIndex + 1; // Fallback to end + } +} + +/** + * Windows Registry helper for direct registry operations using regedit package + */ +export class WindowsRegistry { + private static isWindows(): boolean { + return process.platform === 'win32' && promisified !== null; + } + + private static ensureRegedit(): void { + if (!this.isWindows()) { + throw new Error('Registry operations are only supported on Windows with regedit package installed'); + } + } + + /** + * Read all User Menu entries from registry + */ + static async readUserMenuEntries(baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise> { + this.ensureRegedit(); + + try { + const result = await promisified.list([baseKey]); + return result[baseKey] || { exists: false, keys: [], values: {} }; + } catch (error) { + return { exists: false, keys: [], values: {} }; + } + } + + /** + * Read specific menu entry by index + */ + static async readMenuEntry(index: number, baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise> { + this.ensureRegedit(); + + const keyPath = `${baseKey}\\${index}`; + try { + const result = await promisified.list([keyPath]); + return result[keyPath] || { exists: false, keys: [], values: {} }; + } catch (error) { + return { exists: false, keys: [], values: {} }; + } + } + + /** + * Get all existing menu indices + */ + static async getExistingMenuIndices(baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { + this.ensureRegedit(); + + const menuData = await this.readUserMenuEntries(baseKey); + if (!menuData.exists) { + return []; + } + + return menuData.keys + .map((key: string) => parseInt(key, 10)) + .filter((index: number) => !isNaN(index)) + .sort((a: number, b: number) => a - b); + } + + /** + * Get next available menu index + */ + static async getNextMenuIndex(baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { + const indices = await this.getExistingMenuIndices(baseKey); + return indices.length > 0 ? Math.max(...indices) + 1 : 1; + } + + /** + * Find insertion point for a specific group + */ + static async findGroupInsertionPoint(groupName: string, baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { + this.ensureRegedit(); + + const indices = await this.getExistingMenuIndices(baseKey); + + let inTargetGroup = false; + + for (const index of indices) { + const entry = await this.readMenuEntry(index, baseKey); + + if (entry.exists && entry.values['Item Name']) { + const itemName = entry.values['Item Name'].value; + + if (itemName === groupName) { + inTargetGroup = true; + } else if (itemName === '(Submenu End)' && inTargetGroup) { + return index; // Insert before submenu end + } + } + } + + return await this.getNextMenuIndex(baseKey); // Fallback to end + } + + /** + * Write registry values for a menu entry + */ + static async writeMenuEntry(index: number, values: Record, baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { + this.ensureRegedit(); + + const keyPath = `${baseKey}\\${index}`; + + // First create the key + await promisified.createKey([keyPath]); + + // Then write the values + const valuesToWrite: Record = {}; + valuesToWrite[keyPath] = {}; + + for (const [valueName, valueData] of Object.entries(values)) { + const cleanValueName = valueName.replace(/"/g, ''); + let cleanValueData = String(valueData); + let valueType = 'REG_SZ'; + + if (cleanValueData.startsWith('dword:')) { + valueType = 'REG_DWORD'; + cleanValueData = parseInt(cleanValueData.replace('dword:', ''), 16).toString(); + } else { + // Only strip quotes for non-Arguments fields to preserve command-line quoting + if (cleanValueName !== 'Arguments') { + cleanValueData = cleanValueData.replace(/"/g, ''); + } + } + + valuesToWrite[keyPath][cleanValueName] = { + value: cleanValueData, + type: valueType + }; + } + + await promisified.putValue(valuesToWrite); + } + + /** + * Delete a menu entry + */ + static async deleteMenuEntry(index: number, baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise { + this.ensureRegedit(); + + const keyPath = `${baseKey}\\${index}`; + + try { + await promisified.deleteKey([keyPath]); + } catch (error) { + // Key might not exist, ignore error + } + } + + /** + * List all menu entries with their details + */ + static async listAllMenuEntries(baseKey: string = 'HKCU\\Software\\Altap\\Altap Salamander 4.0\\User Menu'): Promise> { + const indices = await this.getExistingMenuIndices(baseKey); + const entries = []; + + for (const index of indices) { + const entry = await this.readMenuEntry(index, baseKey); + + if (entry.exists && entry.values['Item Name']) { + const name = entry.values['Item Name'].value; + const type = entry.values['Type'] ? entry.values['Type'].value : 0; + const command = entry.values['Command'] ? entry.values['Command'].value : ''; + const args = entry.values['Arguments'] ? entry.values['Arguments'].value : ''; + + let typeString = 'command'; + if (type === 1 || type === '0x00000001') typeString = 'submenu'; + if (type === 2 || type === '0x00000002') typeString = 'submenu-end'; + + entries.push({ + index, + name, + type: typeString, + command: command || undefined, + arguments: args || undefined + }); + } + } + + return entries; + } +} + +/** + * Extended Salamander Menu Generator with direct registry support + */ +export class SalamanderMenuGeneratorRegistry extends SalamanderMenuGenerator { + + /** + * Apply menu configuration directly to Windows registry + */ + async applyToRegistry(): Promise { + if (process.platform !== 'win32') { + throw new Error('Direct registry operations are only supported on Windows'); + } + + const entries = this.generateRegistryEntries(); + + for (const entry of entries) { + // Extract menu index from key + const keyMatch = entry.key.match(/\\User Menu\\(\d+)\]/); + if (!keyMatch) continue; + + const menuIndex = parseInt(keyMatch[1], 10); + + await WindowsRegistry.writeMenuEntry(menuIndex, entry.values); + } + } + + /** + * Remove menu entries from Windows registry + */ + async removeFromRegistry(): Promise { + if (process.platform !== 'win32') { + throw new Error('Direct registry operations are only supported on Windows'); + } + + const entries = this.generateRegistryEntries(); + + // Remove in reverse order to avoid index issues + for (let i = entries.length - 1; i >= 0; i--) { + const entry = entries[i]; + const keyMatch = entry.key.match(/\\User Menu\\(\d+)\]/); + if (keyMatch) { + const menuIndex = parseInt(keyMatch[1], 10); + await WindowsRegistry.deleteMenuEntry(menuIndex); + } + } + } + + /** + * Auto-detect insertion point from Windows registry + */ + static async autoDetectInsertionPoint(groupName?: string): Promise { + if (process.platform !== 'win32') { + throw new Error('Registry operations are only supported on Windows'); + } + + if (groupName) { + return await WindowsRegistry.findGroupInsertionPoint(groupName); + } else { + return await WindowsRegistry.getNextMenuIndex(); + } + } + + /** + * List current menu entries from registry + */ + static async listCurrentMenuEntries(): Promise> { + return await WindowsRegistry.listAllMenuEntries(); + } +} + +export default SalamanderMenuGenerator; diff --git a/packages/media/src/lib/ui/electron.ts b/packages/media/src/lib/ui/electron.ts new file mode 100644 index 00000000..7914ab71 --- /dev/null +++ b/packages/media/src/lib/ui/electron.ts @@ -0,0 +1,93 @@ +import * as path from 'path' + +import { sync as write } from '@polymech/fs/write' +import { sync as read } from '@polymech/fs/read' +import { substitute } from '@polymech/commons' + +const htmlFilePathIn = path.resolve('./web-ui/_prompt.html') +const htmlFilePathOut = path.resolve('./web-ui/prompt.html') + +import { Helper } from './../process/index.js' + +// Define the interface for the result +export interface Result { + editBoxValue: string; + selectedTemplate: string; + selectedFiles: string[]; + selectedModel: string; +} + +// Legacy function for backward compatibility +export const web_prompt = async (prompt: string, dst:string, variables:any = {}) => { + + write(htmlFilePathOut, substitute(false, read(htmlFilePathIn) as string, + { + QUERY: prompt, + DST: dst, + ...variables + })) + const electronPath = path.join(process.cwd(), './node_modules/electron/dist/electron.exe') + const mainPath = path.join(process.cwd(), 'dist-in/lib/ui/electron/main.js'); + const p = await Helper.runBin( + process.cwd(), + electronPath, + '', + [`"${mainPath}"`]) + + const content = p.messages.find((m) => m.type === 'content') + return content +} + +// New schema-based UI function +export const renderSchemaUI = async (options: { + schema: any; + uiSchema?: any; + formData?: any; + title?: string; + width?: number; + height?: number; + cliOptions?: any; +}) => { + // Write config to a temporary file that main process can read + const configPath = path.resolve('./web-ui/temp-config.json') + const config = { + schema: options.schema, + uiSchema: options.uiSchema || {}, + formData: options.formData || {}, + title: options.title || 'Configuration', + cliOptions: options.cliOptions || {} + } + + write(configPath, JSON.stringify(config, null, 2)) + + const electronPath = path.join(process.cwd(), './node_modules/electron/dist/electron.exe') + const mainPath = path.join(process.cwd(), 'dist-in/lib/ui/electron/main.js'); + + console.log('renderSchemaUI: Starting Electron...') + console.log('electronPath:', electronPath) + console.log('mainPath:', mainPath) + console.log('configPath:', configPath) + console.log('config:', config) + + const p = await Helper.runBin( + '', + electronPath, + '', + [`"${mainPath}"`, `--config="${configPath}"`]) + + console.log('renderSchemaUI: Electron process result:', p) + + const content = p.messages.find((m) => m.type === 'content') + + // Cleanup temp file + try { + const fs = await import('fs') + if (fs.existsSync(configPath)) { + fs.unlinkSync(configPath) + } + } catch (e) { + // Ignore cleanup errors + } + + return content +} diff --git a/packages/media/src/lib/ui/electron/main.ts b/packages/media/src/lib/ui/electron/main.ts new file mode 100644 index 00000000..334c9fd1 --- /dev/null +++ b/packages/media/src/lib/ui/electron/main.ts @@ -0,0 +1,198 @@ +//https://rjsf-team.github.io/react-jsonschema-form/ + +import { app, BrowserWindow, ipcMain } from 'electron' +import * as path from 'path' +import * as fs from 'fs' +import { dialog } from 'electron' + +let _files = [] +let _dst = '' +let _config: any = {} + +function createWindow() { + console.log('Creating Electron window...'); + + // Try with minimal options first + const mainWindow = new BrowserWindow({ + width: 900, + height: 800, + show: false, // Start hidden, show after load + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + webSecurity: true + }, + }); + + console.log('Window created successfully!'); + + // Check if we have a built React app + const reactDistPath = path.resolve('./web-ui/dist/index.html') + const legacyHtmlPath = path.resolve('./web-ui/prompt.html') + + if (fs.existsSync(reactDistPath)) { + console.log('Loading React app from:', reactDistPath) + mainWindow.loadFile(reactDistPath) + } else if (fs.existsSync(legacyHtmlPath)) { + console.log('Loading legacy HTML from:', legacyHtmlPath) + mainWindow.loadFile(legacyHtmlPath) + } else { + console.log('No UI files found, trying dev server...') + // Try to load dev server + mainWindow.loadURL('http://localhost:5173').catch((error) => { + console.log('Dev server not available, showing error page') + // If dev server not available, show error + mainWindow.loadURL('data:text/html;charset=utf-8,' + encodeURIComponent(` + + +

UI Not Available

+

React app not built and dev server not running.

+

Please build the React app:

+
cd web-ui && npm run build
+

or start the dev server:

+
cd web-ui && npm run dev
+

Error: ${error.message}

+ + + `)) + }) + } + + // Add event listeners to see what's happening + mainWindow.webContents.on('did-finish-load', () => { + console.log('Page loaded successfully') + mainWindow.show() + mainWindow.focus() + mainWindow.webContents.openDevTools() // Open dev tools to see what's happening + }) + + mainWindow.webContents.on('did-fail-load', (event, errorCode, errorDescription) => { + console.log('Page failed to load:', errorCode, errorDescription) + mainWindow.show() // Show window even on error + }) + + // Force window to be visible immediately + mainWindow.show() + mainWindow.focus() + + // Prevent window from closing immediately + mainWindow.on('close', (event) => { + console.log('Window is trying to close') + }) + + return mainWindow + // Handle React app config requests + ipcMain.on('request-config', (event) => { + event.reply('app-config', _config) + }) + + // Handle form submission from React app + ipcMain.on('content', (_event, content) => { + console.log(JSON.stringify({ + type: 'content', + ...content, + files: _files, + target: _dst + })) + mainWindow.close() + app.exit() + }) + + // Handle cancel from React app + ipcMain.on('cancel', () => { + console.log(JSON.stringify({ type: 'cancelled' })) + mainWindow.close() + app.exit() + }) + + // Keep window open for at least 5 seconds for debugging + setTimeout(() => { + console.log('Window has been open for 5 seconds') + }, 5000) + + // New IPC handlers for file dialogs + ipcMain.handle('showFileDialog', async (event, options) => { + console.log('File dialog requested with options:', options) + try { + const result = await dialog.showOpenDialog(mainWindow, options) + console.log('File dialog result:', result) + if (!result.canceled) { + _files = result.filePaths + return result.filePaths + } + return [] + } catch (error) { + console.error('File dialog error:', error) + return [] + } + }); + + ipcMain.handle('showSaveDialog', async (event, options) => { + console.log('Save dialog requested with options:', options) + try { + const result = await dialog.showSaveDialog(mainWindow, options) + console.log('Save dialog result:', result) + if (!result.canceled) { + _dst = result.filePath + return result.filePath + } + return null + } catch (error) { + console.error('Save dialog error:', error) + return null + } + }); + + // Legacy handlers for backward compatibility + ipcMain.on('filePicker', (_event, content) => { + const files = dialog.showOpenDialog({ properties: ['openFile', 'multiSelections'] }) + files.then((fp) => { + _files = fp.filePaths + }) + return files + }); +} + +console.log('Electron app starting...'); + +app.whenReady().then(() => { + console.log('Electron app ready'); + + // Check for config file argument + const args = process.argv; + console.log('Args:', args); + const configArg = args.find(arg => arg.startsWith('--config=')); + + if (configArg) { + const configPath = configArg.split('=')[1].replace(/"/g, ''); + console.log('Loading config from:', configPath); + + try { + if (fs.existsSync(configPath)) { + const configData = fs.readFileSync(configPath, 'utf8'); + _config = JSON.parse(configData); + console.log('Loaded config:', _config); + } else { + console.log('Config file not found:', configPath); + } + } catch (e) { + console.error('Error loading config:', e); + } + } else { + console.log('No config argument provided'); + } + + createWindow(); + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) createWindow(); + }); +}); + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') app.quit(); +}); + +// Export function to set config from external calls +export const setUIConfig = (config: any) => { + _config = config; +}; \ No newline at end of file diff --git a/packages/media/src/lib/ui/electron/preload.ts b/packages/media/src/lib/ui/electron/preload.ts new file mode 100644 index 00000000..ebdd2d6c --- /dev/null +++ b/packages/media/src/lib/ui/electron/preload.ts @@ -0,0 +1,60 @@ +import { contextBridge, ipcRenderer } from 'electron' + +console.log('Preload script starting...'); + +try { + console.log('Exposing electronAPI to main world...'); + // Expose APIs for React app + contextBridge.exposeInMainWorld('electronAPI', { + submitContent: (content: any) => ipcRenderer.send('content', content), + showFileDialog: (options: any) => ipcRenderer.invoke('showFileDialog', options), + showSaveDialog: (options: any) => ipcRenderer.invoke('showSaveDialog', options) + }); + console.log('electronAPI exposed successfully'); + + // Legacy support for old HTML template + window.addEventListener("DOMContentLoaded", () => { + const okButton = document.getElementById("okButton"); + const filePicker = document.getElementById("_filePicker"); + + if (okButton) { + okButton.addEventListener("click", () => { + console.log('Legacy OK button clicked'); + }); + } + + if (filePicker) { + filePicker.addEventListener("click", () => { + console.log('Legacy file picker clicked'); + ipcHandler.send('filePicker'); + }); + } + }); + +} catch (e) { + console.error('error preload',e) +} +const ipcHandler = { + send(channel, ...args) { + ipcRenderer.send(channel, ...args); + }, + invoke(channel, ...args) { + return ipcRenderer.invoke(channel, ...args); + }, + once(channel, callback) { + ipcRenderer.once(channel, (_event, ...args) => callback(...args)); + }, + on(channel, callback) { + const subscription = (_event, ...args) => callback(...args) + ipcRenderer.on(channel, subscription); + return () => { + ipcRenderer.removeListener(channel, subscription); + }; + }, + clear(channel) { + ipcRenderer.removeAllListeners(channel); + } +}; +contextBridge.exposeInMainWorld('ipc', ipcHandler); +(window as any).ipcHandler = ipcHandler; +export const noop = 2 diff --git a/packages/media/src/lib/ui/electron/renderer.ts b/packages/media/src/lib/ui/electron/renderer.ts new file mode 100644 index 00000000..39ff4599 --- /dev/null +++ b/packages/media/src/lib/ui/electron/renderer.ts @@ -0,0 +1,5 @@ +export const t = 2; +document.getElementById('okButton')?.addEventListener('click', () => { + const textareaContent = (document.getElementById('textarea') as HTMLTextAreaElement).value; + (window as any).electronAPI.submitContent(textareaContent); +}); diff --git a/packages/media/src/lib/ui/types.ts b/packages/media/src/lib/ui/types.ts new file mode 100644 index 00000000..598a5a9f --- /dev/null +++ b/packages/media/src/lib/ui/types.ts @@ -0,0 +1,12 @@ +export interface Button { + text: string; + onClick: () => void; +} +export interface Label { + text: string; +} +export interface Window { + title: string; + width: number; + height: number; +} \ No newline at end of file diff --git a/packages/media/src/main.ts b/packages/media/src/main.ts index b03abc08..0bc6c8a9 100644 --- a/packages/media/src/main.ts +++ b/packages/media/src/main.ts @@ -10,6 +10,7 @@ import './commands/background-remove.js' import './commands/background-remove-bria.js' import './commands/crop-foreground.js' import './commands/salamander.js' +import './commands/schemas.js' import './commands/register-commands.js' import './commands/register-explorer.js' diff --git a/packages/media/src/ref/config_sal_min.reg b/packages/media/src/ref/config_sal_min.reg deleted file mode 100644 index ef7363a7..00000000 --- a/packages/media/src/ref/config_sal_min.reg +++ /dev/null @@ -1,3453 +0,0 @@ -REGEDIT4 - -[-HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0] - -[HKEY_CURRENT_USER\Software] - -[HKEY_CURRENT_USER\Software\Altap] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Alternative Viewers] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Alternative Viewers\1] -"Masks"="*.*" -"Type"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Colors] -"Color Scheme"=dword:00000000 -"Focus Active Normal"=dword:01000000 -"Focus Active Selected"=dword:01000000 -"Focus Inactive Normal"=dword:00808080 -"Focus Inactive Selected"=dword:00808080 -"Focus Bk Inactive Normal"=dword:01ffffff -"Focus Bk Inactive Selected"=dword:01ffffff -"Item Fg Normal"=dword:01000000 -"Item Fg Selected"=dword:000000ff -"Item Fg Focused"=dword:01000000 -"Item Fg Focused and Selected"=dword:000000ff -"Item Fg Highlight"=dword:01000000 -"Item Bk Normal"=dword:01ffffff -"Item Bk Selected"=dword:01ffffff -"Item Bk Focused"=dword:00e8e8e8 -"Item Bk Focused and Selected"=dword:00e8e8e8 -"Item Bk Highlight"=dword:01000000 -"Icon Blend Selected"=dword:018080ff -"Icon Blend Focused"=dword:00808080 -"Icon Blend Focused and Selected"=dword:000000ff -"Progress Fg Normal"=dword:01c00000 -"Progress Fg Selected"=dword:01ffffff -"Progress Bk Normal"=dword:01ffffff -"Progress Bk Selected"=dword:01c00000 -"Hot Panel"=dword:01ff0000 -"Hot Active"=dword:01808080 -"Hot Inactive"=dword:01808080 -"Active Caption Fg"=dword:01ffffff -"Active Caption Bk"=dword:01800000 -"Inactive Caption Fg"=dword:01ffffff -"Inactive Caption Bk"=dword:01808080 -"Thumbnail Frame Normal"=dword:00c0c0c0 -"Thumbnail Frame Selected"=dword:000000ff -"Thumbnail Frame Focused"=dword:00000000 -"Thumbnail Frame Focused and Selected"=dword:00000080 -"Viewer Fg Normal"=dword:01000000 -"Viewer Bk Normal"=dword:01ffffff -"Viewer Fg Selected"=dword:01ffffff -"Viewer Bk Selected"=dword:01000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Colors\Panel Items Hilighting] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Colors\Panel Items Hilighting\1] -"Masks"="*.*" -"Attributes"=dword:00000800 -"Valid Attributes"=dword:00000800 -"Item Fg Normal"=dword:00ff0000 -"Item Fg Selected"=dword:010000ff -"Item Fg Focused"=dword:00ff0000 -"Item Fg Focused and Selected"=dword:010000ff -"Item Fg Highlight"=dword:01ff0000 -"Item Bk Normal"=dword:01ffffff -"Item Bk Selected"=dword:01ffffff -"Item Bk Focused"=dword:01e8e8e8 -"Item Bk Focused and Selected"=dword:01e8e8e8 -"Item Bk Highlight"=dword:01e9e9e9 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Colors\Panel Items Hilighting\2] -"Masks"="*.*" -"Attributes"=dword:00004000 -"Valid Attributes"=dword:00004000 -"Item Fg Normal"=dword:000d8f13 -"Item Fg Selected"=dword:010000ff -"Item Fg Focused"=dword:000d8f13 -"Item Fg Focused and Selected"=dword:010000ff -"Item Fg Highlight"=dword:010d8f13 -"Item Bk Normal"=dword:01ffffff -"Item Bk Selected"=dword:01ffffff -"Item Bk Focused"=dword:01e8e8e8 -"Item Bk Focused and Selected"=dword:01e8e8e8 -"Item Bk Highlight"=dword:01e9e9e9 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration] -"Menu Index"=dword:00000000 -"Menu Break"=dword:00000001 -"Menu Width"=dword:00000001 -"ToolBar Index"=dword:00000001 -"ToolBar Break"=dword:00000001 -"ToolBar Width"=dword:00000001 -"PluginsBar Index"=dword:00000002 -"PluginsBar Break"=dword:00000001 -"PluginsBar Width"=dword:00000001 -"User Menu Index"=dword:00000003 -"User Menu Break"=dword:00000001 -"User Menu Width"=dword:00000001 -"User Menu Labels"=dword:00000001 -"Hot Paths Index"=dword:00000004 -"Hot Paths Break"=dword:00000001 -"Hot Paths Width"=dword:00000001 -"Drive Bar Index"=dword:00000002 -"Drive Bar Break"=dword:00000001 -"Drive Bar Width"=dword:00000001 -"Grips Visible"=dword:00000001 -"File Name Format"=dword:00000004 -"Size Format"=dword:00000000 -"Select/Deselect Directories"=dword:00000000 -"Copy Find Text"=dword:00000001 -"Clear Readonly Attribute"=dword:00000001 -"Primary Context Menu"=dword:00000001 -"Hide Hidden and System Files and Directories"=dword:00000000 -"Use Recycle Bin"=dword:00000000 -"Use Recycle Bin For"="*.txt;*.doc" -"Save Configuration On Exit"=dword:00000001 -"Show Errors In Find Files"=dword:00000000 -"Show Full Row In Find Files"=dword:00000000 -"Use Speeker Beep"=dword:00000001 -"Close Shell Window"=dword:00000000 -"Right Panel Focused"=dword:00000000 -"Always On Top"=dword:00000000 -"Sort Uses Locale"=dword:00000001 -"Sort Detects Numbers"=dword:00000001 -"Sort Newer On Top"=dword:00000000 -"Sort Dirs By Name"=dword:00000000 -"Sort Dirs By Ext"=dword:00000000 -"Save History"=dword:00000001 -"Save Working Dirs"=dword:00000000 -"Enable CmdLine History"=dword:00000001 -"Save CmdLine History"=dword:00000001 -"Only One Instance"=dword:00000000 -"Status Area"=dword:00000000 -"Full Row Select"=dword:00000000 -"Full Row Highlight"=dword:00000001 -"Use Icon Tincture"=dword:00000001 -"Show Panel Caption"=dword:00000001 -"Show Panel Zoom"=dword:00000001 -"Single Click"=dword:00000000 -"Information Line Content"="$(FileName): $(FileSize), $(FileDate), $(FileTime), $(FileAttributes), $(FileDOSName)" -"If Path Is Inaccessible Go To My Docs"=dword:00000001 -"If Path Is Inaccessible Go To"="" -"Auto Configurate Hot Paths"=dword:00000001 -"Speed Limit"=dword:00100000 -"Quick Search Enter Alt"=dword:00000000 -"Change Drive Show My Documents"=dword:00000001 -"Change Drive Show Cloud Storages"=dword:00000001 -"Change Drive Show Another"=dword:00000001 -"Change Drive Network"=dword:00000001 -"Search File Content"=dword:00000001 -"Plugins.ver Version (x64)"=dword:00000000 -"Plugins.ver Version (x86)"=dword:00000000 -"Use salopen.exe"=dword:00000000 -"Netware Fast Dir Move"=dword:00000000 -"Async Copy Alg On Network"=dword:00000001 -"Reload Environment Variables"=dword:00000001 -"Quick Rename Select All"=dword:00000000 -"Edit New File Select All"=dword:00000001 -"Use Shift For GoTo HotPath"=dword:00000001 -"Language"="english.slg" -"Use Alternate Language for Plugins"=dword:00000000 -"Alternate Language for Plugins"="" -"Language Changed"=dword:00000000 -"Show Splash Screen"=dword:00000001 -"Conversion Table"="westeuro" -"Skill Level"=dword:00000002 -"Title bar show path"=dword:00000001 -"Title bar mode"=dword:00000000 -"Title bar prefix"=dword:00000000 -"Title bar prefix text"="ADMIN" -"Main window icon index"=dword:00000000 -"Click to Quick Rename"=dword:00000001 -"Visible Drives"=dword:03ffffff -"Separated Drives"=dword:00000000 -"Compare By Time"=dword:00000001 -"Compare By Size"=dword:00000001 -"Compare By Content"=dword:00000000 -"Compare By Attr"=dword:00000000 -"Compare By Subdirs"=dword:00000000 -"Compare By Subdirs Attr"=dword:00000000 -"Compare One Panel Dirs"=dword:00000000 -"Compare More Options"=dword:00000000 -"Compare Ignore Files"=dword:00000000 -"Compare Ignore Dirs"=dword:00000000 -"Compare Ignore Files Masks"="" -"Compare Ignore Dirs Masks"="" -"Thumbnail Size"=dword:0000005e -"Keep Plugins Sorted"=dword:00000001 -"Show Translation Is Incomplete"=dword:00000001 -"Enable Custom Icon Overlays"=dword:00000001 -"Disabled Custom Icon Overlays"="" -"Edit New File Use Default"=dword:00000000 -"Edit New File Default"="" -"Top ToolBar"="11,14,15,70,-1,40,56,-1,30,31,32,-1,41,42,18,27,55,33,-1,3,34,35,20,19,-1,43,46,49" -"Middle ToolBar"="2,3,17,21,22,23,72,26,24,25,27,55,28,29,30,31,32,33" -"Left ToolBar"="36" -"Right ToolBar"="51" -"Show Top ToolBar"=dword:00000001 -"Show Plugins Bar"=dword:00000000 -"Show Middle ToolBar"=dword:00000000 -"Show User Menu ToolBar"=dword:00000000 -"Hot Paths Bar"=dword:00000000 -"Show Drive Bar"=dword:00000001 -"Show Drive Bar2"=dword:00000000 -"Show Bottom ToolBar"=dword:00000001 -"Use Time Resolution"=dword:00000001 -"Time Resolution"=dword:00000002 -"Ignore DST Shifts"=dword:00000000 -"Use DragDrop Min Time"=dword:00000001 -"DragDrop Min Time"=dword:000001f4 -"Last Focused Page"=dword:0000000e -"Configuration Height"=dword:000001f1 -"Viewers And Editors Expanded"=dword:00000001 -"Packers And Unpackers Expanded"=dword:00000000 -"Command Line"=dword:00000001 -"Command Line Focused"=dword:00000000 -"Use Custom Panel Font"=dword:00000000 -"Panel Font"="Segoe UI,-12,400,0,1,0,0,5,0" -"Make File List Name"="" -"Make File List Append"=dword:00000000 -"Make File List Destination"=dword:00000000 -"Start Trace Server"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\ChangeDir History] -"1"="C:\\Users\\zx\\Desktop\\polymech" -"2"="C:\\Users\\zx\\.platformio\\packages\\framework-arduinoespressif32\\cores" -"3"="C:\\Users\\zx\\.platformio\\packages\\tool-mklittlefs\\" -"4"="c:\\Users\\zx\\AppData\\Roaming\\Cursor\\User\\globalStorage\\llvm-vs-code-extensions.vscode-clangd\\" -"5"="C:\\Users\\zx\\Desktop\\osr\\products\\products\\sheetpress\\cassandra-edczmax-rc2\\cad\\" -"6"="C:\\Users\\zx\\Desktop\\osr\\products\\products\\sheetpress\\cassandra-edczmax-rc2\\cad\\3" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Command History] -"1"="c" -"2"="cc" -"3"="cx" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Confirmation] -"Files or Dirs Del"=dword:00000001 -"Non-empty Dir Del"=dword:00000000 -"File Overwrite"=dword:00000001 -"Directory Overwrite"=dword:00000000 -"SH File Del"=dword:00000001 -"SH Dir Del"=dword:00000000 -"SH File Overwrite"=dword:00000001 -"NTFS Compress and Uncompress"=dword:00000001 -"NTFS Encrypt and Decrypt"=dword:00000001 -"Drag and Drop"=dword:00000000 -"Close Archive"=dword:00000001 -"Close Find"=dword:00000001 -"Stop Find"=dword:00000001 -"Create Target Path"=dword:00000001 -"Always on Top"=dword:00000001 -"Close Salamander"=dword:00000000 -"Send Email"=dword:00000001 -"Add To Archive"=dword:00000001 -"Create Dir"=dword:00000001 -"Change Dir TC"=dword:00000001 -"Show Names To Compare"=dword:00000001 -"DST Shifts Ignored"=dword:00000001 -"DST Shifts Occured"=dword:00000001 -"Copy Move Options Not Supported"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Convert History] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Copy History] -"1"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\media\\src\\ref\\*.*" -"2"="C:\\Users\\zx\\Desktop\\osr\\products\\rosa\\2025\\08\\cidepa\\*.*" -"3"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\bot\\src\\*.*" -"4"="C:\\Users\\zx\\Desktop\\osr\\osr-oa-bot\\src\\*.*" -"5"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\bot\\src\\commands\\*.*" -"6"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\bot\\*.*" -"7"="C:\\Users\\zx\\Desktop\\osr\\*.*" -"8"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\media\\tests\\images\\watermark-add\\*.*" -"9"="C:\\Users\\zx\\Desktop\\polymech\\polymech-fw-apps\\elz-rc3\\lib\\polymech-base\\src\\components\\*.*" -"10"="C:\\Users\\zx\\Desktop\\polymech\\nordin-ex\\*.*" -"11"="C:\\Users\\zx\\Desktop\\social\\233\\*.*" -"12"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\ai-tools\\src\\lib\\tools\\*.*" -"13"="C:\\Users\\zx\\Desktop\\polymech\\polymech-fw-apps\\elz-rc3\\scripts\\delta\\*.*" -"14"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\media\\tests\\pdf\\*.*" -"15"="C:\\Users\\zx\\Desktop\\clients\\plastiq\\followip\\*.*" -"16"="C:\\Users\\zx\\Desktop\\polymech\\polymech-fw-apps\\vendor\\delta\\*.*" -"17"="C:\\Users\\zx\\Desktop\\polymech\\polymech-fw-apps\\vendor\\*.*" -"18"="C:\\Users\\zx\\Desktop\\polymech\\fw-backups\\elzm-rc2\\*.*" -"19"="C:\\Users\\zx\\Desktop\\cs-2\\manuals\\*.*" -"20"="C:\\Users\\zx\\Desktop\\social\\231\\*.*" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Copy Move Options] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Create Directory History] -"1"="ref" -"2"="cidepa" -"3"="08" -"4"="bot" -"5"="logos" -"6"="branding" -"7"="watermark-add" -"8"="nordin-ex" -"9"="1" -"10"="delta" -"11"="elzm-rc2" -"12"="manuals" -"13"="test" -"14"="app" -"15"="thomas-traels" -"16"="340" -"17"="229" -"18"="scripts" -"19"="sel" -"20"="228" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Drive Special Settings] -"Floppy Automatic Refresh"=dword:00000001 -"Floppy Simple Icons"=dword:00000001 -"Removable Automatic Refresh"=dword:00000001 -"Removable Simple Icons"=dword:00000000 -"Fixed Automatic Refresh"=dword:00000001 -"Fixed Simple Icons"=dword:00000000 -"Remote Automatic Refresh"=dword:00000001 -"Remote Simple Icons"=dword:00000000 -"Remote Do Not Refresh on Activation"=dword:00000000 -"CDROM Automatic Refresh"=dword:00000001 -"CDROM Simple Icons"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Edit New History] -"1"="overview" -"2"="ex45.md" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\File List History] -"1"="$(FileName)$(CRLF)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Filter History] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Find Ignore] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Find Ignore\1] -"Path"="\\System Volume Information" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Find Ignore\2] -"Path"="Local Settings\\Temporary Internet Files" -"Enabled"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Find Options] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Grep History] -"1"="arduino-esp32" -"2"="espressif/arduino-esp32" -"3"="const char" -"4"="va_start" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Look In History] -"1"="C:\\Users\\zx\\Desktop\\osr\\products\\products\\sheetpress\\cassandra-edczmax-rc2" -"2"="C:\\Users\\zx\\Desktop\\osr\\products\\rosa" -"3"="C:\\Users\\zx\\Desktop\\osr\\products\\products\\sheetpress\\components" -"4"="C:\\Users\\zx\\Desktop\\osr\\products\\products\\sheetpress\\cassandra-edczmax-rc2\\cad" -"5"="C:\\Users\\zx\\Desktop\\polymech\\polymech-fw-apps" -"6"="C:\\Users\\zx\\.platformio" -"7"="C:\\Espressif\\frameworks\\esp-idf-v5.3.1\\examples" -"8"="C:\\Espressif" -"9"="C:\\Users\\zx\\Desktop\\osr\\products\\nc" -"10"="C:\\Users\\zx\\Desktop\\polymech\\polymech-fw-apps\\cassandra-rc2\\.pio\\libdeps\\waveshare\\eModbus\\src" -"11"="C:\\Users\\zx\\Desktop\\osr\\products\\products\\products\\poly-mech" -"12"="C:\\Program Files" -"13"="E:\\Users\\mc007\\Desktop" -"14"="E:\\Users\\mc007\\Desktop\\ph3\\temp" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Named History] -"1"="cover" -"2"="blank" -"3"="bracket" -"4"="inter" -"5"="bugs*" -"6"="xtensa-esp32s3-elf-stri" -"7"="platform.py" -"8"="*.sh" -"9"="*.*" -"10"="idf.py" -"11"="face" -"12"="docs.sh" -"13"="drawer" -"14"="drawers" -"15"="eDrawings.Interop.EModelViewControl.dll" -"16"="*.reg" -"17"="node_modules" -"18"="pio.exe" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Quick Rename History] -"1"="Global-650-Default-RC2.SLDASM" -"2"="gSPC-650-Default-RC2-Dual.SLDASM" -"3"="EDC-650-320_HG20-40_x6.dxf" -"4"="EDC-650-322_HG20-40Side_x12.dxf" -"5"="EDC-650-323_HG20-40Flange_x12.dxf" -"6"="EDC-650-324_HG20-40RodM_x6.dxf" -"7"="EDC-650-720_GroundPlate_x1.dxf" -"8"="EDC-650-450_FlexInterConnect_x8.dxf" -"9"="EDC-650-616_OutletPanelBlank_x2.dxf" -"10"="EDC-650-612_SidePanelBlank_x4.dxf" -"11"="EDC-650-612_SidePanel_x4.dxf" -"12"="EDC-650-610_FrontPanelBlank_x2.dxf" -"13"="EDC-650-610_FrontPanel_x2.dxf" -"14"="EDC-650-525_Belt_x2.dxf" -"15"="EDC-650-403_MountPlate_x4.dxf" -"16"="EDC-650-403_MountPlate_x.dxf" -"17"="laser_" -"18"="watermark.ts" -"19"="watermark-rm.ts" -"20"="DeltaTypesEx.h" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Select History] -"1"="*.png" -"2"="*.jpg" -"3"="*.arw" -"4"="*.jph" -"5"="*.jpw" -"6"="*.gz" -"7"="*.js" -"8"="*.lnk" -"9"="*.md" -"10"="*.x_t" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Viewer History] -"1"="pdf" -"2"="onFinished" -"3"="PlotBase::onFinished" -"4"="joystick" -"5"="src" -"6"="cassandra" -"7"="const char" -"8"="Exporteren naar CSV" -"9"="loop(" -"10"="mb_tcp_base_address" -"11"="getRegistersHandler" -"12"="signalplot" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Configuration\Working Directories] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Custom Colors] -"1"=dword:00ffffff -"2"=dword:00ffffff -"3"=dword:00ffffff -"4"=dword:00ffffff -"5"=dword:00ffffff -"6"=dword:00ffffff -"7"=dword:00ffffff -"8"=dword:00ffffff -"9"=dword:00ffffff -"10"=dword:00ffffff -"11"=dword:00ffffff -"12"=dword:00ffffff -"13"=dword:00ffffff -"14"=dword:00ffffff -"15"=dword:00ffffff -"16"=dword:00ffffff - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Default Directories] -"C"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\media\\src\\ref" -"G"="G:\\My Drive\\sec" -"E"="E:\\latest\\desktop\\osr" -"D"="D:\\DCIM\\100MSDCF" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Editors] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Editors\1] -"Masks"="*.*" -"Command"="notepad.exe" -"Arguments"="\"$(Name)\"" -"Initial Directory"="$(FullPath)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Find Dialog Window] -"Left"=dword:00000780 -"Right"=dword:0000093d -"Top"=dword:00000022 -"Bottom"=dword:000001f4 -"Show"=dword:00000003 -"Name Width"=dword:000000fa - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Hot Paths] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Hot Paths\10] -"Name"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\kbot" -"Path"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\kbot" -"Visible"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Hot Paths\11] -"Name"="C:\\Users\\zx\\Desktop\\polymech\\polymech-fw-apps" -"Path"="C:\\Users\\zx\\Desktop\\polymech\\polymech-fw-apps" -"Visible"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Hot Paths\12] -"Name"="C:\\Users\\zx\\Desktop\\osr\\products\\products\\products\\poly-mech" -"Path"="C:\\Users\\zx\\Desktop\\osr\\products\\products\\products\\poly-mech" -"Visible"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Hot Paths\2] -"Name"="C:\\Users\\zx\\Desktop" -"Path"="C:\\Users\\zx\\Desktop" -"Visible"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Hot Paths\3] -"Name"="C:\\Users\\zx\\Desktop\\polymech" -"Path"="C:\\Users\\zx\\Desktop\\polymech" -"Visible"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Hot Paths\5] -"Name"="C:\\Users\\zx\\Desktop\\osr\\products" -"Path"="C:\\Users\\zx\\Desktop\\osr\\products" -"Visible"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Hot Paths\8] -"Name"="C:\\Users\\zx\\Desktop\\polymech\\nordin-ex" -"Path"="C:\\Users\\zx\\Desktop\\polymech\\nordin-ex" -"Visible"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Hot Paths\9] -"Name"="C:\\Users\\zx\\Desktop\\osr" -"Path"="C:\\Users\\zx\\Desktop\\osr" -"Visible"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Left Panel] -"Header Line"=dword:00000001 -"Path"="C:\\Users\\zx\\Desktop\\polymech\\polymech-mono\\packages\\media\\src\\ref" -"View Type"=dword:00000002 -"Sort Type"=dword:00000000 -"Reverse Sort"=dword:00000000 -"Directory Line"=dword:00000001 -"Status Line"=dword:00000001 -"Enable Filter"=dword:00000000 -"Filter"="*.*" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers] -"Simple Icons In Archives"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\1] -"Extension List"="zip;pk3;jar" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:ffffffff -"Unpacker Index"=dword:ffffffff - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\10] -"Extension List"="7z" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:fffffffb -"Unpacker Index"=dword:fffffffb - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\11] -"Extension List"="ena" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:fffffff5 -"Unpacker Index"=dword:fffffff5 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\12] -"Extension List"="cab" -"Packer Supported"=dword:00000000 -"Packer Index"=dword:ffffffff -"Unpacker Index"=dword:ffffffea - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\13] -"Extension List"="ima" -"Packer Supported"=dword:00000000 -"Packer Index"=dword:ffffffff -"Unpacker Index"=dword:ffffffe7 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\14] -"Extension List"="iso;isz;nrg;bin;img;pdi;cdi;cif;ncd;c2d;mdf;dmg" -"Packer Supported"=dword:00000000 -"Packer Index"=dword:ffffffff -"Unpacker Index"=dword:ffffffe6 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\15] -"Extension List"="eml;b64;uue;xxe;hqx;ntx;cnm" -"Packer Supported"=dword:00000000 -"Packer Index"=dword:ffffffff -"Unpacker Index"=dword:ffffffe4 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\2] -"Extension List"="j" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:00000000 -"Unpacker Index"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\3] -"Extension List"="rar;r##" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:00000001 -"Unpacker Index"=dword:ffffffe3 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\4] -"Extension List"="arj;a##" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:00000009 -"Unpacker Index"=dword:ffffffeb - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\5] -"Extension List"="lzh;lha;lzs" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:00000003 -"Unpacker Index"=dword:ffffffe5 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\6] -"Extension List"="uc2" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:00000004 -"Unpacker Index"=dword:00000004 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\7] -"Extension List"="ace;c##" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:0000000a -"Unpacker Index"=dword:0000000a - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\8] -"Extension List"="pak" -"Packer Supported"=dword:00000001 -"Packer Index"=dword:fffffffd -"Unpacker Index"=dword:fffffffd - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Archive Association\9] -"Extension List"="tgz;tbz;taz;tar;gz;bz;bz2;z;rpm;cpio;deb" -"Packer Supported"=dword:00000000 -"Packer Index"=dword:ffffffff -"Unpacker Index"=dword:fffffffe - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers] -"Use Another Panel"=dword:00000000 -"Preffered"=dword:00000002 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\1] -"Type"=dword:fffffff5 -"Title"="Encrypt (Plugin)" -"Ext"="ena" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\10] -"Type"=dword:00000000 -"Title"="ARJ to 1.44MB volumes (External Win32, tested with v3.00c)" -"Ext"="arj" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Arj32bitExecutable)" -"Copy Arguments"="a -pav1440 \"$(ArchiveFullName)\" !\"$(ListFullName)\"" -"Support Move"=dword:00000001 -"Move Command"="$(Arj32bitExecutable)" -"Move Arguments"="m -pav1440 \"$(ArchiveFullName)\" !\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\11] -"Type"=dword:00000000 -"Title"="ACE (External Win32, tested with v1.2b)" -"Ext"="ace" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000001 -"Copy Command"="$(Ace32bitExecutable)" -"Copy Arguments"="a \"$(ArchiveFullName)\" @\"$(ListFullName)\"" -"Support Move"=dword:00000001 -"Move Command"="$(Ace32bitExecutable)" -"Move Arguments"="m \"$(ArchiveFullName)\" @\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\12] -"Type"=dword:00000000 -"Title"="ACE to 1.44MB volumes (External Win32, tested with v1.2b)" -"Ext"="ace" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000001 -"Copy Command"="$(Ace32bitExecutable)" -"Copy Arguments"="a -v1440 \"$(ArchiveFullName)\" @\"$(ListFullName)\"" -"Support Move"=dword:00000001 -"Move Command"="$(Ace32bitExecutable)" -"Move Arguments"="m -v1440 \"$(ArchiveFullName)\" @\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\13] -"Type"=dword:00000000 -"Title"="ARJ (External DOS, tested with v2.60)" -"Ext"="arj" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Arj16bitExecutable)" -"Copy Arguments"="a -pa $(ArchiveDOSFullName) !$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Arj16bitExecutable)" -"Move Arguments"="m -pa $(ArchiveDOSFullName) !$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\14] -"Type"=dword:00000000 -"Title"="ARJ to 1.44MB volumes (External DOS, tested with v2.60)" -"Ext"="arj" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Arj16bitExecutable)" -"Copy Arguments"="a -pav1440 $(ArchiveDOSFullName) !$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Arj16bitExecutable)" -"Move Arguments"="m -pav1440 $(ArchiveDOSFullName) !$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\15] -"Type"=dword:00000000 -"Title"="LHA (External DOS, tested with v2.55)" -"Ext"="lzh" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Lha16bitExecutable)" -"Copy Arguments"="a -m -p -a -l1 -x1 -c $(ArchiveDOSFullName) @$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Lha16bitExecutable)" -"Move Arguments"="m -m -p -a -l1 -x1 -c $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\16] -"Type"=dword:00000000 -"Title"="UC2 (External DOS, tested with v2r3PRO)" -"Ext"="uc2" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(UC216bitExecutable)" -"Copy Arguments"="A !SYSHID=ON ##\\ $(ArchiveDOSFullName) @$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(UC216bitExecutable)" -"Move Arguments"="AM !SYSHID=ON ##\\ $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\17] -"Type"=dword:00000000 -"Title"="ACE (External DOS, tested with v1.2b)" -"Ext"="ace" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Ace16bitExecutable)" -"Copy Arguments"="a $(ArchiveDOSFullName) @$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Ace16bitExecutable)" -"Move Arguments"="m $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\18] -"Type"=dword:00000000 -"Title"="ACE to 1.44MB volumes (External DOS, tested with v1.2b)" -"Ext"="ace" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Ace16bitExecutable)" -"Copy Arguments"="a -v1440 $(ArchiveDOSFullName) @$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Ace16bitExecutable)" -"Move Arguments"="m -v1440 $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\19] -"Type"=dword:00000000 -"Title"="JAR (External DOS, tested with v1.02)" -"Ext"="j" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Jar16bitExecutable)" -"Copy Arguments"="a $(ArchiveDOSFullName) !$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Jar16bitExecutable)" -"Move Arguments"="m $(ArchiveDOSFullName) !$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\2] -"Type"=dword:fffffffb -"Title"="7-Zip (Plugin)" -"Ext"="7z" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\20] -"Type"=dword:00000000 -"Title"="JAR to 1.44MB volumes (External DOS, tested with v1.02)" -"Ext"="j" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Jar16bitExecutable)" -"Copy Arguments"="a -v1440 $(ArchiveDOSFullName) !$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Jar16bitExecutable)" -"Move Arguments"="m -v1440 $(ArchiveDOSFullName) !$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\21] -"Type"=dword:00000000 -"Title"="RAR (External DOS, tested with v2.50)" -"Ext"="rar" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Rar16bitExecutable)" -"Copy Arguments"="a $(ArchiveDOSFullName) @$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Rar16bitExecutable)" -"Move Arguments"="m $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\22] -"Type"=dword:00000000 -"Title"="RAR to 1.44MB volumes (External DOS, tested with v2.50)" -"Ext"="rar" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Rar16bitExecutable)" -"Copy Arguments"="a -v1440 $(ArchiveDOSFullName) @$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Rar16bitExecutable)" -"Move Arguments"="m -v1440 $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\23] -"Type"=dword:00000000 -"Title"="PKZIP (External Win32, tested with v2.50)" -"Ext"="zip" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000001 -"Copy Command"="$(Zip32bitExecutable)" -"Copy Arguments"="-add -nozipextension -path -attr \"$(ArchiveFullName)\" @\"$(ListFullName)\"" -"Support Move"=dword:00000001 -"Move Command"="$(Zip32bitExecutable)" -"Move Arguments"="-add -nozipextension -move -path -attr \"$(ArchiveFullName)\" @\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\24] -"Type"=dword:00000000 -"Title"="PKZIP (External DOS, tested with v2.04g)" -"Ext"="zip" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Zip16bitExecutable)" -"Copy Arguments"="-P -whs $(ArchiveDOSFullName) @$(ListDOSFullName)" -"Support Move"=dword:00000001 -"Move Command"="$(Zip16bitExecutable)" -"Move Arguments"="-m -P -whs $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\3] -"Type"=dword:ffffffff -"Title"="ZIP (Plugin)" -"Ext"="zip" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\4] -"Type"=dword:fffffffd -"Title"="PAK (Plugin)" -"Ext"="pak" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\5] -"Type"=dword:00000000 -"Title"="JAR (External Win32, tested with v1.02)" -"Ext"="j" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Jar32bitExecutable)" -"Copy Arguments"="a \"$(ArchiveFullName)\" !\"$(ListFullName)\"" -"Support Move"=dword:00000001 -"Move Command"="$(Jar32bitExecutable)" -"Move Arguments"="m \"$(ArchiveFullName)\" !\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\6] -"Type"=dword:00000000 -"Title"="JAR to 1.44MB volumes (External Win32, tested with v1.02)" -"Ext"="j" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Jar32bitExecutable)" -"Copy Arguments"="a -v1440 \"$(ArchiveFullName)\" !\"$(ListFullName)\"" -"Support Move"=dword:00000001 -"Move Command"="$(Jar32bitExecutable)" -"Move Arguments"="m -v1440 \"$(ArchiveFullName)\" !\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\7] -"Type"=dword:00000000 -"Title"="RAR (External Win32, tested with v2.50)" -"Ext"="rar" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Rar32bitExecutable)" -"Copy Arguments"="a -scol \"$(ArchiveFullName)\" @\"$(ListFullName)\"" -"Support Move"=dword:00000001 -"Move Command"="$(Rar32bitExecutable)" -"Move Arguments"="m -scol \"$(ArchiveFullName)\" @\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\8] -"Type"=dword:00000000 -"Title"="RAR to 1.44MB volumes (External Win32, tested with v2.50)" -"Ext"="rar" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Rar32bitExecutable)" -"Copy Arguments"="a -scol -v1440 \"$(ArchiveFullName)\" @\"$(ListFullName)\"" -"Support Move"=dword:00000001 -"Move Command"="$(Rar32bitExecutable)" -"Move Arguments"="m -scol -v1440 \"$(ArchiveFullName)\" @\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Packers\9] -"Type"=dword:00000000 -"Title"="ARJ (External Win32, tested with v3.00c)" -"Ext"="arj" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000000 -"Copy Command"="$(Arj32bitExecutable)" -"Copy Arguments"="a -pa \"$(ArchiveFullName)\" !\"$(ListFullName)\"" -"Support Move"=dword:00000001 -"Move Command"="$(Arj32bitExecutable)" -"Move Arguments"="m -pa \"$(ArchiveFullName)\" !\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers] -"Use Another Panel"=dword:00000000 -"Use Subdir Name By Archive"=dword:00000000 -"Preffered"=dword:0000000a - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\1] -"Type"=dword:ffffffe3 -"Title"="UnRAR (Plugin)" -"Ext"="*.rar;*.r##" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\10] -"Type"=dword:fffffffb -"Title"="7-Zip (Plugin)" -"Ext"="*.7z" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\11] -"Type"=dword:ffffffff -"Title"="ZIP (Plugin)" -"Ext"="*.zip;*.pk3;*.jar" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\12] -"Type"=dword:fffffffd -"Title"="PAK (Plugin)" -"Ext"="*.pak" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\13] -"Type"=dword:fffffffe -"Title"="TAR (Plugin)" -"Ext"="*.tar;*.tgz;*.tbz;*.taz;*.tar.gz;*.tar.bz;*.tar.bz2;*.tar.z;*_tar.gz;*_tar.bz;*_tar.bz2;*_tar.z;*_tar_gz;*_tar_bz;*_tar_bz2;*_tar_z;*.tar_gz;*.tar_bz;*.tar_bz2;*.tar_z;*.gz;*.bz;*.bz2;*.z;*.rpm;*.cpio;*.deb" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\14] -"Type"=dword:00000000 -"Title"="JAR (External Win32, tested with v1.02)" -"Ext"="*.j" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(Jar32bitExecutable)" -"Extract Arguments"="x -jyc \"$(ArchiveFullName)\" !\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\15] -"Type"=dword:00000000 -"Title"="RAR (External Win32, tested with v2.50)" -"Ext"="*.rar" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(Rar32bitExecutable)" -"Extract Arguments"="x -scol \"$(ArchiveFullName)\" @\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\16] -"Type"=dword:00000000 -"Title"="ARJ (External Win32, tested with v3.00c)" -"Ext"="*.arj" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(Arj32bitExecutable)" -"Extract Arguments"="x -va -jyc \"$(ArchiveFullName)\" !\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\17] -"Type"=dword:00000000 -"Title"="ACE (External Win32, tested with v1.2b)" -"Ext"="*.ace" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000001 -"Extract Command"="$(Ace32bitExecutable)" -"Extract Arguments"="x \"$(ArchiveFullName)\" @\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\18] -"Type"=dword:00000000 -"Title"="ARJ (External DOS, tested with v2.60)" -"Ext"="*.arj" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(Arj16bitExecutable)" -"Extract Arguments"="x -va -jyc $(ArchiveDOSFullName) !$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\19] -"Type"=dword:00000000 -"Title"="LHA (External DOS, tested with v2.55)" -"Ext"="*.lzh" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(Lha16bitExecutable)" -"Extract Arguments"="x -a -l1 -c $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\2] -"Type"=dword:ffffffe4 -"Title"="UnMIME (Plugin)" -"Ext"="*.eml;*.b64;*.uue;*.xxe;*.hqx;*.ntx;*.cnm" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\20] -"Type"=dword:00000000 -"Title"="UC2 (External DOS, tested with v2r3PRO)" -"Ext"="*.uc2" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(UC216bitExecutable)" -"Extract Arguments"="ESF $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\21] -"Type"=dword:00000000 -"Title"="ACE (External DOS, tested with v1.2b)" -"Ext"="*.ace" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(Ace16bitExecutable)" -"Extract Arguments"="x $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\22] -"Type"=dword:00000000 -"Title"="JAR (External DOS, tested with v1.02)" -"Ext"="*.j" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(Jar16bitExecutable)" -"Extract Arguments"="x -jyc $(ArchiveDOSFullName) !$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\23] -"Type"=dword:00000000 -"Title"="RAR (External DOS, tested with v2.50)" -"Ext"="*.rar" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(Rar16bitExecutable)" -"Extract Arguments"="x $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\24] -"Type"=dword:00000000 -"Title"="PKZIP (External Win32, tested with v2.50)" -"Ext"="*.zip;*.pk3;*.jar" -"Support Long Names"=dword:00000001 -"Need ANSI List"=dword:00000001 -"Extract Command"="$(Zip32bitExecutable)" -"Extract Arguments"="-ext -nozipextension -directories -path \"$(ArchiveFullName)\" @\"$(ListFullName)\"" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\25] -"Type"=dword:00000000 -"Title"="PKUNZIP (External DOS, tested with v2.04g)" -"Ext"="*.zip" -"Support Long Names"=dword:00000000 -"Need ANSI List"=dword:00000000 -"Extract Command"="$(Unzip16bitExecutable)" -"Extract Arguments"="-d -Jhrs $(ArchiveDOSFullName) @$(ListDOSFullName)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\3] -"Type"=dword:ffffffe5 -"Title"="UnLHA (Plugin)" -"Ext"="*.lzh;*.lha;*.lzs" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\4] -"Type"=dword:ffffffe6 -"Title"="UnISO (Plugin)" -"Ext"="*.iso;*.isz;*.nrg;*.bin;*.img;*.pdi;*.cdi;*.cif;*.ncd;*.c2d;*.mdf;*.dmg" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\5] -"Type"=dword:ffffffe7 -"Title"="UnFAT (Plugin)" -"Ext"="*.ima" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\6] -"Type"=dword:ffffffe9 -"Title"="UnCHM (Plugin)" -"Ext"="*.chm" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\7] -"Type"=dword:ffffffea -"Title"="UnCAB (Plugin)" -"Ext"="*.cab" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\8] -"Type"=dword:ffffffeb -"Title"="UnARJ (Plugin)" -"Ext"="*.arj;*.a##" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Custom Unpackers\9] -"Type"=dword:fffffff5 -"Title"="Decrypt (Plugin)" -"Ext"="*.ena" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\1] -"Packer UID"=dword:00000001 -"Packer Executable"="jar32" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\10] -"Packer UID"=dword:0000000a -"Packer Executable"="arj32" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\11] -"Packer UID"=dword:0000000b -"Packer Executable"="ace32" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\12] -"Packer UID"=dword:0000000c -"Packer Executable"="ace" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\2] -"Packer UID"=dword:00000002 -"Packer Executable"="rar" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\3] -"Packer UID"=dword:00000003 -"Packer Executable"="arj" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\4] -"Packer UID"=dword:00000004 -"Packer Executable"="lha" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\5] -"Packer UID"=dword:00000005 -"Packer Executable"="uc" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\6] -"Packer UID"=dword:00000006 -"Packer Executable"="jar16" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\7] -"Packer UID"=dword:00000007 -"Packer Executable"="rar" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\8] -"Packer UID"=dword:00000008 -"Packer Executable"="pkzip25" -"Use Packer Executable To Unpack"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Packers & Unpackers\Predefined Packers\9] -"Packer UID"=dword:00000009 -"Packer Executable"="pkzip" -"Use Packer Executable To Unpack"=dword:00000000 -"Unpacker Executable"="pkunzip" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Password Manager] -"Use Master Password"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\1] -"Name"="ZIP" -"DLL"="zip\\zip.spl" -"Version"="1.39" -"Copyright"="Copyright © 1999-2019 ALTAP" -"Extensions"="zip;pk3;pk4;jar" -"Description"="Create, browse, and extract ZIP archives." -"Configuration Key"="ZIP" -"FS Name"="" -"Functions"=dword:0000003f -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,b5,49,44,41,54,78,9c,95,\ - 92,cb,11,c5,20,08,00,39,d8,51,7a,b2,8e,77,b2,07,7b,a2,20,6f,bc,48,40,fc,11,\ - 27,71,f6,90,51,17,10,80,c0,16,00,91,c7,78,e6,c7,f0,ff,b0,91,1f,2e,34,a2,10,\ - 42,20,3d,87,44,8e,40,cc,33,b7,b3,49,66,20,a5,44,1e,16,f5,91,54,50,b8,44,c8,\ - 82,52,0a,d9,27,47,11,9a,40,25,5b,54,10,23,0c,cc,82,be,d4,e1,0d,2c,03,8b,5c,\ - c1,bc,0a,dc,37,a8,17,e7,0c,76,02,37,83,3e,7a,bd,58,c9,71,14,ec,a2,73,06,de,\ - 86,a2,97,fb,0e,68,17,f8,11,4f,11,f4,72,44,67,4e,7a,c1,db,24,b6,9a,bd,49,7c,\ - ed,b5,1c,3e,0a,4e,8b,33,ec,47,3e,2f,4d,3a,08,c0,4a,d3,2c,3e,0a,d6,d2,fe,62,\ - 31,12,86,9c,44,db,ed,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\1\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\1\Menu\1] -"State"=dword:ffffffff -"ID"=dword:00000004 -"Name"="Archive &Comment..." -"Skill"=dword:00000006 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\1\Menu\2] -"State"=dword:ffffffff -"ID"=dword:00000001 -"Name"="Create &Self-Extracting Archive (.exe)..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\1\Menu\3] -"State"=dword:ffffffff -"ID"=dword:00000003 -"Name"="&Test Archive" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\10] -"Name"="DiskMap" -"DLL"="diskmap\\diskmap.spl" -"Version"="1.12" -"Copyright"="Copyright © 2009-2019 Ondrej Zarevucky" -"Extensions"="" -"Description"="Displays a treemap of files on your disk." -"Configuration Key"="DISKMAP" -"FS Name"="" -"Functions"=dword:00000020 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,02,97,49,44,41,54,78,9c,cd,\ - 92,5b,48,d3,01,14,c6,67,d0,05,22,88,c8,85,3e,29,b8,9c,36,a5,87,c8,a9,69,b6,\ - 09,41,9a,97,6d,48,3d,09,5d,24,7a,70,8a,58,e1,2a,73,2d,72,cb,bc,ad,bf,53,4c,\ - c1,9c,b7,4d,ff,db,6c,ba,72,ae,bc,ce,91,4e,b7,a1,2e,97,8e,a6,a1,91,90,37,34,\ - 93,dc,d7,ac,a7,1e,5a,d1,53,07,0e,9c,87,f3,fd,0e,df,e1,a3,50,fe,cb,0a,0c,08,\ - 08,64,46,c7,5e,8b,3f,7b,ee,26,33,32,ea,a2,bf,9f,df,fe,bf,12,06,07,07,fb,24,\ - 27,27,27,de,93,91,43,43,8e,4f,b6,b7,0b,eb,53,7d,36,97,5d,f4,e8,89,81,4a,f5,\ - f5,ff,23,e0,74,4c,4c,40,81,b4,fe,b5,d0,b0,2d,9e,5b,82,65,6a,11,a6,21,17,ba,\ - 5a,ad,1b,ca,ec,1b,02,22,3e,9e,bd,cf,2b,20,ee,54,64,84,b0,75,aa,e6,6e,17,6e,\ - 69,ed,28,57,4f,a0,b4,67,06,f2,37,73,d0,88,2a,c9,e7,c7,c3,c3,82,bc,02,42,8e,\ - 06,45,8a,3b,e6,8a,f8,ed,6e,8e,6d,7e,5b,3a,ee,5a,79,65,76,ae,f6,0f,4c,af,6b,\ - f3,2b,3b,3a,ce,27,24,84,f1,78,bc,df,03,a8,be,87,8f,3c,ac,52,92,8f,d5,13,d5,\ - 26,db,cc,82,6d,ea,fd,b7,97,bd,23,ee,be,f1,f9,ad,c2,62,62,43,a9,54,f6,a9,48,\ - 55,55,5a,5a,5a,26,87,c3,89,0b,09,a1,ff,14,32,18,c7,0e,89,ee,0b,af,77,77,77,\ - 19,09,82,d8,9a,98,fe,80,d5,f5,af,f8,bc,b2,86,99,8f,cb,68,52,bf,40,6d,6d,0d,\ - cc,66,33,74,3a,1d,46,46,86,61,b7,4f,2e,31,99,27,69,94,f6,76,ad,54,a5,22,bf,\ - 58,ad,16,f7,cc,3b,07,9e,d5,c9,91,9d,95,85,d2,32,29,9e,c8,9e,42,5c,54,82,92,\ - d2,72,b4,28,db,d0,a2,50,62,74,6c,0c,93,93,13,d0,68,34,6e,36,9b,1d,47,91,cb,\ - 9b,36,4d,a6,51,0c,f4,0f,43,d1,4c,22,2f,ef,36,2a,08,19,14,2d,cd,d0,a8,d5,3b,\ - 8b,d0,eb,f5,70,38,1c,70,3a,9d,50,28,14,90,48,24,db,19,19,19,a6,d4,d4,d4,13,\ - 94,c6,46,c5,42,4f,af,11,9d,5a,3d,08,a2,02,24,d9,09,97,6b,09,46,a3,05,d5,f2,\ - 2a,48,8a,0b,31,eb,9a,85,ae,53,07,b1,58,8c,dc,dc,dc,55,8f,7f,31,8b,c5,f2,fb,\ - e1,3f,22,82,c9,a8,af,6b,5a,24,db,48,37,9f,9f,b3,69,30,0c,c2,32,e6,80,71,d0,\ - 0a,49,5b,0e,12,0b,c2,51,5e,56,06,81,40,b0,9d,9e,9e,6e,e2,72,b9,31,54,2a,75,\ - cf,2f,df,67,9d,61,e7,d3,68,34,82,4e,a7,47,f1,33,b3,b2,1f,88,0a,1b,1a,1b,5a,\ - e7,65,b5,c4,da,a5,9c,0b,10,89,44,cb,9e,84,0a,3d,57,0f,7a,8b,c1,5e,4f,fb,ec,\ - 0c,a1,a1,a1,bb,92,92,92,0e,70,b9,bc,e8,2b,97,af,de,49,49,49,89,65,30,18,bb,\ - bd,86,e8,5f,eb,3b,83,2c,62,74,1c,e9,7f,b9,00,00,00,00,49,45,4e,44,ae,42,60,\ - 82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\10\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\10\Menu\1] -"State"=dword:00010002 -"ID"=dword:00000001 -"Name"="Show &DiskMap" -"HotKey"=dword:00000344 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11] -"Name"="Encrypt & Decrypt" -"DLL"="encrypt\\encrypt.spl" -"Version"="1.11" -"Copyright"="Copyright © 2003-2019 ALTAP" -"Extensions"="ena" -"Description"="Strong file encryption and decryption, secure files shredding." -"Configuration Key"="Encrypt & Decrypt" -"FS Name"="" -"Functions"=dword:0000003f -"Load On Start"=dword:00000001 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,7b,49,44,41,54,78,9c,dd,\ - 92,db,09,c0,30,08,45,fd,c8,ac,1d,29,e0,36,0e,e0,4e,b6,5a,84,3c,54,4a,bf,4a,\ - 13,2e,42,d0,e3,45,03,02,f1,6d,ad,c9,a8,2c,2f,2d,d6,c3,cc,d2,7b,37,65,90,b0,\ - 98,88,ac,d8,bb,57,90,10,b0,26,47,6f,1f,05,ac,93,cf,14,02,7c,f2,d7,ec,07,e1,\ - 2c,06,61,84,09,b2,59,d7,0d,b8,dd,71,0b,78,80,01,34,a6,80,bb,ab,94,0e,4a,c0,\ - 6f,1c,b0,25,66,2a,01,ba,a2,27,0a,01,6f,3f,d2,09,c9,ee,12,5c,52,7c,70,e1,00,\ - 00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\1] -"State"=dword:01b00002 -"ID"=dword:00000001 -"Name"="&Encrypt..." -"HotKey"=dword:00000345 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\10] -"State"=dword:00010002 -"ID"=dword:00000004 -"Name"="Clean Disk &Free Space..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\2] -"State"=dword:20000001 -"ID"=dword:00000002 -"Name"="&Decrypt Archive..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\3] -"State"=dword:00010002 -"ID"=dword:00000007 -"Name"="Create a &Key..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\4] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\5] -"State"=dword:20040001 -"ID"=dword:00000005 -"Name"="Change Archive &Password or Key..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\6] -"State"=dword:00010012 -"ID"=dword:00000008 -"Name"="Change Key Pass&word..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\7] -"State"=dword:00010012 -"ID"=dword:00000006 -"Name"="Change Archive or Key &Comment..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\8] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\11\Menu\9] -"State"=dword:01b00002 -"ID"=dword:00000003 -"Name"="&Shred Files..." -"HotKey"=dword:00000353 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\12] -"Name"="File Comparator" -"DLL"="filecomp\\filecomp.spl" -"Version"="1.19" -"Copyright"="Copyright © 2000-2019 ALTAP" -"Extensions"="" -"Description"="Visual comparison of two text or binary files." -"Configuration Key"="File Comparator" -"FS Name"="" -"Functions"=dword:00000030 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,84,49,44,41,54,78,9c,a5,\ - 93,d1,0d,80,20,0c,44,f9,60,23,77,72,94,ee,c0,4e,ec,84,50,6d,02,e5,0a,25,42,\ - 2e,31,35,3c,ef,45,0d,25,fc,db,70,48,44,05,e5,08,a0,57,9b,c5,18,27,88,13,90,\ - 8a,cc,34,64,0d,a8,b7,39,df,c1,3e,03,c0,74,ae,4f,96,06,6d,e5,9c,39,10,60,3b,\ - 87,21,4e,80,72,ee,9a,2c,01,d7,fd,06,3b,bb,1a,d8,ce,72,bd,00,24,ad,cb,91,03,\ - db,b7,80,1a,20,67,f8,21,79,1a,6c,01,bd,a3,ce,16,80,1c,2d,67,d7,bf,70,b2,1f,\ - 94,75,57,fb,32,b4,09,6f,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\12\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\12\Menu\1] -"State"=dword:00020000 -"ID"=dword:00000001 -"Name"="Compare Files..." -"HotKey"=dword:00000343 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13] -"Name"="FTP Client" -"DLL"="ftp\\ftp.spl" -"Version"="1.35" -"Copyright"="Copyright © 2002-2019 ALTAP" -"Extensions"="" -"Description"="Transfer files and directories over FTP." -"Configuration Key"="FTP" -"FS Name"="ftp:ftps" -"Functions"=dword:000000b0 -"FS Cmd Name"="/ FTP Client" -"FS Cmd Icon"=dword:00000000 -"Uses Password Manager"=dword:00000001 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,b5,49,44,41,54,78,9c,ad,\ - 92,d1,0d,c5,20,08,45,f9,f0,d3,6d,dc,c9,39,de,1a,dd,89,9d,68,11,11,b0,b5,a9,\ - c9,93,dc,0f,09,f7,40,50,20,78,8e,72,00,79,ad,ea,96,46,3e,05,8b,88,73,95,9a,\ - 5e,01,6a,c4,1e,66,36,c0,0c,79,34,8f,ce,55,cc,70,50,00,00,fc,28,00,56,66,36,\ - 36,33,46,00,2b,e7,4c,06,68,c9,3e,ea,e8,dc,8d,48,61,02,60,f0,a5,94,92,00,38,\ - 89,bc,30,d2,42,31,6b,e7,d9,ac,7b,51,88,01,fa,f6,c7,c8,ae,3b,17,fb,a5,fa,29,\ - 6e,cf,06,35,42,56,e6,00,d0,67,e3,c4,ae,ec,f3,50,95,c5,b8,f3,e5,1e,7e,9f,16,\ - cc,5d,7c,ce,83,06,40,21,be,c3,1b,e0,36,81,c6,ce,04,61,07,7f,05,ec,ea,04,5b,\ - 0f,17,29,cb,4e,cb,63,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\1] -"State"=dword:00010001 -"ID"=dword:00000001 -"Name"="&Connect to FTP Server..." -"HotKey"=dword:00000346 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\10] -"State"=dword:ffffffff -"ID"=dword:0000000c -"Name"="&Binary" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\11] -"Type"=dword:00000002 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\12] -"State"=dword:00080001 -"ID"=dword:0000000d -"Name"="&Refresh" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\13] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\14] -"State"=dword:00080001 -"ID"=dword:00000003 -"Name"="&Add Bookmark..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\15] -"State"=dword:00080001 -"ID"=dword:00000006 -"Name"="&Send FTP Command..." -"Skill"=dword:00000006 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\16] -"State"=dword:00080001 -"ID"=dword:00000009 -"Name"="S&how Raw Listing..." -"Skill"=dword:00000004 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\17] -"State"=dword:ffffffff -"ID"=dword:00000014 -"Name"="L&ist Hidden Files and Directories (Unix)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\2] -"State"=dword:00010001 -"ID"=dword:00000007 -"Name"="&Organize Bookmarks..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\3] -"State"=dword:00010001 -"ID"=dword:00000005 -"Name"="Show &Logs..." -"Skill"=dword:00000006 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\4] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\5] -"State"=dword:00010001 -"ID"=dword:00000012 -"Name"="&Disconnect... F12" -"HotKey"=dword:00020000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\6] -"State"=dword:ffffffff -"ID"=dword:00000018 -"Name"="Sho&w Certificate..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\7] -"State"=dword:00080001 -"ID"=dword:00000015 -"Name"="&Transfer Mode" -"Type"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\8] -"State"=dword:ffffffff -"ID"=dword:0000000a -"Name"="&Automatic" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\13\Menu\9] -"State"=dword:ffffffff -"ID"=dword:0000000b -"Name"="A&SCII" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\14] -"Name"="Multimedia Viewer" -"DLL"="mmviewer\\mmviewer.spl" -"Version"="1.16" -"Copyright"="Copyright © 2003-2019 ALTAP & Tomas Jelinek (tomas@tjelinek.com)" -"Extensions"="" -"Description"="Display information about multimedia files such as MP3, OGG, WAV, etc." -"Configuration Key"="MMVIEWER" -"FS Name"="" -"Functions"=dword:00000060 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,69,49,44,41,54,78,9c,bd,\ - d2,51,0a,c0,20,0c,03,d0,1e,3d,47,eb,cd,1c,9d,08,a5,1a,96,fa,b1,4a,60,a0,3e,\ - 82,cc,86,cd,05,60,28,59,e7,d7,b2,0c,7c,8d,bb,6f,48,1b,88,c9,08,05,60,78,93,\ - c7,e2,78,8a,04,9c,a0,68,22,01,ac,49,0b,a8,df,ff,00,b5,76,0b,38,3d,dc,15,c0,\ - da,c8,6f,c0,da,5c,01,75,64,80,0d,05,62,43,cd,06,d4,ff,5c,49,dc,7b,00,e8,a1,\ - cb,89,a2,3f,7c,27,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\14\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\14\Menu\1] -"State"=dword:ffffffff -"ID"=dword:00000001 -"Name"="Export Info into &HTML..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\15] -"Name"="Network" -"DLL"="nethood\\nethood.spl" -"Version"="1.08" -"Copyright"="Copyright © 2008-2019 ALTAP" -"Extensions"="" -"Description"="Provides access to computers on the network." -"Configuration Key"="nethood" -"FS Name"="net" -"Functions"=dword:000000b0 -"FS Cmd Name"=", Network" -"FS Cmd Icon"=dword:00000000 -"Is Nethood"=dword:00000001 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,02,de,49,44,41,54,78,9c,ad,\ - 93,49,4c,93,51,14,85,bb,31,e2,80,14,04,64,b0,65,92,c1,28,76,e1,42,37,86,a8,\ - 89,91,80,11,08,2a,46,8d,10,22,06,63,20,46,a3,21,04,28,16,cb,50,a0,0c,65,28,\ - 14,a1,02,45,28,50,64,1e,84,0a,54,a0,14,fa,53,40,26,a5,05,04,8d,90,c8,b0,50,\ - e3,e2,1d,7f,9a,28,ac,60,e3,4d,ee,ee,7e,e7,9e,f3,6e,1e,83,41,57,ab,fe,1b,a7,\ - 79,76,a9,58,32,ac,5f,f5,97,28,11,51,a5,32,14,a8,c6,e3,38,91,42,26,63,b7,6a,\ - fa,b8,e0,d7,f7,65,05,5d,8b,eb,68,9d,5f,43,88,5c,4b,2e,8b,da,49,da,5b,0a,01,\ - c9,af,28,ce,dd,b8,9d,45,64,e3,9f,0d,5d,4b,1b,e0,a9,97,11,54,37,8b,80,0a,1d,\ - f1,29,e8,46,60,5e,33,a9,d6,7d,42,a5,6e,9a,bb,a3,00,ff,fd,1c,1e,77,7f,c5,ed,\ - 96,25,dc,ac,37,20,b0,72,0c,be,92,5e,5c,14,28,40,ad,ac,43,a4,d2,c2,39,a5,00,\ - 4e,89,62,38,24,e4,83,fd,3c,1f,ac,d8,5c,d8,47,e7,c0,2e,4a,a4,64,84,d6,4f,21,\ - bc,6d,0e,21,2d,f3,b8,51,3b,03,ff,72,0a,3e,62,25,ce,27,c9,91,a3,a4,c0,ab,ed,\ - c0,a9,ae,19,9c,ec,98,c6,f1,a6,49,e2,51,3f,01,b7,9a,71,1c,a3,17,d9,3c,c9,02,\ - c3,4f,3a,68,78,b7,b8,86,91,ef,bf,c0,ed,36,c0,b7,48,85,4b,59,cd,38,17,2f,c5,\ - e9,88,14,78,84,c5,e2,44,cb,14,3c,1a,68,50,31,4e,5c,e5,63,70,96,8d,12,a7,d2,\ - 11,58,45,64,10,86,77,5e,27,b7,68,48,8f,e9,8d,9f,d0,ff,f8,0d,89,46,0f,ef,d4,\ - 6a,9c,7d,2a,82,67,68,0c,dc,78,25,f0,78,33,01,d7,ea,31,e2,f2,7a,14,4e,65,3a,\ - 38,14,53,84,2d,d1,c2,f2,81,10,0c,2f,a1,82,79,41,50,43,35,4e,2f,60,68,79,15,\ - a5,ea,49,9c,a1,61,ce,fd,78,b8,d1,ed,5a,31,4c,db,1d,25,f4,56,38,49,47,c0,2e,\ - d2,92,a3,e2,61,d8,e7,0c,c1,fc,5e,1a,8c,0f,e9,15,57,cc,8c,6e,ee,41,a4,ac,cd,\ - 68,db,33,22,19,ee,09,a5,70,29,d3,c0,a5,62,14,8e,34,e8,f0,52,0b,56,a1,16,f6,\ - b9,43,b0,cd,d2,e0,48,9a,1a,87,82,05,f8,77,0d,16,37,8f,d0,39,89,bb,e2,03,e8,\ - 9c,84,06,e9,9c,46,bb,7f,41,62,97,ad,81,8d,70,10,d6,82,01,62,99,d8,0f,d3,5b,\ - 29,5b,02,f4,59,c8,b6,9c,c4,b1,84,c2,66,4e,16,6d,d7,4e,b4,09,aa,89,75,ea,00,\ - 36,41,0b,5e,1f,98,dc,5e,b2,ff,7a,d2,96,80,ed,b3,6c,38,97,eb,8c,76,d9,45,14,\ - 61,89,b5,b0,cb,d1,10,db,cc,41,a3,5d,ab,e4,7e,72,f8,45,1f,cc,b9,2a,98,c5,f4,\ - c2,34,aa,07,26,fe,fc,2d,01,eb,47,99,4a,eb,c8,4c,58,3e,14,e2,70,78,3a,b1,08,\ - 4b,07,33,34,95,98,05,a7,c2,f4,4e,0a,0e,d2,76,0f,04,25,63,df,b5,44,62,12,c0,\ - c7,de,ab,7c,ec,b9,92,a0,dc,f5,af,48,ab,1a,b0,d9,bb,0e,fe,57,81,c6,ae,01,43,\ - 5d,7b,2f,e4,8d,9d,90,29,5a,20,ad,ac,47,61,59,35,72,8b,65,c8,10,97,e8,b7,cf,\ - fe,01,21,11,e3,36,87,84,b0,90,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\16] -"Name"="Portable Executable Viewer" -"DLL"="peviewer\\peviewer.spl" -"Version"="3.0" -"Copyright"="Copyright © 2001-2019 ALTAP" -"Extensions"="" -"Description"="Display information about Portable Executable files such as EXE, DLL, etc." -"Configuration Key"="PEVIEWER" -"FS Name"="" -"Functions"=dword:00000070 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\17] -"Name"="PictView" -"DLL"="pictview\\pictview.spl" -"Version"="2.13" -"Copyright"="Copyright © 2000-2019 ALTAP & Jan Patera" -"Extensions"="" -"Description"="Fast image viewer and converter." -"Configuration Key"="PictView" -"FS Name"="" -"Functions"=dword:00000070 -"HomePage"="www.pictview.com/salamander" -"ThumbnailMasks"="*.mng;*.dtx;*.dds;*.nef;*.crw;*.eps;*.ept;*.ai;*.raf;*.mov;*.hpi;*.pntg;*.thumb;*.tiff;*.wbmp;*.mbm;*.ani;*.psp*;*.clk;*.thm;*.zno;*.st;*.cals;*.itiff;*.jfif;*.jpeg;*.macp;*.mpnt;*.paint;*.pict;*.2bp;*.stw;*.sun;*.tga;*.tif;*.udi;*.web;*.wpg;*.xar;*.zbr;*.zmf;*.bw;*.psd;*.pyx;*.qfx;*.ras;*.rgb;*.rle;*.sam;*.scx;*.sep;*.sgi;*.ska;*.pat;*.pbm;*.pc2;*.pcd;*.pct;*.pcx;*.pgm;*.pic;*.png;*.pnm;*.ppm;*.jff;*.jif;*.jmx;*.jpe;*.jpg;*.lbm;*.mac;*.mil;*.msp;*.ofx;*.pan;*.flc;*.fli;*.gem;*.gif;*.ham;*.hmr;*.hrz;*.icn;*.ico;*.iff;*.img;*.cdt;*.cel;*.clp;*.cit;*.cmx;*.cot;*.cpt;*.cur;*.cut;*.dcx;*.dib;*.82i;*.83i;*.85i;*.86i;*.89i;*.92i;*.awd;*.bmi;*.bmp;*.cal;*.cdr;*.arw;*.blp;*.cr2;*.dng;*.orf;*.pef" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,01,13,49,44,41,54,78,9c,a5,\ - 53,cb,0d,c3,30,08,65,9d,9c,99,23,c7,ac,c0,1c,de,a1,27,16,ea,89,73,d7,e8,08,\ - 94,07,49,e4,b8,49,5b,a9,8a,9e,c2,f7,19,30,26,11,f6,d6,c8,97,65,71,a7,fa,60,\ - 03,ae,74,c4,22,07,36,82,00,8f,19,b9,6a,c1,ad,70,a5,23,16,39,c8,a5,79,9e,d3,\ - c9,c1,c6,aa,09,02,5a,73,65,49,b0,94,be,f9,11,8b,1c,e4,66,49,60,cd,a4,e4,75,\ - 67,b7,38,09,8a,fa,83,6e,ce,e6,bb,2f,11,ce,ac,2c,d2,76,02,5e,09,e2,4c,77,38,\ - 15,25,36,17,9c,68,72,20,e0,9e,20,87,03,29,82,47,02,8a,32,45,a3,1e,ae,ff,4e,\ - 12,b1,90,72,88,23,41,91,c4,d4,6d,25,10,fa,4c,30,b6,50,c0,20,39,09,28,7d,5c,\ - b6,b3,16,4e,09,30,34,1a,f0,eb,0c,76,48,97,2c,c3,2d,7c,9b,c1,69,05,86,d9,d8,\ - 8f,33,d0,77,02,11,f3,e7,e3,1e,24,17,7b,90,15,58,57,41,d7,02,47,91,6a,16,37,\ - 63,e5,c3,96,6e,04,b9,ca,21,4d,d3,54,eb,9c,7d,65,6f,91,18,4b,14,ab,2c,90,57,\ - 7b,c6,70,b7,ca,a7,8f,69,bb,cc,0b,fd,f0,98,fe,7d,ce,2f,84,62,5c,36,ab,ee,03,\ - f6,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\17\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\17\Menu\1] -"State"=dword:ffffffff -"ID"=dword:00000069 -"Name"="View Bitmap from &Clipboard" -"HotKey"=dword:00000342 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\17\Menu\2] -"State"=dword:00010001 -"ID"=dword:00000094 -"Name"="&Screen Capture..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\17\Menu\3] -"State"=dword:00900001 -"ID"=dword:000000bc -"Name"="&Update Thumbnail" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\17\Menu\4] -"State"=dword:00010001 -"ID"=dword:000000b4 -"Name"="Sc&an Image..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\18] -"Name"="Registry Editor" -"DLL"="regedt\\regedt.spl" -"Version"="1.14" -"Copyright"="Copyright © 2003-2019 ALTAP" -"Extensions"="" -"Description"="Browse, view, and modify Windows Registry." -"Configuration Key"="RegEdit" -"FS Name"="reg" -"Functions"=dword:000000b0 -"FS Cmd Name"=" Windows Registry" -"FS Cmd Icon"=dword:00000000 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,8d,49,44,41,54,78,9c,95,\ - 93,51,0e,c0,20,08,43,39,3a,37,57,59,d4,14,0a,ea,5c,1a,3f,06,8f,d6,04,69,72,\ - ff,54,b5,55,ff,de,9a,c7,91,51,fa,1b,60,cd,62,32,80,dd,13,82,8e,9e,1c,ec,e6,\ - 71,a2,23,2a,ce,84,cd,d1,11,4f,9a,13,1a,16,01,c8,39,5a,0e,74,52,97,35,49,00,\ - ee,86,07,f5,cd,58,08,93,b6,60,b2,03,7c,cd,08,00,65,4e,08,e0,a6,2d,e0,7e,24,\ - 06,33,00,23,54,71,5e,23,9c,e2,dc,23,04,11,ac,04,54,11,62,9c,64,1f,8e,11,a2,\ - 83,74,99,28,67,a1,6a,57,3a,ae,83,15,dd,05,1e,82,79,00,00,00,00,49,45,4e,44,\ - ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\18\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\18\Menu\1] -"State"=dword:00010001 -"ID"=dword:00000001 -"Name"="&Search in Windows Registry..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\18\Menu\2] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\18\Menu\3] -"State"=dword:10081008 -"ID"=dword:00000002 -"Name"="New &Key..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\18\Menu\4] -"State"=dword:10081008 -"ID"=dword:00000003 -"Name"="New &Value..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\18\Menu\5] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\18\Menu\6] -"State"=dword:00010001 -"ID"=dword:00000004 -"Name"="&Export..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\19] -"Name"="Renamer" -"DLL"="renamer\\renamer.spl" -"Version"="1.13" -"Copyright"="Copyright © 2003-2019 ALTAP" -"Extensions"="" -"Description"="Powerful batch renamer with real-time preview." -"Configuration Key"="Renamer" -"FS Name"="" -"Functions"=dword:00000030 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,91,49,44,41,54,78,9c,bd,\ - 93,dd,0d,80,20,0c,84,79,60,23,76,62,14,76,e8,4e,dd,09,29,a4,fc,d8,52,34,26,\ - 9e,39,1f,80,7e,57,04,5d,76,f2,49,29,65,cb,f3,5a,a5,bc,01,76,a2,39,ef,7d,56,\ - 01,4b,8a,01,20,31,44,4d,b6,00,54,38,db,c5,18,f2,c9,43,50,df,88,58,dd,01,1a,\ - 9d,35,e6,41,40,3a,20,60,d9,0e,e0,d8,5b,11,8f,35,00,08,c8,02,a0,85,77,00,8f,\ - fd,d3,c1,e7,6f,70,3e,05,a3,83,fd,3d,40,35,59,74,b0,03,f0,59,5b,de,00,50,dc,\ - 36,cb,02,f0,34,59,fd,99,de,24,73,cd,05,7d,1b,a0,61,47,90,be,66,00,00,00,00,\ - 49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\19\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\19\Menu\1] -"State"=dword:01b00002 -"ID"=dword:00000001 -"Name"="&Batch Rename..." -"HotKey"=dword:00000352 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\2] -"Name"="TAR" -"DLL"="tar\\tar.spl" -"Version"="3.34" -"Copyright"="Copyright © 1999-2019 ALTAP" -"Extensions"="tar;tgz;taz;tbz;gz;bz;bz2;z;rpm;cpio;deb" -"Description"="Browse and extract Unix archives." -"Configuration Key"="TAR" -"FS Name"="" -"Functions"=dword:00000069 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\20] -"Name"="Split & Combine" -"DLL"="splitcbn\\splitcbn.spl" -"Version"="1.11" -"Copyright"="Copyright © 2001-2019 ALTAP" -"Extensions"="" -"Description"="Split and combine files." -"Configuration Key"="SplitCombine" -"FS Name"="" -"Functions"=dword:00000030 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,91,49,44,41,54,78,9c,a5,\ - 92,d1,0d,c0,20,08,44,fd,70,76,77,60,27,77,a2,11,73,09,20,2a,6d,db,5c,1b,08,\ - 3c,0d,47,e1,c2,a5,b5,c6,59,8d,7a,fd,16,00,ee,0f,09,a0,d6,ca,1f,00,24,5f,d4,\ - 69,48,02,40,e6,06,10,20,17,00,2d,ff,de,bb,28,04,48,52,35,cf,38,86,2c,00,24,\ - d0,e4,63,1c,30,14,df,40,4d,d6,4f,1a,8d,51,6c,3c,f5,a0,c8,77,7f,88,2d,86,55,\ - 41,ac,17,ee,b0,07,d6,6f,1d,cf,1c,2d,50,05,58,a7,7d,b2,72,b3,07,39,c8,06,f0,\ - f3,06,d8,b0,ac,0c,00,be,be,d5,e8,7d,00,f3,22,b7,a4,5a,4a,17,78,00,00,00,00,\ - 49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\20\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\20\Menu\1] -"State"=dword:00010012 -"ID"=dword:00000001 -"Name"="&Split File..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\20\Menu\2] -"State"=dword:00900002 -"ID"=dword:00000002 -"Name"="&Combine Files..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\21] -"Name"="UnARJ" -"DLL"="unarj\\unarj.spl" -"Version"="1.21" -"Copyright"="Copyright © 2000-2019 ALTAP" -"Extensions"="arj" -"Description"="Browse and extract ARJ archives." -"Configuration Key"="UnARJ" -"FS Name"="" -"Functions"=dword:00000039 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\22] -"Name"="UnCAB" -"DLL"="uncab\\uncab.spl" -"Version"="1.27" -"Copyright"="Copyright © 2001-2019 ALTAP" -"Extensions"="cab" -"Description"="Browse and extract CAB archives." -"Configuration Key"="UnCAB" -"FS Name"="" -"Functions"=dword:00000039 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\23] -"Name"="UnCHM" -"DLL"="unchm\\unchm.spl" -"Version"="1.03" -"Copyright"="Copyright © 2009-2019 ALTAP" -"Extensions"="chm" -"Description"="Browse and extract CHM files." -"Configuration Key"="" -"FS Name"="" -"Functions"=dword:00000009 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\24] -"Name"="Undelete" -"DLL"="undelete\\undelete.spl" -"Version"="1.11" -"Copyright"="Copyright © 2004-2019 ALTAP" -"Extensions"="" -"Description"="Recovers files deleted from FAT or NTFS partitions." -"Configuration Key"="UNDELETE" -"FS Name"="del" -"Functions"=dword:000000b0 -"FS Cmd Name"=" Undelete" -"FS Cmd Icon"=dword:00000000 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,02,34,49,44,41,54,78,9c,ad,\ - cf,cb,6e,12,61,14,07,70,1e,c1,85,71,ab,5b,5d,b9,33,ae,74,e1,03,f8,02,4d,9a,\ - 68,aa,31,31,31,3e,01,0b,13,a3,6d,3a,60,45,70,28,4c,01,b9,59,4a,b9,14,ab,48,\ - 19,5a,60,ca,7d,b8,86,81,d2,61,06,e6,1b,86,3b,e5,ba,1c,67,16,2e,74,5a,16,c6,\ - 93,fc,f3,6d,ce,f9,9d,f3,c9,64,ff,ab,a2,b9,da,8d,78,a1,b2,9d,28,54,3d,cb,22,\ - f6,88,bd,12,20,91,c9,37,a6,f3,45,77,32,5b,b4,27,b3,79,6b,3c,9d,b1,17,93,19,\ - 18,8e,a7,cc,60,34,69,0c,2f,a6,d4,60,34,ae,f7,47,63,32,70,82,e5,21,04,b9,f6,\ - 07,e0,70,1f,d6,1b,6c,9b,ee,f4,47,d5,56,6f,50,66,bb,fd,22,d3,ee,e6,e8,56,27,\ - 43,b1,5c,92,64,b8,d8,19,0d,b0,0a,c5,44,d4,db,46,5e,72,81,cd,e1,c5,ab,24,5d,\ - 17,06,4b,4c,bb,9f,a7,d9,0e,4e,81,4e,4a,18,8c,9f,35,c0,a9,30,1c,21,c8,e6,49,\ - 8e,38,8f,7c,d2,1a,86,12,c0,64,75,ee,c4,33,f9,66,93,eb,64,29,b6,93,7e,82,e0,\ - 40,f6,12,e5,65,4a,96,5f,f1,00,3a,5c,6e,46,8b,35,3a,18,3a,4d,67,b6,34,7a,54,\ - 02,e8,0d,36,c5,31,96,68,92,80,4b,9e,37,5b,b1,f7,07,a5,f2,8a,36,49,3f,b2,03,\ - 4e,44,dc,38,1d,cd,57,a9,9f,fe,63,0c,87,54,5a,97,04,f8,ac,33,be,f2,fe,08,72,\ - e2,b9,f7,2d,a0,7f,cf,0c,7a,c5,1a,15,72,e1,34,a6,0c,d3,29,fd,51,29,96,ad,90,\ - 7e,d7,e1,11,b1,a9,d4,28,24,80,0a,46,56,ed,fb,de,1e,46,30,98,b8,f1,ce,0e,18,\ - 08,1b,03,ae,14,15,59,33,e2,84,ec,b9,9f,0f,66,aa,a8,c3,f3,bd,b6,0e,a9,e4,12,\ - 00,52,c1,77,75,26,fb,44,d8,8a,de,86,eb,43,f1,ff,72,77,21,7b,5d,0d,e6,22,f8,\ - c0,ca,00,f1,02,c4,bc,db,7e,b7,b1,f5,58,0a,40,ea,5b,6a,9d,71,91,ab,90,81,fd,\ - 78,2d,fc,da,92,29,3a,a3,44,f8,a9,8f,26,d6,84,38,d3,64,58,04,60,83,65,f0,76,\ - 1d,7a,28,01,c4,52,a8,60,5e,6c,5a,96,0f,1a,fd,fc,cd,c6,c7,9b,97,02,7a,93,0d,\ - 4d,e4,cb,e8,32,00,46,be,e0,97,0e,8b,15,8a,a6,5e,98,f7,0e,e6,88,c5,c9,23,56,\ - 69,cc,0e,ef,1c,c5,d2,cf,ae,04,76,dd,3e,b9,c3,f3,8d,df,13,f2,fb,fd,3b,5f,3d,\ - be,d5,2b,81,7f,a9,5f,f9,f6,e9,d1,ff,ad,56,be,00,00,00,00,49,45,4e,44,ae,42,\ - 60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\24\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\24\Menu\1] -"State"=dword:00010001 -"ID"=dword:00000001 -"Name"="&Recover Deleted Files and Directories..." -"HotKey"=dword:00000355 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\24\Menu\2] -"State"=dword:01b00202 -"ID"=dword:00000002 -"Name"="Restore &Encrypted Files from Backup..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\25] -"Name"="UnFAT" -"DLL"="unfat\\unfat.spl" -"Version"="1.1" -"Copyright"="Copyright © 2003-2019 ALTAP" -"Extensions"="ima" -"Description"="Browse and extract FAT 12, 16, and 32 disk images." -"Configuration Key"="" -"FS Name"="" -"Functions"=dword:00000009 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\26] -"Name"="UnISO" -"DLL"="uniso\\uniso.spl" -"Version"="1.37" -"Copyright"="Copyright © 2003-2019 ALTAP" -"Extensions"="iso;isz;nrg;bin;img;pdi;cdi;cif;ncd;c2d;dmg" -"Description"="Browse and extract CD/DVD ISO image files." -"Configuration Key"="UnISO" -"FS Name"="" -"Functions"=dword:00000079 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,c9,49,44,41,54,78,9c,9d,\ - 93,cb,0d,c4,20,0c,05,d3,53,0a,e2,46,29,94,80,44,1b,54,90,02,b8,73,a2,16,6f,\ - 9c,e8,81,6d,60,b5,da,58,16,22,62,c6,16,9f,83,8e,39,5a,6b,64,73,b5,8e,63,09,\ - 5e,d7,d5,b3,d6,4a,54,12,c5,18,29,84,30,89,14,2c,41,2b,28,a9,3c,69,25,db,ca,\ - 48,09,73,52,d1,12,55,7d,25,81,80,41,a4,12,58,08,73,ef,3d,9d,e7,f9,8c,00,6f,\ - 55,4f,e7,1c,2d,05,16,c6,08,10,6b,b6,02,ae,d4,2b,df,1f,b7,cb,73,5b,44,09,d0,\ - a2,ed,00,30,cf,bf,0a,f0,13,6d,f2,a6,c9,f6,2d,9c,73,1e,02,9c,02,c0,b1,e3,69,\ - da,58,5b,bd,0b,f8,96,69,78,08,ec,11,cb,ea,ea,26,b2,44,c2,52,b0,83,a7,b7,c0,\ - 92,57,94,54,db,00,2d,3c,09,10,58,2c,f3,a7,d7,f8,4f,7c,00,80,0d,bc,54,c3,13,\ - d5,02,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\27] -"Name"="UnLHA" -"DLL"="unlha\\unlha.spl" -"Version"="1.13" -"Copyright"="Copyright © 2001-2019 ALTAP" -"Extensions"="lzh;lha;lzs" -"Description"="Browse and extract LHA archives." -"Configuration Key"="" -"FS Name"="" -"Functions"=dword:00000009 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\28] -"Name"="UnMIME" -"DLL"="unmime\\unmime.spl" -"Version"="1.14" -"Copyright"="Copyright © 2001-2019 ALTAP" -"Extensions"="eml;b64;uue;xxe;hqx;ntx;cnm" -"Description"="Browse and extract MIME/Base64, UU/XXEncode, yEncode and BinHex files." -"Configuration Key"="UnMIME" -"FS Name"="" -"Functions"=dword:00000039 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\29] -"Name"="UnRAR" -"DLL"="unrar\\unrar.spl" -"Version"="3.01" -"Copyright"="Copyright © 2000-2019 ALTAP" -"Extensions"="rar" -"Description"="Browse and extract RAR archives." -"Configuration Key"="UnRAR" -"FS Name"="" -"Functions"=dword:00000039 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\3] -"Name"="PAK" -"DLL"="pak\\pak.spl" -"Version"="1.71" -"Copyright"="Copyright © 1999-2019 ALTAP" -"Extensions"="pak" -"Description"="Browse and extract Quake PAK archives." -"Configuration Key"="" -"FS Name"="" -"Functions"=dword:0000000f -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\30] -"Name"="Windows Mobile" -"DLL"="wmobile\\wmobile.spl" -"Version"="1.08" -"Copyright"="Copyright © 2003-2019 Juraj Rojko & ALTAP" -"Extensions"="" -"Description"="Access files on your Windows Mobile device." -"Configuration Key"="WMOBILE" -"FS Name"="CE" -"Functions"=dword:000000a0 -"FS Cmd Name"=" Mobile Device" -"FS Cmd Icon"=dword:00000000 -"FS Cmd Visible"=dword:00000000 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,02,21,49,44,41,54,78,9c,8d,\ - cc,4f,48,93,61,1c,07,70,6f,d1,a1,43,74,a9,43,97,a0,43,87,a2,ac,fd,53,34,31,\ - 45,0a,42,87,ee,54,d1,48,9b,4b,db,1c,2b,51,b3,cd,51,52,6f,31,5a,5b,6c,ee,75,\ - ad,f6,be,6b,6b,6d,cb,65,64,a6,16,b2,37,37,b7,c7,25,24,c3,8a,4c,28,68,14,66,\ - 5e,84,3a,14,df,1e,47,87,12,dc,eb,ef,c7,97,e7,f0,fc,be,9f,a2,a2,55,d3,d1,a1,\ - 52,87,ef,69,f9,17,11,cd,0c,f1,d4,83,d8,6a,d0,d7,2c,87,35,56,0b,b3,6a,5f,96,\ - 9e,6c,59,dd,f9,6f,32,a1,e3,f8,e9,a9,c2,44,93,04,23,4d,25,98,d4,2b,10,6b,de,\ - 03,f7,79,19,02,67,8a,41,4f,4c,05,91,29,9f,0a,c9,ce,32,a8,35,5d,60,9c,4e,78,\ - 22,1c,1c,03,76,18,7d,6d,60,35,fb,57,00,3f,cd,d6,b5,81,7e,25,26,bb,64,58,fc,\ - bd,88,ef,74,3f,d2,7d,fc,61,10,a6,68,37,58,ad,64,05,b8,5f,10,20,ce,a3,48,75,\ - cb,30,b7,fc,3e,5f,ce,d2,e5,5e,fb,c0,0c,5f,01,db,2a,17,07,d2,b6,c3,48,5d,94,\ - 81,7c,23,f9,72,e2,47,02,d6,b1,eb,b0,c7,6f,82,d5,97,8a,03,a9,6b,d5,48,9b,a4,\ - 18,cb,8d,82,fc,22,e0,67,f8,7c,d9,fb,ea,36,58,43,99,38,c0,1b,ca,41,cc,52,0c,\ - e5,86,30,be,24,a0,2f,e9,82,43,b0,c3,9d,72,81,35,1e,5c,07,d0,5a,02,d2,23,c5,\ - c0,fc,20,82,d9,30,f4,de,b3,d0,79,5a,d0,fb,e4,12,d8,f6,4a,71,c0,50,27,a1,80,\ - 0c,a1,d9,28,dc,09,2f,2c,31,33,9c,89,5b,88,ce,47,c0,76,56,8b,03,5c,e3,01,10,\ - 8b,1c,fc,74,08,dc,74,10,c3,5f,9e,42,58,8e,c3,4f,fc,08,5e,3e,22,0e,4c,e8,f6,\ - 22,6d,51,a0,37,c0,20,14,eb,41,f8,ae,09,82,b5,1e,6f,03,e7,30,6a,6b,58,07,a0,\ - dd,8d,05,47,25,16,fa,eb,f0,29,a0,06,c3,30,78,fe,50,87,39,a1,0d,99,58,a3,38,\ - f0,f2,d4,2e,cc,ba,94,60,af,1e,c3,bb,47,27,f0,35,de,0e,4c,9d,46,ee,d9,49,54,\ - 29,76,bc,a1,27,ee,82,40,4b,f9,4e,f5,03,a3,f4,73,45,a9,04,99,3b,4a,64,38,15,\ - 5c,17,0e,2d,6d,df,b6,39,49,bf,bd,34,0d,34,1b,d7,04,e8,6c,a0,a9,a5,b1,d3,8c,\ - d0,8c,ff,7d,6f,d0,54,d0,6c,fa,f7,f8,0f,38,9c,50,10,86,fc,d9,39,00,00,00,00,\ - 49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\4] -"Name"="Internet Explorer Viewer" -"DLL"="ieviewer\\ieviewer.spl" -"Version"="1.12" -"Copyright"="Copyright © 1999-2019 ALTAP" -"Extensions"="" -"Description"="Lightweight HTML and XML viewer based on Internet Explorer." -"Configuration Key"="IEVIEWER" -"FS Name"="" -"Functions"=dword:00000060 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\5] -"Name"="7-Zip" -"DLL"="7zip\\7zip.spl" -"Version"="1.31" -"Copyright"="Copyright © 2004-2019 ALTAP" -"Extensions"="7z" -"Description"="Create, browse, and extract 7-Zip archives." -"Configuration Key"="7zip" -"FS Name"="" -"Functions"=dword:0000003f -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,6d,49,44,41,54,78,9c,bd,\ - 92,41,0e,c0,20,08,04,39,f0,76,de,c5,cf,6c,39,d0,6c,29,62,94,a4,90,3d,28,38,\ - 22,48,83,7a,de,3c,7e,03,98,79,ac,f4,0f,40,44,3e,aa,62,ae,07,90,59,15,33,7b,\ - 01,50,aa,da,03,98,19,04,d7,59,4e,0a,88,b7,63,32,f6,25,05,d8,86,07,22,00,ab,\ - c2,3c,5a,dd,1e,9f,e4,87,b7,01,b3,4a,8f,00,65,13,67,53,d9,1a,63,54,f9,13,bb,\ - 7e,01,91,b6,0e,57,df,9e,05,8e,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\5\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\5\Menu\1] -"State"=dword:20000001 -"ID"=dword:00000001 -"Name"="Test Archive" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6] -"Name"="Automation" -"DLL"="automation\\automation.spl" -"Version"="1.7" -"Copyright"="Copyright © 2009-2019 ALTAP" -"Extensions"="" -"Description"="Automates common tasks using scripts." -"Configuration Key"="Automation" -"FS Name"="" -"Functions"=dword:00000130 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 40,00,00,00,10,08,06,00,00,00,a6,e7,79,29,00,00,06,45,49,44,41,54,78,9c,e5,\ - 96,79,4c,53,77,00,c7,7f,45,30,71,cb,66,b6,6c,ce,8c,c5,b0,e0,34,1a,af,78,e2,\ - 31,85,b9,18,75,d3,2c,a2,13,af,c9,60,5e,a0,a2,72,ca,a1,a8,30,45,41,11,11,e5,\ - 50,0e,91,1b,61,82,47,55,10,10,dc,80,81,88,e5,1c,ca,38,0b,14,e8,4d,69,5f,db,\ - ef,de,ab,69,55,5a,3b,f4,0f,f7,c7,7e,c9,37,ed,6b,9b,d7,f7,f9,bc,df,f7,f7,7b,\ - c4,fe,a2,1d,3c,ee,3b,2f,03,40,fe,8f,21,8c,80,f9,1e,d3,df,5a,c2,d0,71,bd,a8,\ - 1e,86,72,2d,9f,83,54,f6,23,24,e6,94,32,39,a5,fd,fd,7f,2e,60,63,f8,1a,44,96,\ - 06,eb,24,08,7f,23,23,44,b9,64,a1,f8,16,eb,bc,f8,b6,59,ab,98,6d,aa,a4,8f,29,\ - 51,36,69,12,66,b0,8e,0b,92,4c,66,f2,e3,4c,48,7f,e4,08,d2,1b,66,6a,50,80,b1,\ - 11,93,5e,80,b9,2b,7f,d1,49,30,74,51,ef,72,46,12,db,d0,ef,b0,8f,bd,4d,27,21,\ - ff,d6,94,14,f1,4d,02,59,f1,67,90,57,2e,c0,40,d9,2c,48,0b,3e,86,e8,06,81,28,\ - 9d,40,90,44,14,fc,78,13,57,5a,00,cb,90,80,ac,fb,35,46,05,9c,4f,64,e3,4e,09,\ - 47,2b,21,d8,d0,45,bd,cb,5a,92,ef,4f,2e,c5,f6,6b,1b,e1,9c,b3,15,eb,63,57,69,\ - 24,54,e7,59,42,5a,b6,08,68,71,87,f2,e9,3e,0c,94,cf,01,23,45,94,49,27,89,40,\ - 18,47,40,0b,d8,43,0b,18,c1,40,db,7e,6b,61,51,90,e9,83,3b,c9,1e,c8,8d,dd,8f,\ - cc,0b,bb,90,78,da,01,1e,0e,33,e0,e9,38,f3,15,01,e7,12,6e,69,e0,b5,79,9d,80,\ - b7,a9,65,48,8e,0a,27,b3,15,f8,35,73,00,47,52,c4,f0,bb,c2,87,d7,e5,1e,b8,45,\ - 73,b1,ef,42,1b,dc,a3,da,f4,fe,8f,d8,1c,b3,82,7d,f2,5a,0d,fc,d7,c7,a6,63,8a,\ - ab,05,c6,6e,7f,1f,95,d5,59,78,5a,e8,01,55,9b,27,06,4a,27,43,fa,60,3c,28,6e,\ - 06,84,a5,2e,e8,8d,31,03,3f,92,25,ee,3d,67,3a,8e,11,10,b0,7b,96,92,12,66,42,\ - 2d,c9,86,5a,9c,05,aa,3f,09,3e,3f,4f,44,49,a2,2d,9e,5c,df,8a,2d,2b,be,d0,09,\ - a0,94,2a,8d,04,ad,08,43,20,43,6b,39,5c,01,0c,7c,4d,8b,12,9c,56,0a,0f,eb,15,\ - 60,57,c8,91,53,26,47,c6,43,39,2e,dd,95,62,ea,ba,34,7d,01,f3,7c,a7,61,6d,cc,\ - 4a,1d,fc,68,7b,53,34,b7,e5,43,a1,06,38,6c,3f,c8,ca,67,40,72,6f,24,06,1b,dd,\ - 34,00,4d,b5,15,a8,0b,33,87,28,82,a0,fb,ac,e9,11,46,40,5a,b4,93,5a,45,83,ab,\ - 04,a9,50,f0,e2,31,d8,1e,81,70,8f,d9,1a,01,01,2e,56,38,ec,6c,f5,ca,2c,90,ca,\ - 14,1a,01,73,56,38,1a,14,30,b4,96,c3,95,c0,dc,f9,c6,0e,0a,65,8d,94,06,3c,a5,\ - 68,10,17,6f,0e,e0,6c,8e,18,c7,af,34,e1,ab,d5,09,fa,02,a6,b9,5b,be,02,cf,89,\ - 7b,0f,f2,3a,6f,fa,3b,35,24,3d,1c,f0,b3,4c,21,c9,1d,03,b5,e2,19,84,52,a0,f8,\ - ca,0e,b4,9c,36,83,24,d2,04,1d,21,a6,55,8c,80,84,d0,cd,c8,8c,73,87,8c,06,97,\ - 36,05,41,c8,f1,43,57,89,33,22,bc,17,42,26,15,e8,c0,d5,6a,b5,06,be,bb,4f,6a,\ - 54,80,a1,5a,0e,47,02,33,ed,9f,b4,50,b8,53,29,c7,d5,fb,83,08,a7,c1,03,53,44,\ - f0,8e,e5,61,77,48,15,c6,2d,8b,d2,17,30,de,e5,73,1d,fc,e3,8b,f4,d4,4e,a0,fb,\ - 1d,cb,82,a2,e1,04,7d,c5,4a,08,ca,ec,41,d5,bb,43,ae,a2,d0,90,e3,8a,f6,93,04,\ - e2,0b,04,7d,a7,09,9a,4f,b0,ba,18,01,81,7b,66,cf,3c,ed,69,0d,71,43,20,f8,15,\ - fb,c1,2b,de,86,ee,fc,8d,1a,01,b9,f1,6e,3a,01,72,85,12,fd,42,19,5a,b8,42,a3,\ - 02,5e,57,4b,fa,75,82,31,01,4c,e7,ff,a8,a3,90,f9,3b,7d,e7,6f,c9,70,22,9d,81,\ - ef,c3,9e,f0,4e,ac,f3,cc,c7,98,c5,61,fa,02,cc,77,7e,f4,1c,3e,74,94,52,98,32,\ - 11,82,54,0b,f4,9e,1b,01,51,c6,a7,50,cb,5a,75,17,2f,e2,fe,89,67,a1,1f,42,1c,\ - 62,06,41,ac,25,ba,22,2c,51,e7,cf,e2,6a,57,ff,18,7f,eb,cc,5e,ce,71,f4,14,fe,\ - a4,09,97,6d,8b,b6,dc,55,48,08,58,82,4b,a7,ec,a1,54,a9,21,92,ca,d1,c9,93,a0,\ - b1,a5,df,a8,00,43,b5,fc,37,78,26,cc,82,77,b7,4a,8e,f8,bc,41,84,66,4b,70,30,\ - 96,8f,9d,61,9d,d8,10,d0,84,e5,ce,b9,18,3d,f7,94,be,80,4f,1c,47,69,4e,ce,4f,\ - 5b,f0,b7,66,9a,2a,45,18,ac,3d,03,aa,ed,3a,7d,40,e9,04,a8,28,19,64,8d,57,41,\ - d5,46,d0,47,4a,cd,67,15,41,96,e5,69,e1,f6,88,0a,58,8d,73,be,cb,10,17,b4,5e,\ - 97,a8,63,b6,88,09,d8,84,86,f4,65,b8,e4,bf,08,b2,41,0a,3c,fe,00,9a,3b,04,78,\ - f2,17,cf,a8,80,a1,b5,1c,0e,3c,13,66,b5,cf,2a,95,23,fc,86,14,87,ae,f4,61,f7,\ - 79,1a,3e,b0,11,ab,0f,56,62,e9,b6,0c,8c,9a,11,a8,2f,40,7b,72,6e,fc,fc,93,14,\ - bf,1e,72,49,0f,14,b2,17,bd,7d,79,30,d8,62,51,3f,04,02,1e,ba,5a,eb,51,78,74,\ - d2,81,60,b7,05,68,ae,4d,85,b8,eb,36,44,1d,59,ba,f0,9a,ae,e2,ac,b7,0d,1e,27,\ - 7e,83,b3,5e,56,10,88,07,d1,d6,2d,42,7d,73,1f,ca,6b,b8,46,05,bc,5c,cb,e1,c2,\ - 33,61,b6,ba,b8,7b,62,1c,8b,af,c3,9e,90,4a,6c,f0,2d,a4,ef,7c,16,ac,1d,92,31,\ - cf,2e,1a,66,53,8e,e8,0b,d0,be,69,3c,6c,32,bd,f9,fc,54,71,6b,f4,62,70,23,ad,\ - 20,ca,da,0a,65,4f,e5,f3,bb,4f,a7,ab,a1,08,8d,31,9b,50,17,32,17,a5,c1,d6,60,\ - fb,4c,e1,dd,73,22,63,83,5c,17,2f,39,e3,65,43,ef,f9,73,e0,b4,6e,92,2e,3b,d6,\ - 4c,80,db,e6,39,d8,fd,e3,64,dd,c2,d7,d4,c6,c7,e3,86,1e,14,3f,6a,37,2a,40,5b,\ - cb,37,81,67,c2,ec,f3,f3,1d,6e,62,d6,e6,6c,4c,b6,4d,86,c5,f2,4b,9a,de,7f,30,\ - 3b,08,23,a7,1e,35,2e,a0,c1,97,98,55,ed,27,ae,35,9e,04,4f,7d,08,9a,5c,e8,6d,\ - 2e,c9,46,53,03,a9,88,87,87,c7,67,a2,66,27,c1,a3,03,04,45,bb,08,ee,39,12,bb,\ - 3c,27,c2,1a,fa,24,c8,80,69,07,b3,e8,bd,bc,f0,d5,3c,ed,45,e9,93,4e,e4,95,b5,\ - 18,15,a0,ad,e5,9b,c0,bf,6d,5e,08,f0,23,a4,fa,20,31,ab,38,c4,da,5b,ee,c7,1a,\ - 28,71,24,a8,0d,fa,92,16,20,87,a0,b7,1d,97,1d,cc,c1,de,42,50,ec,c9,ea,2d,70,\ - 65,d9,e5,ed,22,84,16,a0,37,b4,02,b4,0f,3b,c6,f2,3a,01,ef,0a,de,90,00,52,e1,\ - c7,22,f7,f7,12,cb,ea,a8,1f,fc,25,ed,55,74,07,d4,5c,95,4a,c5,6d,e0,94,95,46,\ - 7b,2d,3f,70,d5,9e,98,3f,70,a3,e1,8d,08,60,c0,86,9b,77,05,fa,ba,fc,03,da,3d,\ - f7,20,f5,8b,8b,64,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\1] -"State"=dword:ffffffff -"ID"=dword:00000001 -"Name"="Run Focused Script" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\10] -"State"=dword:ffffffff -"ID"=dword:23bb6d00 -"Name"="Unpack Multiple Archives" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\2] -"State"=dword:ffffffff -"ID"=dword:00000002 -"Name"="Open Script Menu" -"HotKey"=dword:00000341 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\3] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\4] -"State"=dword:ffffffff -"ID"=dword:0ccb5b00 -"Name"="Convert Images" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\5] -"State"=dword:ffffffff -"ID"=dword:1797e000 -"Name"="Count Lines" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\6] -"State"=dword:ffffffff -"ID"=dword:79d13200 -"Name"="Launch Elevated Command Prompt" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\7] -"State"=dword:ffffffff -"ID"=dword:4e1cc200 -"Name"="Make Link" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\8] -"State"=dword:ffffffff -"ID"=dword:276fa200 -"Name"="Make List (JScript)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\6\Menu\9] -"State"=dword:ffffffff -"ID"=dword:0fe6ea00 -"Name"="Make List (VBScript)" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\7] -"Name"="Checksum" -"DLL"="checksum\\checksum.spl" -"Version"="2.2" -"Copyright"="Copyright © 2003-2019 ALTAP" -"Extensions"="" -"Description"="SFV, MD5, SHA-1, SHA-256, and SHA-512 checksum verifier and calculator." -"Configuration Key"="Checksum" -"FS Name"="" -"Functions"=dword:00000030 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,00,7d,49,44,41,54,78,9c,95,\ - 92,cb,0d,00,21,08,44,39,58,f8,9e,ec,81,6e,e8,0c,83,1b,36,2b,f8,19,35,a3,07,\ - 99,e7,44,24,25,a5,5a,ab,22,b2,da,38,c9,01,a7,21,22,53,08,08,e0,0e,b0,11,21,\ - 00,80,fb,5a,4a,19,04,02,38,ed,96,04,04,8c,66,7a,e8,7b,8b,0d,20,df,e8,e6,17,\ - b0,4d,b0,37,43,09,bc,68,65,3e,26,f8,17,cf,cc,50,82,a8,8b,2e,ac,63,c3,09,62,\ - cb,2e,ff,c1,bc,0b,70,02,3b,40,95,00,f1,9f,23,72,40,03,1a,6b,bf,de,d9,2e,02,\ - 93,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\7\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\7\Menu\1] -"State"=dword:00010012 -"ID"=dword:00000002 -"Name"="&Verify Checksums..." -"HotKey"=dword:00000356 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\7\Menu\2] -"State"=dword:01b00002 -"ID"=dword:00000001 -"Name"="&Calculate Checksums..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\8] -"Name"="Check Version" -"DLL"="checkver\\checkver.spl" -"Version"="1.26" -"Copyright"="Copyright © 2000-2019 ALTAP" -"Extensions"="" -"Description"="Check for updates of Altap Salamander and plugins." -"Configuration Key"="CHECKVER" -"FS Name"="" -"Functions"=dword:00000030 -"Load On Start"=dword:00000001 -"HomePage"="www.altap.cz" -"PluginIconList"=hex:89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,\ - 10,00,00,00,10,08,06,00,00,00,1f,f3,ff,61,00,00,01,66,49,44,41,54,78,9c,7d,\ - 93,b1,91,02,31,0c,45,15,10,10,90,90,50,00,19,b1,3a,20,a7,0d,b5,40,4a,44,09,\ - 3b,e3,8c,80,b9,02,b6,02,e2,1b,e7,44,74,70,c1,75,a0,d3,ff,8b,cc,c2,c2,8d,e7,\ - 83,2d,a4,27,59,16,e2,f2,bc,76,bb,9d,43,af,f6,4f,eb,e9,70,3c,1e,c3,22,14,f6,\ - b0,5d,2e,17,87,3e,02,fa,be,f7,eb,f5,ea,af,80,ae,eb,68,53,d5,7f,2b,92,ed,76,\ - eb,9b,cd,a6,39,2c,16,0b,5f,2e,97,3c,03,b2,5e,af,bd,d4,4a,d5,1f,9f,80,f8,b1,\ - df,ef,7d,b5,5a,31,f3,6c,36,a3,00,c2,59,4d,dd,aa,ba,16,75,29,d5,ad,3c,43,da,\ - 06,57,01,28,03,51,55,a9,c5,23,6f,7c,9b,6b,08,00,b1,1a,b0,e2,13,40,ae,ac,04,\ - d7,48,80,45,00,2a,21,e0,70,08,88,d2,36,01,e0,8e,a2,d6,1a,a9,2a,e1,a8,84,45,\ - 37,07,01,74,c0,d5,6c,0a,f8,fa,fe,65,89,f3,f9,bc,41,d0,0f,d8,24,12,b2,3a,93,\ - 01,12,80,d3,e9,fc,08,c6,5b,c3,01,d9,d0,87,84,b0,27,a8,96,d2,3b,40,08,d0,e8,\ - 68,03,a0,81,2c,df,ea,43,28,59,e4,5e,7a,da,8d,15,20,d8,c6,00,0c,4b,73,54,38,\ - 3a,f7,d9,d4,01,ee,fc,0d,f7,57,2d,9c,d6,06,b8,dd,6e,1c,59,bc,33,01,a9,c8,c6,\ - 3e,44,74,da,14,4f,a9,6f,9a,d8,de,d6,46,00,bd,03,22,e3,10,ec,cc,9e,a3,fe,16,\ - 10,53,3b,34,48,94,d2,0c,64,e6,47,f0,47,40,2e,cc,bf,95,4a,18,94,ff,d0,f1,fa,\ - 03,87,ce,fe,95,3a,db,83,4d,00,00,00,00,49,45,4e,44,ae,42,60,82 -"PluginIconIndex"=dword:00000000 -"SubmenuIconIndex"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\8\Menu] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\8\Menu\1] -"State"=dword:00010001 -"ID"=dword:0000005a -"Name"="&Check For New Versions..." - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins\9] -"Name"="Database Viewer" -"DLL"="dbviewer\\dbviewer.spl" -"Version"="1.23" -"Copyright"="Copyright © 2003-2019 ALTAP" -"Extensions"="" -"Description"="Display dBase, FoxPro and CSV database files." -"Configuration Key"="DBVIEWER" -"FS Name"="" -"Functions"=dword:00000070 -"HomePage"="www.altap.cz" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\7zip] -"Version"=dword:00000003 -"Show Extended Options"=dword:00000001 -"Extended List Info"=dword:00000000 -"List Info Packed Size"=dword:00000000 -"List Info Method"=dword:00000000 -"Column PackedSize FixedWidth"=dword:00000000 -"Column PackedSize Width"=dword:00000000 -"Column Method FixedWidth"=dword:00000000 -"Column Method Width"=dword:00000000 -"Compression Level"=dword:00000005 -"Compression Method"=dword:00000000 -"Dictionary Size"=dword:00004000 -"Word Size"=dword:00000020 -"Solid Archive"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation] -"Version"=dword:00000001 -"EnableDebugger"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation\Directories] -"1"="$[AppData]\\Altap\\Altap Salamander\\Automation\\scripts" -"2"="$[AllUsersProfile]\\Altap\\Altap Salamander\\Automation\\scripts" -"3"="$(SalDir)\\plugins\\automation\\scripts" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation\Scripts] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation\Scripts\0CCB5B] -"00"="$(SalDir)\\plugins\\automation\\scripts\\Convert Images.js" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation\Scripts\0FE6EA] -"00"="$(SalDir)\\plugins\\automation\\scripts\\Make List (VBScript).vbs" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation\Scripts\1797E0] -"00"="$(SalDir)\\plugins\\automation\\scripts\\Count Lines.js" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation\Scripts\23BB6D] -"00"="$(SalDir)\\plugins\\automation\\scripts\\Unpack Multiple Archives.js" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation\Scripts\276FA2] -"00"="$(SalDir)\\plugins\\automation\\scripts\\Make List (JScript).js" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation\Scripts\4E1CC2] -"00"="$(SalDir)\\plugins\\automation\\scripts\\Make Link.js" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Automation\Scripts\79D132] -"00"="$(SalDir)\\plugins\\automation\\scripts\\Launch Elevated Command Prompt.vbs" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Checksum] -"Version"=dword:00000001 -"Hash Type"=dword:00000001 -"Dialog Size 1"=hex:96,02,00,00,2d,01,00,00,e6,00,00,00,50,00,00,00,50,00,00,\ - 00,e5,00,00,00,17,01,00,00,ae,01,00,00,5c,03,00,00 -"Dialog Size 2"=hex:b1,01,00,00,2d,01,00,00,e6,00,00,00,50,00,00,00,50,00,00,\ - 00 -"CRC"=dword:00000001 -"MD5"=dword:00000001 -"SHA1"=dword:00000001 -"SHA256"=dword:00000001 -"SHA512"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\CHECKVER] -"Version"=dword:00000004 -"AutoCheckMode"=dword:00000002 -"AutoConnect"=dword:00000001 -"AutoClose"=dword:00000001 -"CheckBetaVersions"=dword:00000001 -"CheckPBVersions"=dword:00000000 -"CfgOfPB"=dword:00000000 -"CheckReleaseVersions"=dword:00000001 -"IneternetConnection"=dword:00000001 -"InternetProtocol"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\CHECKVER\Filters] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\DBVIEWER] -"Version"=dword:00000000 -"Use Custom Font"=dword:00000000 -"LogFont"=hex:f4,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,90,01,00,00,00,\ - 00,00,01,00,00,05,00,53,65,67,6f,65,20,55,49,00,00,00,00,00,00,00,00,00,00,\ - 00,00,00,00,00,00,00,00,00,00,00,00,00,00 -"SavePosition"=dword:00000000 -"WindowPlacement"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ - 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -"Auto Select"=dword:00000001 -"Default Coding"="" -"CSV Text Qualifier"=dword:00000000 -"CSV Value Separator"=dword:00000000 -"CSV Value Separator Char"=dword:00000000 -"CSV First Row As Name"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\DBVIEWER\Find History] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\DISKMAP] -"Confirm ESC Close"=dword:00000001 -"Highlight Folders"=dword:00000001 -"Display Tooltip"=dword:00000001 -"Tooltip Path Format"=dword:00000002 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\Encrypt & Decrypt] -"Version"=dword:00000003 -"SF Method"=dword:00000001 -"CFS Method"=dword:00000002 -"TFS Method"=dword:00000001 -"SF Random Passes"=dword:00000001 -"CFS Random Passes"=dword:00000001 -"TFS Random Passes"=dword:00000001 -"Hash"=hex:02 -"Cipher"=hex:03 -"Compression"=hex:09 -"Mode"=hex:01 -"Hide Typing"=dword:00000001 -"Clear Cluster Tips"=dword:00000001 -"Clear FAT Directories"=dword:00000001 -"Shred Temporary Files"=dword:00000001 -"Temp Dir"="C:\\Users\\zx\\AppData\\Local\\Temp\\SalEncTemp" -"Last Key"="" -"Use Key Password"=dword:00000001 -"Use Key File"=dword:00000000 -"Dont Show Small Files Warning"=dword:00000000 -"Dont Ask Open On SSD"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\File Comparator] -"Version"=dword:00000008 -"Configuration"=hex:01,00,00,00,02,00,00,00,08,00,00,00,f3,ff,ff,ff,00,00,00,\ - 00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,01,43,6f,6e,73,\ - 6f,6c,61,73,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ - 00,00,00,01,00,00,00,b7,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00 -"Colors"=hex:00,00,00,01,00,00,00,01,00,00,00,01,00,00,00,01,00,00,00,01,e3,e3,\ - e3,01,e3,e3,e3,01,e3,e3,e3,01,f0,f0,f0,01,f0,f0,f0,01,a0,a0,a0,01,a0,a0,a0,\ - 01,00,00,00,01,00,00,00,01,00,00,00,01,00,00,00,01,00,00,00,01,ff,ff,ff,00,\ - ff,ff,ff,00,ff,ff,ff,01,eb,eb,eb,01,eb,eb,eb,01,bf,df,ff,01,ff,cc,cc,01,0a,\ - 80,f0,00,ff,78,78,00,a0,a0,a0,01,a0,a0,a0,01,ff,ff,ff,01,00,00,00,01 -"Custom Colors"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ - 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ - 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -"Force Text"=dword:00000000 -"Force Binary"=dword:00000000 -"Ignore Space Change"=dword:00000000 -"Ignore All Space"=dword:00000000 -"Ignore Line Breaks Changes"=dword:00000000 -"Ignore Case"=dword:00000000 -"EOL Conversion 0"=dword:00000007 -"EOL Conversion 1"=dword:00000007 -"Encoding 0"=dword:00000000 -"Encoding 1"=dword:00000000 -"Endians 0"=dword:00000000 -"Endians 1"=dword:00000000 -"InputEnc 0"=dword:00000000 -"InputEnc 1"=dword:00000000 -"InputEnc Table 0"="" -"InputEnc Table 1"="" -"Normalization Form"=dword:00000001 -"Rebar Bands Layout"=hex:ff,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ - 00,00,00,00,00,00 -"Last Configuration Page"=dword:00000000 -"Load On Start"=dword:00000000 -"Horizontal View"=dword:00000000 -"Auto-Copy Selection"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP] -"Version"=dword:00000025 -"Last Config Page"=dword:00000000 -"Show Welcome Message"=dword:00000001 -"Priority to Panel Connections"=dword:00000001 -"Enable Total Speed Limit"=dword:00000000 -"Total Speed Limit"="2" -"Anonymous Password"="name@someserver.com" -"Passive Mode"=dword:00000000 -"Keep Alive"=dword:00000001 -"Compress Data"=dword:00000000 -"Max. Connections"=dword:ffffffff -"Speed Limit"="-1" -"Use Listings Cache"=dword:00000001 -"Transfer Mode"=dword:00000002 -"ASCII File Masks"="*.txt;*.*htm;*.*html;*.pl;*.php;*.php3;*.asp;*.cgi;*.css;*.bat;*.tcl;*.diz;*.nfo;*.ini;*.mak;*.cpp;*.c;*.h;*.bas;*.pas;*.tex;*.log" -"Server Replies Timeout"=dword:0000001e -"No Data Transfer Timeout"=dword:0000012c -"Delay Connect Retries"=dword:00000014 -"Connect Attempts"=dword:0000003c -"Resume Overlap"=dword:00000400 -"Resume Min File Size"=dword:00008000 -"Keep Alive - Every"=dword:0000005a -"Keep Alive - Stop After"=dword:0000001e -"Keep Alive - Command"=dword:00000000 -"Mem Cache Max Size"=dword:00400000 -"Download Add To Queue"=dword:00000000 -"Delete Add To Queue"=dword:00000000 -"ChngAttr Add To Queue"=dword:00000000 -"If Cannot Create File"=dword:00000000 -"If Cannot Create Dir"=dword:00000000 -"If File Already Exists"=dword:00000000 -"If Dir Already Exists"=dword:00000002 -"If Retry On Created"=dword:00000003 -"If Retry On Resumed"=dword:00000002 -"If Ascii Mode For Binary File"=dword:00000000 -"If Unknown Attrs"=dword:00000000 -"If Directory Is Not Empty"=dword:00000001 -"If File Is Hidden"=dword:00000000 -"If Dir Is Hidden"=dword:00000001 -"Upload - If Cannot Create File"=dword:00000000 -"Upload - If Cannot Create Dir"=dword:00000000 -"Upload - If File Already Exists"=dword:00000000 -"Upload - If Dir Already Exists"=dword:00000002 -"Upload - If Retry On Created"=dword:00000003 -"Upload - If Retry On Resumed"=dword:00000002 -"Upload - If Ascii Mode For Binary File"=dword:00000000 -"Last Bookmark"=dword:00000002 -"Default Proxy UID"=dword:ffffffff -"Always Detach"=dword:00000000 -"Always Disconnect"=dword:00000000 -"Enable Logging"=dword:00000001 -"Log Max. Size"=dword:00000032 -"Max. Closed Connections Logs"=dword:0000000a -"Always Show Panel Log"=dword:00000001 -"Disable Log for Operations"=dword:00000000 -"Logs Position"="" -"OperDlg Position"="" -"OperDlg Split Pos."=dword:0000c350 -"Send Secret Command"=dword:00000000 -"Always Reconnect"=dword:00000000 -"Connection Lost Message"=dword:00000001 -"List Hidden Files Hint"=dword:00000001 -"Always Overwrite"=dword:00000000 -"Convert Hex-esc-sequences"=dword:00000001 -"Close OperDlg If Successfully Finished"=dword:00000001 -"Open SolveErrDlg If Idle"=dword:00000001 -"Simple Listing Fixed Column Width"=dword:00000000 -"Simple Listing Column Width"=dword:00000000 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP\Bookmarks] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP\Bookmarks\1] -"Name"="ALTAP" -"Address"="ftp.altap.cz" -"Initial Path"="/pub/altap/salamand" -"Anonymous"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP\Bookmarks\2] -"Name"="polymech" -"Address"="polymech.io" -"Anonymous"=dword:00000000 -"User"="polymech.io_6z8t5kbi9np" -"PasswordS"=hex:01,28,4a,c0,82,99,2f,b5,b1,d5,01,95,c0,f7,b9,97,e4,8f,71,97,31,\ - 03,06,a1,9f,20,93,51,fd,6e,61,e8,02,3d,f4 -"Save Password"=dword:00000001 - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP\Command History] -"1"="HELP" -"2"="CDUP" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP\Host Address History] -"1"="polymech.io" -"2"="polymech" - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP\Init Path History] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP\Proxy Servers] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP\Server Types] - -[HKEY_CURRENT_USER\Software\Altap\Altap Salamander 4.0\Plugins Configuration\FTP\Server Types\1] -"Name"="UNIX1" -"Autodetect Condition"="not syst_contains(\"z/VM \") and not syst_contains(\"OS/2 \") and not syst_contains(\" MACOS \") and not syst_contains(\"Windows_NT\")" -"Rules For Parsing"="# parse lines with files and directories|* if(next_char\\!=\"l\"), assign(, next_char==\"d\"), word(),| white_spaces(), word(), white_spaces(), word(), white_spaces(),| word(), white_spaces(), positive_number(), white_spaces(),| month_3(), white_spaces(), day(), white_spaces(),| year(), white_spaces(2),| assign(, next_char==\".\"), rest_of_line();||# parse lines with files and directories|* if(next_char\\!=\"l\"), assign(, next_char==\"d\"), word(),| white_spaces(), word(), white_spaces(), word(), white_spaces(),| word(), white_spaces(), positive_number(), white_spaces(),| month_3(), white_spaces(), day(), white_spaces(),| year_or_time(,