feat: Add database migrations and auth system
- Add Alembic for database migrations - Implement user authentication system - Update frontend styles and components - Add new test audio functionality - Update stream management and UI
This commit is contained in:
		
							
								
								
									
										192
									
								
								static/test-audio.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								static/test-audio.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,192 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
  <meta charset="UTF-8">
 | 
			
		||||
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
  <title>Audio Player Test</title>
 | 
			
		||||
  <style>
 | 
			
		||||
    body {
 | 
			
		||||
      font-family: Arial, sans-serif;
 | 
			
		||||
      max-width: 800px;
 | 
			
		||||
      margin: 0 auto;
 | 
			
		||||
      padding: 20px;
 | 
			
		||||
      line-height: 1.6;
 | 
			
		||||
    }
 | 
			
		||||
    .test-case {
 | 
			
		||||
      margin-bottom: 20px;
 | 
			
		||||
      padding: 15px;
 | 
			
		||||
      border: 1px solid #ddd;
 | 
			
		||||
      border-radius: 5px;
 | 
			
		||||
    }
 | 
			
		||||
    .success { color: green; }
 | 
			
		||||
    .error { color: red; }
 | 
			
		||||
    button {
 | 
			
		||||
      padding: 8px 16px;
 | 
			
		||||
      margin: 5px;
 | 
			
		||||
      cursor: pointer;
 | 
			
		||||
    }
 | 
			
		||||
    #log {
 | 
			
		||||
      margin-top: 20px;
 | 
			
		||||
      padding: 10px;
 | 
			
		||||
      border: 1px solid #ccc;
 | 
			
		||||
      border-radius: 5px;
 | 
			
		||||
      max-height: 300px;
 | 
			
		||||
      overflow-y: auto;
 | 
			
		||||
      font-family: monospace;
 | 
			
		||||
      background: #f5f5f5;
 | 
			
		||||
    }
 | 
			
		||||
  </style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
  <h1>Audio Player Test</h1>
 | 
			
		||||
  
 | 
			
		||||
  <div class="test-case">
 | 
			
		||||
    <h2>Test 1: Basic Audio Element</h2>
 | 
			
		||||
    <audio id="test1" controls>
 | 
			
		||||
      <source src="/static/test-audio.opus" type="audio/ogg; codecs=opus">
 | 
			
		||||
      Your browser does not support the audio element.
 | 
			
		||||
    </audio>
 | 
			
		||||
    <div>
 | 
			
		||||
      <button onclick="document.getElementById('test1').play()">Play</button>
 | 
			
		||||
      <button onclick="document.getElementById('test1').pause()">Pause</button>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <div class="test-case">
 | 
			
		||||
    <h2>Test 2: Dynamic Audio Element</h2>
 | 
			
		||||
    <div id="test2-container">
 | 
			
		||||
      <button onclick="setupTest2()">Initialize Audio</button>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <div class="test-case">
 | 
			
		||||
    <h2>Test 3: Using loadProfileStream</h2>
 | 
			
		||||
    <div id="test3-container">
 | 
			
		||||
      <button onclick="testLoadProfileStream()">Test loadProfileStream</button>
 | 
			
		||||
      <div id="test3-status">Not started</div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <div class="test-case">
 | 
			
		||||
    <h2>Browser Audio Support</h2>
 | 
			
		||||
    <div id="codec-support">Testing codec support...</div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <div class="test-case">
 | 
			
		||||
    <h2>Console Log</h2>
 | 
			
		||||
    <div id="log"></div>
 | 
			
		||||
    <button onclick="document.getElementById('log').innerHTML = ''">Clear Log</button>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <script>
 | 
			
		||||
    // Logging function
 | 
			
		||||
    function log(message, type = 'info') {
 | 
			
		||||
      const logDiv = document.getElementById('log');
 | 
			
		||||
      const entry = document.createElement('div');
 | 
			
		||||
      entry.className = type;
 | 
			
		||||
      entry.textContent = `[${new Date().toISOString()}] ${message}`;
 | 
			
		||||
      logDiv.appendChild(entry);
 | 
			
		||||
      logDiv.scrollTop = logDiv.scrollHeight;
 | 
			
		||||
      console.log(`[${type.toUpperCase()}] ${message}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Test 2: Dynamic Audio Element
 | 
			
		||||
    function setupTest2() {
 | 
			
		||||
      log('Setting up dynamic audio element...');
 | 
			
		||||
      const container = document.getElementById('test2-container');
 | 
			
		||||
      container.innerHTML = '';
 | 
			
		||||
      
 | 
			
		||||
      try {
 | 
			
		||||
        const audio = document.createElement('audio');
 | 
			
		||||
        audio.controls = true;
 | 
			
		||||
        audio.preload = 'auto';
 | 
			
		||||
        
 | 
			
		||||
        const source = document.createElement('source');
 | 
			
		||||
        source.src = '/static/test-audio.opus';
 | 
			
		||||
        source.type = 'audio/ogg; codecs=opus';
 | 
			
		||||
        
 | 
			
		||||
        audio.appendChild(source);
 | 
			
		||||
        container.appendChild(audio);
 | 
			
		||||
        container.appendChild(document.createElement('br'));
 | 
			
		||||
        
 | 
			
		||||
        const playBtn = document.createElement('button');
 | 
			
		||||
        playBtn.textContent = 'Play';
 | 
			
		||||
        playBtn.onclick = () => audio.play().catch(e => log(`Play error: ${e}`, 'error'));
 | 
			
		||||
        container.appendChild(playBtn);
 | 
			
		||||
        
 | 
			
		||||
        const pauseBtn = document.createElement('button');
 | 
			
		||||
        pauseBtn.textContent = 'Pause';
 | 
			
		||||
        pauseBtn.onclick = () => audio.pause();
 | 
			
		||||
        container.appendChild(pauseBtn);
 | 
			
		||||
        
 | 
			
		||||
        log('Dynamic audio element created successfully');
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        log(`Error creating dynamic audio: ${e}`, 'error');
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Test 3: loadProfileStream
 | 
			
		||||
    async function testLoadProfileStream() {
 | 
			
		||||
      const status = document.getElementById('test3-status');
 | 
			
		||||
      status.textContent = 'Loading...';
 | 
			
		||||
      status.className = '';
 | 
			
		||||
      
 | 
			
		||||
      try {
 | 
			
		||||
        // Create a test user ID
 | 
			
		||||
        const testUid = 'test-user-' + Math.random().toString(36).substr(2, 8);
 | 
			
		||||
        log(`Testing with user: ${testUid}`);
 | 
			
		||||
        
 | 
			
		||||
        // Call loadProfileStream
 | 
			
		||||
        const audio = await window.loadProfileStream(testUid);
 | 
			
		||||
        
 | 
			
		||||
        if (audio) {
 | 
			
		||||
          status.textContent = 'Audio loaded successfully!';
 | 
			
		||||
          status.className = 'success';
 | 
			
		||||
          log('Audio loaded successfully', 'success');
 | 
			
		||||
        } else {
 | 
			
		||||
          status.textContent = 'No audio available for test user';
 | 
			
		||||
          status.className = '';
 | 
			
		||||
          log('No audio available for test user', 'info');
 | 
			
		||||
        }
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        status.textContent = `Error: ${e.message}`;
 | 
			
		||||
        status.className = 'error';
 | 
			
		||||
        log(`Error in loadProfileStream: ${e}`, 'error');
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Check browser audio support
 | 
			
		||||
    function checkAudioSupport() {
 | 
			
		||||
      const supportDiv = document.getElementById('codec-support');
 | 
			
		||||
      const audio = document.createElement('audio');
 | 
			
		||||
      
 | 
			
		||||
      const codecs = {
 | 
			
		||||
        'audio/ogg; codecs=opus': 'Opus (OGG)',
 | 
			
		||||
        'audio/webm; codecs=opus': 'Opus (WebM)',
 | 
			
		||||
        'audio/mp4; codecs=mp4a.40.2': 'AAC (MP4)',
 | 
			
		||||
        'audio/mpeg': 'MP3'
 | 
			
		||||
      };
 | 
			
		||||
      
 | 
			
		||||
      let results = [];
 | 
			
		||||
      
 | 
			
		||||
      for (const [type, name] of Object.entries(codecs)) {
 | 
			
		||||
        const canPlay = audio.canPlayType(type);
 | 
			
		||||
        results.push(`${name}: ${canPlay || 'Not supported'}`);
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
      supportDiv.innerHTML = results.join('<br>');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Initialize tests
 | 
			
		||||
    document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
      log('Test page loaded');
 | 
			
		||||
      checkAudioSupport();
 | 
			
		||||
      
 | 
			
		||||
      // Expose loadProfileStream for testing
 | 
			
		||||
      if (!window.loadProfileStream) {
 | 
			
		||||
        log('Warning: loadProfileStream not found in global scope', 'warning');
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  </script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
		Reference in New Issue
	
	Block a user