UNPKG

touhou-tagger

Version:

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

204 lines (203 loc) 7.41 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; }; 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;