diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css index 4be7ac9..1b5a98c 100644 --- a/apps/web/src/app/globals.css +++ b/apps/web/src/app/globals.css @@ -146,7 +146,6 @@ h2 { @apply scroll-m-20 pb-2 text-3xl font-semibold tracking-tight first:mt-0; } -/* Media controller styles remain unchanged */ media-controller { --media-primary-color: #ffffff; --media-secondary-color: hsla(var(--background), 0.85); diff --git a/apps/web/src/components/app/StreamPlayer/StreamPlayer.tsx b/apps/web/src/components/app/StreamPlayer/StreamPlayer.tsx index 4691eef..ea29cfb 100644 --- a/apps/web/src/components/app/StreamPlayer/StreamPlayer.tsx +++ b/apps/web/src/components/app/StreamPlayer/StreamPlayer.tsx @@ -10,8 +10,9 @@ import { MediaMuteButton, MediaVolumeRange, MediaFullscreenButton, + MediaChromeButton, } from 'media-chrome/react'; -import { RefreshCw } from 'lucide-react'; +import { RefreshCw, RotateCw } from 'lucide-react'; import HlsVideo from 'hls-video-element/react'; import type { HlsVideoElement } from 'hls-video-element'; import { Button } from '@/components/ui/button'; @@ -19,6 +20,7 @@ import { useSession } from '@/lib/providers/SessionProvider'; import { useUserStreamInfo } from '@/lib/hooks/useUserList'; import { getMediamtxClientEnvs } from '@/lib/utils/mediamtx/client'; import type { MediaMTXRegion } from '@/lib/utils/mediamtx/regions'; +import { cn } from '@/lib/utils'; const WAITING_RECOVERY_DELAY_MS = 8000; const RECOVERY_COOLDOWN_MS = 2000; @@ -193,26 +195,18 @@ export default function StreamPlayer() {
+ {(process.env.NODE_ENV === 'development' || userInfo?.isLive) && ( + triggerRecovery('manual_reload')}> + + + + Retry stream + + )}
- - {userInfo?.isLive && ( -
- -
- )} ); }