touhou-tagger
Version:
从 THBWiki 自动填写东方 Project CD 曲目信息.
103 lines (102 loc) • 4.53 kB
JavaScript
;
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;