import fs from 'node:fs'; import path from 'node:path'; import type { LogLevel } from './types.js'; import { DEFAULT_MPV_LOG_FILE } from './types.js'; export const COLORS = { red: '\x1b[0;31m', green: '\x1b[0;32m', yellow: '\x1b[0;33m', cyan: '\x1b[0;36m', reset: '\x1b[0m', }; export const LOG_PRI: Record = { debug: 10, info: 20, warn: 30, error: 40, }; export function shouldLog(level: LogLevel, configured: LogLevel): boolean { return LOG_PRI[level] >= LOG_PRI[configured]; } export function getMpvLogPath(): string { const envPath = process.env.SUBMINER_MPV_LOG?.trim(); if (envPath) return envPath; return DEFAULT_MPV_LOG_FILE; } export function appendToMpvLog(message: string): void { const logPath = getMpvLogPath(); try { fs.mkdirSync(path.dirname(logPath), { recursive: true }); fs.appendFileSync(logPath, `[${new Date().toISOString()}] ${message}\n`, { encoding: 'utf8' }); } catch { // ignore logging failures } } export function log(level: LogLevel, configured: LogLevel, message: string): void { if (!shouldLog(level, configured)) return; const color = level === 'info' ? COLORS.green : level === 'warn' ? COLORS.yellow : level === 'error' ? COLORS.red : COLORS.cyan; process.stdout.write(`${color}[${level.toUpperCase()}]${COLORS.reset} ${message}\n`); appendToMpvLog(`[${level.toUpperCase()}] ${message}`); } export function fail(message: string): never { process.stderr.write(`${COLORS.red}[ERROR]${COLORS.reset} ${message}\n`); appendToMpvLog(`[ERROR] ${message}`); process.exit(1); }