diff --git a/src/cli.ts b/src/cli.ts index da345fa..7387d9f 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -4,9 +4,9 @@ import fs from 'fs' import path from 'path' -import { fetchMscz, MSCZ_URL_SYM } from './mscz' +import { fetchMscz, setMscz, MSCZ_URL_SYM } from './mscz' import { loadMscore, INDV_DOWNLOADS, WebMscore } from './mscore' -import { ScoreInfoHtml } from './scoreinfo' +import { ScoreInfo, ScoreInfoHtml, ScoreInfoObj } from './scoreinfo' import { escapeFilename } from './utils' import i18n from './i18n' @@ -15,6 +15,7 @@ const ora: typeof import('ora') = require('ora') const chalk: typeof import('chalk') = require('chalk') const SCORE_URL_PREFIX = 'https://musescore.com/' +const EXT = '.mscz' interface Params { url: string; @@ -25,35 +26,42 @@ interface Params { } void (async () => { - // ask for the page url - const { url } = await inquirer.prompt({ - type: 'input', - name: 'url', - message: 'Score URL:', - suffix: ` (starts with "${SCORE_URL_PREFIX}")\n `, - validate (input: string) { - return input && input.startsWith(SCORE_URL_PREFIX) - }, - default: process.argv[2], - }) + const fileInit: string | undefined = process.argv[2] + const isLocalFile = fileInit?.endsWith(EXT) && fs.existsSync(fileInit) - // request scoreinfo - const scoreinfo = await ScoreInfoHtml.request(url) - const fileName = scoreinfo.fileName + let scoreinfo: ScoreInfo + if (!isLocalFile) { + // ask for the page url + const { url } = await inquirer.prompt({ + type: 'input', + name: 'url', + message: 'Score URL:', + suffix: ` (starts with "${SCORE_URL_PREFIX}")\n `, + validate (input: string) { + return input && input.startsWith(SCORE_URL_PREFIX) + }, + default: fileInit, + }) - // confirmation - const { confirmed } = await inquirer.prompt({ - type: 'confirm', - name: 'confirmed', - message: 'Continue?', - prefix: `${chalk.yellow('!')} ` + - `ID: ${scoreinfo.id}\n ` + - `Title: ${scoreinfo.title}\n `, - default: true, - }) - if (!confirmed) return + // request scoreinfo + scoreinfo = await ScoreInfoHtml.request(url) + + // confirmation + const { confirmed } = await inquirer.prompt({ + type: 'confirm', + name: 'confirmed', + message: 'Continue?', + prefix: `${chalk.yellow('!')} ` + + `ID: ${scoreinfo.id}\n ` + + `Title: ${scoreinfo.title}\n `, + default: true, + }) + if (!confirmed) return + console.log() // print a blank line to the terminal + } else { + scoreinfo = new ScoreInfoObj(0, path.basename(fileInit, EXT)) + } - console.log() const spinner = ora({ text: i18n('PROCESSING')(), color: 'blue', @@ -64,11 +72,19 @@ void (async () => { let score: WebMscore let metadata: import('webmscore/schemas').ScoreMetadata try { - // fetch mscz file from the dataset, and cache it for side effect - await fetchMscz(scoreinfo) + if (!isLocalFile) { + // fetch mscz file from the dataset, and cache it for side effect + await fetchMscz(scoreinfo) + } else { + // load local file + const data = await fs.promises.readFile(fileInit) + await setMscz(scoreinfo, data.buffer) + } spinner.info('MSCZ file loaded') - spinner.info(`File URL: ${scoreinfo.store.get(MSCZ_URL_SYM) as string}`) + if (!isLocalFile) { + spinner.info(`File URL: ${scoreinfo.store.get(MSCZ_URL_SYM) as string}`) + } spinner.start() // load score using webmscore @@ -123,6 +139,7 @@ void (async () => { }) // export files + const fileName = scoreinfo.fileName || await score.titleFilenameSafe() spinner.start() await Promise.all( filetypes.map(async (d) => { diff --git a/src/mscz.ts b/src/mscz.ts index e3b338f..a2e43e5 100644 --- a/src/mscz.ts +++ b/src/mscz.ts @@ -76,6 +76,11 @@ export const fetchMscz = async (scoreinfo: ScoreInfo, _fetch = getFetch()): Prom return msczBufferP } +// eslint-disable-next-line @typescript-eslint/require-await +export const setMscz = async (scoreinfo: ScoreInfo, buffer: ArrayBuffer): Promise => { + scoreinfo.store.set(MSCZ_BUF_SYM, Promise.resolve(buffer)) +} + export const downloadMscz = async (scoreinfo: ScoreInfo, saveAs: typeof import('file-saver').saveAs): Promise => { const data = new Blob([await fetchMscz(scoreinfo)]) const filename = scoreinfo.fileName diff --git a/src/scoreinfo.ts b/src/scoreinfo.ts index 9053dfe..3133b87 100644 --- a/src/scoreinfo.ts +++ b/src/scoreinfo.ts @@ -27,7 +27,7 @@ export abstract class ScoreInfo { } export class ScoreInfoObj extends ScoreInfo { - constructor (public id: number, public title: string) { super() } + constructor (public id: number = 0, public title: string = '') { super() } } export class ScoreInfoInPage extends ScoreInfo {