@structyl/video-player 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ChapterMarkers.tsx","../src/VideoControls.tsx","../src/VideoFilters.tsx","../src/SubtitleUploader.tsx","../src/VideoSettings.tsx","../src/useVideoPlayer.ts","../src/SubtitleDisplay.tsx","../src/subtitleParser.ts","../src/useVideoFilters.ts","../src/usePlaylist.ts","../src/useQuality.ts","../src/useChapters.ts","../src/PlaylistPanel.tsx","../src/ThumbnailPreview.tsx","../src/VideoPlayer.tsx"],"names":["jsxs","jsx","Button","Slider","useRef","handleVolumeChange","useState","useEffect","useCallback","formatTime"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react';\nimport { Tooltip } from '@structyl/styled';\nimport type { Chapter } from './useChapters';\n\ninterface ChapterMarkersProps {\n chapters: Chapter[];\n duration: number;\n currentTime: number;\n onSeek: (time: number) => void;\n}\n\nexport const ChapterMarkers: React.FC<ChapterMarkersProps> = ({\n chapters, duration, currentTime, onSeek,\n}) => {\n if (chapters.length === 0 || duration === 0) return null;\n\n return (\n <Tooltip.Provider delayDuration={200}>\n {chapters.map((chapter) => {\n const left = (chapter.startTime / duration) * 100;\n const isActive = currentTime >= chapter.startTime && currentTime < chapter.endTime;\n\n return (\n <Tooltip.Root key={chapter.id}>\n <Tooltip.Trigger asChild>\n <div\n className={`absolute -top-px h-[calc(100%+4px)] border-l-2 pointer-events-auto cursor-pointer transition-colors duration-200 z-[1] ${\n isActive ? 'border-primary' : 'border-fg/50 hover:border-primary'\n }`}\n style={{ left: `${left}%` }}\n onClick={(e) => { e.stopPropagation(); onSeek(chapter.startTime); }}\n />\n </Tooltip.Trigger>\n <Tooltip.Content side=\"top\" variant=\"dark\">\n {chapter.title}\n </Tooltip.Content>\n </Tooltip.Root>\n );\n })}\n </Tooltip.Provider>\n );\n};\n\nChapterMarkers.displayName = 'ChapterMarkers';\n","import React, { useRef } from 'react';\nimport {\n Play, Pause, Volume2, VolumeX, Maximize, Minimize,\n Settings, PictureInPicture, SkipBack, SkipForward,\n Subtitles, List, ChevronLeft, ChevronRight,\n} from 'lucide-react';\nimport { Button, Slider, DropdownMenu } from '@structyl/styled';\nimport type { Chapter } from './useChapters';\nimport { ChapterMarkers } from './ChapterMarkers';\n\ninterface VideoControlsProps {\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isMuted: boolean;\n playbackRate: number;\n isFullscreen: boolean;\n isPiP: boolean;\n buffered: number;\n subtitlesEnabled: boolean;\n hasSubtitles: boolean;\n hasPlaylist: boolean;\n chapters: Chapter[];\n settingsPanel?: React.ReactNode;\n onPlayPause: () => void;\n onSeek: (time: number) => void;\n onVolumeChange: (volume: number) => void;\n onMuteToggle: () => void;\n onPlaybackRateChange: (rate: number) => void;\n onFullscreenToggle: () => void;\n onPiPToggle: () => void;\n onSubtitlesToggle: () => void;\n onPlaylistClick: () => void;\n onNext: () => void;\n onPrevious: () => void;\n onThumbnailHover: (show: boolean, time: number, position: number) => void;\n}\n\nconst formatTime = (seconds: number): string => {\n if (isNaN(seconds) || !isFinite(seconds)) return '0:00';\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n if (h > 0) return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;\n return `${m}:${String(s).padStart(2, '0')}`;\n};\n\nexport const VideoControls: React.FC<VideoControlsProps> = ({\n isPlaying, currentTime, duration, volume, isMuted,\n isFullscreen, isPiP, buffered, subtitlesEnabled, hasSubtitles,\n hasPlaylist, onPlayPause, onSeek, onVolumeChange, onMuteToggle,\n onFullscreenToggle, onPiPToggle, onSubtitlesToggle,\n onPlaylistClick, onNext, onPrevious, chapters, settingsPanel, onThumbnailHover,\n}) => {\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n const progressRef = useRef<HTMLDivElement>(null);\n\n const handleProgressClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const rect = progressRef.current?.getBoundingClientRect();\n if (!rect) return;\n onSeek(((e.clientX - rect.left) / rect.width) * duration);\n };\n\n const handleProgressHover = (e: React.MouseEvent<HTMLDivElement>) => {\n const rect = progressRef.current?.getBoundingClientRect();\n if (!rect) return;\n const pos = (e.clientX - rect.left) / rect.width;\n onThumbnailHover(true, pos * duration, pos * 100);\n };\n\n return (\n <div className=\"bg-black/70 pt-2 pb-2 px-2 md:pb-2.5 md:px-3\">\n {/* Progress bar */}\n <div className=\"mb-2 cursor-pointer py-1\">\n <div\n ref={progressRef}\n className=\"group relative h-1 bg-fg/20 rounded cursor-pointer transition-all duration-150 hover:h-1.5\"\n onClick={handleProgressClick}\n onMouseMove={handleProgressHover}\n onMouseLeave={() => onThumbnailHover(false, 0, 0)}\n >\n <ChapterMarkers chapters={chapters} duration={duration} currentTime={currentTime} onSeek={onSeek} />\n <div className=\"absolute top-0 left-0 h-full bg-fg/35 rounded transition-[width] duration-100\" style={{ width: `${buffered}%` }} />\n <div className=\"absolute top-0 left-0 h-full bg-primary rounded transition-[width] duration-100\" style={{ width: `${progress}%` }} />\n <div\n className=\"absolute top-1/2 -translate-x-1/2 -translate-y-1/2 w-3 h-3 bg-primary rounded-full shadow-md opacity-0 pointer-events-none transition-opacity duration-200 group-hover:opacity-100\"\n style={{ left: `${progress}%` }}\n />\n </div>\n </div>\n\n {/* Controls row */}\n <div className=\"flex items-center gap-1\">\n {/* Left */}\n <div className=\"flex items-center gap-0.5 flex-1\">\n {hasPlaylist && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onPrevious} title=\"Previous\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <ChevronLeft />\n </Button>\n )}\n\n <Button variant=\"ghost\" size=\"icon\" onClick={onPlayPause} title={isPlaying ? 'Pause (Space)' : 'Play (Space)'} className=\"text-white/80 hover:text-white hover:bg-white/10\">\n {isPlaying ? <Pause /> : <Play />}\n </Button>\n\n {hasPlaylist && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onNext} title=\"Next\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <ChevronRight />\n </Button>\n )}\n\n <Button variant=\"ghost\" size=\"icon\" onClick={() => onSeek(Math.max(0, currentTime - 10))} title=\"Rewind 10s\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <SkipBack />\n </Button>\n\n <Button variant=\"ghost\" size=\"icon\" onClick={() => onSeek(Math.min(duration, currentTime + 10))} title=\"Forward 10s\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <SkipForward />\n </Button>\n\n {/* Volume — expand on hover */}\n <div className=\"flex items-center gap-0.5 group\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onMuteToggle} title=\"Mute (M)\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n {isMuted || volume === 0 ? <VolumeX /> : <Volume2 />}\n </Button>\n <div className=\"w-0 overflow-hidden opacity-0 transition-[width,opacity] duration-200 flex items-center sm:group-hover:w-[88px] sm:group-hover:opacity-100\">\n <Slider\n value={[isMuted ? 0 : Math.round(volume * 100)]}\n onValueChange={(val) => onVolumeChange((val[0] ?? 0) / 100)}\n min={0}\n max={100}\n step={1}\n className=\"w-20\"\n />\n </div>\n </div>\n\n <span className=\"text-white/90 text-[11px] md:text-xs font-medium whitespace-nowrap px-1.5 tabular-nums\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n </div>\n\n {/* Right */}\n <div className=\"flex items-center gap-0.5\">\n {hasSubtitles && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSubtitlesToggle}\n title=\"Subtitles (C)\"\n className={subtitlesEnabled ? 'text-primary hover:bg-white/10' : 'text-white/80 hover:text-white hover:bg-white/10'}\n >\n <Subtitles />\n </Button>\n )}\n\n {hasPlaylist && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onPlaylistClick} title=\"Playlist\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <List />\n </Button>\n )}\n\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <Button variant=\"ghost\" size=\"icon\" title=\"Settings\" className=\"text-white/80 hover:text-white hover:bg-white/10 data-[state=open]:text-primary\">\n <Settings />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content\n side=\"top\"\n align=\"end\"\n sideOffset={8}\n className=\"p-0 w-[280px] max-h-[420px] overflow-y-auto bg-popover\"\n >\n {settingsPanel}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onPiPToggle}\n title=\"Picture in Picture (P)\"\n className={isPiP ? 'text-primary hover:bg-white/10' : 'text-white/80 hover:text-white hover:bg-white/10'}\n >\n <PictureInPicture />\n </Button>\n\n <Button variant=\"ghost\" size=\"icon\" onClick={onFullscreenToggle} title=\"Fullscreen (F)\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n {isFullscreen ? <Minimize /> : <Maximize />}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nVideoControls.displayName = 'VideoControls';\n","import React from 'react';\nimport { RotateCcw } from 'lucide-react';\nimport { Button, Slider } from '@structyl/styled';\nimport type { VideoFilters as VideoFiltersType } from './useVideoFilters';\n\ninterface VideoFiltersProps {\n filters: VideoFiltersType;\n onFilterChange: (key: keyof VideoFiltersType, value: number) => void;\n onReset: () => void;\n}\n\nconst FILTER_CONFIG: Array<{\n key: keyof VideoFiltersType;\n label: string;\n min: number;\n max: number;\n unit: string;\n}> = [\n { key: 'brightness', label: 'Brightness', min: 0, max: 200, unit: '%' },\n { key: 'contrast', label: 'Contrast', min: 0, max: 200, unit: '%' },\n { key: 'saturation', label: 'Saturation', min: 0, max: 200, unit: '%' },\n { key: 'hue', label: 'Hue', min: 0, max: 360, unit: '°' },\n { key: 'blur', label: 'Blur', min: 0, max: 10, unit: 'px' },\n { key: 'grayscale', label: 'Grayscale', min: 0, max: 100, unit: '%' },\n];\n\nexport const VideoFilters: React.FC<VideoFiltersProps> = ({ filters, onFilterChange, onReset }) => (\n <div>\n <div className=\"flex items-center justify-between mb-3.5\">\n <span className=\"text-xs font-semibold text-fg\">Video Filters</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={onReset} leftIcon={<RotateCcw />}>\n Reset\n </Button>\n </div>\n\n {FILTER_CONFIG.map(({ key, label, min, max, unit }) => (\n <div className=\"mb-3.5 last:mb-0\" key={key}>\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11px] text-muted-foreground\">{label}</span>\n <span className=\"text-[11px] text-fg font-medium\">{filters[key]}{unit}</span>\n </div>\n <Slider\n value={[filters[key]]}\n onValueChange={([v]) => onFilterChange(key, v ?? filters[key])}\n min={min}\n max={max}\n step={1}\n />\n </div>\n ))}\n </div>\n);\n\nVideoFilters.displayName = 'VideoFilters';\n","import React, { useRef } from 'react';\nimport { Upload } from 'lucide-react';\nimport { Button } from '@structyl/styled';\n\ninterface SubtitleUploaderProps {\n onSubtitleUpload: (file: File) => void;\n}\n\nexport const SubtitleUploader: React.FC<SubtitleUploaderProps> = ({ onSubtitleUpload }) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file && (file.name.endsWith('.srt') || file.name.endsWith('.vtt'))) {\n onSubtitleUpload(file);\n }\n };\n\n return (\n <div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".srt,.vtt\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full mb-2\"\n leftIcon={<Upload />}\n onClick={() => fileInputRef.current?.click()}\n >\n Upload Subtitle File\n </Button>\n <p className=\"text-[11px] text-muted-foreground\">Supports .srt and .vtt formats</p>\n </div>\n );\n};\n\nSubtitleUploader.displayName = 'SubtitleUploader';\n","import React from 'react';\nimport { Button, Slider, Tabs } from '@structyl/styled';\nimport type { SubtitleStyle } from './SubtitleDisplay';\nimport type { SubtitleTrack } from './subtitleParser';\nimport type { VideoFilters as VideoFiltersType } from './useVideoFilters';\nimport { VideoFilters } from './VideoFilters';\nimport { SubtitleUploader } from './SubtitleUploader';\nimport type { QualityLevel } from './useQuality';\n\ninterface VideoSettingsProps {\n playbackRate: number;\n subtitleStyle: SubtitleStyle;\n subtitles: SubtitleTrack[];\n activeSubtitleIndex: number;\n filters: VideoFiltersType;\n qualities: QualityLevel[];\n currentQuality: number;\n onPlaybackRateChange: (rate: number) => void;\n onSubtitleStyleChange: (style: SubtitleStyle) => void;\n onSubtitleTrackChange: (index: number) => void;\n onSubtitleUpload: (file: File) => void;\n onFilterChange: (key: keyof VideoFiltersType, value: number) => void;\n onResetFilters: () => void;\n onQualityChange: (level: number) => void;\n}\n\nconst PLAYBACK_RATES = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n\nexport const VideoSettings: React.FC<VideoSettingsProps> = ({\n playbackRate,\n subtitleStyle,\n subtitles,\n activeSubtitleIndex,\n filters,\n qualities,\n currentQuality,\n onPlaybackRateChange,\n onSubtitleStyleChange,\n onSubtitleTrackChange,\n onSubtitleUpload,\n onFilterChange,\n onResetFilters,\n onQualityChange,\n}) => {\n const updateSubtitleStyle = (updates: Partial<SubtitleStyle>) => {\n onSubtitleStyleChange({ ...subtitleStyle, ...updates });\n };\n\n return (\n <div className=\"flex flex-col w-full\">\n {/* Header */}\n <div className=\"flex items-center px-3 py-2.5 border-b border-border shrink-0\">\n <span className=\"text-[13px] font-semibold text-fg\">Settings</span>\n </div>\n\n {/* Main tabs */}\n <Tabs.Root defaultValue=\"subtitles\" className=\"flex flex-col flex-1 overflow-hidden\">\n <Tabs.List className=\"px-3 py-2 flex-shrink-0\">\n <Tabs.Trigger value=\"subtitles\">Subtitles</Tabs.Trigger>\n <Tabs.Trigger value=\"filters\">Filters</Tabs.Trigger>\n <Tabs.Trigger value=\"quality\">Quality</Tabs.Trigger>\n <Tabs.Trigger value=\"playback\">Playback</Tabs.Trigger>\n </Tabs.List>\n\n <div className=\"flex-1 overflow-y-auto px-3 pt-1 pb-3\">\n {/* ── Subtitles ─────────────────────────────────── */}\n <Tabs.Content value=\"subtitles\">\n <Tabs.Root defaultValue=\"style\" variant=\"pills\">\n <Tabs.List className=\"mb-3\">\n <Tabs.Trigger value=\"style\">Style</Tabs.Trigger>\n <Tabs.Trigger value=\"tracks\">Tracks</Tabs.Trigger>\n <Tabs.Trigger value=\"upload\">Upload</Tabs.Trigger>\n </Tabs.List>\n\n {/* Style */}\n <Tabs.Content value=\"style\">\n <div className=\"mb-3.5 last:mb-0\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11px] text-muted-foreground\">Font Size</span>\n <span className=\"text-[11px] text-fg font-medium\">{subtitleStyle.fontSize}px</span>\n </div>\n <Slider\n value={[subtitleStyle.fontSize]}\n onValueChange={([v]) => updateSubtitleStyle({ fontSize: v ?? subtitleStyle.fontSize })}\n min={14} max={40} step={2}\n />\n </div>\n\n <div className=\"mb-3.5 last:mb-0\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11px] text-muted-foreground\">Background Opacity</span>\n <span className=\"text-[11px] text-fg font-medium\">{Math.round(subtitleStyle.backgroundOpacity * 100)}%</span>\n </div>\n <Slider\n value={[Math.round(subtitleStyle.backgroundOpacity * 100)]}\n onValueChange={([v]) => updateSubtitleStyle({ backgroundOpacity: (v ?? 0) / 100 })}\n min={0} max={100} step={5}\n />\n </div>\n\n <div className=\"mb-3.5 last:mb-0\">\n <span className=\"text-[11px] text-muted-foreground block mb-1.5\">Text Color</span>\n <input\n type=\"color\"\n className=\"w-full h-9 rounded-lg border border-border cursor-pointer bg-transparent p-0.5\"\n value={subtitleStyle.textColor}\n onChange={(e) => updateSubtitleStyle({ textColor: e.target.value })}\n />\n </div>\n\n <div className=\"mb-3.5 last:mb-0\">\n <span className=\"text-[11px] text-muted-foreground block mb-1.5\">Background Color</span>\n <input\n type=\"color\"\n className=\"w-full h-9 rounded-lg border border-border cursor-pointer bg-transparent p-0.5\"\n value={subtitleStyle.backgroundColor}\n onChange={(e) => updateSubtitleStyle({ backgroundColor: e.target.value })}\n />\n </div>\n\n <div className=\"mb-3.5 last:mb-0\">\n <span className=\"text-[11px] text-muted-foreground block mb-2\">Position</span>\n <div className=\"flex gap-2\">\n <Button\n variant={subtitleStyle.position === 'bottom' ? 'default' : 'outline'}\n size=\"sm\"\n className=\"flex-1\"\n onClick={() => updateSubtitleStyle({ position: 'bottom' })}\n >\n Bottom\n </Button>\n <Button\n variant={subtitleStyle.position === 'top' ? 'default' : 'outline'}\n size=\"sm\"\n className=\"flex-1\"\n onClick={() => updateSubtitleStyle({ position: 'top' })}\n >\n Top\n </Button>\n </div>\n </div>\n </Tabs.Content>\n\n {/* Tracks */}\n <Tabs.Content value=\"tracks\">\n <Button\n variant={activeSubtitleIndex === -1 ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onSubtitleTrackChange(-1)}\n >\n Off\n </Button>\n {subtitles.map((track, i) => (\n <Button\n key={track.src}\n variant={activeSubtitleIndex === i ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onSubtitleTrackChange(i)}\n >\n {track.label} {track.language && `(${track.language})`}\n </Button>\n ))}\n </Tabs.Content>\n\n {/* Upload */}\n <Tabs.Content value=\"upload\">\n <SubtitleUploader onSubtitleUpload={onSubtitleUpload} />\n </Tabs.Content>\n </Tabs.Root>\n </Tabs.Content>\n\n {/* ── Filters ───────────────────────────────────── */}\n <Tabs.Content value=\"filters\">\n <VideoFilters filters={filters} onFilterChange={onFilterChange} onReset={onResetFilters} />\n </Tabs.Content>\n\n {/* ── Quality ───────────────────────────────────── */}\n <Tabs.Content value=\"quality\">\n <p className=\"text-xs font-semibold text-fg mb-2.5\">Video Quality</p>\n {qualities.length > 0 ? (\n <>\n <Button\n variant={currentQuality === -1 ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onQualityChange(-1)}\n >\n Auto\n </Button>\n {qualities.map((q, i) => (\n <Button\n key={i}\n variant={currentQuality === i ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onQualityChange(i)}\n >\n {q.label} ({Math.round(q.bitrate / 1000)}kbps)\n </Button>\n ))}\n </>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n Quality selection is only available for HLS/DASH adaptive streaming sources.\n </p>\n )}\n </Tabs.Content>\n\n {/* ── Playback ──────────────────────────────────── */}\n <Tabs.Content value=\"playback\">\n <p className=\"text-xs font-semibold text-fg mb-2.5\">Playback Speed</p>\n {PLAYBACK_RATES.map((rate) => (\n <Button\n key={rate}\n variant={playbackRate === rate ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onPlaybackRateChange(rate)}\n >\n {rate === 1 ? 'Normal' : `${rate}x`}\n </Button>\n ))}\n </Tabs.Content>\n </div>\n </Tabs.Root>\n </div>\n );\n};\n\nVideoSettings.displayName = 'VideoSettings';\n","import { useState, useEffect, useCallback } from 'react';\nimport type { RefObject } from 'react';\n\ninterface UseVideoPlayerProps {\n videoRef: RefObject<HTMLVideoElement | null>;\n containerRef: RefObject<HTMLDivElement | null>;\n autoPlay?: boolean;\n muted?: boolean;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (currentTime: number) => void;\n onVolumeChange?: (volume: number) => void;\n}\n\nexport const useVideoPlayer = ({\n videoRef,\n containerRef,\n autoPlay,\n muted,\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onVolumeChange,\n}: UseVideoPlayerProps) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [isMuted, setIsMuted] = useState(muted || false);\n const [playbackRate, setPlaybackRate] = useState(1);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isPiP, setIsPiP] = useState(false);\n const [buffered, setBuffered] = useState(0);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n if (autoPlay) {\n video.play().catch(console.error);\n }\n\n const handleLoadedMetadata = () => setDuration(video.duration);\n const handleTimeUpdate = () => {\n setCurrentTime(video.currentTime);\n onTimeUpdate?.(video.currentTime);\n };\n const handlePlay = () => { setIsPlaying(true); onPlay?.(); };\n const handlePause = () => { setIsPlaying(false); onPause?.(); };\n const handleEnded = () => { setIsPlaying(false); onEnded?.(); };\n const handleVolumeChange = () => {\n setVolume(video.volume);\n setIsMuted(video.muted);\n onVolumeChange?.(video.volume);\n };\n const handleProgress = () => {\n if (video.buffered.length > 0) {\n const bufferedEnd = video.buffered.end(video.buffered.length - 1);\n setBuffered((bufferedEnd / video.duration) * 100);\n }\n };\n const handleEnterpip = () => setIsPiP(true);\n const handleLeavepip = () => setIsPiP(false);\n\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('timeupdate', handleTimeUpdate);\n video.addEventListener('play', handlePlay);\n video.addEventListener('pause', handlePause);\n video.addEventListener('ended', handleEnded);\n video.addEventListener('volumechange', handleVolumeChange);\n video.addEventListener('progress', handleProgress);\n video.addEventListener('enterpictureinpicture', handleEnterpip);\n video.addEventListener('leavepictureinpicture', handleLeavepip);\n\n return () => {\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('timeupdate', handleTimeUpdate);\n video.removeEventListener('play', handlePlay);\n video.removeEventListener('pause', handlePause);\n video.removeEventListener('ended', handleEnded);\n video.removeEventListener('volumechange', handleVolumeChange);\n video.removeEventListener('progress', handleProgress);\n video.removeEventListener('enterpictureinpicture', handleEnterpip);\n video.removeEventListener('leavepictureinpicture', handleLeavepip);\n };\n }, [videoRef, autoPlay, onPlay, onPause, onEnded, onTimeUpdate, onVolumeChange]);\n\n useEffect(() => {\n const handleFullscreenChange = () => setIsFullscreen(!!document.fullscreenElement);\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => document.removeEventListener('fullscreenchange', handleFullscreenChange);\n }, []);\n\n const togglePlay = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n if (!video.paused) { video.pause(); return; }\n // If a previous load attempt failed (NETWORK_NO_SOURCE), restart before playing\n if (video.networkState === HTMLMediaElement.NETWORK_NO_SOURCE) {\n video.load();\n }\n video.play().catch(console.error);\n }, [videoRef]);\n\n const handleSeek = useCallback((time: number) => {\n const video = videoRef.current;\n if (!video) return;\n video.currentTime = time;\n setCurrentTime(time);\n }, [videoRef]);\n\n const handleVolumeChange = useCallback((newVolume: number) => {\n const video = videoRef.current;\n if (!video) return;\n video.volume = newVolume;\n setVolume(newVolume);\n if (newVolume > 0 && isMuted) {\n video.muted = false;\n setIsMuted(false);\n }\n }, [videoRef, isMuted]);\n\n const toggleMute = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n video.muted = !video.muted;\n setIsMuted(video.muted);\n }, [videoRef]);\n\n const changePlaybackRate = useCallback((rate: number) => {\n const video = videoRef.current;\n if (!video) return;\n video.playbackRate = rate;\n setPlaybackRate(rate);\n }, [videoRef]);\n\n const toggleFullscreen = useCallback(async () => {\n const container = containerRef.current;\n if (!container) return;\n try {\n if (!document.fullscreenElement) {\n await container.requestFullscreen();\n } else {\n await document.exitFullscreen();\n }\n } catch (error) {\n console.error('Fullscreen error:', error);\n }\n }, [containerRef]);\n\n const togglePiP = useCallback(async () => {\n const video = videoRef.current;\n if (!video) return;\n try {\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch (error) {\n console.error('PiP error:', error);\n }\n }, [videoRef]);\n\n const skipForward = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n video.currentTime = Math.min(video.duration, video.currentTime + 10);\n }, [videoRef]);\n\n const skipBackward = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n video.currentTime = Math.max(0, video.currentTime - 10);\n }, [videoRef]);\n\n return {\n isPlaying, currentTime, duration, volume, isMuted, playbackRate,\n isFullscreen, isPiP, buffered,\n togglePlay, handleSeek, handleVolumeChange, toggleMute,\n changePlaybackRate, toggleFullscreen, togglePiP, skipForward, skipBackward,\n };\n};\n","import React from 'react';\n\nexport interface SubtitleStyle {\n fontSize: number;\n fontFamily: string;\n textColor: string;\n backgroundColor: string;\n backgroundOpacity: number;\n position: 'bottom' | 'top';\n}\n\ninterface SubtitleDisplayProps {\n text: string;\n style: SubtitleStyle;\n}\n\nconst toHex2 = (n: number) => Math.round(n).toString(16).padStart(2, '0');\n\nexport const SubtitleDisplay: React.FC<SubtitleDisplayProps> = ({ text, style }) => {\n if (!text) return null;\n\n const bgColor = `${style.backgroundColor}${toHex2(style.backgroundOpacity * 255)}`;\n const positionClass = style.position === 'bottom' ? 'bottom-[88px]' : 'top-4';\n\n return (\n <div\n className={`absolute left-1/2 -translate-x-1/2 max-w-[90%] px-3 py-1.5 rounded-lg text-center pointer-events-none z-20 leading-[1.4] break-words ${positionClass}`}\n style={{\n fontSize: style.fontSize,\n fontFamily: style.fontFamily,\n color: style.textColor,\n backgroundColor: bgColor,\n textShadow: '2px 2px 4px rgba(0,0,0,0.8)',\n }}\n >\n {text.split('\\n').map((line, i) => (\n <div key={i}>{line}</div>\n ))}\n </div>\n );\n};\n\nSubtitleDisplay.displayName = 'SubtitleDisplay';\n","export interface SubtitleCue {\n start: number;\n end: number;\n text: string;\n}\n\nexport interface SubtitleTrack {\n label: string;\n language: string;\n src: string;\n kind?: 'subtitles' | 'captions';\n}\n\nconst toSeconds = (h: string, m: string, s: string, ms: string): number =>\n parseInt(h, 10) * 3600 + parseInt(m, 10) * 60 + parseInt(s, 10) + parseInt(ms, 10) / 1000;\n\nexport const parseSRT = (content: string): SubtitleCue[] => {\n const cues: SubtitleCue[] = [];\n const SRT_TIME = /(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})\\s*-->\\s*(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})/;\n\n for (const block of content.trim().split(/\\n\\s*\\n/)) {\n const lines = block.split('\\n');\n if (lines.length < 3) continue;\n const timeLine = lines[1];\n if (!timeLine) continue;\n const m = timeLine.match(SRT_TIME);\n if (!m || m.length < 9) continue;\n\n const start = toSeconds(m[1] ?? '0', m[2] ?? '0', m[3] ?? '0', m[4] ?? '0');\n const end = toSeconds(m[5] ?? '0', m[6] ?? '0', m[7] ?? '0', m[8] ?? '0');\n const text = lines.slice(2).join('\\n').trim();\n cues.push({ start, end, text });\n }\n\n return cues;\n};\n\nexport const parseVTT = (content: string): SubtitleCue[] => {\n const cues: SubtitleCue[] = [];\n const VTT_TIME = /(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})\\s*-->\\s*(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})/;\n const lines = content.split('\\n');\n let i = 0;\n\n while (i < lines.length && !lines[i]?.includes('-->')) i++;\n\n while (i < lines.length) {\n const line = lines[i]?.trim() ?? '';\n const m = line.match(VTT_TIME);\n\n if (m && m.length >= 9) {\n const start = toSeconds(m[1] ?? '0', m[2] ?? '0', m[3] ?? '0', m[4] ?? '0');\n const end = toSeconds(m[5] ?? '0', m[6] ?? '0', m[7] ?? '0', m[8] ?? '0');\n\n const textLines: string[] = [];\n i++;\n while (i < lines.length && lines[i]?.trim() !== '') {\n const l = lines[i];\n if (l !== undefined) textLines.push(l.trim());\n i++;\n }\n cues.push({ start, end, text: textLines.join('\\n') });\n }\n\n i++;\n }\n\n return cues;\n};\n\nexport const loadSubtitleFile = async (url: string): Promise<SubtitleCue[]> => {\n try {\n const response = await fetch(url);\n const content = await response.text();\n\n if (content.includes('WEBVTT') || url.endsWith('.vtt')) return parseVTT(content);\n if (url.endsWith('.srt')) return parseSRT(content);\n if (content.includes('-->')) return content.includes(',') ? parseSRT(content) : parseVTT(content);\n return [];\n } catch {\n return [];\n }\n};\n\nexport const findActiveCue = (cues: SubtitleCue[], currentTime: number): SubtitleCue | null =>\n cues.find((c) => currentTime >= c.start && currentTime <= c.end) ?? null;\n","import { useState, useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport interface VideoFilters {\n brightness: number;\n contrast: number;\n saturation: number;\n hue: number;\n blur: number;\n grayscale: number;\n}\n\nconst DEFAULT_FILTERS: VideoFilters = {\n brightness: 100,\n contrast: 100,\n saturation: 100,\n hue: 0,\n blur: 0,\n grayscale: 0,\n};\n\nexport const useVideoFilters = (videoRef: RefObject<HTMLVideoElement | null>) => {\n const [filters, setFilters] = useState<VideoFilters>(DEFAULT_FILTERS);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n video.style.filter = [\n `brightness(${filters.brightness}%)`,\n `contrast(${filters.contrast}%)`,\n `saturate(${filters.saturation}%)`,\n `hue-rotate(${filters.hue}deg)`,\n `blur(${filters.blur}px)`,\n `grayscale(${filters.grayscale}%)`,\n ].join(' ');\n }, [filters, videoRef]);\n\n const updateFilter = (key: keyof VideoFilters, value: number) => {\n setFilters((prev) => ({ ...prev, [key]: value }));\n };\n\n const resetFilters = () => setFilters(DEFAULT_FILTERS);\n\n return { filters, updateFilter, resetFilters };\n};\n","import { useState, useCallback } from 'react';\n\nexport interface PlaylistItem {\n id: string;\n title: string;\n src: string;\n poster?: string;\n duration?: number;\n}\n\nexport interface PlaylistState {\n items: PlaylistItem[];\n currentIndex: number;\n shuffle: boolean;\n repeat: 'none' | 'one' | 'all';\n}\n\nexport const usePlaylist = (initialItems: PlaylistItem[] = []) => {\n const [playlist, setPlaylist] = useState<PlaylistState>({\n items: initialItems,\n currentIndex: 0,\n shuffle: false,\n repeat: 'none',\n });\n\n const currentItem = playlist.items[playlist.currentIndex] ?? null;\n\n const playNext = useCallback(() => {\n setPlaylist((prev) => {\n if (prev.items.length === 0) return prev;\n let nextIndex: number;\n if (prev.shuffle) {\n nextIndex = Math.floor(Math.random() * prev.items.length);\n } else {\n nextIndex = prev.currentIndex + 1;\n if (nextIndex >= prev.items.length) {\n nextIndex = prev.repeat === 'all' ? 0 : prev.currentIndex;\n }\n }\n return { ...prev, currentIndex: nextIndex };\n });\n }, []);\n\n const playPrevious = useCallback(() => {\n setPlaylist((prev) => {\n if (prev.items.length === 0) return prev;\n let prevIndex: number;\n if (prev.shuffle) {\n prevIndex = Math.floor(Math.random() * prev.items.length);\n } else {\n prevIndex = prev.currentIndex - 1;\n if (prevIndex < 0) {\n prevIndex = prev.repeat === 'all' ? prev.items.length - 1 : 0;\n }\n }\n return { ...prev, currentIndex: prevIndex };\n });\n }, []);\n\n const playIndex = useCallback((index: number) => {\n setPlaylist((prev) => {\n if (index < 0 || index >= prev.items.length) return prev;\n return { ...prev, currentIndex: index };\n });\n }, []);\n\n const toggleShuffle = useCallback(() => {\n setPlaylist((prev) => ({ ...prev, shuffle: !prev.shuffle }));\n }, []);\n\n const toggleRepeat = useCallback(() => {\n setPlaylist((prev) => {\n const modes: Array<'none' | 'one' | 'all'> = ['none', 'one', 'all'];\n const nextMode = modes[(modes.indexOf(prev.repeat) + 1) % modes.length] ?? 'none';\n return { ...prev, repeat: nextMode };\n });\n }, []);\n\n const addToPlaylist = useCallback((item: PlaylistItem) => {\n setPlaylist((prev) => ({ ...prev, items: [...prev.items, item] }));\n }, []);\n\n const removeFromPlaylist = useCallback((index: number) => {\n setPlaylist((prev) => {\n const newItems = prev.items.filter((_, i) => i !== index);\n let newIndex = prev.currentIndex;\n if (index < prev.currentIndex) {\n newIndex = prev.currentIndex - 1;\n } else if (index === prev.currentIndex && newItems.length > 0) {\n newIndex = Math.min(prev.currentIndex, newItems.length - 1);\n }\n return { ...prev, items: newItems, currentIndex: Math.max(0, newIndex) };\n });\n }, []);\n\n return {\n playlist, currentItem,\n playNext, playPrevious, playIndex,\n toggleShuffle, toggleRepeat,\n addToPlaylist, removeFromPlaylist,\n };\n};\n","import { useState, useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport Hls from 'hls.js';\n\nexport interface QualityLevel {\n height: number;\n width: number;\n bitrate: number;\n label: string;\n}\n\nexport const useQuality = (videoRef: RefObject<HTMLVideoElement | null>, src: string) => {\n const [qualities, setQualities] = useState<QualityLevel[]>([]);\n const [currentQuality, setCurrentQuality] = useState<number>(-1);\n const [isHls, setIsHls] = useState(false);\n const hlsRef = useRef<Hls | null>(null);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return undefined;\n\n const isHlsSource = src.endsWith('.m3u8');\n setIsHls(isHlsSource);\n\n if (isHlsSource && Hls.isSupported()) {\n const hls = new Hls({ enableWorker: true, lowLatencyMode: true });\n hlsRef.current = hls;\n hls.loadSource(src);\n hls.attachMedia(video);\n\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n setQualities(\n hls.levels.map((level) => ({\n height: level.height,\n width: level.width,\n bitrate: level.bitrate,\n label: `${level.height}p`,\n }))\n );\n });\n\n hls.on(Hls.Events.LEVEL_SWITCHED, (_, data) => setCurrentQuality(data.level));\n\n return () => {\n hls.destroy();\n hlsRef.current = null;\n };\n } else if (isHlsSource && video.canPlayType('application/vnd.apple.mpegurl')) {\n // Native HLS (Safari)\n setQualities((prev) => (prev.length === 1 && prev[0]?.label === 'Auto' ? prev : [{ height: 0, width: 0, bitrate: 0, label: 'Auto' }]));\n return undefined;\n } else {\n // Regular MP4/WebM — clear qualities list without creating a new array if already empty\n setQualities((prev) => (prev.length === 0 ? prev : []));\n return undefined;\n }\n }, [src, videoRef]);\n\n const changeQuality = (level: number) => {\n if (hlsRef.current) {\n hlsRef.current.currentLevel = level;\n setCurrentQuality(level);\n }\n };\n\n return { qualities, currentQuality, changeQuality, isHls };\n};\n","import { useState, useCallback } from 'react';\n\nexport interface Chapter {\n id: string;\n title: string;\n startTime: number;\n endTime: number;\n}\n\nexport const useChapters = (initialChapters: Chapter[] = []) => {\n const [chapters] = useState<Chapter[]>(initialChapters);\n\n const getCurrentChapter = useCallback(\n (currentTime: number): Chapter | null =>\n chapters.find((c) => currentTime >= c.startTime && currentTime < c.endTime) ?? null,\n [chapters]\n );\n\n const getChapterAtPosition = useCallback(\n (position: number, duration: number): Chapter | null =>\n getCurrentChapter((position / 100) * duration),\n [getCurrentChapter]\n );\n\n return { chapters, getCurrentChapter, getChapterAtPosition };\n};\n","import React from 'react';\nimport { Shuffle, Repeat, Repeat1, X } from 'lucide-react';\nimport { Button, ScrollArea } from '@structyl/styled';\nimport type { PlaylistItem } from './usePlaylist';\n\ninterface PlaylistPanelProps {\n items: PlaylistItem[];\n currentIndex: number;\n shuffle: boolean;\n repeat: 'none' | 'one' | 'all';\n onPlayItem: (index: number) => void;\n onRemoveItem: (index: number) => void;\n onToggleShuffle: () => void;\n onToggleRepeat: () => void;\n onClose: () => void;\n}\n\nconst formatDuration = (seconds: number) =>\n `${Math.floor(seconds / 60)}:${String(Math.floor(seconds % 60)).padStart(2, '0')}`;\n\nexport const PlaylistPanel: React.FC<PlaylistPanelProps> = ({\n items, currentIndex, shuffle, repeat,\n onPlayItem, onRemoveItem, onToggleShuffle, onToggleRepeat, onClose,\n}) => (\n <div className=\"absolute top-0 right-0 w-full md:w-[280px] h-full bg-popover border-l border-border z-20 flex flex-col\">\n <div className=\"flex items-center justify-between px-3 py-2.5 border-b border-border shrink-0\">\n <span className=\"text-[13px] font-semibold text-fg\">Playlist ({items.length})</span>\n <div className=\"flex items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onToggleShuffle}\n title=\"Shuffle\"\n className={shuffle ? 'text-primary' : ''}\n >\n <Shuffle />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onToggleRepeat}\n title=\"Repeat\"\n className={repeat !== 'none' ? 'text-primary' : ''}\n >\n {repeat === 'one' ? <Repeat1 /> : <Repeat />}\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" onClick={onClose} title=\"Close\">\n <X />\n </Button>\n </div>\n </div>\n\n <ScrollArea.Root className=\"flex-1 overflow-y-auto p-1.5\">\n {items.map((item, index) => (\n <div\n key={item.id}\n className={`flex items-center gap-2.5 p-2 rounded-lg cursor-pointer transition-colors duration-150 relative group hover:bg-accent/[0.07] ${\n index === currentIndex ? 'bg-primary/15' : ''\n }`}\n onClick={() => onPlayItem(index)}\n >\n <div className=\"shrink-0 w-10 h-10 bg-muted/80 rounded overflow-hidden flex items-center justify-center text-xs text-muted-foreground\">\n {item.poster\n ? <img src={item.poster} alt={item.title} className=\"w-full h-full object-cover\" />\n : <span>{index + 1}</span>\n }\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium text-fg overflow-hidden text-ellipsis whitespace-nowrap\">{item.title}</div>\n {item.duration != null && (\n <div className=\"text-[11px] text-muted-foreground mt-0.5\">{formatDuration(item.duration)}</div>\n )}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100\"\n onClick={(e) => { e.stopPropagation(); onRemoveItem(index); }}\n title=\"Remove\"\n >\n <X />\n </Button>\n </div>\n ))}\n </ScrollArea.Root>\n </div>\n);\n\nPlaylistPanel.displayName = 'PlaylistPanel';\n","import React, { useEffect, useRef, useState } from 'react';\n\ninterface ThumbnailPreviewProps {\n videoRef: React.RefObject<HTMLVideoElement | null>;\n time: number;\n position: number;\n duration: number;\n}\n\nconst formatTime = (seconds: number) =>\n `${Math.floor(seconds / 60)}:${String(Math.floor(seconds % 60)).padStart(2, '0')}`;\n\nexport const ThumbnailPreview: React.FC<ThumbnailPreviewProps> = ({\n videoRef, time, position,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const captureRef = useRef<HTMLVideoElement | null>(null);\n const [thumbnail, setThumbnail] = useState<string | null>(null);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video || !canvasRef.current) return;\n\n if (!captureRef.current) {\n captureRef.current = document.createElement('video');\n captureRef.current.src = video.src;\n captureRef.current.crossOrigin = 'anonymous';\n captureRef.current.muted = true;\n }\n\n const captureVideo = captureRef.current;\n const canvas = canvasRef.current;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n captureVideo.currentTime = time;\n\n const handleSeeked = () => {\n try {\n canvas.width = 160;\n canvas.height = 90;\n ctx.drawImage(captureVideo, 0, 0, 160, 90);\n setThumbnail(canvas.toDataURL());\n } catch {\n // Canvas tainted by cross-origin video without CORS headers — show time only\n }\n };\n\n captureVideo.addEventListener('seeked', handleSeeked);\n return () => captureVideo.removeEventListener('seeked', handleSeeked);\n }, [time, videoRef]);\n\n return (\n <div className=\"absolute bottom-[calc(100%+8px)] -translate-x-1/2 bg-card border border-border rounded-lg overflow-hidden shadow-lg z-[1001] pointer-events-none\" style={{ left: `${position}%` }}>\n <canvas ref={canvasRef} className=\"hidden\" />\n {thumbnail\n ? <img src={thumbnail} alt=\"Preview\" className=\"w-[160px] h-auto block\" />\n : <div className=\"w-[160px] h-[90px] flex items-center justify-center bg-muted text-[11px] text-muted-foreground\">Loading…</div>\n }\n <div className=\"text-[11px] text-fg px-2 py-[3px] text-center bg-muted\">{formatTime(time)}</div>\n </div>\n );\n};\n\nThumbnailPreview.displayName = 'ThumbnailPreview';\n","'use client';\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { VideoControls } from './VideoControls';\nimport { VideoSettings } from './VideoSettings';\nimport { useVideoPlayer } from './useVideoPlayer';\nimport { SubtitleDisplay } from './SubtitleDisplay';\nimport type { SubtitleStyle } from './SubtitleDisplay';\nimport { loadSubtitleFile, findActiveCue } from './subtitleParser';\nimport type { SubtitleTrack, SubtitleCue } from './subtitleParser';\nimport { useVideoFilters } from './useVideoFilters';\nimport { usePlaylist } from './usePlaylist';\nimport type { PlaylistItem } from './usePlaylist';\nimport { useQuality } from './useQuality';\nimport { useChapters } from './useChapters';\nimport type { Chapter } from './useChapters';\nimport { PlaylistPanel } from './PlaylistPanel';\nimport { ThumbnailPreview } from './ThumbnailPreview';\n\nfunction extractYouTubeId(url: string): string | null {\n const match = url.match(\n /(?:youtube\\.com\\/(?:watch\\?(?:.*&)?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([A-Za-z0-9_-]{11})/\n );\n return match?.[1] ?? null;\n}\n\nexport interface VideoPlayerProps {\n src: string;\n poster?: string;\n autoPlay?: boolean;\n loop?: boolean;\n muted?: boolean;\n className?: string;\n subtitles?: SubtitleTrack[];\n playlist?: PlaylistItem[];\n chapters?: Chapter[];\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (currentTime: number) => void;\n onVolumeChange?: (volume: number) => void;\n}\n\nexport const VideoPlayer: React.FC<VideoPlayerProps> = ({\n src,\n poster,\n autoPlay = false,\n loop = false,\n muted = false,\n className = '',\n subtitles = [],\n playlist: initialPlaylist = [],\n chapters: initialChapters = [],\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onVolumeChange,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [showControls, setShowControls] = useState(true);\n const [showPlaylist, setShowPlaylist] = useState(false);\n const [showThumbnail, setShowThumbnail] = useState(false);\n const [videoError, setVideoError] = useState<string | null>(null);\n const [thumbnailTime, setThumbnailTime] = useState(0);\n const [thumbnailPosition, setThumbnailPosition] = useState(0);\n const controlsTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n // Subtitle state\n const [subtitleTracks, setSubtitleTracks] = useState<Map<string, SubtitleCue[]>>(new Map());\n const [activeSubtitleIndex, setActiveSubtitleIndex] = useState<number>(-1);\n const [subtitlesEnabled, setSubtitlesEnabled] = useState(false);\n const [currentSubtitleText, setCurrentSubtitleText] = useState('');\n const [subtitleStyle, setSubtitleStyle] = useState<SubtitleStyle>({\n fontSize: 20,\n fontFamily: 'Arial, sans-serif',\n textColor: '#ffffff',\n backgroundColor: '#000000',\n backgroundOpacity: 0.75,\n position: 'bottom',\n });\n const [availableSubtitles, setAvailableSubtitles] = useState<SubtitleTrack[]>(subtitles);\n\n const { filters, updateFilter, resetFilters } = useVideoFilters(videoRef);\n const {\n playlist,\n currentItem,\n playNext,\n playPrevious,\n playIndex,\n toggleShuffle,\n toggleRepeat,\n addToPlaylist: _addToPlaylist,\n removeFromPlaylist,\n } = usePlaylist(\n initialPlaylist.length > 0\n ? initialPlaylist\n : [{ id: '1', title: 'Current Video', src, poster }]\n );\n\n const currentSrc = currentItem?.src ?? src;\n const { qualities, currentQuality, changeQuality, isHls } = useQuality(videoRef, currentSrc);\n const { chapters } = useChapters(initialChapters);\n\n const {\n isPlaying, currentTime, duration, volume, isMuted, playbackRate,\n isFullscreen, isPiP, buffered,\n togglePlay, handleSeek, handleVolumeChange, toggleMute,\n changePlaybackRate, toggleFullscreen, togglePiP, skipForward, skipBackward,\n } = useVideoPlayer({\n videoRef,\n containerRef,\n autoPlay,\n muted,\n onPlay,\n onPause,\n onEnded: () => {\n onEnded?.();\n if (playlist.repeat === 'one') {\n videoRef.current?.play();\n } else if (playlist.items.length > 1) {\n playNext();\n }\n },\n onTimeUpdate,\n onVolumeChange,\n });\n\n // Load subtitle files\n useEffect(() => {\n if (availableSubtitles.length === 0) return;\n\n const loadSubtitles = async () => {\n const tracks = new Map<string, SubtitleCue[]>();\n for (const track of availableSubtitles) {\n const cues = await loadSubtitleFile(track.src);\n tracks.set(track.src, cues);\n }\n setSubtitleTracks(tracks);\n if (activeSubtitleIndex === -1) {\n setActiveSubtitleIndex(0);\n setSubtitlesEnabled(true);\n }\n };\n\n loadSubtitles();\n }, [availableSubtitles]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleSubtitleUpload = async (file: File) => {\n const url = URL.createObjectURL(file);\n const newTrack: SubtitleTrack = {\n src: url,\n label: file.name.replace(/\\.(srt|vtt)$/, ''),\n language: 'unknown',\n };\n setAvailableSubtitles((prev) => [...prev, newTrack]);\n };\n\n // Update subtitle text on time change\n useEffect(() => {\n if (!subtitlesEnabled || activeSubtitleIndex === -1 || availableSubtitles.length === 0) {\n setCurrentSubtitleText('');\n return;\n }\n const activeTrack = availableSubtitles[activeSubtitleIndex];\n if (!activeTrack) { setCurrentSubtitleText(''); return; }\n const cues = subtitleTracks.get(activeTrack.src);\n const activeCue = cues ? findActiveCue(cues, currentTime) : null;\n setCurrentSubtitleText(activeCue?.text ?? '');\n }, [currentTime, subtitlesEnabled, activeSubtitleIndex, subtitleTracks, availableSubtitles]);\n\n // Explicitly reload when src changes — ensures video.networkState never gets stuck at NETWORK_NO_SOURCE\n useEffect(() => {\n const video = videoRef.current;\n if (!video || isHls) return;\n setVideoError(null);\n video.load();\n }, [currentSrc, isHls]);\n\n // Surface media errors to the UI\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n const handleError = () => {\n const code = video.error?.code;\n if (code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || code === MediaError.MEDIA_ERR_NETWORK) {\n setVideoError('Video not found or unsupported format.');\n } else if (code) {\n setVideoError('Failed to load video.');\n }\n };\n video.addEventListener('error', handleError);\n return () => video.removeEventListener('error', handleError);\n }, [videoRef]);\n\n // Trigger play when the playlist item changes\n useEffect(() => {\n const video = videoRef.current;\n if (!video || !currentItem || isHls) return undefined;\n if (autoPlay || isPlaying) {\n const onCanPlay = () => { video.play().catch(console.error); };\n video.addEventListener('canplay', onCanPlay, { once: true });\n return () => video.removeEventListener('canplay', onCanPlay);\n }\n return undefined;\n }, [currentItem, isHls]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-hide controls\n useEffect(() => {\n const handleMouseMove = () => {\n setShowControls(true);\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\n if (isPlaying) {\n controlsTimeoutRef.current = setTimeout(() => setShowControls(false), 3000);\n }\n };\n const handleMouseLeave = () => { if (isPlaying) setShowControls(false); };\n const container = containerRef.current;\n container?.addEventListener('mousemove', handleMouseMove);\n container?.addEventListener('mouseleave', handleMouseLeave);\n return () => {\n container?.removeEventListener('mousemove', handleMouseMove);\n container?.removeEventListener('mouseleave', handleMouseLeave);\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\n };\n }, [isPlaying]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;\n switch (e.key) {\n case ' ': case 'k': e.preventDefault(); togglePlay(); break;\n case 'ArrowRight': e.preventDefault(); skipForward(); break;\n case 'ArrowLeft': e.preventDefault(); skipBackward(); break;\n case 'ArrowUp': e.preventDefault(); handleVolumeChange(Math.min(volume + 0.1, 1)); break;\n case 'ArrowDown': e.preventDefault(); handleVolumeChange(Math.max(volume - 0.1, 0)); break;\n case 'm': e.preventDefault(); toggleMute(); break;\n case 'f': e.preventDefault(); toggleFullscreen(); break;\n case 'p': e.preventDefault(); togglePiP(); break;\n case 'c': e.preventDefault(); setSubtitlesEnabled((v) => !v); break;\n case ',':\n e.preventDefault();\n if (videoRef.current) videoRef.current.currentTime = Math.max(0, videoRef.current.currentTime - 1 / 30);\n break;\n case '.':\n e.preventDefault();\n if (videoRef.current) videoRef.current.currentTime = Math.min(duration, videoRef.current.currentTime + 1 / 30);\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [togglePlay, skipForward, skipBackward, volume, handleVolumeChange, toggleMute, toggleFullscreen, togglePiP, duration]);\n\n const youtubeId = extractYouTubeId(currentSrc);\n if (youtubeId) {\n return (\n <div className={`relative w-full aspect-video bg-black overflow-hidden rounded-lg shadow-lg ${className}`}>\n <iframe\n src={`https://www.youtube.com/embed/${youtubeId}?autoplay=${autoPlay ? 1 : 0}&mute=${muted ? 1 : 0}&loop=${loop ? 1 : 0}&rel=0`}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n className=\"absolute inset-0 w-full h-full border-0\"\n title=\"YouTube video player\"\n />\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={`relative w-full aspect-video bg-bg overflow-hidden rounded-lg shadow-lg font-sans text-sm text-fg select-none ${className}`}\n >\n <video\n ref={videoRef}\n src={!isHls ? currentSrc : undefined}\n poster={poster ?? currentItem?.poster}\n loop={loop}\n onClick={togglePlay}\n className=\"w-full h-full object-contain block cursor-pointer\"\n />\n\n {subtitlesEnabled && currentSubtitleText && (\n <SubtitleDisplay text={currentSubtitleText} style={subtitleStyle} />\n )}\n\n {videoError ? (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-bg/90 gap-3\">\n <svg className=\"w-12 h-12 text-muted-foreground\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z\" />\n </svg>\n <span className=\"text-sm font-medium text-fg\">{videoError}</span>\n </div>\n ) : !isPlaying && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-fg/10 cursor-pointer transition-opacity duration-300\" onClick={togglePlay}>\n <div className=\"w-[72px] h-[72px] rounded-full bg-primary/90 flex items-center justify-center cursor-pointer transition-all duration-200 hover:bg-primary hover:scale-110\">\n <svg className=\"w-9 h-9 text-primary-fg fill-current ml-1\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n </div>\n )}\n\n <div className={`absolute bottom-0 left-0 right-0 transition-opacity duration-300${showControls || !isPlaying ? '' : ' opacity-0 pointer-events-none'}`}>\n <VideoControls\n isPlaying={isPlaying}\n currentTime={currentTime}\n duration={duration}\n volume={volume}\n isMuted={isMuted}\n playbackRate={playbackRate}\n isFullscreen={isFullscreen}\n isPiP={isPiP}\n buffered={buffered}\n subtitlesEnabled={subtitlesEnabled}\n hasSubtitles={availableSubtitles.length > 0}\n hasPlaylist={playlist.items.length > 1}\n chapters={chapters}\n onPlayPause={togglePlay}\n onSeek={handleSeek}\n onVolumeChange={handleVolumeChange}\n onMuteToggle={toggleMute}\n onPlaybackRateChange={changePlaybackRate}\n onFullscreenToggle={toggleFullscreen}\n onPiPToggle={togglePiP}\n onSubtitlesToggle={() => setSubtitlesEnabled((v) => !v)}\n onPlaylistClick={() => setShowPlaylist((v) => !v)}\n onNext={playNext}\n onPrevious={playPrevious}\n settingsPanel={\n <VideoSettings\n playbackRate={playbackRate}\n subtitleStyle={subtitleStyle}\n subtitles={availableSubtitles}\n activeSubtitleIndex={activeSubtitleIndex}\n filters={filters}\n qualities={qualities}\n currentQuality={currentQuality}\n onPlaybackRateChange={changePlaybackRate}\n onSubtitleStyleChange={setSubtitleStyle}\n onSubtitleTrackChange={setActiveSubtitleIndex}\n onSubtitleUpload={handleSubtitleUpload}\n onFilterChange={updateFilter}\n onResetFilters={resetFilters}\n onQualityChange={changeQuality}\n />\n }\n onThumbnailHover={(show, time, position) => {\n setShowThumbnail(show);\n setThumbnailTime(time);\n setThumbnailPosition(position);\n }}\n />\n {showThumbnail && (\n <ThumbnailPreview\n videoRef={videoRef}\n time={thumbnailTime}\n position={thumbnailPosition}\n duration={duration}\n />\n )}\n </div>\n\n {showPlaylist && (\n <PlaylistPanel\n items={playlist.items}\n currentIndex={playlist.currentIndex}\n shuffle={playlist.shuffle}\n repeat={playlist.repeat}\n onPlayItem={playIndex}\n onRemoveItem={removeFromPlaylist}\n onToggleShuffle={toggleShuffle}\n onToggleRepeat={toggleRepeat}\n onClose={() => setShowPlaylist(false)}\n />\n )}\n </div>\n );\n};\n\nVideoPlayer.displayName = 'VideoPlayer';\n"]}
1
+ {"version":3,"sources":["../src/ChapterMarkers.tsx","../src/VideoControls.tsx","../src/VideoFilters.tsx","../src/SubtitleUploader.tsx","../src/VideoSettings.tsx","../src/useVideoPlayer.ts","../src/SubtitleDisplay.tsx","../src/subtitleParser.ts","../src/useVideoFilters.ts","../src/usePlaylist.ts","../src/useQuality.ts","../src/useChapters.ts","../src/PlaylistPanel.tsx","../src/ThumbnailPreview.tsx","../src/VideoPlayer.tsx"],"names":["jsxs","jsx","Button","Slider","useRef","handleVolumeChange","useState","useEffect","useCallback","formatTime"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react';\nimport { Tooltip } from '@structyl/styled';\nimport type { Chapter } from './useChapters';\n\ninterface ChapterMarkersProps {\n chapters: Chapter[];\n duration: number;\n currentTime: number;\n onSeek: (time: number) => void;\n}\n\nexport const ChapterMarkers: React.FC<ChapterMarkersProps> = ({\n chapters, duration, currentTime, onSeek,\n}) => {\n if (chapters.length === 0 || duration === 0) return null;\n\n return (\n <Tooltip.Provider delayDuration={200}>\n {chapters.map((chapter) => {\n const left = (chapter.startTime / duration) * 100;\n const isActive = currentTime >= chapter.startTime && currentTime < chapter.endTime;\n\n return (\n <Tooltip.Root key={chapter.id}>\n <Tooltip.Trigger asChild>\n <div\n className={`absolute -top-px h-[calc(100%+4px)] border-l-2 pointer-events-auto cursor-pointer transition-colors duration-200 z-[1] ${\n isActive ? 'border-primary' : 'border-fg/50 hover:border-primary'\n }`}\n style={{ left: `${left}%` }}\n onClick={(e) => { e.stopPropagation(); onSeek(chapter.startTime); }}\n />\n </Tooltip.Trigger>\n <Tooltip.Content side=\"top\" variant=\"dark\">\n {chapter.title}\n </Tooltip.Content>\n </Tooltip.Root>\n );\n })}\n </Tooltip.Provider>\n );\n};\n\nChapterMarkers.displayName = 'ChapterMarkers';\n","import React, { useRef } from 'react';\nimport {\n Play, Pause, Volume2, VolumeX, Maximize, Minimize,\n Settings, PictureInPicture, SkipBack, SkipForward,\n Subtitles, List, ChevronLeft, ChevronRight,\n} from 'lucide-react';\nimport { Button, Slider, DropdownMenu } from '@structyl/styled';\nimport type { Chapter } from './useChapters';\nimport { ChapterMarkers } from './ChapterMarkers';\n\ninterface VideoControlsProps {\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isMuted: boolean;\n playbackRate: number;\n isFullscreen: boolean;\n isPiP: boolean;\n buffered: number;\n subtitlesEnabled: boolean;\n hasSubtitles: boolean;\n hasPlaylist: boolean;\n chapters: Chapter[];\n settingsPanel?: React.ReactNode;\n onPlayPause: () => void;\n onSeek: (time: number) => void;\n onVolumeChange: (volume: number) => void;\n onMuteToggle: () => void;\n onPlaybackRateChange: (rate: number) => void;\n onFullscreenToggle: () => void;\n onPiPToggle: () => void;\n onSubtitlesToggle: () => void;\n onPlaylistClick: () => void;\n onNext: () => void;\n onPrevious: () => void;\n onThumbnailHover: (show: boolean, time: number, position: number) => void;\n}\n\nconst formatTime = (seconds: number): string => {\n if (isNaN(seconds) || !isFinite(seconds)) return '0:00';\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n if (h > 0) return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;\n return `${m}:${String(s).padStart(2, '0')}`;\n};\n\nexport const VideoControls: React.FC<VideoControlsProps> = ({\n isPlaying, currentTime, duration, volume, isMuted,\n isFullscreen, isPiP, buffered, subtitlesEnabled, hasSubtitles,\n hasPlaylist, onPlayPause, onSeek, onVolumeChange, onMuteToggle,\n onFullscreenToggle, onPiPToggle, onSubtitlesToggle,\n onPlaylistClick, onNext, onPrevious, chapters, settingsPanel, onThumbnailHover,\n}) => {\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n const progressRef = useRef<HTMLDivElement>(null);\n\n const handleProgressClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const rect = progressRef.current?.getBoundingClientRect();\n if (!rect) return;\n onSeek(((e.clientX - rect.left) / rect.width) * duration);\n };\n\n const handleProgressHover = (e: React.MouseEvent<HTMLDivElement>) => {\n const rect = progressRef.current?.getBoundingClientRect();\n if (!rect) return;\n const pos = (e.clientX - rect.left) / rect.width;\n onThumbnailHover(true, pos * duration, pos * 100);\n };\n\n return (\n <div className=\"bg-black/70 pt-2 pb-2 px-2 md:pb-2.5 md:px-3\">\n {/* Progress bar */}\n <div className=\"mb-2 cursor-pointer py-1\">\n <div\n ref={progressRef}\n className=\"group relative h-1 bg-fg/20 rounded cursor-pointer transition-all duration-150 hover:h-1.5\"\n onClick={handleProgressClick}\n onMouseMove={handleProgressHover}\n onMouseLeave={() => onThumbnailHover(false, 0, 0)}\n >\n <ChapterMarkers chapters={chapters} duration={duration} currentTime={currentTime} onSeek={onSeek} />\n <div className=\"absolute top-0 left-0 h-full bg-fg/35 rounded transition-[width] duration-100\" style={{ width: `${buffered}%` }} />\n <div className=\"absolute top-0 left-0 h-full bg-primary rounded transition-[width] duration-100\" style={{ width: `${progress}%` }} />\n <div\n className=\"absolute top-1/2 -translate-x-1/2 -translate-y-1/2 w-3 h-3 bg-primary rounded-full shadow-md opacity-0 pointer-events-none transition-opacity duration-200 group-hover:opacity-100\"\n style={{ left: `${progress}%` }}\n />\n </div>\n </div>\n\n {/* Controls row — wraps instead of clipping on narrow players. flex-wrap\n + space-between set inline so they work even where the consumer's\n Tailwind hasn't generated those utilities. */}\n <div className=\"flex items-center gap-1\" style={{ flexWrap: 'wrap', justifyContent: 'space-between' }}>\n {/* Left */}\n <div className=\"flex items-center gap-0.5\" style={{ minWidth: 0, flexWrap: 'wrap' }}>\n {hasPlaylist && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onPrevious} title=\"Previous\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <ChevronLeft />\n </Button>\n )}\n\n <Button variant=\"ghost\" size=\"icon\" onClick={onPlayPause} title={isPlaying ? 'Pause (Space)' : 'Play (Space)'} className=\"text-white/80 hover:text-white hover:bg-white/10\">\n {isPlaying ? <Pause /> : <Play />}\n </Button>\n\n {hasPlaylist && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onNext} title=\"Next\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <ChevronRight />\n </Button>\n )}\n\n <Button variant=\"ghost\" size=\"icon\" onClick={() => onSeek(Math.max(0, currentTime - 10))} title=\"Rewind 10s\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <SkipBack />\n </Button>\n\n <Button variant=\"ghost\" size=\"icon\" onClick={() => onSeek(Math.min(duration, currentTime + 10))} title=\"Forward 10s\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <SkipForward />\n </Button>\n\n {/* Volume — expand on hover */}\n <div className=\"flex items-center gap-0.5 group\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onMuteToggle} title=\"Mute (M)\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n {isMuted || volume === 0 ? <VolumeX /> : <Volume2 />}\n </Button>\n <div className=\"w-0 overflow-hidden opacity-0 transition-[width,opacity] duration-200 flex items-center sm:group-hover:w-[88px] sm:group-hover:opacity-100\">\n <Slider\n value={[isMuted ? 0 : Math.round(volume * 100)]}\n onValueChange={(val) => onVolumeChange((val[0] ?? 0) / 100)}\n min={0}\n max={100}\n step={1}\n className=\"w-20\"\n />\n </div>\n </div>\n\n <span className=\"text-white/90 text-[11px] md:text-xs font-medium whitespace-nowrap px-1.5 tabular-nums\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n </div>\n\n {/* Right */}\n <div className=\"flex items-center gap-0.5\">\n {hasSubtitles && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSubtitlesToggle}\n title=\"Subtitles (C)\"\n className={subtitlesEnabled ? 'text-primary hover:bg-white/10' : 'text-white/80 hover:text-white hover:bg-white/10'}\n >\n <Subtitles />\n </Button>\n )}\n\n {hasPlaylist && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onPlaylistClick} title=\"Playlist\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n <List />\n </Button>\n )}\n\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <Button variant=\"ghost\" size=\"icon\" title=\"Settings\" className=\"text-white/80 hover:text-white hover:bg-white/10 data-[state=open]:text-primary\">\n <Settings />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content\n side=\"top\"\n align=\"end\"\n sideOffset={8}\n className=\"p-0 w-[min(320px,calc(100vw-1rem))] max-h-[min(70dvh,420px)] overflow-y-auto bg-popover\"\n >\n {settingsPanel}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onPiPToggle}\n title=\"Picture in Picture (P)\"\n className={isPiP ? 'text-primary hover:bg-white/10' : 'text-white/80 hover:text-white hover:bg-white/10'}\n >\n <PictureInPicture />\n </Button>\n\n <Button variant=\"ghost\" size=\"icon\" onClick={onFullscreenToggle} title=\"Fullscreen (F)\" className=\"text-white/80 hover:text-white hover:bg-white/10\">\n {isFullscreen ? <Minimize /> : <Maximize />}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nVideoControls.displayName = 'VideoControls';\n","import React from 'react';\nimport { RotateCcw } from 'lucide-react';\nimport { Button, Slider } from '@structyl/styled';\nimport type { VideoFilters as VideoFiltersType } from './useVideoFilters';\n\ninterface VideoFiltersProps {\n filters: VideoFiltersType;\n onFilterChange: (key: keyof VideoFiltersType, value: number) => void;\n onReset: () => void;\n}\n\nconst FILTER_CONFIG: Array<{\n key: keyof VideoFiltersType;\n label: string;\n min: number;\n max: number;\n unit: string;\n}> = [\n { key: 'brightness', label: 'Brightness', min: 0, max: 200, unit: '%' },\n { key: 'contrast', label: 'Contrast', min: 0, max: 200, unit: '%' },\n { key: 'saturation', label: 'Saturation', min: 0, max: 200, unit: '%' },\n { key: 'hue', label: 'Hue', min: 0, max: 360, unit: '°' },\n { key: 'blur', label: 'Blur', min: 0, max: 10, unit: 'px' },\n { key: 'grayscale', label: 'Grayscale', min: 0, max: 100, unit: '%' },\n];\n\nexport const VideoFilters: React.FC<VideoFiltersProps> = ({ filters, onFilterChange, onReset }) => (\n <div>\n <div className=\"flex items-center justify-between mb-3.5\">\n <span className=\"text-xs font-semibold text-fg\">Video Filters</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={onReset} leftIcon={<RotateCcw />}>\n Reset\n </Button>\n </div>\n\n {FILTER_CONFIG.map(({ key, label, min, max, unit }) => (\n <div className=\"mb-3.5 last:mb-0\" key={key}>\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11px] text-muted-foreground\">{label}</span>\n <span className=\"text-[11px] text-fg font-medium\">{filters[key]}{unit}</span>\n </div>\n <Slider\n value={[filters[key]]}\n onValueChange={([v]) => onFilterChange(key, v ?? filters[key])}\n min={min}\n max={max}\n step={1}\n />\n </div>\n ))}\n </div>\n);\n\nVideoFilters.displayName = 'VideoFilters';\n","import React, { useRef } from 'react';\nimport { Upload } from 'lucide-react';\nimport { Button } from '@structyl/styled';\n\ninterface SubtitleUploaderProps {\n onSubtitleUpload: (file: File) => void;\n}\n\nexport const SubtitleUploader: React.FC<SubtitleUploaderProps> = ({ onSubtitleUpload }) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file && (file.name.endsWith('.srt') || file.name.endsWith('.vtt'))) {\n onSubtitleUpload(file);\n }\n };\n\n return (\n <div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".srt,.vtt\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full mb-2\"\n leftIcon={<Upload />}\n onClick={() => fileInputRef.current?.click()}\n >\n Upload Subtitle File\n </Button>\n <p className=\"text-[11px] text-muted-foreground\">Supports .srt and .vtt formats</p>\n </div>\n );\n};\n\nSubtitleUploader.displayName = 'SubtitleUploader';\n","import React from 'react';\nimport { Button, Slider, Tabs } from '@structyl/styled';\nimport type { SubtitleStyle } from './SubtitleDisplay';\nimport type { SubtitleTrack } from './subtitleParser';\nimport type { VideoFilters as VideoFiltersType } from './useVideoFilters';\nimport { VideoFilters } from './VideoFilters';\nimport { SubtitleUploader } from './SubtitleUploader';\nimport type { QualityLevel } from './useQuality';\n\ninterface VideoSettingsProps {\n playbackRate: number;\n subtitleStyle: SubtitleStyle;\n subtitles: SubtitleTrack[];\n activeSubtitleIndex: number;\n filters: VideoFiltersType;\n qualities: QualityLevel[];\n currentQuality: number;\n onPlaybackRateChange: (rate: number) => void;\n onSubtitleStyleChange: (style: SubtitleStyle) => void;\n onSubtitleTrackChange: (index: number) => void;\n onSubtitleUpload: (file: File) => void;\n onFilterChange: (key: keyof VideoFiltersType, value: number) => void;\n onResetFilters: () => void;\n onQualityChange: (level: number) => void;\n}\n\nconst PLAYBACK_RATES = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n\nexport const VideoSettings: React.FC<VideoSettingsProps> = ({\n playbackRate,\n subtitleStyle,\n subtitles,\n activeSubtitleIndex,\n filters,\n qualities,\n currentQuality,\n onPlaybackRateChange,\n onSubtitleStyleChange,\n onSubtitleTrackChange,\n onSubtitleUpload,\n onFilterChange,\n onResetFilters,\n onQualityChange,\n}) => {\n const updateSubtitleStyle = (updates: Partial<SubtitleStyle>) => {\n onSubtitleStyleChange({ ...subtitleStyle, ...updates });\n };\n\n return (\n <div className=\"flex flex-col w-full\">\n {/* Header */}\n <div className=\"flex items-center px-3 py-2.5 border-b border-border shrink-0\">\n <span className=\"text-[13px] font-semibold text-fg\">Settings</span>\n </div>\n\n {/* Main tabs */}\n <Tabs.Root defaultValue=\"subtitles\" className=\"flex flex-col flex-1 overflow-hidden\">\n <Tabs.List scrollable className=\"px-3 py-2 flex-shrink-0\">\n <Tabs.Trigger value=\"subtitles\">Subtitles</Tabs.Trigger>\n <Tabs.Trigger value=\"filters\">Filters</Tabs.Trigger>\n <Tabs.Trigger value=\"quality\">Quality</Tabs.Trigger>\n <Tabs.Trigger value=\"playback\">Playback</Tabs.Trigger>\n </Tabs.List>\n\n <div className=\"flex-1 overflow-y-auto px-3 pt-1 pb-3\">\n {/* ── Subtitles ─────────────────────────────────── */}\n <Tabs.Content value=\"subtitles\">\n <Tabs.Root defaultValue=\"style\" variant=\"pills\">\n <Tabs.List className=\"mb-3\">\n <Tabs.Trigger value=\"style\">Style</Tabs.Trigger>\n <Tabs.Trigger value=\"tracks\">Tracks</Tabs.Trigger>\n <Tabs.Trigger value=\"upload\">Upload</Tabs.Trigger>\n </Tabs.List>\n\n {/* Style */}\n <Tabs.Content value=\"style\">\n <div className=\"mb-3.5 last:mb-0\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11px] text-muted-foreground\">Font Size</span>\n <span className=\"text-[11px] text-fg font-medium\">{subtitleStyle.fontSize}px</span>\n </div>\n <Slider\n value={[subtitleStyle.fontSize]}\n onValueChange={([v]) => updateSubtitleStyle({ fontSize: v ?? subtitleStyle.fontSize })}\n min={14} max={40} step={2}\n />\n </div>\n\n <div className=\"mb-3.5 last:mb-0\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11px] text-muted-foreground\">Background Opacity</span>\n <span className=\"text-[11px] text-fg font-medium\">{Math.round(subtitleStyle.backgroundOpacity * 100)}%</span>\n </div>\n <Slider\n value={[Math.round(subtitleStyle.backgroundOpacity * 100)]}\n onValueChange={([v]) => updateSubtitleStyle({ backgroundOpacity: (v ?? 0) / 100 })}\n min={0} max={100} step={5}\n />\n </div>\n\n <div className=\"mb-3.5 last:mb-0\">\n <span className=\"text-[11px] text-muted-foreground block mb-1.5\">Text Color</span>\n <input\n type=\"color\"\n className=\"w-full h-9 rounded-lg border border-border cursor-pointer bg-transparent p-0.5\"\n value={subtitleStyle.textColor}\n onChange={(e) => updateSubtitleStyle({ textColor: e.target.value })}\n />\n </div>\n\n <div className=\"mb-3.5 last:mb-0\">\n <span className=\"text-[11px] text-muted-foreground block mb-1.5\">Background Color</span>\n <input\n type=\"color\"\n className=\"w-full h-9 rounded-lg border border-border cursor-pointer bg-transparent p-0.5\"\n value={subtitleStyle.backgroundColor}\n onChange={(e) => updateSubtitleStyle({ backgroundColor: e.target.value })}\n />\n </div>\n\n <div className=\"mb-3.5 last:mb-0\">\n <span className=\"text-[11px] text-muted-foreground block mb-2\">Position</span>\n <div className=\"flex gap-2\">\n <Button\n variant={subtitleStyle.position === 'bottom' ? 'default' : 'outline'}\n size=\"sm\"\n className=\"flex-1\"\n onClick={() => updateSubtitleStyle({ position: 'bottom' })}\n >\n Bottom\n </Button>\n <Button\n variant={subtitleStyle.position === 'top' ? 'default' : 'outline'}\n size=\"sm\"\n className=\"flex-1\"\n onClick={() => updateSubtitleStyle({ position: 'top' })}\n >\n Top\n </Button>\n </div>\n </div>\n </Tabs.Content>\n\n {/* Tracks */}\n <Tabs.Content value=\"tracks\">\n <Button\n variant={activeSubtitleIndex === -1 ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onSubtitleTrackChange(-1)}\n >\n Off\n </Button>\n {subtitles.map((track, i) => (\n <Button\n key={track.src}\n variant={activeSubtitleIndex === i ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onSubtitleTrackChange(i)}\n >\n {track.label} {track.language && `(${track.language})`}\n </Button>\n ))}\n </Tabs.Content>\n\n {/* Upload */}\n <Tabs.Content value=\"upload\">\n <SubtitleUploader onSubtitleUpload={onSubtitleUpload} />\n </Tabs.Content>\n </Tabs.Root>\n </Tabs.Content>\n\n {/* ── Filters ───────────────────────────────────── */}\n <Tabs.Content value=\"filters\">\n <VideoFilters filters={filters} onFilterChange={onFilterChange} onReset={onResetFilters} />\n </Tabs.Content>\n\n {/* ── Quality ───────────────────────────────────── */}\n <Tabs.Content value=\"quality\">\n <p className=\"text-xs font-semibold text-fg mb-2.5\">Video Quality</p>\n {qualities.length > 0 ? (\n <>\n <Button\n variant={currentQuality === -1 ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onQualityChange(-1)}\n >\n Auto\n </Button>\n {qualities.map((q, i) => (\n <Button\n key={i}\n variant={currentQuality === i ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onQualityChange(i)}\n >\n {q.label} ({Math.round(q.bitrate / 1000)}kbps)\n </Button>\n ))}\n </>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n Quality selection is only available for HLS/DASH adaptive streaming sources.\n </p>\n )}\n </Tabs.Content>\n\n {/* ── Playback ──────────────────────────────────── */}\n <Tabs.Content value=\"playback\">\n <p className=\"text-xs font-semibold text-fg mb-2.5\">Playback Speed</p>\n {PLAYBACK_RATES.map((rate) => (\n <Button\n key={rate}\n variant={playbackRate === rate ? 'default' : 'outline'}\n size=\"sm\"\n className=\"w-full justify-start mb-1\"\n onClick={() => onPlaybackRateChange(rate)}\n >\n {rate === 1 ? 'Normal' : `${rate}x`}\n </Button>\n ))}\n </Tabs.Content>\n </div>\n </Tabs.Root>\n </div>\n );\n};\n\nVideoSettings.displayName = 'VideoSettings';\n","import { useState, useEffect, useCallback } from 'react';\nimport type { RefObject } from 'react';\n\ninterface UseVideoPlayerProps {\n videoRef: RefObject<HTMLVideoElement | null>;\n containerRef: RefObject<HTMLDivElement | null>;\n autoPlay?: boolean;\n muted?: boolean;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (currentTime: number) => void;\n onVolumeChange?: (volume: number) => void;\n}\n\nexport const useVideoPlayer = ({\n videoRef,\n containerRef,\n autoPlay,\n muted,\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onVolumeChange,\n}: UseVideoPlayerProps) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [isMuted, setIsMuted] = useState(muted || false);\n const [playbackRate, setPlaybackRate] = useState(1);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isPiP, setIsPiP] = useState(false);\n const [buffered, setBuffered] = useState(0);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n if (autoPlay) {\n video.play().catch(console.error);\n }\n\n const handleLoadedMetadata = () => setDuration(video.duration);\n const handleTimeUpdate = () => {\n setCurrentTime(video.currentTime);\n onTimeUpdate?.(video.currentTime);\n };\n const handlePlay = () => { setIsPlaying(true); onPlay?.(); };\n const handlePause = () => { setIsPlaying(false); onPause?.(); };\n const handleEnded = () => { setIsPlaying(false); onEnded?.(); };\n const handleVolumeChange = () => {\n setVolume(video.volume);\n setIsMuted(video.muted);\n onVolumeChange?.(video.volume);\n };\n const handleProgress = () => {\n if (video.buffered.length > 0) {\n const bufferedEnd = video.buffered.end(video.buffered.length - 1);\n setBuffered((bufferedEnd / video.duration) * 100);\n }\n };\n const handleEnterpip = () => setIsPiP(true);\n const handleLeavepip = () => setIsPiP(false);\n\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('timeupdate', handleTimeUpdate);\n video.addEventListener('play', handlePlay);\n video.addEventListener('pause', handlePause);\n video.addEventListener('ended', handleEnded);\n video.addEventListener('volumechange', handleVolumeChange);\n video.addEventListener('progress', handleProgress);\n video.addEventListener('enterpictureinpicture', handleEnterpip);\n video.addEventListener('leavepictureinpicture', handleLeavepip);\n\n return () => {\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('timeupdate', handleTimeUpdate);\n video.removeEventListener('play', handlePlay);\n video.removeEventListener('pause', handlePause);\n video.removeEventListener('ended', handleEnded);\n video.removeEventListener('volumechange', handleVolumeChange);\n video.removeEventListener('progress', handleProgress);\n video.removeEventListener('enterpictureinpicture', handleEnterpip);\n video.removeEventListener('leavepictureinpicture', handleLeavepip);\n };\n }, [videoRef, autoPlay, onPlay, onPause, onEnded, onTimeUpdate, onVolumeChange]);\n\n useEffect(() => {\n const handleFullscreenChange = () => setIsFullscreen(!!document.fullscreenElement);\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => document.removeEventListener('fullscreenchange', handleFullscreenChange);\n }, []);\n\n const togglePlay = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n if (!video.paused) { video.pause(); return; }\n // If a previous load attempt failed (NETWORK_NO_SOURCE), restart before playing\n if (video.networkState === HTMLMediaElement.NETWORK_NO_SOURCE) {\n video.load();\n }\n video.play().catch(console.error);\n }, [videoRef]);\n\n const handleSeek = useCallback((time: number) => {\n const video = videoRef.current;\n if (!video) return;\n video.currentTime = time;\n setCurrentTime(time);\n }, [videoRef]);\n\n const handleVolumeChange = useCallback((newVolume: number) => {\n const video = videoRef.current;\n if (!video) return;\n video.volume = newVolume;\n setVolume(newVolume);\n if (newVolume > 0 && isMuted) {\n video.muted = false;\n setIsMuted(false);\n }\n }, [videoRef, isMuted]);\n\n const toggleMute = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n video.muted = !video.muted;\n setIsMuted(video.muted);\n }, [videoRef]);\n\n const changePlaybackRate = useCallback((rate: number) => {\n const video = videoRef.current;\n if (!video) return;\n video.playbackRate = rate;\n setPlaybackRate(rate);\n }, [videoRef]);\n\n const toggleFullscreen = useCallback(async () => {\n const container = containerRef.current;\n if (!container) return;\n try {\n if (!document.fullscreenElement) {\n await container.requestFullscreen();\n } else {\n await document.exitFullscreen();\n }\n } catch (error) {\n console.error('Fullscreen error:', error);\n }\n }, [containerRef]);\n\n const togglePiP = useCallback(async () => {\n const video = videoRef.current;\n if (!video) return;\n try {\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch (error) {\n console.error('PiP error:', error);\n }\n }, [videoRef]);\n\n const skipForward = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n video.currentTime = Math.min(video.duration, video.currentTime + 10);\n }, [videoRef]);\n\n const skipBackward = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n video.currentTime = Math.max(0, video.currentTime - 10);\n }, [videoRef]);\n\n return {\n isPlaying, currentTime, duration, volume, isMuted, playbackRate,\n isFullscreen, isPiP, buffered,\n togglePlay, handleSeek, handleVolumeChange, toggleMute,\n changePlaybackRate, toggleFullscreen, togglePiP, skipForward, skipBackward,\n };\n};\n","import React from 'react';\n\nexport interface SubtitleStyle {\n fontSize: number;\n fontFamily: string;\n textColor: string;\n backgroundColor: string;\n backgroundOpacity: number;\n position: 'bottom' | 'top';\n}\n\ninterface SubtitleDisplayProps {\n text: string;\n style: SubtitleStyle;\n}\n\nconst toHex2 = (n: number) => Math.round(n).toString(16).padStart(2, '0');\n\nexport const SubtitleDisplay: React.FC<SubtitleDisplayProps> = ({ text, style }) => {\n if (!text) return null;\n\n const bgColor = `${style.backgroundColor}${toHex2(style.backgroundOpacity * 255)}`;\n const positionClass = style.position === 'bottom' ? 'bottom-[88px]' : 'top-4';\n\n return (\n <div\n className={`absolute left-1/2 -translate-x-1/2 max-w-[90%] px-3 py-1.5 rounded-lg text-center pointer-events-none z-20 leading-[1.4] break-words ${positionClass}`}\n style={{\n fontSize: style.fontSize,\n fontFamily: style.fontFamily,\n color: style.textColor,\n backgroundColor: bgColor,\n textShadow: '2px 2px 4px rgba(0,0,0,0.8)',\n }}\n >\n {text.split('\\n').map((line, i) => (\n <div key={i}>{line}</div>\n ))}\n </div>\n );\n};\n\nSubtitleDisplay.displayName = 'SubtitleDisplay';\n","export interface SubtitleCue {\n start: number;\n end: number;\n text: string;\n}\n\nexport interface SubtitleTrack {\n label: string;\n language: string;\n src: string;\n kind?: 'subtitles' | 'captions';\n}\n\nconst toSeconds = (h: string, m: string, s: string, ms: string): number =>\n parseInt(h, 10) * 3600 + parseInt(m, 10) * 60 + parseInt(s, 10) + parseInt(ms, 10) / 1000;\n\nexport const parseSRT = (content: string): SubtitleCue[] => {\n const cues: SubtitleCue[] = [];\n const SRT_TIME = /(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})\\s*-->\\s*(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})/;\n\n for (const block of content.trim().split(/\\n\\s*\\n/)) {\n const lines = block.split('\\n');\n if (lines.length < 3) continue;\n const timeLine = lines[1];\n if (!timeLine) continue;\n const m = timeLine.match(SRT_TIME);\n if (!m || m.length < 9) continue;\n\n const start = toSeconds(m[1] ?? '0', m[2] ?? '0', m[3] ?? '0', m[4] ?? '0');\n const end = toSeconds(m[5] ?? '0', m[6] ?? '0', m[7] ?? '0', m[8] ?? '0');\n const text = lines.slice(2).join('\\n').trim();\n cues.push({ start, end, text });\n }\n\n return cues;\n};\n\nexport const parseVTT = (content: string): SubtitleCue[] => {\n const cues: SubtitleCue[] = [];\n const VTT_TIME = /(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})\\s*-->\\s*(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})/;\n const lines = content.split('\\n');\n let i = 0;\n\n while (i < lines.length && !lines[i]?.includes('-->')) i++;\n\n while (i < lines.length) {\n const line = lines[i]?.trim() ?? '';\n const m = line.match(VTT_TIME);\n\n if (m && m.length >= 9) {\n const start = toSeconds(m[1] ?? '0', m[2] ?? '0', m[3] ?? '0', m[4] ?? '0');\n const end = toSeconds(m[5] ?? '0', m[6] ?? '0', m[7] ?? '0', m[8] ?? '0');\n\n const textLines: string[] = [];\n i++;\n while (i < lines.length && lines[i]?.trim() !== '') {\n const l = lines[i];\n if (l !== undefined) textLines.push(l.trim());\n i++;\n }\n cues.push({ start, end, text: textLines.join('\\n') });\n }\n\n i++;\n }\n\n return cues;\n};\n\nexport const loadSubtitleFile = async (url: string): Promise<SubtitleCue[]> => {\n try {\n const response = await fetch(url);\n const content = await response.text();\n\n if (content.includes('WEBVTT') || url.endsWith('.vtt')) return parseVTT(content);\n if (url.endsWith('.srt')) return parseSRT(content);\n if (content.includes('-->')) return content.includes(',') ? parseSRT(content) : parseVTT(content);\n return [];\n } catch {\n return [];\n }\n};\n\nexport const findActiveCue = (cues: SubtitleCue[], currentTime: number): SubtitleCue | null =>\n cues.find((c) => currentTime >= c.start && currentTime <= c.end) ?? null;\n","import { useState, useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport interface VideoFilters {\n brightness: number;\n contrast: number;\n saturation: number;\n hue: number;\n blur: number;\n grayscale: number;\n}\n\nconst DEFAULT_FILTERS: VideoFilters = {\n brightness: 100,\n contrast: 100,\n saturation: 100,\n hue: 0,\n blur: 0,\n grayscale: 0,\n};\n\nexport const useVideoFilters = (videoRef: RefObject<HTMLVideoElement | null>) => {\n const [filters, setFilters] = useState<VideoFilters>(DEFAULT_FILTERS);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n video.style.filter = [\n `brightness(${filters.brightness}%)`,\n `contrast(${filters.contrast}%)`,\n `saturate(${filters.saturation}%)`,\n `hue-rotate(${filters.hue}deg)`,\n `blur(${filters.blur}px)`,\n `grayscale(${filters.grayscale}%)`,\n ].join(' ');\n }, [filters, videoRef]);\n\n const updateFilter = (key: keyof VideoFilters, value: number) => {\n setFilters((prev) => ({ ...prev, [key]: value }));\n };\n\n const resetFilters = () => setFilters(DEFAULT_FILTERS);\n\n return { filters, updateFilter, resetFilters };\n};\n","import { useState, useCallback } from 'react';\n\nexport interface PlaylistItem {\n id: string;\n title: string;\n src: string;\n poster?: string;\n duration?: number;\n}\n\nexport interface PlaylistState {\n items: PlaylistItem[];\n currentIndex: number;\n shuffle: boolean;\n repeat: 'none' | 'one' | 'all';\n}\n\nexport const usePlaylist = (initialItems: PlaylistItem[] = []) => {\n const [playlist, setPlaylist] = useState<PlaylistState>({\n items: initialItems,\n currentIndex: 0,\n shuffle: false,\n repeat: 'none',\n });\n\n const currentItem = playlist.items[playlist.currentIndex] ?? null;\n\n const playNext = useCallback(() => {\n setPlaylist((prev) => {\n if (prev.items.length === 0) return prev;\n let nextIndex: number;\n if (prev.shuffle) {\n nextIndex = Math.floor(Math.random() * prev.items.length);\n } else {\n nextIndex = prev.currentIndex + 1;\n if (nextIndex >= prev.items.length) {\n nextIndex = prev.repeat === 'all' ? 0 : prev.currentIndex;\n }\n }\n return { ...prev, currentIndex: nextIndex };\n });\n }, []);\n\n const playPrevious = useCallback(() => {\n setPlaylist((prev) => {\n if (prev.items.length === 0) return prev;\n let prevIndex: number;\n if (prev.shuffle) {\n prevIndex = Math.floor(Math.random() * prev.items.length);\n } else {\n prevIndex = prev.currentIndex - 1;\n if (prevIndex < 0) {\n prevIndex = prev.repeat === 'all' ? prev.items.length - 1 : 0;\n }\n }\n return { ...prev, currentIndex: prevIndex };\n });\n }, []);\n\n const playIndex = useCallback((index: number) => {\n setPlaylist((prev) => {\n if (index < 0 || index >= prev.items.length) return prev;\n return { ...prev, currentIndex: index };\n });\n }, []);\n\n const toggleShuffle = useCallback(() => {\n setPlaylist((prev) => ({ ...prev, shuffle: !prev.shuffle }));\n }, []);\n\n const toggleRepeat = useCallback(() => {\n setPlaylist((prev) => {\n const modes: Array<'none' | 'one' | 'all'> = ['none', 'one', 'all'];\n const nextMode = modes[(modes.indexOf(prev.repeat) + 1) % modes.length] ?? 'none';\n return { ...prev, repeat: nextMode };\n });\n }, []);\n\n const addToPlaylist = useCallback((item: PlaylistItem) => {\n setPlaylist((prev) => ({ ...prev, items: [...prev.items, item] }));\n }, []);\n\n const removeFromPlaylist = useCallback((index: number) => {\n setPlaylist((prev) => {\n const newItems = prev.items.filter((_, i) => i !== index);\n let newIndex = prev.currentIndex;\n if (index < prev.currentIndex) {\n newIndex = prev.currentIndex - 1;\n } else if (index === prev.currentIndex && newItems.length > 0) {\n newIndex = Math.min(prev.currentIndex, newItems.length - 1);\n }\n return { ...prev, items: newItems, currentIndex: Math.max(0, newIndex) };\n });\n }, []);\n\n return {\n playlist, currentItem,\n playNext, playPrevious, playIndex,\n toggleShuffle, toggleRepeat,\n addToPlaylist, removeFromPlaylist,\n };\n};\n","import { useState, useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport Hls from 'hls.js';\n\nexport interface QualityLevel {\n height: number;\n width: number;\n bitrate: number;\n label: string;\n}\n\nexport const useQuality = (videoRef: RefObject<HTMLVideoElement | null>, src: string) => {\n const [qualities, setQualities] = useState<QualityLevel[]>([]);\n const [currentQuality, setCurrentQuality] = useState<number>(-1);\n const [isHls, setIsHls] = useState(false);\n const hlsRef = useRef<Hls | null>(null);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return undefined;\n\n const isHlsSource = src.endsWith('.m3u8');\n setIsHls(isHlsSource);\n\n if (isHlsSource && Hls.isSupported()) {\n const hls = new Hls({ enableWorker: true, lowLatencyMode: true });\n hlsRef.current = hls;\n hls.loadSource(src);\n hls.attachMedia(video);\n\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n setQualities(\n hls.levels.map((level) => ({\n height: level.height,\n width: level.width,\n bitrate: level.bitrate,\n label: `${level.height}p`,\n }))\n );\n });\n\n hls.on(Hls.Events.LEVEL_SWITCHED, (_, data) => setCurrentQuality(data.level));\n\n return () => {\n hls.destroy();\n hlsRef.current = null;\n };\n } else if (isHlsSource && video.canPlayType('application/vnd.apple.mpegurl')) {\n // Native HLS (Safari)\n setQualities((prev) => (prev.length === 1 && prev[0]?.label === 'Auto' ? prev : [{ height: 0, width: 0, bitrate: 0, label: 'Auto' }]));\n return undefined;\n } else {\n // Regular MP4/WebM — clear qualities list without creating a new array if already empty\n setQualities((prev) => (prev.length === 0 ? prev : []));\n return undefined;\n }\n }, [src, videoRef]);\n\n const changeQuality = (level: number) => {\n if (hlsRef.current) {\n hlsRef.current.currentLevel = level;\n setCurrentQuality(level);\n }\n };\n\n return { qualities, currentQuality, changeQuality, isHls };\n};\n","import { useState, useCallback } from 'react';\n\nexport interface Chapter {\n id: string;\n title: string;\n startTime: number;\n endTime: number;\n}\n\nexport const useChapters = (initialChapters: Chapter[] = []) => {\n const [chapters] = useState<Chapter[]>(initialChapters);\n\n const getCurrentChapter = useCallback(\n (currentTime: number): Chapter | null =>\n chapters.find((c) => currentTime >= c.startTime && currentTime < c.endTime) ?? null,\n [chapters]\n );\n\n const getChapterAtPosition = useCallback(\n (position: number, duration: number): Chapter | null =>\n getCurrentChapter((position / 100) * duration),\n [getCurrentChapter]\n );\n\n return { chapters, getCurrentChapter, getChapterAtPosition };\n};\n","import React from 'react';\nimport { Shuffle, Repeat, Repeat1, X } from 'lucide-react';\nimport { Button, ScrollArea } from '@structyl/styled';\nimport type { PlaylistItem } from './usePlaylist';\n\ninterface PlaylistPanelProps {\n items: PlaylistItem[];\n currentIndex: number;\n shuffle: boolean;\n repeat: 'none' | 'one' | 'all';\n onPlayItem: (index: number) => void;\n onRemoveItem: (index: number) => void;\n onToggleShuffle: () => void;\n onToggleRepeat: () => void;\n onClose: () => void;\n}\n\nconst formatDuration = (seconds: number) =>\n `${Math.floor(seconds / 60)}:${String(Math.floor(seconds % 60)).padStart(2, '0')}`;\n\nexport const PlaylistPanel: React.FC<PlaylistPanelProps> = ({\n items, currentIndex, shuffle, repeat,\n onPlayItem, onRemoveItem, onToggleShuffle, onToggleRepeat, onClose,\n}) => (\n <div className=\"absolute top-0 right-0 w-full md:w-[280px] h-full bg-popover border-l border-border z-20 flex flex-col\">\n <div className=\"flex items-center justify-between px-3 py-2.5 border-b border-border shrink-0\">\n <span className=\"text-[13px] font-semibold text-fg\">Playlist ({items.length})</span>\n <div className=\"flex items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onToggleShuffle}\n title=\"Shuffle\"\n className={shuffle ? 'text-primary' : ''}\n >\n <Shuffle />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onToggleRepeat}\n title=\"Repeat\"\n className={repeat !== 'none' ? 'text-primary' : ''}\n >\n {repeat === 'one' ? <Repeat1 /> : <Repeat />}\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" onClick={onClose} title=\"Close\">\n <X />\n </Button>\n </div>\n </div>\n\n <ScrollArea.Root className=\"flex-1 overflow-y-auto p-1.5\">\n {items.map((item, index) => (\n <div\n key={item.id}\n className={`flex items-center gap-2.5 p-2 rounded-lg cursor-pointer transition-colors duration-150 relative group hover:bg-accent/[0.07] ${\n index === currentIndex ? 'bg-primary/15' : ''\n }`}\n onClick={() => onPlayItem(index)}\n >\n <div className=\"shrink-0 w-10 h-10 bg-muted/80 rounded overflow-hidden flex items-center justify-center text-xs text-muted-foreground\">\n {item.poster\n ? <img src={item.poster} alt={item.title} className=\"w-full h-full object-cover\" />\n : <span>{index + 1}</span>\n }\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium text-fg overflow-hidden text-ellipsis whitespace-nowrap\">{item.title}</div>\n {item.duration != null && (\n <div className=\"text-[11px] text-muted-foreground mt-0.5\">{formatDuration(item.duration)}</div>\n )}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100\"\n onClick={(e) => { e.stopPropagation(); onRemoveItem(index); }}\n title=\"Remove\"\n >\n <X />\n </Button>\n </div>\n ))}\n </ScrollArea.Root>\n </div>\n);\n\nPlaylistPanel.displayName = 'PlaylistPanel';\n","import React, { useEffect, useRef, useState } from 'react';\n\ninterface ThumbnailPreviewProps {\n videoRef: React.RefObject<HTMLVideoElement | null>;\n time: number;\n position: number;\n duration: number;\n}\n\nconst formatTime = (seconds: number) =>\n `${Math.floor(seconds / 60)}:${String(Math.floor(seconds % 60)).padStart(2, '0')}`;\n\nexport const ThumbnailPreview: React.FC<ThumbnailPreviewProps> = ({\n videoRef, time, position,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const captureRef = useRef<HTMLVideoElement | null>(null);\n const [thumbnail, setThumbnail] = useState<string | null>(null);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video || !canvasRef.current) return;\n\n if (!captureRef.current) {\n captureRef.current = document.createElement('video');\n captureRef.current.src = video.src;\n captureRef.current.crossOrigin = 'anonymous';\n captureRef.current.muted = true;\n }\n\n const captureVideo = captureRef.current;\n const canvas = canvasRef.current;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n captureVideo.currentTime = time;\n\n const handleSeeked = () => {\n try {\n canvas.width = 160;\n canvas.height = 90;\n ctx.drawImage(captureVideo, 0, 0, 160, 90);\n setThumbnail(canvas.toDataURL());\n } catch {\n // Canvas tainted by cross-origin video without CORS headers — show time only\n }\n };\n\n captureVideo.addEventListener('seeked', handleSeeked);\n return () => captureVideo.removeEventListener('seeked', handleSeeked);\n }, [time, videoRef]);\n\n return (\n <div className=\"absolute bottom-[calc(100%+8px)] -translate-x-1/2 bg-card border border-border rounded-lg overflow-hidden shadow-lg z-[1001] pointer-events-none\" style={{ left: `${position}%` }}>\n <canvas ref={canvasRef} className=\"hidden\" />\n {thumbnail\n ? <img src={thumbnail} alt=\"Preview\" className=\"w-[160px] h-auto block\" />\n : <div className=\"w-[160px] h-[90px] flex items-center justify-center bg-muted text-[11px] text-muted-foreground\">Loading…</div>\n }\n <div className=\"text-[11px] text-fg px-2 py-[3px] text-center bg-muted\">{formatTime(time)}</div>\n </div>\n );\n};\n\nThumbnailPreview.displayName = 'ThumbnailPreview';\n","'use client';\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { VideoControls } from './VideoControls';\nimport { VideoSettings } from './VideoSettings';\nimport { useVideoPlayer } from './useVideoPlayer';\nimport { SubtitleDisplay } from './SubtitleDisplay';\nimport type { SubtitleStyle } from './SubtitleDisplay';\nimport { loadSubtitleFile, findActiveCue } from './subtitleParser';\nimport type { SubtitleTrack, SubtitleCue } from './subtitleParser';\nimport { useVideoFilters } from './useVideoFilters';\nimport { usePlaylist } from './usePlaylist';\nimport type { PlaylistItem } from './usePlaylist';\nimport { useQuality } from './useQuality';\nimport { useChapters } from './useChapters';\nimport type { Chapter } from './useChapters';\nimport { PlaylistPanel } from './PlaylistPanel';\nimport { ThumbnailPreview } from './ThumbnailPreview';\n\nfunction extractYouTubeId(url: string): string | null {\n const match = url.match(\n /(?:youtube\\.com\\/(?:watch\\?(?:.*&)?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([A-Za-z0-9_-]{11})/\n );\n return match?.[1] ?? null;\n}\n\nexport interface VideoPlayerProps {\n src: string;\n poster?: string;\n autoPlay?: boolean;\n loop?: boolean;\n muted?: boolean;\n className?: string;\n subtitles?: SubtitleTrack[];\n playlist?: PlaylistItem[];\n chapters?: Chapter[];\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (currentTime: number) => void;\n onVolumeChange?: (volume: number) => void;\n}\n\nexport const VideoPlayer: React.FC<VideoPlayerProps> = ({\n src,\n poster,\n autoPlay = false,\n loop = false,\n muted = false,\n className = '',\n subtitles = [],\n playlist: initialPlaylist = [],\n chapters: initialChapters = [],\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onVolumeChange,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [showControls, setShowControls] = useState(true);\n const [showPlaylist, setShowPlaylist] = useState(false);\n const [showThumbnail, setShowThumbnail] = useState(false);\n const [videoError, setVideoError] = useState<string | null>(null);\n const [thumbnailTime, setThumbnailTime] = useState(0);\n const [thumbnailPosition, setThumbnailPosition] = useState(0);\n const controlsTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n // Subtitle state\n const [subtitleTracks, setSubtitleTracks] = useState<Map<string, SubtitleCue[]>>(new Map());\n const [activeSubtitleIndex, setActiveSubtitleIndex] = useState<number>(-1);\n const [subtitlesEnabled, setSubtitlesEnabled] = useState(false);\n const [currentSubtitleText, setCurrentSubtitleText] = useState('');\n const [subtitleStyle, setSubtitleStyle] = useState<SubtitleStyle>({\n fontSize: 20,\n fontFamily: 'Arial, sans-serif',\n textColor: '#ffffff',\n backgroundColor: '#000000',\n backgroundOpacity: 0.75,\n position: 'bottom',\n });\n const [availableSubtitles, setAvailableSubtitles] = useState<SubtitleTrack[]>(subtitles);\n\n const { filters, updateFilter, resetFilters } = useVideoFilters(videoRef);\n const {\n playlist,\n currentItem,\n playNext,\n playPrevious,\n playIndex,\n toggleShuffle,\n toggleRepeat,\n addToPlaylist: _addToPlaylist,\n removeFromPlaylist,\n } = usePlaylist(\n initialPlaylist.length > 0\n ? initialPlaylist\n : [{ id: '1', title: 'Current Video', src, poster }]\n );\n\n const currentSrc = currentItem?.src ?? src;\n const { qualities, currentQuality, changeQuality, isHls } = useQuality(videoRef, currentSrc);\n const { chapters } = useChapters(initialChapters);\n\n const {\n isPlaying, currentTime, duration, volume, isMuted, playbackRate,\n isFullscreen, isPiP, buffered,\n togglePlay, handleSeek, handleVolumeChange, toggleMute,\n changePlaybackRate, toggleFullscreen, togglePiP, skipForward, skipBackward,\n } = useVideoPlayer({\n videoRef,\n containerRef,\n autoPlay,\n muted,\n onPlay,\n onPause,\n onEnded: () => {\n onEnded?.();\n if (playlist.repeat === 'one') {\n videoRef.current?.play();\n } else if (playlist.items.length > 1) {\n playNext();\n }\n },\n onTimeUpdate,\n onVolumeChange,\n });\n\n // Load subtitle files\n useEffect(() => {\n if (availableSubtitles.length === 0) return;\n\n const loadSubtitles = async () => {\n const tracks = new Map<string, SubtitleCue[]>();\n for (const track of availableSubtitles) {\n const cues = await loadSubtitleFile(track.src);\n tracks.set(track.src, cues);\n }\n setSubtitleTracks(tracks);\n if (activeSubtitleIndex === -1) {\n setActiveSubtitleIndex(0);\n setSubtitlesEnabled(true);\n }\n };\n\n loadSubtitles();\n }, [availableSubtitles]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleSubtitleUpload = async (file: File) => {\n const url = URL.createObjectURL(file);\n const newTrack: SubtitleTrack = {\n src: url,\n label: file.name.replace(/\\.(srt|vtt)$/, ''),\n language: 'unknown',\n };\n setAvailableSubtitles((prev) => [...prev, newTrack]);\n };\n\n // Update subtitle text on time change\n useEffect(() => {\n if (!subtitlesEnabled || activeSubtitleIndex === -1 || availableSubtitles.length === 0) {\n setCurrentSubtitleText('');\n return;\n }\n const activeTrack = availableSubtitles[activeSubtitleIndex];\n if (!activeTrack) { setCurrentSubtitleText(''); return; }\n const cues = subtitleTracks.get(activeTrack.src);\n const activeCue = cues ? findActiveCue(cues, currentTime) : null;\n setCurrentSubtitleText(activeCue?.text ?? '');\n }, [currentTime, subtitlesEnabled, activeSubtitleIndex, subtitleTracks, availableSubtitles]);\n\n // Explicitly reload when src changes — ensures video.networkState never gets stuck at NETWORK_NO_SOURCE\n useEffect(() => {\n const video = videoRef.current;\n if (!video || isHls) return;\n setVideoError(null);\n video.load();\n }, [currentSrc, isHls]);\n\n // Surface media errors to the UI\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n const handleError = () => {\n const code = video.error?.code;\n if (code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || code === MediaError.MEDIA_ERR_NETWORK) {\n setVideoError('Video not found or unsupported format.');\n } else if (code) {\n setVideoError('Failed to load video.');\n }\n };\n video.addEventListener('error', handleError);\n return () => video.removeEventListener('error', handleError);\n }, [videoRef]);\n\n // Trigger play when the playlist item changes\n useEffect(() => {\n const video = videoRef.current;\n if (!video || !currentItem || isHls) return undefined;\n if (autoPlay || isPlaying) {\n const onCanPlay = () => { video.play().catch(console.error); };\n video.addEventListener('canplay', onCanPlay, { once: true });\n return () => video.removeEventListener('canplay', onCanPlay);\n }\n return undefined;\n }, [currentItem, isHls]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-hide controls\n useEffect(() => {\n const handleMouseMove = () => {\n setShowControls(true);\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\n if (isPlaying) {\n controlsTimeoutRef.current = setTimeout(() => setShowControls(false), 3000);\n }\n };\n const handleMouseLeave = () => { if (isPlaying) setShowControls(false); };\n const container = containerRef.current;\n container?.addEventListener('mousemove', handleMouseMove);\n container?.addEventListener('mouseleave', handleMouseLeave);\n return () => {\n container?.removeEventListener('mousemove', handleMouseMove);\n container?.removeEventListener('mouseleave', handleMouseLeave);\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\n };\n }, [isPlaying]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;\n switch (e.key) {\n case ' ': case 'k': e.preventDefault(); togglePlay(); break;\n case 'ArrowRight': e.preventDefault(); skipForward(); break;\n case 'ArrowLeft': e.preventDefault(); skipBackward(); break;\n case 'ArrowUp': e.preventDefault(); handleVolumeChange(Math.min(volume + 0.1, 1)); break;\n case 'ArrowDown': e.preventDefault(); handleVolumeChange(Math.max(volume - 0.1, 0)); break;\n case 'm': e.preventDefault(); toggleMute(); break;\n case 'f': e.preventDefault(); toggleFullscreen(); break;\n case 'p': e.preventDefault(); togglePiP(); break;\n case 'c': e.preventDefault(); setSubtitlesEnabled((v) => !v); break;\n case ',':\n e.preventDefault();\n if (videoRef.current) videoRef.current.currentTime = Math.max(0, videoRef.current.currentTime - 1 / 30);\n break;\n case '.':\n e.preventDefault();\n if (videoRef.current) videoRef.current.currentTime = Math.min(duration, videoRef.current.currentTime + 1 / 30);\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [togglePlay, skipForward, skipBackward, volume, handleVolumeChange, toggleMute, toggleFullscreen, togglePiP, duration]);\n\n const youtubeId = extractYouTubeId(currentSrc);\n if (youtubeId) {\n // aspect-ratio + bg set inline so the embed always has dimensions even if\n // the consuming app's Tailwind hasn't generated `aspect-video`/`bg-black`\n // (the iframe is absolutely positioned, so without a sized box it collapses\n // to 0 height and the video would be invisible).\n return (\n <div\n className={`relative w-full overflow-hidden rounded-lg shadow-lg ${className}`}\n style={{ aspectRatio: '16 / 9', backgroundColor: '#000' }}\n >\n <iframe\n src={`https://www.youtube.com/embed/${youtubeId}?autoplay=${autoPlay ? 1 : 0}&mute=${muted ? 1 : 0}&loop=${loop ? 1 : 0}&rel=0`}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n className=\"absolute inset-0 w-full h-full border-0\"\n title=\"YouTube video player\"\n />\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={`relative w-full aspect-video bg-bg overflow-hidden rounded-lg shadow-lg font-sans text-sm text-fg select-none ${className}`}\n style={{ aspectRatio: '16 / 9' }}\n >\n <video\n ref={videoRef}\n src={!isHls ? currentSrc : undefined}\n poster={poster ?? currentItem?.poster}\n loop={loop}\n onClick={togglePlay}\n className=\"w-full h-full object-contain block cursor-pointer\"\n />\n\n {subtitlesEnabled && currentSubtitleText && (\n <SubtitleDisplay text={currentSubtitleText} style={subtitleStyle} />\n )}\n\n {videoError ? (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-bg/90 gap-3\">\n <svg className=\"w-12 h-12 text-muted-foreground\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z\" />\n </svg>\n <span className=\"text-sm font-medium text-fg\">{videoError}</span>\n </div>\n ) : !isPlaying && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-fg/10 cursor-pointer transition-opacity duration-300\" onClick={togglePlay}>\n <div className=\"w-[72px] h-[72px] rounded-full bg-primary/90 flex items-center justify-center cursor-pointer transition-all duration-200 hover:bg-primary hover:scale-110\">\n <svg className=\"w-9 h-9 text-primary-fg fill-current ml-1\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n </div>\n )}\n\n <div className={`absolute bottom-0 left-0 right-0 transition-opacity duration-300${showControls || !isPlaying ? '' : ' opacity-0 pointer-events-none'}`}>\n <VideoControls\n isPlaying={isPlaying}\n currentTime={currentTime}\n duration={duration}\n volume={volume}\n isMuted={isMuted}\n playbackRate={playbackRate}\n isFullscreen={isFullscreen}\n isPiP={isPiP}\n buffered={buffered}\n subtitlesEnabled={subtitlesEnabled}\n hasSubtitles={availableSubtitles.length > 0}\n hasPlaylist={playlist.items.length > 1}\n chapters={chapters}\n onPlayPause={togglePlay}\n onSeek={handleSeek}\n onVolumeChange={handleVolumeChange}\n onMuteToggle={toggleMute}\n onPlaybackRateChange={changePlaybackRate}\n onFullscreenToggle={toggleFullscreen}\n onPiPToggle={togglePiP}\n onSubtitlesToggle={() => setSubtitlesEnabled((v) => !v)}\n onPlaylistClick={() => setShowPlaylist((v) => !v)}\n onNext={playNext}\n onPrevious={playPrevious}\n settingsPanel={\n <VideoSettings\n playbackRate={playbackRate}\n subtitleStyle={subtitleStyle}\n subtitles={availableSubtitles}\n activeSubtitleIndex={activeSubtitleIndex}\n filters={filters}\n qualities={qualities}\n currentQuality={currentQuality}\n onPlaybackRateChange={changePlaybackRate}\n onSubtitleStyleChange={setSubtitleStyle}\n onSubtitleTrackChange={setActiveSubtitleIndex}\n onSubtitleUpload={handleSubtitleUpload}\n onFilterChange={updateFilter}\n onResetFilters={resetFilters}\n onQualityChange={changeQuality}\n />\n }\n onThumbnailHover={(show, time, position) => {\n setShowThumbnail(show);\n setThumbnailTime(time);\n setThumbnailPosition(position);\n }}\n />\n {showThumbnail && (\n <ThumbnailPreview\n videoRef={videoRef}\n time={thumbnailTime}\n position={thumbnailPosition}\n duration={duration}\n />\n )}\n </div>\n\n {showPlaylist && (\n <PlaylistPanel\n items={playlist.items}\n currentIndex={playlist.currentIndex}\n shuffle={playlist.shuffle}\n repeat={playlist.repeat}\n onPlayItem={playIndex}\n onRemoveItem={removeFromPlaylist}\n onToggleShuffle={toggleShuffle}\n onToggleRepeat={toggleRepeat}\n onClose={() => setShowPlaylist(false)}\n />\n )}\n </div>\n );\n};\n\nVideoPlayer.displayName = 'VideoPlayer';\n"]}
package/package.json CHANGED
@@ -1,6 +1,17 @@
1
1
  {
2
2
  "name": "@structyl/video-player",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/imirfanul/structyl.git",
7
+ "directory": "packages/video-player"
8
+ },
9
+ "homepage": "https://www.structyl.com",
10
+ "bugs": "https://github.com/imirfanul/structyl/issues",
11
+ "author": {
12
+ "name": "Mohammed Irfanul Alam Tanveer",
13
+ "url": "https://www.imirfanul.com"
14
+ },
4
15
  "publishConfig": {
5
16
  "access": "public"
6
17
  },
@@ -44,7 +55,7 @@
44
55
  "dependencies": {
45
56
  "hls.js": "^1.5.20",
46
57
  "lucide-react": "^0.460.0",
47
- "@structyl/styled": "1.0.0"
58
+ "@structyl/styled": "1.1.0"
48
59
  },
49
60
  "devDependencies": {
50
61
  "@types/react": "^19.0.0",