/** * 摄像头管理器 - 优先通过API获取摄像头列表 * 支持降级到流列表显示 */ class CameraManager { constructor() { this.cameras = []; this.streams = []; this.loadingIndicator = document.getElementById('loading-indicator'); this.cameraContainer = document.getElementById('camera-list-container'); this.streamContainer = document.getElementById('stream-list-container'); this.init(); } async init() { try { // 优先尝试获取摄像头列表 await this.loadCameras(); } catch (error) { console.warn('摄像头API不可用,降级到流列表:', error); // 降级到流列表 await this.loadStreams(); } } async loadCameras() { try { const response = await fetch('/cameras'); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } const data = await response.json(); if (data.cameras && data.cameras.length > 0) { this.cameras = data.cameras; this.renderCameras(); this.updateTitle(`摄像头 (${this.cameras.length})`); } else { throw new Error('摄像头列表为空'); } } catch (error) { console.error('加载摄像头失败:', error); throw error; } } async loadStreams() { try { const response = await fetch('/streams'); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } const data = await response.json(); if (data.status === 1 && data.payload) { this.streams = Object.entries(data.payload).map(([key, value]) => ({ id: key, ...value })); this.showStreamFallback(); this.updateTitle(`视频流 (${this.streams.length})`); } else { this.showEmptyState(); } } catch (error) { console.error('加载流列表失败:', error); this.showEmptyState(); } } renderCameras() { this.hideLoading(); this.cameraContainer.style.display = 'flex'; this.cameraContainer.innerHTML = ''; this.cameras.forEach(camera => { const cameraCard = this.createCameraCard(camera); this.cameraContainer.appendChild(cameraCard); }); } createCameraCard(camera) { const col = document.createElement('div'); col.className = 'col-12 col-sm-6 col-md-3'; col.id = `camera-${camera.id || camera.camera_id}`; const statusClass = camera.status === 'online' ? 'badge-success' : 'badge-secondary'; const statusText = camera.status === 'online' ? '在线' : '离线'; const enabledBadge = camera.enabled ? '已启用' : '已禁用'; // 构建播放按钮 const playButtons = this.createPlayButtons(camera); col.innerHTML = `