fix: handle non-image modalities across uploads, previews, and filenames (#255)

SnapOtter spans five modalities now, but several code paths still assumed image input.

- dropzone: default to accept-all when no fileFilter is given (image tools still pass one); neutral "supported file types" error text instead of "image files"
- automate (pipelines): accept any modality in the file pickers and dropzones; render modality-aware previews (video player, audio waveform, document/data card) instead of always using ImageViewer/BeforeAfterSlider
- filename sanitizer: extend the double-extension allowlist beyond image extensions to video/audio/document/data so e.g. "report.csv.php" becomes "report.csv"; add tests
- thumbnail route: return 422 for non-rasterisable files (audio, data, non-PDF docs) instead of attempting a doomed Sharp decode
- pool: unknown tools fall back to the "system" pool, not the image pool
- a11y labels: "Previous/Next image", "Image viewer/area/controls/drop zone" are now modality-neutral, across all 21 locales
- copy: bulk-rename default, find-duplicates ZIP name, SSRF user-agent, fetch-urls fallback name, file-details MIME label, URL-import placeholder, help dialog
This commit is contained in:
SnapOtter
2026-06-16 18:04:48 +08:00
committed by GitHub
parent 622c9f98a5
commit 8eee17aeea
29 changed files with 420 additions and 246 deletions
+12 -12
View File
@@ -2436,13 +2436,13 @@ export const ar: TranslationKeys = {
generatingPreview: "جاري إنشاء المعاينة...",
cannotPreviewWillProcess:
"لا يمكن معاينة ملفات {ext} في المتصفح. ستتم معالجة الملف بشكل طبيعي.",
previousImage: "الصورة السابقة",
nextImage: "الصورة التالية",
previousImage: "الملف السابق",
nextImage: "الملف التالي",
imageCounter: "{current} / {total}",
settingsLabel: "الإعدادات",
downloadAllZip: "تحميل الكل (ZIP)",
hideSettings: "إخفاء الإعدادات",
imageArea: "منطقة الصورة",
imageArea: "منطقة المعاينة",
disabledByAdmin: "This tool has been disabled by your administrator",
browseOtherTools: "Browse other tools",
privacyNote: "Files are processed on your server and never leave your network",
@@ -3176,10 +3176,10 @@ export const ar: TranslationKeys = {
savingIndicator: "...",
cancelButton: "إلغاء",
preview: "معاينة",
previousImage: "الصورة السابقة",
nextImage: "الصورة التالية",
previousImage: "الملف السابق",
nextImage: "الملف التالي",
imageCounter: "{current} / {total}",
imageArea: "منطقة الصورة",
imageArea: "منطقة المعاينة",
templateSocialMedia: "جاهز لوسائل التواصل",
templatePrivacyClean: "تنظيف الخصوصية",
templateWebOptimization: "تحسين للويب",
@@ -3399,14 +3399,14 @@ export const ar: TranslationKeys = {
zoomOut: "Zoom out",
fitToView: "Fit to view",
actualSize: "Actual size",
previousImage: "Previous image",
nextImage: "Next image",
imageArea: "Image area",
imageViewer: "Image viewer",
previousImage: "الملف السابق",
nextImage: "الملف التالي",
imageArea: "منطقة المعاينة",
imageViewer: "عارض الملفات",
fileDropZone: "File drop zone",
imageDropZone: "Image drop zone",
imageDropZone: "منطقة إسقاط الملفات",
beforeAfterSlider: "Before/after comparison slider",
imageControls: "Image controls",
imageControls: "عناصر تحكم المعاينة",
zoomControls: "Zoom controls",
dragToReorder: "Drag to reorder",
whiteBackground: "White background",