touhou-tagger
Version:
从 THBWiki 自动填写东方 Project CD 曲目信息.
204 lines (203 loc) • 7.41 kB
JavaScript
"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;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadOptions = exports.getCliOptions = exports.getMetadataConfig = exports.getLyricConfig = void 0;
const yargs_1 = __importDefault(require("yargs"));
const helpers_1 = require("yargs/helpers");
const core_config_1 = require("../core/core-config");
const debug_1 = require("../core/debug");
const config_file_1 = require("./config-file");
const readCliOptionsFromFile = () => {
const configFile = (0, config_file_1.loadConfigFile)();
const options = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
.parserConfiguration({
'short-option-groups': false,
})
.command(['tag', '*'], '为音乐文件写入元数据', {}, () => {
Promise.resolve().then(() => __importStar(require('./run-tagger'))).then(({ runTagger }) => {
runTagger();
});
})
.command('dump', '从音乐文件提取元数据', {}, () => {
Promise.resolve().then(() => __importStar(require('./run-dumper'))).then(({ dump }) => {
dump();
});
})
.option('cover', {
alias: 'c',
type: 'boolean',
default: false,
description: '是否将封面保存为独立文件',
})
.option('debug', {
alias: 'd',
type: 'boolean',
default: false,
description: '是否启用调试模式, 输出更杂碎的日志',
})
.option('batch', {
alias: 'b',
type: 'string',
description: '是否使用批量模式, 参数为开始批量运行的路径',
})
.option('batch-depth', {
alias: 'bd',
type: 'number',
default: 1,
description: '指定批量模式的文件夹层级',
})
.option('comment-language', {
type: 'string',
default: configFile?.commentLanguage ?? 'zho',
description: '自定义 ID3 Tag 注释的语言 (ISO-639-2)',
})
.option('cover-compress-size', {
alias: 'ccs',
type: 'number',
default: configFile?.coverCompressSize ?? 0,
description: '封面达到指定的大小 (MB) 时, 自动进行压缩 (只影响嵌入文件的封面)',
})
.option('cover-compress-resolution', {
alias: 'ccr',
type: 'number',
default: configFile?.coverCompressResolution ?? 0,
description: '压缩封面时的最大边长, 超过时会进行缩放',
})
.option('source', {
alias: 's',
type: 'string',
default: 'thb-wiki',
choices: ['thb-wiki', 'doujin-meta'],
description: '设置数据源',
})
.option('lyric', {
alias: 'l',
type: 'boolean',
default: false,
description: '是否启用歌词写入 (会增加运行时间)',
})
.option('lyric-type', {
alias: 'lt',
type: 'string',
default: configFile?.lyric?.type ?? 'original',
choices: ['original', 'translated', 'mixed'],
description: '歌词类型, 可以选择原文/译文/混合模式',
})
.option('lyric-output', {
alias: 'lo',
type: 'string',
default: configFile?.lyric?.output ?? 'metadata',
choices: ['metadata', 'lrc'],
description: '歌词输出方式, 可以选择写入歌曲元数据或者保存为 lrc 文件',
})
.option('lyric-cache-size', {
alias: 'lcs',
type: 'number',
default: 16,
description: '下载歌词时的最大缓存数量',
})
.option('translation-separator', {
alias: 'ts',
type: 'string',
default: configFile?.lyric?.translationSeparator ?? ' // ',
description: '指定混合歌词模式下, 使用的分隔符',
})
.option('lyric-time', {
type: 'boolean',
default: true,
description: '是否启用歌词时轴',
})
.option('separator', {
type: 'string',
default: configFile?.separator ?? core_config_1.DefaultMetadataSeparator,
description: '指定 mp3 元数据的分隔符',
})
.option('timeout', {
type: 'number',
default: configFile?.timeout ?? 30,
description: '指定一次运行的超时时间',
})
.option('retry', {
type: 'number',
default: configFile?.retry ?? 3,
description: '指定超时后自动重试的最大次数',
})
.option('interactive', {
alias: 'i',
type: 'boolean',
default: true,
description: '是否允许交互',
})
.parseSync();
if (options.debug) {
console.log('Node.js version:', process.version);
}
return Object.freeze({ ...options });
};
const getLyricConfig = (options) => {
return {
type: options.lyricType,
output: options.lyricOutput,
time: options.lyricTime,
translationSeparator: options.translationSeparator,
maxCacheSize: options.lyricCacheSize,
};
};
exports.getLyricConfig = getLyricConfig;
const getMetadataConfig = (options) => {
return {
lyric: options.lyric ? (0, exports.getLyricConfig)(options) : undefined,
commentLanguage: options.commentLanguage,
coverCompressSize: options.coverCompressSize,
coverCompressResolution: options.coverCompressResolution,
separator: options.separator,
timeout: options.timeout,
retry: options.retry,
};
};
exports.getMetadataConfig = getMetadataConfig;
let cliOptions;
const getCliOptions = () => {
if (cliOptions) {
return { ...cliOptions };
}
cliOptions = readCliOptionsFromFile();
return { ...cliOptions };
};
exports.getCliOptions = getCliOptions;
const loadOptions = () => {
const options = (0, exports.getCliOptions)();
(0, debug_1.setDebug)(options.debug);
const metadataConfig = (0, exports.getMetadataConfig)(options);
const lyricConfig = (0, exports.getLyricConfig)(options);
(0, debug_1.log)(options);
(0, debug_1.log)(metadataConfig);
(0, config_file_1.saveConfigFile)({ ...metadataConfig, lyric: lyricConfig });
return options;
};
exports.loadOptions = loadOptions;