test-audio-playback.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. const { PrismaClient } = require('@prisma/client');
  2. const prisma = new PrismaClient();
  3. const http = require('http');
  4. async function testAudioPlayback() {
  5. console.log('\n🎵 音频播放完整测试\n');
  6. console.log('=' .repeat(60));
  7. const bookId = 5;
  8. // 步骤1:检查一个小节的音频URL
  9. console.log('📊 步骤1:检查音频数据\n');
  10. const subsection = await prisma.bookChapter.findFirst({
  11. where: {
  12. bookId,
  13. level: 3
  14. },
  15. select: {
  16. id: true,
  17. title: true,
  18. level: true,
  19. audioUrl: true,
  20. audioDuration: true,
  21. content: true,
  22. }
  23. });
  24. if (!subsection) {
  25. console.log('❌ 找不到小节\n');
  26. await prisma.$disconnect();
  27. return;
  28. }
  29. console.log(`章节: ${subsection.title}`);
  30. console.log(`ID: ${subsection.id}`);
  31. console.log(`Level: ${subsection.level}`);
  32. console.log(`audioUrl: ${subsection.audioUrl || '无'}`);
  33. console.log(`audioDuration: ${subsection.audioDuration || 0}秒`);
  34. console.log(`内容: ${subsection.content || '无'}\n`);
  35. // 步骤2:检查文件是否存在
  36. console.log('📁 步骤2:检查音频文件\n');
  37. const fs = require('fs');
  38. const path = require('path');
  39. const uuid = subsection.audioUrl.match(/\/uploads\/([^\/]+)\//)?.[1];
  40. if (!uuid) {
  41. console.log('❌ 无法解析UUID\n');
  42. await prisma.$disconnect();
  43. return;
  44. }
  45. const filePath = path.join(__dirname, 'uploads', uuid, 'output.mp3');
  46. console.log(`文件路径: ${filePath}`);
  47. if (fs.existsSync(filePath)) {
  48. const stats = fs.statSync(filePath);
  49. console.log(`✅ 文件存在,大小: ${(stats.size / 1024).toFixed(2)} KB\n`);
  50. } else {
  51. console.log(`❌ 文件不存在\n`);
  52. await prisma.$disconnect();
  53. return;
  54. }
  55. // 步骤3:测试HTTP访问
  56. console.log('🌐 步骤3:测试HTTP访问\n');
  57. const url = 'http://localhost:3000' + subsection.audioUrl;
  58. console.log(`URL: ${url}\n`);
  59. return new Promise((resolve) => {
  60. http.get(url, (res) => {
  61. console.log(`HTTP响应状态: ${res.statusCode}`);
  62. console.log(`Content-Type: ${res.headers['content-type']}`);
  63. console.log(`Content-Length: ${res.headers['content-length']} bytes\n`);
  64. if (res.statusCode === 200) {
  65. console.log('✅ 音频URL可以通过HTTP访问\n');
  66. // 步骤4:测试API接口
  67. console.log('📡 步骤4:测试API接口\n');
  68. const apiUrl = `http://localhost:3000/api/player/audio/${subsection.id}`;
  69. console.log(`API URL: ${apiUrl}\n`);
  70. http.get(apiUrl, { headers: { 'Content-Type': 'application/json' } }, (apiRes) => {
  71. let data = '';
  72. apiRes.on('data', chunk => data += chunk);
  73. apiRes.on('end', () => {
  74. try {
  75. const result = JSON.parse(data);
  76. console.log(`API响应状态码: ${apiRes.statusCode}`);
  77. console.log(`API code: ${result.code}`);
  78. console.log(`API message: ${result.message}\n`);
  79. if (result.data) {
  80. console.log('音频数据:');
  81. console.log(` ID: ${result.data.id}`);
  82. console.log(` 标题: ${result.data.title}`);
  83. console.log(` audioUrl: ${result.data.audioUrl}`);
  84. console.log(` 时长: ${result.data.audioDuration}秒\n`);
  85. console.log('=' .repeat(60));
  86. console.log('\n📋 测试总结:\n');
  87. console.log('✅ 所有测试通过!');
  88. console.log('\n前端访问地址:');
  89. console.log(` http://localhost:5173/#/pages/player/index?id=${subsection.id}`);
  90. console.log('\n音频应该可以正常播放了!\n');
  91. }
  92. } catch (e) {
  93. console.log('❌ API响应解析失败:', e.message);
  94. }
  95. resolve();
  96. });
  97. }).on('error', (err) => {
  98. console.log(`❌ API请求失败: ${err.message}\n`);
  99. resolve();
  100. });
  101. } else {
  102. console.log('❌ 音频URL无法通过HTTP访问\n');
  103. resolve();
  104. }
  105. }).on('error', (err) => {
  106. console.log(`❌ HTTP请求失败: ${err.message}\n`);
  107. resolve();
  108. });
  109. });
  110. }
  111. testAudioPlayback().then(() => prisma.$disconnect()).catch(console.error);