UNPKG

touhou-tagger

Version:

从 THBWiki 自动填写东方 Project CD 曲目信息.

103 lines (102 loc) 4.53 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CliDumper = void 0; const debug_1 = require("../core/debug"); const normalize_1 = require("../core/metadata/normalize/normalize"); const command_base_1 = require("./command-base"); const options_1 = require("./options"); const handleBufferStringify = (key, value) => { const isBuffer = typeof value === 'object' && value !== null && value.type === 'Buffer'; if (isBuffer) { return `<Buffer length=${value.data?.length ?? 0}>`; } return value; }; const dumpCover = async (metadatas) => { const { writeFileSync } = await Promise.resolve().then(() => __importStar(require('fs'))); const { resolve } = await Promise.resolve().then(() => __importStar(require('path'))); const metadata = metadatas.find(m => m.coverImage); if (!metadata) { return; } const { default: imageType } = await Promise.resolve().then(() => __importStar(require('image-type'))); const type = imageType(metadata.coverImage); if (!type) { return; } const coverFilename = resolve(process.cwd(), `cover.${type.ext}`); (0, debug_1.log)('cover file', coverFilename); writeFileSync(coverFilename, metadata.coverImage); }; class CliDumper extends command_base_1.CliCommandBase { constructor() { super(); } async run() { await this.loadAlbumOptions(); const { glob } = await Promise.resolve().then(() => __importStar(require('glob'))); const { extname, resolve } = await Promise.resolve().then(() => __importStar(require('path'))); const { writeFileSync, readFileSync } = await Promise.resolve().then(() => __importStar(require('fs'))); const { readerMappings } = await Promise.resolve().then(() => __importStar(require('../core/reader/reader-mappings'))); const globTypes = Object.keys(readerMappings) .map(readerType => readerType.replace(/^\./, '')) .join('|'); const files = (await glob(`./**/*.@(${globTypes})`, { posix: true, cwd: this.workingDir })).sort(); (0, debug_1.log)({ globTypes }); (0, debug_1.log)(files); if (files.length === 0) { console.log('没有找到能够提取的音乐文件'); return; } const results = await Promise.all(files.map(async (file) => { const type = extname(file); const reader = readerMappings[type]; reader.config = (0, options_1.getMetadataConfig)(this.options); const buffer = readFileSync(resolve(this.workingDir, file)); const rawTag = await reader.readRaw(buffer); const metadata = await reader.read(rawTag); return { rawTag, metadata, }; })); const metadatas = results.map(it => it.metadata); const rawTags = results.map(it => it.rawTag); await (0, normalize_1.simplifyMetadataInfo)({ metadatas, }); writeFileSync(resolve(this.workingDir, 'metadata.json'), JSON.stringify(metadatas.map(({ coverImage, ...restParts }) => { return restParts; }), undefined, 2)); if (this.options.debug) { writeFileSync(resolve(this.workingDir, 'metadata.debug.json'), JSON.stringify(rawTags, handleBufferStringify, 2)); } if (this.options.cover) { await dumpCover(metadatas); } } } exports.CliDumper = CliDumper;