{"version":3,"file":"dash-provider-0e5b2c0e.mjs","sources":["../../../common/resources/client/player/providers/dash-provider.tsx"],"sourcesContent":["import {useCallback, useContext, useEffect, useRef, useState} from 'react';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {useHtmlMediaInternalState} from '@common/player/providers/html-media/use-html-media-internal-state';\nimport {useHtmlMediaEvents} from '@common/player/providers/html-media/use-html-media-events';\nimport {useHtmlMediaApi} from '@common/player/providers/html-media/use-html-media-api';\nimport {MediaPlayer, MediaPlayerClass, supportsMediaSource} from 'dashjs';\n\nexport default function DashProvider() {\n const store = useContext(PlayerStoreContext);\n const cuedMedia = usePlayerStore(s => s.cuedMedia);\n\n // html medial element state\n const videoRef = useRef(null!);\n const htmlMediaState = useHtmlMediaInternalState(videoRef);\n const htmlMediaEvents = useHtmlMediaEvents(htmlMediaState);\n const htmlMediaApi = useHtmlMediaApi(htmlMediaState);\n\n const dash = useRef();\n const [dashReady, setDashReady] = useState(false);\n\n const destroyDash = useCallback(() => {\n if (dash.current) {\n dash.current.destroy();\n dash.current = undefined;\n setDashReady(false);\n }\n }, []);\n\n const setupDash = useCallback(() => {\n if (!supportsMediaSource()) {\n store.getState().emit('error', {fatal: true});\n return;\n }\n\n const dashInstance = MediaPlayer().create();\n\n dashInstance.on(MediaPlayer.events.ERROR, (e: any) => {\n store.getState().emit('error', {sourceEvent: e});\n });\n\n dashInstance.on(MediaPlayer.events.PLAYBACK_METADATA_LOADED, () => {\n const levels = dashInstance.getBitrateInfoListFor('video');\n if (!levels?.length) return;\n\n store.getState().emit('playbackQualities', {\n qualities: ['auto', ...levels.map(levelToPlaybackQuality)],\n });\n\n store.getState().emit('playbackQualityChange', {quality: 'auto'});\n });\n\n dashInstance.initialize(videoRef.current, undefined, false);\n\n // set dash instance after attaching to video element, so \"attachSource\" is called after\n dash.current = dashInstance;\n setDashReady(true);\n }, [store]);\n\n useEffect(() => {\n setupDash();\n return () => {\n destroyDash();\n };\n }, [setupDash, destroyDash]);\n\n useEffect(() => {\n if (dash.current && cuedMedia?.src) {\n dash.current.attachSource(cuedMedia.src);\n }\n }, [cuedMedia?.src, dashReady]);\n\n useEffect(() => {\n if (!dashReady) return;\n store.setState({\n providerApi: {\n ...htmlMediaApi,\n setPlaybackQuality: (quality: string) => {\n if (!dash.current) return;\n\n const levels = dash.current.getBitrateInfoListFor('video');\n const index = levels.findIndex(\n level => levelToPlaybackQuality(level) === quality\n );\n\n dash.current.updateSettings({\n streaming: {\n abr: {\n autoSwitchBitrate: {\n video: index === -1,\n },\n },\n },\n });\n\n if (index >= 0) {\n dash.current.setQualityFor('video', index);\n }\n\n store.getState().emit('playbackQualityChange', {quality});\n },\n },\n });\n }, [store, htmlMediaApi, dashReady]);\n\n return (\n \n );\n}\n\nconst levelToPlaybackQuality = (level: any) => {\n return level === -1 ? 'auto' : `${level.height}p`;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,SAAwB,eAAe;AAC/B,QAAA,QAAQ,WAAW,kBAAkB;AAC3C,QAAM,YAAY,eAAe,CAAK,MAAA,EAAE,SAAS;AAG3C,QAAA,WAAW,OAAyB,IAAK;AACzC,QAAA,iBAAiB,0BAA0B,QAAQ;AACnD,QAAA,kBAAkB,mBAAmB,cAAc;AACnD,QAAA,eAAe,gBAAgB,cAAc;AAEnD,QAAM,OAAO;AACb,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAE1C,QAAA,cAAc,YAAY,MAAM;AACpC,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ;AACb,WAAK,UAAU;AACf,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAE,CAAA;AAEC,QAAA,YAAY,YAAY,MAAM;AAC9B,QAAA,CAAC,uBAAuB;AAC1B,YAAM,WAAW,KAAK,SAAS,EAAC,OAAO,MAAK;AAC5C;AAAA,IACF;AAEM,UAAA,eAAe,cAAc;AAEnC,iBAAa,GAAG,YAAY,OAAO,OAAO,CAAC,MAAW;AACpD,YAAM,WAAW,KAAK,SAAS,EAAC,aAAa,GAAE;AAAA,IAAA,CAChD;AAED,iBAAa,GAAG,YAAY,OAAO,0BAA0B,MAAM;AAC3D,YAAA,SAAS,aAAa,sBAAsB,OAAO;AACzD,UAAI,EAAC,iCAAQ;AAAQ;AAEf,YAAA,SAAA,EAAW,KAAK,qBAAqB;AAAA,QACzC,WAAW,CAAC,QAAQ,GAAG,OAAO,IAAI,sBAAsB,CAAC;AAAA,MAAA,CAC1D;AAED,YAAM,WAAW,KAAK,yBAAyB,EAAC,SAAS,QAAO;AAAA,IAAA,CACjE;AAED,iBAAa,WAAW,SAAS,SAAS,QAAW,KAAK;AAG1D,SAAK,UAAU;AACf,iBAAa,IAAI;AAAA,EAAA,GAChB,CAAC,KAAK,CAAC;AAEV,YAAU,MAAM;AACJ;AACV,WAAO,MAAM;AACC;IAAA;AAAA,EACd,GACC,CAAC,WAAW,WAAW,CAAC;AAE3B,YAAU,MAAM;AACV,QAAA,KAAK,YAAW,uCAAW,MAAK;AAC7B,WAAA,QAAQ,aAAa,UAAU,GAAG;AAAA,IACzC;AAAA,EACC,GAAA,CAAC,uCAAW,KAAK,SAAS,CAAC;AAE9B,YAAU,MAAM;AACd,QAAI,CAAC;AAAW;AAChB,UAAM,SAAS;AAAA,MACb,aAAa;AAAA,QACX,GAAG;AAAA,QACH,oBAAoB,CAAC,YAAoB;AACvC,cAAI,CAAC,KAAK;AAAS;AAEnB,gBAAM,SAAS,KAAK,QAAQ,sBAAsB,OAAO;AACzD,gBAAM,QAAQ,OAAO;AAAA,YACnB,CAAA,UAAS,uBAAuB,KAAK,MAAM;AAAA,UAAA;AAG7C,eAAK,QAAQ,eAAe;AAAA,YAC1B,WAAW;AAAA,cACT,KAAK;AAAA,gBACH,mBAAmB;AAAA,kBACjB,OAAO,UAAU;AAAA,gBACnB;AAAA,cACF;AAAA,YACF;AAAA,UAAA,CACD;AAED,cAAI,SAAS,GAAG;AACT,iBAAA,QAAQ,cAAc,SAAS,KAAK;AAAA,UAC3C;AAEA,gBAAM,WAAW,KAAK,yBAAyB,EAAC,SAAQ;AAAA,QAC1D;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EACA,GAAA,CAAC,OAAO,cAAc,SAAS,CAAC;AAGjC,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,KAAK;AAAA,MACL,aAAW;AAAA,MACX,QAAQ,uCAAW;AAAA,MAClB,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,MAAM,yBAAyB,CAAC,UAAe;AAC7C,SAAO,UAAU,KAAK,SAAS,GAAG,MAAM,MAAM;AAChD;"}