From 9a702b6fc762f7c3625a8350d6b506f7b0c462c7 Mon Sep 17 00:00:00 2001 From: Karn Date: Sat, 30 Aug 2025 17:02:06 +0100 Subject: [PATCH 1/3] Clean up generated files names to remove or replace invalid characters --- src/utils/MediaTypeManager.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/utils/MediaTypeManager.ts b/src/utils/MediaTypeManager.ts index c661368..ac6b0ac 100644 --- a/src/utils/MediaTypeManager.ts +++ b/src/utils/MediaTypeManager.ts @@ -71,7 +71,13 @@ export class MediaTypeManager { getFileName(mediaTypeModel: MediaTypeModel): string { // Ignore undefined tags since some search APIs do not return all properties in the model and produce clean file names even if errors occur - return replaceTags(this.mediaFileNameTemplateMap.get(mediaTypeModel.getMediaType())!, mediaTypeModel, true); + let fileName = replaceTags(this.mediaFileNameTemplateMap.get(mediaTypeModel.getMediaType())!, mediaTypeModel, true); + return this.cleanFileName(fileName); + } + + cleanFileName(fileName: string) { + const invalidCharsRegex = /\™|\®|,|#|\[|\]|\||\^|\<|\>|\?|\*|\\|\//g; + return fileName.replaceAll(invalidCharsRegex, '').replaceAll(/"/g, "'").replaceAll(/:/g, ' -'); } async getTemplate(mediaTypeModel: MediaTypeModel, app: App): Promise { From c1b35fc89590866c0818dc45efd1f85d63173c29 Mon Sep 17 00:00:00 2001 From: Karn Date: Sat, 30 Aug 2025 19:51:55 +0100 Subject: [PATCH 2/3] Remove redundant regex from filename cleaner helper --- src/utils/MediaTypeManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/MediaTypeManager.ts b/src/utils/MediaTypeManager.ts index ac6b0ac..6f6f774 100644 --- a/src/utils/MediaTypeManager.ts +++ b/src/utils/MediaTypeManager.ts @@ -77,7 +77,7 @@ export class MediaTypeManager { cleanFileName(fileName: string) { const invalidCharsRegex = /\™|\®|,|#|\[|\]|\||\^|\<|\>|\?|\*|\\|\//g; - return fileName.replaceAll(invalidCharsRegex, '').replaceAll(/"/g, "'").replaceAll(/:/g, ' -'); + return fileName.replaceAll(invalidCharsRegex, '').replaceAll('"', "'").replaceAll(':', ' -'); } async getTemplate(mediaTypeModel: MediaTypeModel, app: App): Promise { From bc6b985234e59576cc6d556eb759a13cdda920d9 Mon Sep 17 00:00:00 2001 From: Karn Date: Wed, 3 Sep 2025 12:31:54 +0100 Subject: [PATCH 3/3] Refactor illegal filename character cleanup --- src/utils/IllegalFilenameCharactersList.ts | 16 ++++++++++++++++ src/utils/MediaTypeManager.ts | 8 +++++--- 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/utils/IllegalFilenameCharactersList.ts diff --git a/src/utils/IllegalFilenameCharactersList.ts b/src/utils/IllegalFilenameCharactersList.ts new file mode 100644 index 0000000..d0ceba1 --- /dev/null +++ b/src/utils/IllegalFilenameCharactersList.ts @@ -0,0 +1,16 @@ +// Illegal characters in the form `[illegal_character, replacement][]` +export const ILLEGAL_FILENAME_CHARACTERS = [ + ['\/', '-'], + ['\\', '-'], + ['<', ''], + ['>', ''], + [':', ' - '], + ['"', "'"], + ['|', ' - '], + ['?', ''], + ['*', ''], + ['[', '('], + [']', ')'], + ['^', ''], + ['#', ''], +]; diff --git a/src/utils/MediaTypeManager.ts b/src/utils/MediaTypeManager.ts index 6f6f774..29c78a2 100644 --- a/src/utils/MediaTypeManager.ts +++ b/src/utils/MediaTypeManager.ts @@ -12,6 +12,7 @@ import { WikiModel } from '../models/WikiModel'; import type { MediaDbPluginSettings } from '../settings/Settings'; import { MediaType } from './MediaType'; import { replaceTags } from './Utils'; +import { ILLEGAL_FILENAME_CHARACTERS } from './IllegalFilenameCharactersList'; export const MEDIA_TYPES: MediaType[] = [ MediaType.Movie, @@ -75,9 +76,10 @@ export class MediaTypeManager { return this.cleanFileName(fileName); } - cleanFileName(fileName: string) { - const invalidCharsRegex = /\™|\®|,|#|\[|\]|\||\^|\<|\>|\?|\*|\\|\//g; - return fileName.replaceAll(invalidCharsRegex, '').replaceAll('"', "'").replaceAll(':', ' -'); + cleanFileName(fileName: string): string { + const cleanedFileName = ILLEGAL_FILENAME_CHARACTERS.reduce((str, char) => str.replaceAll(char[0], char[1]), fileName); + // Remove all duplicate whitespace in the file name + return cleanedFileName.replaceAll(/ +/g, ' '); } async getTemplate(mediaTypeModel: MediaTypeModel, app: App): Promise {