0.10.2-7 Layout/Chars
This commit is contained in:
@@ -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, ' ')
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user