#!/usr/bin/env node /** * 导出系统模板配置脚本 * 从数据库导出所有系统模板配置到 system-templates.json * * 使用方法: * node scripts/export-system-templates.js */ const fs = require('fs'); const path = require('path'); const Database = require('better-sqlite3'); async function exportSystemTemplates() { console.log('📦 开始导出系统模板配置...\n'); try { // 确定数据库路径 let dbPath; const possiblePaths = [ path.join(__dirname, '../userData/data.db'), path.join(__dirname, '../data.db'), path.join(process.env.APPDATA || process.env.HOME, 'zhenqianba/data.db'), ]; for (const tryPath of possiblePaths) { if (fs.existsSync(tryPath)) { dbPath = tryPath; console.log(`✅ 找到数据库: ${dbPath}\n`); break; } } if (!dbPath) { console.error('❌ 未找到数据库文件,请确保应用已启动过一次'); console.error('尝试的路径:', possiblePaths); process.exit(1); } // 打开数据库 const db = new Database(dbPath, { readonly: true }); // 导出字幕模板 console.log('1️⃣ 导出字幕模板...'); const subtitleTemplates = db.prepare(` SELECT id, name, description, config, is_system, readonly, created_at, updated_at FROM subtitle_templates WHERE is_system = 1 ORDER BY created_at ASC `).all(); const subtitleTemplatesFormatted = subtitleTemplates.map(t => ({ id: t.id, name: t.name, description: t.description, isSystem: Boolean(t.is_system), readonly: Boolean(t.readonly), createdAt: t.created_at, config: typeof t.config === 'string' ? JSON.parse(t.config) : t.config })); console.log(` ✅ 导出 ${subtitleTemplatesFormatted.length} 个字幕模板`); // 导出封面模板 console.log('\n2️⃣ 导出封面模板...'); const coverTemplates = db.prepare(` SELECT id, name, description, config, thumbnail_path, is_system, readonly, created_at, updated_at FROM cover_templates WHERE is_system = 1 ORDER BY created_at ASC `).all(); const coverTemplatesFormatted = coverTemplates.map(t => ({ id: t.id, name: t.name, description: t.description, is_system: t.is_system, readonly: Boolean(t.readonly), config: typeof t.config === 'string' ? JSON.parse(t.config) : t.config, thumbnailPath: t.thumbnail_path, createdAt: t.created_at })); console.log(` ✅ 导出 ${coverTemplatesFormatted.length} 个封面模板`); // 生成配置对象 const systemTemplatesConfig = { version: "1.0.0", description: "系统内置模板配置 - 包含8套字幕模板和8套封面模板(开发模式可编辑,生产模式只读)", timestamp: new Date().toISOString(), subtitleTemplates: subtitleTemplatesFormatted, coverTemplates: coverTemplatesFormatted }; // 保存到文件 const configPath = path.join(__dirname, '../electron/config/system-templates.json'); fs.writeFileSync( configPath, JSON.stringify(systemTemplatesConfig, null, 2), 'utf-8' ); console.log(`\n✅ 配置已保存到: ${configPath}`); console.log(` - 字幕模板: ${subtitleTemplatesFormatted.length} 套`); console.log(` - 封面模板: ${coverTemplatesFormatted.length} 套`); console.log(` - 文件大小: ${(fs.statSync(configPath).size / 1024).toFixed(2)} KB`); db.close(); console.log('\n✨ 导出完成!'); process.exit(0); } catch (error) { console.error('\n❌ 导出失败:', error.message); console.error(error); process.exit(1); } } exportSystemTemplates();