Files

127 lines
4.4 KiB
JavaScript
Executable File

const fs = require('fs');
const path = require('path');
const ROOT_DIR = path.join(__dirname, '..');
const APP_CONFIG_FILE = path.join(ROOT_DIR, 'config.json');
const DEFAULT_APP_CONFIG = {
api: {
music: 'https://api.chksz.top/api/163_music',
lyric: 'https://api.chksz.top/api/163_lyric',
search: 'https://api.chksz.top/api/163_search',
playlist: 'https://api.chksz.top/api/163_playlist',
neteaseBaseUrl: 'https://music.163.com',
},
paths: {
downloadDir: 'downloads',
historyFile: 'download_history.json',
runtimeConfigFile: 'downloader_config.json',
trashDir: '.trash',
tempZipDir: '.tmp_zip',
},
defaults: {
quality: 'jymaster',
retries: 3,
historyLimit: 500,
},
};
function loadAppConfig() {
try {
if (!fs.existsSync(APP_CONFIG_FILE)) return DEFAULT_APP_CONFIG;
const config = JSON.parse(fs.readFileSync(APP_CONFIG_FILE, 'utf-8'));
return {
api: { ...DEFAULT_APP_CONFIG.api, ...(config.api || {}) },
paths: { ...DEFAULT_APP_CONFIG.paths, ...(config.paths || {}) },
defaults: { ...DEFAULT_APP_CONFIG.defaults, ...(config.defaults || {}) },
};
} catch (e) {
console.warn(`⚠️ 配置文件读取失败,将使用默认配置: ${e.message}`);
return DEFAULT_APP_CONFIG;
}
}
function resolveConfigPath(configPath, fallback) {
const value = typeof configPath === 'string' && configPath.trim() ? configPath.trim() : fallback;
return path.isAbsolute(value) ? value : path.join(ROOT_DIR, value);
}
function getConfigString(value, fallback) {
return typeof value === 'string' && value.trim() ? value.trim() : fallback;
}
const APP_CONFIG = loadAppConfig();
const API = {
music: getConfigString(APP_CONFIG.api.music, DEFAULT_APP_CONFIG.api.music),
lyric: getConfigString(APP_CONFIG.api.lyric, DEFAULT_APP_CONFIG.api.lyric),
search: getConfigString(APP_CONFIG.api.search, DEFAULT_APP_CONFIG.api.search),
playlist: getConfigString(APP_CONFIG.api.playlist, DEFAULT_APP_CONFIG.api.playlist),
neteaseBaseUrl: getConfigString(APP_CONFIG.api.neteaseBaseUrl, DEFAULT_APP_CONFIG.api.neteaseBaseUrl),
};
const NETEASE_BASE_URL = API.neteaseBaseUrl.replace(/\/$/, '');
const DOWNLOAD_DIR = resolveConfigPath(APP_CONFIG.paths.downloadDir, DEFAULT_APP_CONFIG.paths.downloadDir);
const HISTORY_FILE = resolveConfigPath(APP_CONFIG.paths.historyFile, DEFAULT_APP_CONFIG.paths.historyFile);
const CONFIG_FILE = resolveConfigPath(APP_CONFIG.paths.runtimeConfigFile, DEFAULT_APP_CONFIG.paths.runtimeConfigFile);
const TRASH_DIR = resolveConfigPath(APP_CONFIG.paths.trashDir, DEFAULT_APP_CONFIG.paths.trashDir);
const TEMP_ZIP_DIR = resolveConfigPath(APP_CONFIG.paths.tempZipDir, DEFAULT_APP_CONFIG.paths.tempZipDir);
const QUALITY_LEVELS = ['standard', 'exhigh', 'lossless', 'hires', 'jymaster', 'sky', 'jyeffect'];
const QUALITY_LABELS = {
standard: '标准',
exhigh: '极高',
lossless: '无损',
hires: 'Hi-Res',
jymaster: '超清母带',
sky: '空间音频',
jyeffect: '高清臻品',
};
const DEFAULT_LEVEL = QUALITY_LEVELS.includes(APP_CONFIG.defaults.quality)
? APP_CONFIG.defaults.quality
: DEFAULT_APP_CONFIG.defaults.quality;
const DEFAULT_RETRIES = Number.isInteger(APP_CONFIG.defaults.retries) && APP_CONFIG.defaults.retries > 0
? APP_CONFIG.defaults.retries
: DEFAULT_APP_CONFIG.defaults.retries;
const HISTORY_LIMIT = Number.isInteger(APP_CONFIG.defaults.historyLimit) && APP_CONFIG.defaults.historyLimit > 0
? APP_CONFIG.defaults.historyLimit
: DEFAULT_APP_CONFIG.defaults.historyLimit;
function loadRuntimeConfig() {
try {
if (fs.existsSync(CONFIG_FILE)) return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
} catch {}
return {};
}
function saveRuntimeConfig(config) {
fs.mkdirSync(path.dirname(CONFIG_FILE), { recursive: true });
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
}
function getConfig(key, defaultVal) {
const config = loadRuntimeConfig();
return config[key] !== undefined ? config[key] : defaultVal;
}
function setConfig(key, val) {
const config = loadRuntimeConfig();
config[key] = val;
saveRuntimeConfig(config);
}
if (!fs.existsSync(DOWNLOAD_DIR)) fs.mkdirSync(DOWNLOAD_DIR, { recursive: true });
module.exports = {
API,
NETEASE_BASE_URL,
DOWNLOAD_DIR,
HISTORY_FILE,
CONFIG_FILE,
TRASH_DIR,
TEMP_ZIP_DIR,
QUALITY_LEVELS,
QUALITY_LABELS,
DEFAULT_LEVEL,
DEFAULT_RETRIES,
HISTORY_LIMIT,
getConfig,
setConfig,
};