Fix some frontend bugs related to folder naming

This commit is contained in:
Arnaud_Cayrol 2026-02-06 20:09:27 +01:00
parent 6ba592a84e
commit 6f8d52695c
2 changed files with 22 additions and 8 deletions

View file

@ -61,17 +61,25 @@
); );
// Match backend's sanitize_folder_name logic for video path construction // Match backend's sanitize_folder_name logic for video path construction
// Must exactly replicate src/utils.rs sanitize_folder_name
function sanitizeFolderName(name, id) { function sanitizeFolderName(name, id) {
const base = name && name.trim() ? name : id; const base = name && name.trim() ? name : id;
// Remove accents by decomposing to NFD and filtering combining marks
const withoutAccents = base.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
// Convert to lowercase and replace unsafe characters with underscores
let sanitized = ''; let sanitized = '';
for (const c of base) { for (const c of withoutAccents.toLowerCase()) {
if (/^[\p{L}\p{N}\-_ ]$/u.test(c)) { if (/^[a-z0-9\-_]$/.test(c)) {
sanitized += c; sanitized += c;
} else { } else {
sanitized += '_'; sanitized += '_';
} }
} }
sanitized = sanitized.trim();
// Trim whitespace and underscores, then limit length
sanitized = sanitized.replace(/^[\s_]+|[\s_]+$/g, '');
return sanitized.length > 50 ? sanitized.slice(0, 50) : sanitized; return sanitized.length > 50 ? sanitized.slice(0, 50) : sanitized;
} }

View file

@ -11,19 +11,25 @@
); );
// Match backend's sanitize_folder_name logic // Match backend's sanitize_folder_name logic
// Uses Unicode-aware regex to match Rust's is_alphanumeric() // Must exactly replicate src/utils.rs sanitize_folder_name
function sanitizeFolderName(name, id) { function sanitizeFolderName(name, id) {
const base = name && name.trim() ? name : id; const base = name && name.trim() ? name : id;
// Remove accents by decomposing to NFD and filtering combining marks
const withoutAccents = base.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
// Convert to lowercase and replace unsafe characters with underscores
let sanitized = ''; let sanitized = '';
for (const c of base) { for (const c of withoutAccents.toLowerCase()) {
// \p{L} = Unicode letter, \p{N} = Unicode number (matches Rust's is_alphanumeric) if (/^[a-z0-9\-_]$/.test(c)) {
if (/^[\p{L}\p{N}\-_ ]$/u.test(c)) {
sanitized += c; sanitized += c;
} else { } else {
sanitized += '_'; sanitized += '_';
} }
} }
sanitized = sanitized.trim();
// Trim whitespace and underscores, then limit length
sanitized = sanitized.replace(/^[\s_]+|[\s_]+$/g, '');
return sanitized.length > 50 ? sanitized.slice(0, 50) : sanitized; return sanitized.length > 50 ? sanitized.slice(0, 50) : sanitized;
} }