From 5314d9a7c3db8e23cd3be0b7f6fedf4b0cdbffa2 Mon Sep 17 00:00:00 2001 From: Geomitron <22552797+Geomitron@users.noreply.github.com> Date: Wed, 27 May 2020 15:19:34 -0400 Subject: [PATCH] Added better invalid character replacements --- package-lock.json | 10 +++++++++- package.json | 2 ++ .../result-table/result-table.component.html | 2 +- src/app/core/services/search.service.ts | 2 +- src/electron/ipc/download/FileDownloader.ts | 1 - src/electron/shared/UtilFunctions.ts | 19 +++++++++++++------ 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index d118002..3244cb2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2212,6 +2212,15 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, + "@types/randombytes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/randombytes/-/randombytes-2.0.0.tgz", + "integrity": "sha512-bz8PhAVlwN72vqefzxa14DKNT8jK/mV66CSjwdVQM/k3Th3EPKfUtdMniwZgMedQTFuywAsfjnZsg+pEnltaMA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz", @@ -14468,7 +14477,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } diff --git a/package.json b/package.json index f8a34cd..13b8679 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "needle": "^2.3.2", "node-7z": "^2.0.5", "node-unrar-js": "^0.8.1", + "randombytes": "^2.1.0", "rimraf": "^3.0.2", "rxjs": "~6.5.5", "sanitize-filename": "^1.6.3", @@ -63,6 +64,7 @@ "@types/mv": "^2.1.0", "@types/needle": "^2.0.4", "@types/node": "^12.11.1", + "@types/randombytes": "^2.0.0", "@types/rimraf": "^3.0.0", "@types/underscore": "^1.9.4", "@typescript-eslint/eslint-plugin": "^2.19.2", diff --git a/src/app/components/browse/result-table/result-table.component.html b/src/app/components/browse/result-table/result-table.component.html index 24de5e7..1240993 100644 --- a/src/app/components/browse/result-table/result-table.component.html +++ b/src/app/components/browse/result-table/result-table.component.html @@ -1,6 +1,6 @@ - + diff --git a/src/app/core/services/search.service.ts b/src/app/core/services/search.service.ts index 179bb3d..97eb8e7 100644 --- a/src/app/core/services/search.service.ts +++ b/src/app/core/services/search.service.ts @@ -11,7 +11,7 @@ export class SearchService { private resultsChangedEmitter = new EventEmitter() // For when any results change private newResultsEmitter = new EventEmitter() // For when a new search happens private results: SongResult[] = [] - private awaitingResults = false // TODO: add loading icon below table when this is true + private awaitingResults = false private currentQuery: SongSearch private _allResultsVisible = true diff --git a/src/electron/ipc/download/FileDownloader.ts b/src/electron/ipc/download/FileDownloader.ts index bd3e449..a3dd7c4 100644 --- a/src/electron/ipc/download/FileDownloader.ts +++ b/src/electron/ipc/download/FileDownloader.ts @@ -2,7 +2,6 @@ import { AnyFunction } from '../../shared/UtilFunctions' import { createWriteStream } from 'fs' import * as needle from 'needle' // TODO: replace needle with got (for cancel() method) (if before-headers event is possible?) -// TODO: add download throttle library and setting import { googleTimer } from './GoogleTimer' import { DownloadError } from './ChartDownload' diff --git a/src/electron/shared/UtilFunctions.ts b/src/electron/shared/UtilFunctions.ts index cfee556..d788cc2 100644 --- a/src/electron/shared/UtilFunctions.ts +++ b/src/electron/shared/UtilFunctions.ts @@ -1,23 +1,30 @@ +import * as randomBytes from 'randombytes' const sanitize = require('sanitize-filename') // eslint-disable-next-line @typescript-eslint/no-explicit-any export type AnyFunction = (...args: any) => any /** - * @returns `filename`, but with any invalid filename characters replaced with similar valid characters. + * @returns `filename` with all invalid filename characters replaced. */ export function sanitizeFilename(filename: string): string { - const newName = sanitize(filename, { + const newFilename = sanitize(filename, { replacement: ((invalidChar: string) => { switch (invalidChar) { - case '/': return '-' - case '\\': return '-' + case '<': return '❮' + case '>': return '❯' + case ':': return '꞉' case '"': return "'" - default: return '_' // TODO: add more cases for replacing invalid characters + case '/': return '/' + case '\\': return '⧵' + case '|': return '⏐' + case '?': return '?' + case '*': return '⁎' + default: return '_' } }) }) - return newName + return (newFilename == '' ? randomBytes(5).toString('hex') : newFilename) } /**