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 c661368..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, @@ -71,7 +72,14 @@ 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): 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 {