diff --git a/src/cli.ts b/src/cli.ts index f02943e..93fcec3 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -7,6 +7,7 @@ import fs from 'fs' import { fetchMscz } from './mscz' import { loadMscore, INDV_DOWNLOADS, WebMscore } from './mscore' import { ScoreInfoHtml } from './scoreinfo' +import { escapeFilename } from './utils' import i18n from './i18n' const SCORE_URL_PREFIX = 'https://musescore.com/' @@ -99,7 +100,7 @@ void (async () => { await Promise.all( filetypes.map(async (d) => { const data = await d.action(score) - const f = `${fileName} - ${encodeURIComponent(partName)}.${d.fileExt}` + const f = `${fileName} - ${escapeFilename(partName)}.${d.fileExt}` await fs.promises.writeFile(f, data) spinner.info(`Saved ${chalk.underline(f)}`) spinner.start() diff --git a/src/scoreinfo.ts b/src/scoreinfo.ts index 6be1c24..024d421 100644 --- a/src/scoreinfo.ts +++ b/src/scoreinfo.ts @@ -1,5 +1,5 @@ -import { getFetch } from './utils' +import { getFetch, escapeFilename } from './utils' export abstract class ScoreInfo { private readonly IPNS_KEY = 'QmSdXtvzC8v8iTTZuj5cVmiugnzbR1QATYRcGix4bBsioP'; @@ -15,7 +15,7 @@ export abstract class ScoreInfo { } get fileName (): string { - return this.title.replace(/[\s<>:{}"/\\|?*~.\0\cA-\cZ]+/g, '_') + return escapeFilename(this.title) } get msczIpfsRef (): string { diff --git a/src/utils.ts b/src/utils.ts index b89ec2a..f9cfc94 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,10 @@ import isNodeJs from 'detect-node' +export const escapeFilename = (s: string): string => { + return s.replace(/[\s<>:{}"/\\|?*~.\0\cA-\cZ]+/g, '_') +} + export const getIndexPath = (id: number): string => { const idStr = String(id) // 获取最后三位,倒序排列