// 列 OSS audio/ 最近 N 个文件,带时间戳和稳定/UUID 标记 const fs = require('fs'); const path = require('path'); const envTxt = fs.readFileSync(path.join(__dirname, '..', '..', 'server', '.env.production'), 'utf8'); const env = {}; for (const line of envTxt.split(/\r?\n/)) { const m = line.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/); if (m) env[m[1]] = m[2].replace(/^["']|["']$/g, ''); } const OSS = require(path.join(__dirname, '..', '..', 'server', 'node_modules', 'ali-oss')); const c = new OSS({ accessKeyId: env.OSS_ACCESS_KEY_ID, accessKeySecret: env.OSS_ACCESS_KEY_SECRET, bucket: 'rrbrr-book-audio', endpoint: 'oss-cn-shanghai.aliyuncs.com', secure: true, }); (async () => { const all = []; let marker = null; do { const r = await c.list({ prefix: 'audio/', 'max-keys': 1000, marker }); all.push(...(r.objects || [])); marker = r.nextMarker || null; } while (marker); // 按 lastModified 倒序 all.sort((a, b) => new Date(b.lastModified) - new Date(a.lastModified)); console.log(`总文件数: ${all.length}\n`); console.log('=== 最近 25 个文件 ==='); for (const o of all.slice(0, 25)) { const isMergedPath = o.name.includes('/merged/chapter/') || o.name.includes('/audio/chapter/'); const isMergedMp3 = o.name.includes('_merged.mp3'); const tag = isMergedPath ? '✅ 稳定路径' : (isMergedMp3 ? '⚠️ UUID_merged (垃圾)' : ' UUID (TTS)'); const mb = (o.size / 1024 / 1024).toFixed(1).padStart(6); console.log(`${o.lastModified.slice(0, 19)} ${mb} MB ${tag.padEnd(22)} ${o.name}`); } })();