@@ -5,10 +5,11 @@ import { LiveUrls } from 'api-types/api/v1/lives/_liveId@number/url';
55import { useAPIError } from './api/use-api-error' ;
66import { VideoUrls } from 'api-types/api/v1/videos/_liveId@number' ;
77import type { HlsConfig } from 'hls.js' ;
8+ import { useLocalStorage } from 'react-use' ;
89
910export enum LivePlayType {
10- FlvHttp = 'flvHttp' ,
1111 FlvWs = 'flvWs' ,
12+ FlvHttp = 'flvHttp' ,
1213 HlsHq = 'hlsHq' ,
1314 HlsLq = 'hlsLq' ,
1415 Audio = 'audio'
@@ -31,14 +32,19 @@ type UrlType<T> = T extends 'live' ? LiveUrls : VideoUrls;
3132let hlsInterface : typeof Hls | undefined ;
3233let mpegtsInterface : typeof Mpegts | undefined ;
3334
35+ const isLivePlayType = ( type : string ) : type is LivePlayType =>
36+ Object . values ( LivePlayType ) . includes ( type as LivePlayType ) ;
37+
3438export const useVideoStream = < T extends 'live' | 'video' > (
3539 entityType : T ,
3640 videoTagRef : RefObject < HTMLVideoElement > ,
3741 url ?: UrlType < T >
3842) => {
3943 const mpegtsPlayerRef = useRef < Mpegts . Player > ( ) ;
4044 const hlsPlayerRef = useRef < Hls > ( ) ;
41- const [ playType , setPlayType ] = useState < PlayType < T > > ( ) ;
45+ const [ playType , setPlayType ] = useLocalStorage < PlayType < T > > (
46+ `knzklive-${ entityType } -play-type`
47+ ) ;
4248 const [ error , setError ] = useState < unknown > ( ) ;
4349 useAPIError ( error ) ;
4450
@@ -210,6 +216,24 @@ export const useVideoStream = <T extends 'live' | 'video'>(
210216 [ videoTagRef ]
211217 ) ;
212218
219+ const handleToLowerQuality = useCallback ( ( ) => {
220+ if ( ! playType ) {
221+ return ;
222+ }
223+ if ( isLivePlayType ( playType ) ) {
224+ const qualities = Object . values ( LivePlayType ) ;
225+ const currentIndex = qualities . indexOf ( playType ) ;
226+ const nextQuality = qualities [ currentIndex + 1 ] ;
227+ if ( nextQuality && nextQuality !== LivePlayType . Audio ) {
228+ setPlayType ( nextQuality as PlayType < T > ) ;
229+
230+ return true ;
231+ }
232+ }
233+
234+ return false ;
235+ } , [ playType , setPlayType ] ) ;
236+
213237 useEffect ( ( ) => {
214238 const video = videoTagRef . current ;
215239 if ( ! video || ! url ) {
@@ -273,12 +297,21 @@ export const useVideoStream = <T extends 'live' | 'video'>(
273297 video . src = '' ;
274298 }
275299 } ;
276- } , [ videoTagRef , url , playType , handleFlv , handleHls , entityType ] ) ;
300+ } , [
301+ videoTagRef ,
302+ url ,
303+ playType ,
304+ handleFlv ,
305+ handleHls ,
306+ entityType ,
307+ setPlayType
308+ ] ) ;
277309
278310 return {
279311 playType,
280312 setPlayType,
281- play
313+ play,
314+ handleToLowerQuality
282315 } as const ;
283316} ;
284317
0 commit comments