import React from 'react'; import { useTranscriptionStore } from '../stores/transcriptionStore'; import { generateWebVTT } from '../utils/subtitleUtils'; import {LANGUAGE_MAP} from '../utils/languages'; interface MediaPlayerProps { audioRef: React.RefObject; videoRef: React.RefObject; onTimeUpdate?: () => void; } export default function MediaPlayer({ audioRef, videoRef, onTimeUpdate, }: MediaPlayerProps) { const { file, mediaUrl, isVideoFile, currentSegments, selectedLanguage, setCurrentTime } = useTranscriptionStore(); const handleSeeked = (event: React.SyntheticEvent) => { const target = event.target as HTMLMediaElement; setCurrentTime(target.currentTime); // Call onTimeUpdate to trigger segment selection logic if (onTimeUpdate) { onTimeUpdate(); } }; const handleLoadedMetadata = (event: React.SyntheticEvent) => { const target = event.target as HTMLMediaElement; setCurrentTime(target.currentTime); // Call onTimeUpdate to trigger segment selection logic if (onTimeUpdate) { onTimeUpdate(); } }; // Helper function to encode UTF-8 string to base64 const utf8ToBase64 = (str: string): string => { // Convert string to UTF-8 bytes, then to base64 const encoder = new TextEncoder(); const bytes = encoder.encode(str); let binary = ''; bytes.forEach(byte => binary += String.fromCharCode(byte)); return btoa(binary); }; // Get language info for subtitles const getLanguageInfo = () => { if (!selectedLanguage) { return { code: 'en', name: 'English' }; } const languageName = (LANGUAGE_MAP as Record)[selectedLanguage]; return { code: selectedLanguage, name: languageName || 'Unknown' }; }; // Early return if no file is selected if (!file) { return null; } // Early return if no media URL is available if (!mediaUrl) { return (
Loading media...
); } return (
{isVideoFile ? ( ) : (
)}
); }