0.10.2-7 Layout/Chars

This commit is contained in:
2026-03-16 08:36:02 +00:00
parent e9a48fadaf
commit ed44d866df
2 changed files with 25 additions and 5 deletions
+2 -4
View File
@@ -5,7 +5,7 @@ const { promisify } = require('util');
const logger = require('./logger').child('CD_RIP'); const logger = require('./logger').child('CD_RIP');
const { spawnTrackedProcess } = require('./processRunner'); const { spawnTrackedProcess } = require('./processRunner');
const { parseCdParanoiaProgress } = require('../utils/progressParsers'); const { parseCdParanoiaProgress } = require('../utils/progressParsers');
const { ensureDir } = require('../utils/files'); const { ensureDir, transliterateForFilename } = require('../utils/files');
const { errorToMeta } = require('../utils/errorMeta'); const { errorToMeta } = require('../utils/errorMeta');
const execFileAsync = promisify(execFile); const execFileAsync = promisify(execFile);
@@ -120,10 +120,8 @@ function buildOutputFilename(track, meta, format, outputTemplate = DEFAULT_CD_OU
} }
function sanitizePathSegment(value, fallback = 'unknown') { function sanitizePathSegment(value, fallback = 'unknown') {
const raw = String(value == null ? '' : value) const raw = transliterateForFilename(String(value == null ? '' : value))
.normalize('NFC')
.replace(/[\\/:*?"<>|]/g, '-') .replace(/[\\/:*?"<>|]/g, '-')
// Keep umlauts/special letters, but filter heart symbols in filenames.
.replace(/[♥❤♡❥❣❦❧]/gu, ' ') .replace(/[♥❤♡❥❣❦❧]/gu, ' ')
.replace(/\p{C}+/gu, ' ') .replace(/\p{C}+/gu, ' ')
.replace(/\s+/g, ' ') .replace(/\s+/g, ' ')
+23 -1
View File
@@ -5,8 +5,29 @@ function ensureDir(dirPath) {
fs.mkdirSync(dirPath, { recursive: true }); fs.mkdirSync(dirPath, { recursive: true });
} }
function transliterateForFilename(input) {
return String(input || '')
// German — must come before NFD to get ae/oe/ue instead of just a/o/u
.replace(/ä/g, 'ae').replace(/Ä/g, 'Ae')
.replace(/ö/g, 'oe').replace(/Ö/g, 'Oe')
.replace(/ü/g, 'ue').replace(/Ü/g, 'Ue')
.replace(/ß/g, 'ss')
// Danish / Norwegian / Swedish
.replace(/å/g, 'a').replace(/Å/g, 'A')
.replace(/æ/g, 'ae').replace(/Æ/g, 'Ae')
.replace(/ø/g, 'o').replace(/Ø/g, 'O')
// Icelandic
.replace(/ð/g, 'd').replace(/Ð/g, 'D')
.replace(/þ/g, 'th').replace(/Þ/g, 'Th')
// NFD decomposition + strip combining diacritical marks (handles é→e, ñ→n, ç→c, etc.)
.normalize('NFD')
.replace(/\p{M}+/gu, '')
// Drop any remaining non-ASCII characters
.replace(/[^\x00-\x7F]/g, '');
}
function sanitizeFileName(input) { function sanitizeFileName(input) {
return String(input || 'untitled') return transliterateForFilename(String(input || 'untitled'))
.replace(/[\\/:*?"<>|]/g, '_') .replace(/[\\/:*?"<>|]/g, '_')
.replace(/\s+/g, ' ') .replace(/\s+/g, ' ')
.trim() .trim()
@@ -63,6 +84,7 @@ function findMediaFiles(dirPath, extensions = ['.mkv', '.mp4']) {
module.exports = { module.exports = {
ensureDir, ensureDir,
transliterateForFilename,
sanitizeFileName, sanitizeFileName,
renderTemplate, renderTemplate,
findLargestMediaFile, findLargestMediaFile,