@vkontakte/videoplayer-core 2.0.102-beta.3 → 2.0.103-dev.c555938f.0

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.
package/esnext.esm.js CHANGED
@@ -1,9 +1,9 @@
1
1
  /**
2
- * @vkontakte/videoplayer-core v2.0.102-beta.3
3
- * Tue, 21 May 2024 11:58:06 GMT
4
- * https://st.mycdn.me/static/vkontakte-videoplayer/2-0-102/doc/
2
+ * @vkontakte/videoplayer-core v2.0.103-dev.c555938f.0
3
+ * Tue, 28 May 2024 09:13:35 GMT
4
+ * https://st.mycdn.me/static/vkontakte-videoplayer/2-0-103/doc/
5
5
  */
6
- import{ValueSubject as g,Subject as x,Subscription as ee,isNonNullable as A,ErrorCategory as P,isNullable as Q,fromEvent as C,assertNever as V,merge as O,tap as Nt,map as T,observableFrom as xe,filterChanged as de,assertNonNullable as v,debounce as Ge,getHighestQuality as Ls,timeout as xs,getCurrentBrowser as $i,CurrentClientBrowser as ns,combine as De,once as ye,mapTo as Kt,filter as oe,VideoQuality as we,now as se,assertNotEmptyArray as Cs,videoSizeToQuality as dt,isInvariantQuality as ut,isHigher as At,isLower as jt,isHigherOrEqual as bi,isLowerOrEqual as Zt,interval as Bt,videoQualityToHeight as Rs,abortable as Te,getExponentialDelay as Jt,throttle as Is,Observable as Pi,observeElementSize as Bs,isIOS as Ms,CurrentClientDevice as _s,safeStorage as pi,fillWithDefault as Os,Logger as Ns}from"@vkontakte/videoplayer-shared/esnext.esm.js";import{Observable as ln,Subject as fn,Subscription as pn,ValueSubject as mn,VideoQuality as gn}from"@vkontakte/videoplayer-shared/esnext.esm.js";const Fs="2.0.102-beta.3";var l;(function(s){s.STOPPED="stopped",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused"})(l||(l={}));var m;(function(s){s.MPEG="MPEG",s.DASH="DASH_SEP",s.DASH_SEP="DASH_SEP",s.DASH_SEP_VK="DASH_SEP",s.DASH_WEBM="DASH_WEBM",s.DASH_WEBM_AV1="DASH_WEBM_AV1",s.DASH_WEBM_VK="DASH_WEBM",s.DASH_ONDEMAND="DASH_ONDEMAND",s.DASH_ONDEMAND_VK="DASH_ONDEMAND",s.DASH_LIVE="DASH_LIVE",s.DASH_LIVE_CMAF="DASH_LIVE_CMAF",s.DASH_LIVE_WEBM="DASH_LIVE_WEBM",s.HLS="HLS",s.HLS_ONDEMAND="HLS_ONDEMAND",s.HLS_JS="HLS",s.HLS_LIVE="HLS_LIVE",s.HLS_LIVE_CMAF="HLS_LIVE_CMAF",s.WEB_RTC_LIVE="WEB_RTC_LIVE"})(m||(m={}));var ge;(function(s){s.SCREEN="SCREEN",s.CHROMECAST="CHROMECAST"})(ge||(ge={}));var pe;(function(s){s.NOT_AVAILABLE="NOT_AVAILABLE",s.AVAILABLE="AVAILABLE",s.CONNECTING="CONNECTING",s.CONNECTED="CONNECTED"})(pe||(pe={}));var yi;(function(s){s.HTTP1="http1",s.HTTP2="http2",s.QUIC="quic"})(yi||(yi={}));var G;(function(s){s.None="none",s.Requested="requested",s.Applying="applying"})(G||(G={}));var et;(function(s){s.NONE="none",s.INLINE="inline",s.FULLSCREEN="fullscreen",s.SECOND_SCREEN="second_screen",s.PIP="pip"})(et||(et={}));var Vs=s=>new Promise((e,t)=>{const i=document.createElement("script");i.setAttribute("src",s),i.onload=()=>e,i.onerror=()=>t,document.body.appendChild(i)});class Us{connection$=new g(void 0);castState$=new g(pe.NOT_AVAILABLE);errorEvent$=new x;contentId;realCastState$=new g(pe.NOT_AVAILABLE);subscription=new ee;log;params;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastInitializer");const t="chrome"in window;if(this.log({message:`[constructor] receiverApplicationId: ${this.params.receiverApplicationId}, isDisabled: ${this.params.isDisabled}, isSupported: ${t}`}),e.isDisabled||!t)return;const i=A(window.chrome?.cast),a=!!window.__onGCastApiAvailable;i?this.initializeCastApi():(window.__onGCastApiAvailable=r=>{delete window.__onGCastApiAvailable,r&&this.initializeCastApi()},a||Vs("https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1").catch(()=>this.errorEvent$.next({id:"ChromecastLoading",category:P.NETWORK,message:"Script loading failed!"})))}connect(){cast.framework.CastContext.getInstance()?.requestSession()}disconnect(){cast.framework.CastContext.getInstance()?.getCurrentSession()?.endSession(!0)}stopMedia(){return new Promise((e,t)=>{cast.framework.CastContext.getInstance()?.getCurrentSession()?.getMediaSession()?.stop(new chrome.cast.media.StopRequest,e,t)})}toggleConnection(){A(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){const t=this.connection$.getValue();Q(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){const t=this.connection$.getValue();Q(t)||e!==t.remotePlayer.isMuted&&t.remotePlayerController.muteOrUnmute()}destroy(){this.subscription.unsubscribe()}initListeners(){const e=new cast.framework.RemotePlayer,t=new cast.framework.RemotePlayerController(e),i=cast.framework.CastContext.getInstance();this.subscription.add(C(i,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(a=>{switch(a.sessionState){case cast.framework.SessionState.SESSION_STARTED:case cast.framework.SessionState.SESSION_STARTING:case cast.framework.SessionState.SESSION_RESUMED:this.contentId=i.getCurrentSession()?.getMediaSession()?.media.contentId;break;case cast.framework.SessionState.NO_SESSION:case cast.framework.SessionState.SESSION_ENDING:case cast.framework.SessionState.SESSION_ENDED:case cast.framework.SessionState.SESSION_START_FAILED:this.contentId=void 0;break;default:return V(a.sessionState)}})).add(O(C(i,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(Nt(a=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(a)}`})}),T(a=>a.castState)),xe([i.getCastState()])).pipe(de(),T(Hs),Nt(a=>{this.log({message:`realCastState$: ${a}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(a=>{const r=a===pe.CONNECTED,n=A(this.connection$.getValue());if(r&&!n){const o=i.getCurrentSession();v(o);const d=o.getCastDevice(),c=o.getMediaSession()?.media.contentId;(Q(c)||c===this.contentId)&&(this.log({message:"connection created"}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:o,castDevice:d}))}else!r&&n&&(this.log({message:"connection destroyed"}),this.connection$.next(void 0));this.castState$.next(a===pe.CONNECTED?A(this.connection$.getValue())?pe.CONNECTED:pe.AVAILABLE:a)}))}initializeCastApi(){let e,t,i;try{e=cast.framework.CastContext.getInstance(),t=chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,i=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED}catch{return}try{e.setOptions({receiverApplicationId:this.params.receiverApplicationId??t,autoJoinPolicy:i}),this.initListeners()}catch(a){this.errorEvent$.next({id:"ChromecastInitializer",category:P.EXTERNAL_API,message:"[initializeCastApi] failed",thrown:a})}}}const Hs=s=>{switch(s){case cast.framework.CastState.NO_DEVICES_AVAILABLE:return pe.NOT_AVAILABLE;case cast.framework.CastState.NOT_CONNECTED:return pe.AVAILABLE;case cast.framework.CastState.CONNECTING:return pe.CONNECTING;case cast.framework.CastState.CONNECTED:return pe.CONNECTED;default:return V(s)}};var le;(function(s){s[s.OFFSET_P=0]="OFFSET_P",s[s.PLAYBACK_SHIFT=1]="PLAYBACK_SHIFT",s[s.DASH_CMAF_OFFSET_P=2]="DASH_CMAF_OFFSET_P"})(le||(le={}));var _e=(s,e=0,t=le.OFFSET_P)=>{switch(t){case le.OFFSET_P:return s.replace("_offset_p",e===0?"":"_"+e.toFixed(0));case le.PLAYBACK_SHIFT:{if(e===0)return s;const i=new URL(s);return i.searchParams.append("playback_shift",e.toFixed(0)),i.toString()}case le.DASH_CMAF_OFFSET_P:{const i=new URL(s);return!i.searchParams.get("offset_p")&&e===0?s:(i.searchParams.set("offset_p",e.toFixed(0)),i.toString())}default:V(t)}return s};const Mi=(s,e)=>{switch(e){case le.OFFSET_P:return NaN;case le.PLAYBACK_SHIFT:{const t=new URL(s);return Number(t.searchParams.get("playback_shift"))}case le.DASH_CMAF_OFFSET_P:{const t=new URL(s);return Number(t.searchParams.get("offset_p")??0)}default:V(e)}};var R=(s,e,t=!1)=>{const i=s.getTransition();(t||!i||i.to===e)&&s.setState(e)};class ne{state;prevState;transition;transitionStarted$=new x;transitionEnded$=new x;transitionUpdated$=new x;forceChanged$=new x;stateChangeStarted$=O(this.transitionStarted$,this.transitionUpdated$);stateChangeEnded$=O(this.transitionEnded$,this.forceChanged$);constructor(e){this.state=e,this.prevState=void 0}setState(e){const t=this.transition,i=this.state;this.transition=void 0,this.prevState=i,this.state=e,t?t.to===e?this.transitionEnded$.next(t):this.forceChanged$.next({from:t.from,to:e,canceledTransition:t}):this.forceChanged$.next({from:i,to:e,canceledTransition:t})}startTransitionTo(e){const t=this.transition,i=this.state;i===e||A(t)&&t.to===e||(this.prevState=i,this.state=e,t?(this.transition={from:t.from,to:e,canceledTransition:t},this.transitionUpdated$.next(this.transition)):(this.transition={from:i,to:e},this.transitionStarted$.next(this.transition)))}getTransition(){return this.transition}getState(){return this.state}getPrevState(){return this.prevState}}const Ys=s=>{switch(s){case m.MPEG:case m.DASH_SEP:case m.DASH_ONDEMAND:case m.DASH_WEBM:case m.DASH_WEBM_AV1:case m.HLS:case m.HLS_ONDEMAND:return!1;case m.DASH_LIVE:case m.DASH_LIVE_CMAF:case m.HLS_LIVE:case m.HLS_LIVE_CMAF:case m.DASH_LIVE_WEBM:case m.WEB_RTC_LIVE:return!0;default:return V(s)}};var F;(function(s){s.STOPPED="stopped",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused"})(F||(F={}));const Gs=5,qs=5,zs=500,_i=7e3;class Ws{subscription=new ee;loadMediaTimeoutSubscription=new ee;videoState=new ne(F.STOPPED);params;log;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastProvider"),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(Ys(e.format)),this.params.output.isAudioAvailable$.next(!0),this.handleRemoteVolumeChange({volume:this.params.connection.remotePlayer.volumeLevel,muted:this.params.connection.remotePlayer.isMuted});const t=this.params.connection.session.getMediaSession();t&&this.restoreSession(t),this.subscribe()}destroy(){this.log({message:"[destroy]"}),this.subscription.unsubscribe()}subscribe(){this.subscription.add(this.loadMediaTimeoutSubscription);const e=new ee;this.subscription.add(e),this.subscription.add(O(this.videoState.stateChangeStarted$.pipe(T(a=>`stateChangeStarted$ ${JSON.stringify(a)}`)),this.videoState.stateChangeEnded$.pipe(T(a=>`stateChangeEnded$ ${JSON.stringify(a)}`))).subscribe(a=>this.log({message:`[videoState] ${a}`})));const t=(a,r)=>this.subscription.add(a.subscribe(r));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{const a=new x;e.add(a.pipe(Ge(zs)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let r=NaN;e.add(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(n=>{this.logRemoteEvent(n);const o=n.value;this.params.output.position$.next(o),(this.params.desiredState.seekState.getState().state===G.Applying||Math.abs(o-r)>Gs)&&a.next(o),r=o})),e.add(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(n=>{this.logRemoteEvent(n),this.params.output.duration$.next(n.value)}))}t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),a=>{this.logRemoteEvent(a),a.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),a=>{this.logRemoteEvent(a),a.value?this.handleRemotePause():this.handleRemotePlay()}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),a=>{this.logRemoteEvent(a);const{remotePlayer:r}=this.params.connection,n=a.value,o=this.params.output.isBuffering$.getValue(),d=n===chrome.cast.media.PlayerState.BUFFERING;switch(o!==d&&this.params.output.isBuffering$.next(d),n){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&r.duration-r.currentTime<qs&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),R(this.params.desiredState.playbackState,l.STOPPED);break;case chrome.cast.media.PlayerState.PAUSED:{this.handleRemotePause();break}case chrome.cast.media.PlayerState.PLAYING:this.handleRemotePlay();break;case chrome.cast.media.PlayerState.BUFFERING:break;default:V(n)}}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),a=>{this.logRemoteEvent(a),this.handleRemoteVolumeChange({volume:a.value})}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),a=>{this.logRemoteEvent(a),this.handleRemoteVolumeChange({muted:a.value})});const i=O(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,xe(["init"])).pipe(Ge(0));t(i,this.syncPlayback)}restoreSession(e){this.log({message:"restoreSession"});const{remotePlayer:t}=this.params.connection;if(e.playerState!==chrome.cast.media.PlayerState.IDLE){t.isPaused?(this.videoState.setState(F.PAUSED),R(this.params.desiredState.playbackState,l.PAUSED)):(this.videoState.setState(F.PLAYING),R(this.params.desiredState.playbackState,l.PLAYING));const i=this.params.output.isLive$.getValue();this.params.output.duration$.next(i?0:t.duration),this.params.output.position$.next(i?0:t.currentTime),this.params.desiredState.seekState.setState({state:G.None})}}prepare(){const e=this.params.format;this.log({message:`[prepare] format: ${e}`});const t=this.createMediaInfo(e),i=this.createLoadRequest(t);this.loadMedia(i)}handleRemotePause(){const e=this.videoState.getState();(this.videoState.getTransition()?.to===F.PAUSED||e===F.PLAYING)&&(this.videoState.setState(F.PAUSED),R(this.params.desiredState.playbackState,l.PAUSED))}handleRemotePlay(){const e=this.videoState.getState();(this.videoState.getTransition()?.to===F.PLAYING||e===F.PAUSED)&&(this.videoState.setState(F.PLAYING),R(this.params.desiredState.playbackState,l.PLAYING))}handleRemoteReady(){this.videoState.getTransition()?.to===F.READY&&this.videoState.setState(F.READY),this.params.desiredState.playbackState.getTransition()?.to===l.READY&&R(this.params.desiredState.playbackState,l.READY)}handleRemoteStop(){this.videoState.getState()!==F.STOPPED&&this.videoState.setState(F.STOPPED)}handleRemoteVolumeChange(e){const t=this.params.output.volume$.getValue(),i={volume:e.volume??t.volume,muted:e.muted??t.muted};(i.volume!==t.volume||i.muted!==i.muted)&&this.params.output.volume$.next(i)}seek(e){this.params.output.willSeekEvent$.next();const{remotePlayer:t,remotePlayerController:i}=this.params.connection;t.currentTime=e,i.seek()}stop(){const{remotePlayerController:e}=this.params.connection;e.stop()}createMediaInfo(e){const t=this.params.source;let i,a,r;switch(e){case m.MPEG:{const c=t[e];v(c);const u=Ls(Object.keys(c));v(u);const h=c[u];v(h),i=h,a="video/mp4",r=chrome.cast.media.StreamType.BUFFERED;break}case m.HLS:case m.HLS_ONDEMAND:{const c=t[e];v(c),i=c.url,a="application/x-mpegurl",r=chrome.cast.media.StreamType.BUFFERED;break}case m.DASH_SEP:case m.DASH_ONDEMAND:case m.DASH_WEBM:case m.DASH_WEBM_AV1:{const c=t[e];v(c),i=c.url,a="application/dash+xml",r=chrome.cast.media.StreamType.BUFFERED;break}case m.DASH_LIVE_CMAF:{const c=t[e];v(c),i=c.url,a="application/dash+xml",r=chrome.cast.media.StreamType.LIVE;break}case m.HLS_LIVE:case m.HLS_LIVE_CMAF:{const c=t[e];v(c),i=_e(c.url),a="application/x-mpegurl",r=chrome.cast.media.StreamType.LIVE;break}case m.DASH_LIVE:case m.WEB_RTC_LIVE:{const c="Unsupported format for Chromecast",u=new Error(c);throw this.params.output.error$.next({id:"ChromecastProvider.createMediaInfo()",category:P.VIDEO_PIPELINE,message:c,thrown:u}),u}case m.DASH_LIVE_WEBM:throw new Error("DASH_LIVE_WEBM is no longer supported");default:return V(e)}const n=new chrome.cast.media.MediaInfo(this.params.meta.videoId??i,a);n.contentUrl=i,n.streamType=r,n.metadata=new chrome.cast.media.GenericMediaMetadata;const{title:o,subtitle:d}=this.params.meta;return A(o)&&(n.metadata.title=o),A(d)&&(n.metadata.subtitle=d),n}createLoadRequest(e){const t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;const i=this.params.desiredState.seekState.getState();return i.state===G.Applying||i.state===G.Requested?t.currentTime=this.params.output.isLive$.getValue()?0:i.position/1e3:t.currentTime=0,t}loadMedia(e){const t=this.params.connection.session.loadMedia(e),i=new Promise((a,r)=>{this.loadMediaTimeoutSubscription.add(xs(_i).subscribe(()=>r(`timeout(${_i})`)))});Promise.race([t,i]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state===G.Applying&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},a=>{const r=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${a}`;this.log({message:r}),this.params.output.error$.next({id:"ChromecastProvider.loadMedia",category:P.VIDEO_PIPELINE,message:r,thrown:a})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}syncPlayback=()=>{const e=this.videoState.getState(),t=this.videoState.getTransition(),i=this.params.desiredState.playbackState.getState(),a=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.seekState.getState();if(this.log({message:`[syncPlayback] videoState: ${e}; videoTransition: ${JSON.stringify(t)}; desiredPlaybackState: ${i}; desiredPlaybackStateTransition: ${this.params.desiredState.playbackState.getTransition()}; seekState: ${JSON.stringify(r)};`}),i===l.STOPPED){e!==F.STOPPED&&(this.videoState.startTransitionTo(F.STOPPED),this.stop());return}if(!t){if(a?.to!==l.PAUSED&&r.state===G.Requested&&e!==F.STOPPED){this.seek(r.position/1e3);return}switch(i){case l.READY:{switch(e){case F.PLAYING:case F.PAUSED:case F.READY:break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}case l.PLAYING:{switch(e){case F.PLAYING:break;case F.PAUSED:this.videoState.startTransitionTo(F.PLAYING),this.params.connection.remotePlayerController.playOrPause();break;case F.READY:this.videoState.startTransitionTo(F.PLAYING),this.params.connection.remotePlayerController.playOrPause();break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}case l.PAUSED:{switch(e){case F.PLAYING:this.videoState.startTransitionTo(F.PAUSED),this.params.connection.remotePlayerController.playOrPause();break;case F.PAUSED:break;case F.READY:this.videoState.startTransitionTo(F.PAUSED),this.videoState.setState(F.PAUSED);break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}default:V(i)}}}}const Di=s=>{s.removeAttribute("src"),s.load()},Qs=s=>{try{s.pause(),s.playbackRate=0,Di(s),s.remove()}catch(e){console.error(e)}};class js{attribute="data-pool-reused";get(e){return e.hasAttribute(this.attribute)}set(e,t){e.toggleAttribute(this.attribute,t)}delete(e){e.removeAttribute(this.attribute)}}const Ti=window.WeakMap?new WeakMap:new js,lt=s=>{let e=s.querySelector("video");const t=!!e;return e?Di(e):(e=document.createElement("video"),s.appendChild(e)),Ti.set(e,t),e.setAttribute("crossorigin","anonymous"),e.setAttribute("playsinline","playsinline"),e.controls=!1,e.setAttribute("poster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="),e},ft=s=>{const e=Ti.get(s);Ti.delete(s),e?Di(s):Qs(s)},We=(s,e,t,{equal:i=(n,o)=>n===o,changed$:a,onError:r}={})=>{const n=s.getState(),o=e(),d=Q(a),c=new ee;return a&&c.add(a.subscribe(u=>{const h=s.getState();i(u,h)&&s.setState(u)},r)),i(o,n)||(t(n),d&&s.setState(n)),c.add(s.stateChangeStarted$.subscribe(u=>{t(u.to),d&&s.setState(u.to)},r)),c},Ut=(s,e,t)=>We(e,()=>s.loop,i=>{A(i)&&(s.loop=i)},{onError:t}),pt=(s,e,t,i)=>We(e,()=>({muted:s.muted,volume:s.volume}),a=>{A(a)&&(s.muted=a.muted,s.volume=a.volume)},{equal:(a,r)=>a===r||a?.muted===r?.muted&&a?.volume===r?.volume,changed$:t,onError:i}),Pt=(s,e,t,i)=>We(e,()=>s.playbackRate,a=>{A(a)&&(s.playbackRate=a)},{changed$:t,onError:i}),Js=s=>["__",s.language,s.label].join("|"),Xs=(s,e)=>{if(s.id===e)return!0;const[t,i,a]=e.split("|");return s.language===i&&s.label===a};class it{available$=new x;current$=new g(void 0);error$=new x;video;cueSettings;subscription=new ee;externalTracks=new Map;internalTracks=new Map;connect(e,t,i){this.video=e,this.cueSettings=t.textTrackCuesSettings,this.subscribe();const a=r=>{this.error$.next({id:"TextTracksManager",category:P.WTF,message:"Generic HtmlVideoTextTrackManager error",thrown:r})};this.subscription.add(this.available$.subscribe(i.availableTextTracks$)),this.subscription.add(this.current$.subscribe(i.currentTextTrack$)),this.subscription.add(this.error$.subscribe(i.error$)),this.subscription.add(We(t.internalTextTracks,()=>Object.values(this.internalTracks),r=>{A(r)&&this.setInternal(r)},{equal:(r,n)=>A(r)&&A(n)&&r.length===n.length&&r.every(({id:o},d)=>o===n[d].id),changed$:this.available$.pipe(T(r=>r.filter(({type:n})=>n==="internal"))),onError:a})),this.subscription.add(We(t.externalTextTracks,()=>Object.values(this.externalTracks),r=>{A(r)&&this.setExternal(r)},{equal:(r,n)=>A(r)&&A(n)&&r.length===n.length&&r.every(({id:o},d)=>o===n[d].id),changed$:this.available$.pipe(T(r=>r.filter(({type:n})=>n==="external"))),onError:a})),this.subscription.add(We(t.currentTextTrack,()=>{if(this.video)return;const r=this.htmlTextTracksAsArray().find(({mode:n})=>n==="showing");return r&&this.htmlTextTrackToITextTrack(r).id},r=>this.select(r),{changed$:this.current$,onError:a})),this.subscription.add(We(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(const r of this.htmlTextTracksAsArray())this.applyCueSettings(r.cues),this.applyCueSettings(r.activeCues)}))}subscribe(){v(this.video);const{textTracks:e}=this.video;this.subscription.add(C(e,"addtrack").subscribe(()=>{const i=this.current$.getValue();i&&this.select(i)})),this.subscription.add(O(C(e,"addtrack"),C(e,"removetrack"),xe(["init"])).pipe(T(()=>this.htmlTextTracksAsArray().map(i=>this.htmlTextTrackToITextTrack(i))),de((i,a)=>i.length===a.length&&i.every(({id:r},n)=>r===a[n].id))).subscribe(this.available$)),this.subscription.add(O(C(e,"change"),xe(["init"])).pipe(T(()=>this.htmlTextTracksAsArray().find(({mode:i})=>i==="showing")),T(i=>i&&this.htmlTextTrackToITextTrack(i).id),de()).subscribe(this.current$));const t=i=>this.applyCueSettings(i.target?.activeCues??null);this.subscription.add(C(e,"addtrack").subscribe(i=>{i.track?.addEventListener("cuechange",t);const a=r=>{const n=r.target?.cues??null;n&&n.length&&(this.applyCueSettings(r.target?.cues??null),r.target?.removeEventListener("cuechange",a))};i.track?.addEventListener("cuechange",a)})),this.subscription.add(C(e,"removetrack").subscribe(i=>{i.track?.removeEventListener("cuechange",t)}))}applyCueSettings(e){if(!e||!e.length)return;const t=this.cueSettings.getState();for(const i of Array.from(e)){const a=i;A(t.align)&&(a.align=t.align),A(t.position)&&(a.position=t.position),A(t.size)&&(a.size=t.size),A(t.line)&&(a.line=t.line)}}htmlTextTracksAsArray(e=!1){v(this.video);const t=[...this.video.textTracks];return e?t:t.filter(it.isHealthyTrack)}htmlTextTrackToITextTrack(e){const{language:t,label:i}=e,a=e.id?e.id:Js(e),r=this.externalTracks.has(a),n=a.includes("auto");return r?{id:a,type:"external",isAuto:n,language:t,label:i,url:this.externalTracks.get(a)?.url}:{id:a,type:"internal",isAuto:n,language:t,label:i,url:this.internalTracks.get(a)?.url}}static isHealthyTrack(e){return!(e.kind==="metadata"||e.groupId||e.id===""&&e.label===""&&e.language==="")}setExternal(e){this.internalTracks.size>0&&Array.from(this.internalTracks).forEach(([,t])=>this.detach(t)),e.filter(({id:t})=>!this.externalTracks.has(t)).forEach(t=>this.attach(t)),Array.from(this.externalTracks).filter(([t])=>!e.find(i=>i.id===t)).forEach(([,t])=>this.detach(t))}setInternal(e){const t=[...this.externalTracks];e.filter(({id:i,language:a,isAuto:r})=>!this.internalTracks.has(i)&&!t.some(([,n])=>n.language===a&&n.isAuto===r)).forEach(i=>this.attach(i)),Array.from(this.internalTracks).filter(([i])=>!e.find(a=>a.id===i)).forEach(([,i])=>this.detach(i))}select(e){v(this.video);for(const t of this.htmlTextTracksAsArray(!0))t.mode="showing";for(const t of this.htmlTextTracksAsArray(!0))(Q(e)||!Xs(t,e))&&(t.mode="disabled")}destroy(){if(this.subscription.unsubscribe(),this.video)for(const e of Array.from(this.video.getElementsByTagName("track"))){const t=e.getAttribute("id");t&&this.externalTracks.has(t)&&this.video.removeChild(e)}this.externalTracks.clear()}attach(e){v(this.video);const t=document.createElement("track");t.setAttribute("src",e.url),t.setAttribute("id",e.id),e.label&&t.setAttribute("label",e.label),e.language&&t.setAttribute("srclang",e.language),e.type==="external"?this.externalTracks.set(e.id,e):e.type==="internal"&&this.internalTracks.set(e.id,e),this.video.appendChild(t)}detach(e){v(this.video);const t=Array.prototype.find.call(this.video.getElementsByTagName("track"),i=>i.getAttribute("id")===e.id);t&&this.video.removeChild(t),e.type==="external"?this.externalTracks.delete(e.id):e.type==="internal"&&this.internalTracks.delete(e.id)}}class Li{pausedTime=0;streamOffset=0;pauseTimestamp=0;getTotalPausedTime(){return this.pausedTime+this.getCurrentPausedTime()}getCurrentPausedTime(){return this.pauseTimestamp>0?Date.now()-this.pauseTimestamp:0}getStreamOffset(){return this.streamOffset}getTotalOffset(){return this.getTotalPausedTime()+this.streamOffset}pause(){this.pauseTimestamp===0&&(this.pauseTimestamp=Date.now())}resume(){this.pauseTimestamp>0&&(this.pausedTime+=this.getCurrentPausedTime(),this.pauseTimestamp=0)}resetTo(e,t=!1){this.streamOffset=e,this.pauseTimestamp=0,this.pausedTime=0,t&&this.pause()}}const os=s=>{let e=s;for(;!(e instanceof Document)&&!(e instanceof ShadowRoot)&&e!==null;)e=e?.parentNode;return e??void 0},Oi=s=>{const e=os(s);return!!(e&&e.fullscreenElement&&e.fullscreenElement===s)},Ks=s=>{const e=os(s);return!!(e&&e.pictureInPictureElement&&e.pictureInPictureElement===s)},Zs=3;var ea=(s,e,t=Zs)=>{let i=0,a=0;for(let r=0;r<s.length;r++){const n=s.start(r),o=s.end(r);if(n<=e&&e<=o){if(i=n,a=o,!t)return{from:i,to:a};for(let d=r-1;d>=0;d--)s.end(d)+t>=i&&(i=s.start(d));for(let d=r+1;d<s.length;d++)s.start(d)-t<=a&&(a=s.end(d))}}return{from:i,to:a}};const mt=s=>{const e=M=>C(s,M).pipe(Kt(void 0)),i=O(...["waiting","pause","canplay","play","canplaythrough","playing","seeking","seeked","ended"].map(M=>C(s,M))).pipe(T(M=>M.type==="ended"?s.readyState<2:s.readyState<3),de()),a=O(C(s,"progress"),C(s,"timeupdate")).pipe(T(()=>ea(s.buffered,s.currentTime))),n=$i().browser===ns.Safari?De({play:e("play").pipe(ye()),playing:e("playing")}).pipe(Kt(void 0)):e("playing"),o=C(s,"volumechange").pipe(T(()=>({muted:s.muted,volume:s.volume}))),d=C(s,"ratechange").pipe(T(()=>s.playbackRate)),c=C(s,"error").pipe(oe(()=>!!(s.error||s.played.length)),T(()=>{const M=s.error;return{id:M?`MediaError#${M.code}`:"HtmlVideoError",category:P.VIDEO_PIPELINE,message:M?M.message:"Error event from HTML video element",thrown:s.error??void 0}})),u=C(s,"timeupdate").pipe(T(()=>s.currentTime)),h=new x,f=.3;let p;u.subscribe(M=>{s.loop&&A(p)&&A(M)&&p>=s.duration-f&&M<=f&&h.next(p),p=M});const S=C(s,"enterpictureinpicture"),$=C(s,"leavepictureinpicture"),y=new g(Ks(s));S.subscribe(()=>y.next(!0)),$.subscribe(()=>y.next(!1));const k=new g(Oi(s));return C(s,"fullscreenchange").pipe(T(()=>Oi(s))).subscribe(k),{playing$:n,pause$:e("pause").pipe(oe(()=>!s.error)),canplay$:e("canplay"),ended$:e("ended"),looped$:h,error$:c,seeked$:e("seeked"),seeking$:e("seeking"),progress$:e("progress"),loadStart$:e("loadstart"),loadedMetadata$:e("loadedmetadata"),loadedData$:e("loadeddata"),timeUpdate$:u,durationChange$:C(s,"durationchange").pipe(T(()=>s.duration)),isBuffering$:i,currentBuffer$:a,volumeState$:o,playbackRateState$:d,inPiP$:y,inFullscreen$:k}};var ri=s=>{switch(s){case"mobile":return we.Q_144P;case"lowest":return we.Q_240P;case"low":return we.Q_360P;case"sd":case"medium":return we.Q_480P;case"hd":case"high":return we.Q_720P;case"fullhd":case"full":return we.Q_1080P;case"quadhd":case"quad":return we.Q_1440P;case"ultrahd":case"ultra":return we.Q_2160P}};let xi=!1,Qe={};const ta=s=>{xi=s},ia=()=>{Qe={}},sa=s=>{s(Qe)},Wt=(s,e)=>{xi&&(Qe.meta=Qe.meta??{},Qe.meta[s]=e)};class Ue{name;constructor(e){this.name=e}next(e){if(!xi)return;Qe.series=Qe.series??{};const t=Qe.series[this.name]??[];t.push([Date.now(),e]),Qe.series[this.name]=t}}var ot;(function(s){s.FitsContainer="FitsContainer",s.FitsThroughput="FitsThroughput",s.Buffer="Buffer",s.DroppedFramesLimit="DroppedFramesLimit",s.FitsQualityLimits="FitsQualityLimits"})(ot||(ot={}));const aa=new Ue("best_bitrate"),ra=(s,e,t)=>(e-t)*Math.pow(2,-10*s)+t;class na{last;history={};recordSelection(e){this.history[e.id]=se()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}const oa='Assertion "ABR Tracks is empty array" failed',ni=(s,{container:e,throughput:t,tuning:i,limits:a,reserve:r=0,forwardBufferHealth:n,playbackRate:o,current:d,history:c,droppedVideoMaxQualityLimit:u,abrLogger:h})=>{Cs(s,oa);const f=i.usePixelRatio?window.devicePixelRatio??1:1,p=i.limitByContainer&&e&&e.width>0&&e.height>0&&{width:e.width*f*i.containerSizeFactor,height:e.height*f*i.containerSizeFactor},S=p&&dt(p),$=i.considerPlaybackRate&&A(o)?o:1,y=s.filter(L=>!ut(L.quality)).sort((L,I)=>At(L.quality,I.quality)?-1:1),k=y.at(-1)?.quality,_=y.at(0)?.quality,M=Q(a)||A(a.min)&&A(a.max)&&jt(a.max,a.min)||A(a.min)&&_&&At(a.min,_)||A(a.max)&&k&&jt(a.max,k),E=$*ra(n??.5,i.bitrateFactorAtEmptyBuffer,i.bitrateFactorAtFullBuffer),D={},q=y.filter(L=>(S?jt(L.quality,S):!0)?(A(t)&&isFinite(t)&&A(L.bitrate)?t-r>=L.bitrate*E:!0)?i.lazyQualitySwitch&&A(i.minBufferToSwitchUp)&&d&&!ut(d.quality)&&(n??0)<i.minBufferToSwitchUp&&At(L.quality,d.quality)?(D[L.quality]=ot.Buffer,!1):!!u&&bi(L.quality,u)?(D[L.quality]=ot.DroppedFramesLimit,!1):M||(Q(a.max)||Zt(L.quality,a.max))&&(Q(a.min)||bi(L.quality,a.min))?!0:(D[L.quality]=ot.FitsQualityLimits,!1):(D[L.quality]=ot.FitsThroughput,!1):(D[L.quality]=ot.FitsContainer,!1))[0];q&&q.bitrate&&aa.next(q.bitrate);const H=q??y[Math.ceil((y.length-1)/2)]??s[0];H.quality!==c?.last?.quality&&h({message:`
6
+ import{ValueSubject as g,Subject as x,Subscription as ee,isNonNullable as A,ErrorCategory as P,isNullable as Q,fromEvent as C,assertNever as V,merge as O,tap as Nt,map as T,observableFrom as xe,filterChanged as de,assertNonNullable as v,debounce as Ge,getHighestQuality as Ls,timeout as xs,getCurrentBrowser as $i,CurrentClientBrowser as ns,combine as De,once as ye,mapTo as Kt,filter as oe,VideoQuality as we,now as se,assertNotEmptyArray as Cs,videoSizeToQuality as dt,isInvariantQuality as ut,isHigher as At,isLower as jt,isHigherOrEqual as bi,isLowerOrEqual as Zt,interval as Bt,videoQualityToHeight as Rs,abortable as Te,getExponentialDelay as Jt,throttle as Is,Observable as Pi,observeElementSize as Bs,isIOS as Ms,CurrentClientDevice as _s,safeStorage as pi,fillWithDefault as Os,Logger as Ns}from"@vkontakte/videoplayer-shared/esnext.esm.js";import{Observable as ln,Subject as fn,Subscription as pn,ValueSubject as mn,VideoQuality as gn}from"@vkontakte/videoplayer-shared/esnext.esm.js";const Fs="2.0.103-dev.c555938f.0";var l;(function(s){s.STOPPED="stopped",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused"})(l||(l={}));var m;(function(s){s.MPEG="MPEG",s.DASH="DASH_SEP",s.DASH_SEP="DASH_SEP",s.DASH_SEP_VK="DASH_SEP",s.DASH_WEBM="DASH_WEBM",s.DASH_WEBM_AV1="DASH_WEBM_AV1",s.DASH_WEBM_VK="DASH_WEBM",s.DASH_ONDEMAND="DASH_ONDEMAND",s.DASH_ONDEMAND_VK="DASH_ONDEMAND",s.DASH_LIVE="DASH_LIVE",s.DASH_LIVE_CMAF="DASH_LIVE_CMAF",s.DASH_LIVE_WEBM="DASH_LIVE_WEBM",s.HLS="HLS",s.HLS_ONDEMAND="HLS_ONDEMAND",s.HLS_JS="HLS",s.HLS_LIVE="HLS_LIVE",s.HLS_LIVE_CMAF="HLS_LIVE_CMAF",s.WEB_RTC_LIVE="WEB_RTC_LIVE"})(m||(m={}));var ge;(function(s){s.SCREEN="SCREEN",s.CHROMECAST="CHROMECAST"})(ge||(ge={}));var pe;(function(s){s.NOT_AVAILABLE="NOT_AVAILABLE",s.AVAILABLE="AVAILABLE",s.CONNECTING="CONNECTING",s.CONNECTED="CONNECTED"})(pe||(pe={}));var yi;(function(s){s.HTTP1="http1",s.HTTP2="http2",s.QUIC="quic"})(yi||(yi={}));var G;(function(s){s.None="none",s.Requested="requested",s.Applying="applying"})(G||(G={}));var et;(function(s){s.NONE="none",s.INLINE="inline",s.FULLSCREEN="fullscreen",s.SECOND_SCREEN="second_screen",s.PIP="pip"})(et||(et={}));var Vs=s=>new Promise((e,t)=>{const i=document.createElement("script");i.setAttribute("src",s),i.onload=()=>e,i.onerror=()=>t,document.body.appendChild(i)});class Us{connection$=new g(void 0);castState$=new g(pe.NOT_AVAILABLE);errorEvent$=new x;contentId;realCastState$=new g(pe.NOT_AVAILABLE);subscription=new ee;log;params;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastInitializer");const t="chrome"in window;if(this.log({message:`[constructor] receiverApplicationId: ${this.params.receiverApplicationId}, isDisabled: ${this.params.isDisabled}, isSupported: ${t}`}),e.isDisabled||!t)return;const i=A(window.chrome?.cast),a=!!window.__onGCastApiAvailable;i?this.initializeCastApi():(window.__onGCastApiAvailable=r=>{delete window.__onGCastApiAvailable,r&&this.initializeCastApi()},a||Vs("https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1").catch(()=>this.errorEvent$.next({id:"ChromecastLoading",category:P.NETWORK,message:"Script loading failed!"})))}connect(){cast.framework.CastContext.getInstance()?.requestSession()}disconnect(){cast.framework.CastContext.getInstance()?.getCurrentSession()?.endSession(!0)}stopMedia(){return new Promise((e,t)=>{cast.framework.CastContext.getInstance()?.getCurrentSession()?.getMediaSession()?.stop(new chrome.cast.media.StopRequest,e,t)})}toggleConnection(){A(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){const t=this.connection$.getValue();Q(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){const t=this.connection$.getValue();Q(t)||e!==t.remotePlayer.isMuted&&t.remotePlayerController.muteOrUnmute()}destroy(){this.subscription.unsubscribe()}initListeners(){const e=new cast.framework.RemotePlayer,t=new cast.framework.RemotePlayerController(e),i=cast.framework.CastContext.getInstance();this.subscription.add(C(i,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(a=>{switch(a.sessionState){case cast.framework.SessionState.SESSION_STARTED:case cast.framework.SessionState.SESSION_STARTING:case cast.framework.SessionState.SESSION_RESUMED:this.contentId=i.getCurrentSession()?.getMediaSession()?.media.contentId;break;case cast.framework.SessionState.NO_SESSION:case cast.framework.SessionState.SESSION_ENDING:case cast.framework.SessionState.SESSION_ENDED:case cast.framework.SessionState.SESSION_START_FAILED:this.contentId=void 0;break;default:return V(a.sessionState)}})).add(O(C(i,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(Nt(a=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(a)}`})}),T(a=>a.castState)),xe([i.getCastState()])).pipe(de(),T(Hs),Nt(a=>{this.log({message:`realCastState$: ${a}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(a=>{const r=a===pe.CONNECTED,n=A(this.connection$.getValue());if(r&&!n){const o=i.getCurrentSession();v(o);const d=o.getCastDevice(),c=o.getMediaSession()?.media.contentId;(Q(c)||c===this.contentId)&&(this.log({message:"connection created"}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:o,castDevice:d}))}else!r&&n&&(this.log({message:"connection destroyed"}),this.connection$.next(void 0));this.castState$.next(a===pe.CONNECTED?A(this.connection$.getValue())?pe.CONNECTED:pe.AVAILABLE:a)}))}initializeCastApi(){let e,t,i;try{e=cast.framework.CastContext.getInstance(),t=chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,i=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED}catch{return}try{e.setOptions({receiverApplicationId:this.params.receiverApplicationId??t,autoJoinPolicy:i}),this.initListeners()}catch(a){this.errorEvent$.next({id:"ChromecastInitializer",category:P.EXTERNAL_API,message:"[initializeCastApi] failed",thrown:a})}}}const Hs=s=>{switch(s){case cast.framework.CastState.NO_DEVICES_AVAILABLE:return pe.NOT_AVAILABLE;case cast.framework.CastState.NOT_CONNECTED:return pe.AVAILABLE;case cast.framework.CastState.CONNECTING:return pe.CONNECTING;case cast.framework.CastState.CONNECTED:return pe.CONNECTED;default:return V(s)}};var le;(function(s){s[s.OFFSET_P=0]="OFFSET_P",s[s.PLAYBACK_SHIFT=1]="PLAYBACK_SHIFT",s[s.DASH_CMAF_OFFSET_P=2]="DASH_CMAF_OFFSET_P"})(le||(le={}));var _e=(s,e=0,t=le.OFFSET_P)=>{switch(t){case le.OFFSET_P:return s.replace("_offset_p",e===0?"":"_"+e.toFixed(0));case le.PLAYBACK_SHIFT:{if(e===0)return s;const i=new URL(s);return i.searchParams.append("playback_shift",e.toFixed(0)),i.toString()}case le.DASH_CMAF_OFFSET_P:{const i=new URL(s);return!i.searchParams.get("offset_p")&&e===0?s:(i.searchParams.set("offset_p",e.toFixed(0)),i.toString())}default:V(t)}return s};const Mi=(s,e)=>{switch(e){case le.OFFSET_P:return NaN;case le.PLAYBACK_SHIFT:{const t=new URL(s);return Number(t.searchParams.get("playback_shift"))}case le.DASH_CMAF_OFFSET_P:{const t=new URL(s);return Number(t.searchParams.get("offset_p")??0)}default:V(e)}};var R=(s,e,t=!1)=>{const i=s.getTransition();(t||!i||i.to===e)&&s.setState(e)};class ne{state;prevState;transition;transitionStarted$=new x;transitionEnded$=new x;transitionUpdated$=new x;forceChanged$=new x;stateChangeStarted$=O(this.transitionStarted$,this.transitionUpdated$);stateChangeEnded$=O(this.transitionEnded$,this.forceChanged$);constructor(e){this.state=e,this.prevState=void 0}setState(e){const t=this.transition,i=this.state;this.transition=void 0,this.prevState=i,this.state=e,t?t.to===e?this.transitionEnded$.next(t):this.forceChanged$.next({from:t.from,to:e,canceledTransition:t}):this.forceChanged$.next({from:i,to:e,canceledTransition:t})}startTransitionTo(e){const t=this.transition,i=this.state;i===e||A(t)&&t.to===e||(this.prevState=i,this.state=e,t?(this.transition={from:t.from,to:e,canceledTransition:t},this.transitionUpdated$.next(this.transition)):(this.transition={from:i,to:e},this.transitionStarted$.next(this.transition)))}getTransition(){return this.transition}getState(){return this.state}getPrevState(){return this.prevState}}const Ys=s=>{switch(s){case m.MPEG:case m.DASH_SEP:case m.DASH_ONDEMAND:case m.DASH_WEBM:case m.DASH_WEBM_AV1:case m.HLS:case m.HLS_ONDEMAND:return!1;case m.DASH_LIVE:case m.DASH_LIVE_CMAF:case m.HLS_LIVE:case m.HLS_LIVE_CMAF:case m.DASH_LIVE_WEBM:case m.WEB_RTC_LIVE:return!0;default:return V(s)}};var F;(function(s){s.STOPPED="stopped",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused"})(F||(F={}));const Gs=5,qs=5,zs=500,_i=7e3;class Ws{subscription=new ee;loadMediaTimeoutSubscription=new ee;videoState=new ne(F.STOPPED);params;log;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastProvider"),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(Ys(e.format)),this.params.output.isAudioAvailable$.next(!0),this.handleRemoteVolumeChange({volume:this.params.connection.remotePlayer.volumeLevel,muted:this.params.connection.remotePlayer.isMuted});const t=this.params.connection.session.getMediaSession();t&&this.restoreSession(t),this.subscribe()}destroy(){this.log({message:"[destroy]"}),this.subscription.unsubscribe()}subscribe(){this.subscription.add(this.loadMediaTimeoutSubscription);const e=new ee;this.subscription.add(e),this.subscription.add(O(this.videoState.stateChangeStarted$.pipe(T(a=>`stateChangeStarted$ ${JSON.stringify(a)}`)),this.videoState.stateChangeEnded$.pipe(T(a=>`stateChangeEnded$ ${JSON.stringify(a)}`))).subscribe(a=>this.log({message:`[videoState] ${a}`})));const t=(a,r)=>this.subscription.add(a.subscribe(r));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{const a=new x;e.add(a.pipe(Ge(zs)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let r=NaN;e.add(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(n=>{this.logRemoteEvent(n);const o=n.value;this.params.output.position$.next(o),(this.params.desiredState.seekState.getState().state===G.Applying||Math.abs(o-r)>Gs)&&a.next(o),r=o})),e.add(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(n=>{this.logRemoteEvent(n),this.params.output.duration$.next(n.value)}))}t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),a=>{this.logRemoteEvent(a),a.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),a=>{this.logRemoteEvent(a),a.value?this.handleRemotePause():this.handleRemotePlay()}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),a=>{this.logRemoteEvent(a);const{remotePlayer:r}=this.params.connection,n=a.value,o=this.params.output.isBuffering$.getValue(),d=n===chrome.cast.media.PlayerState.BUFFERING;switch(o!==d&&this.params.output.isBuffering$.next(d),n){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&r.duration-r.currentTime<qs&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),R(this.params.desiredState.playbackState,l.STOPPED);break;case chrome.cast.media.PlayerState.PAUSED:{this.handleRemotePause();break}case chrome.cast.media.PlayerState.PLAYING:this.handleRemotePlay();break;case chrome.cast.media.PlayerState.BUFFERING:break;default:V(n)}}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),a=>{this.logRemoteEvent(a),this.handleRemoteVolumeChange({volume:a.value})}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),a=>{this.logRemoteEvent(a),this.handleRemoteVolumeChange({muted:a.value})});const i=O(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,xe(["init"])).pipe(Ge(0));t(i,this.syncPlayback)}restoreSession(e){this.log({message:"restoreSession"});const{remotePlayer:t}=this.params.connection;if(e.playerState!==chrome.cast.media.PlayerState.IDLE){t.isPaused?(this.videoState.setState(F.PAUSED),R(this.params.desiredState.playbackState,l.PAUSED)):(this.videoState.setState(F.PLAYING),R(this.params.desiredState.playbackState,l.PLAYING));const i=this.params.output.isLive$.getValue();this.params.output.duration$.next(i?0:t.duration),this.params.output.position$.next(i?0:t.currentTime),this.params.desiredState.seekState.setState({state:G.None})}}prepare(){const e=this.params.format;this.log({message:`[prepare] format: ${e}`});const t=this.createMediaInfo(e),i=this.createLoadRequest(t);this.loadMedia(i)}handleRemotePause(){const e=this.videoState.getState();(this.videoState.getTransition()?.to===F.PAUSED||e===F.PLAYING)&&(this.videoState.setState(F.PAUSED),R(this.params.desiredState.playbackState,l.PAUSED))}handleRemotePlay(){const e=this.videoState.getState();(this.videoState.getTransition()?.to===F.PLAYING||e===F.PAUSED)&&(this.videoState.setState(F.PLAYING),R(this.params.desiredState.playbackState,l.PLAYING))}handleRemoteReady(){this.videoState.getTransition()?.to===F.READY&&this.videoState.setState(F.READY),this.params.desiredState.playbackState.getTransition()?.to===l.READY&&R(this.params.desiredState.playbackState,l.READY)}handleRemoteStop(){this.videoState.getState()!==F.STOPPED&&this.videoState.setState(F.STOPPED)}handleRemoteVolumeChange(e){const t=this.params.output.volume$.getValue(),i={volume:e.volume??t.volume,muted:e.muted??t.muted};(i.volume!==t.volume||i.muted!==i.muted)&&this.params.output.volume$.next(i)}seek(e){this.params.output.willSeekEvent$.next();const{remotePlayer:t,remotePlayerController:i}=this.params.connection;t.currentTime=e,i.seek()}stop(){const{remotePlayerController:e}=this.params.connection;e.stop()}createMediaInfo(e){const t=this.params.source;let i,a,r;switch(e){case m.MPEG:{const c=t[e];v(c);const u=Ls(Object.keys(c));v(u);const h=c[u];v(h),i=h,a="video/mp4",r=chrome.cast.media.StreamType.BUFFERED;break}case m.HLS:case m.HLS_ONDEMAND:{const c=t[e];v(c),i=c.url,a="application/x-mpegurl",r=chrome.cast.media.StreamType.BUFFERED;break}case m.DASH_SEP:case m.DASH_ONDEMAND:case m.DASH_WEBM:case m.DASH_WEBM_AV1:{const c=t[e];v(c),i=c.url,a="application/dash+xml",r=chrome.cast.media.StreamType.BUFFERED;break}case m.DASH_LIVE_CMAF:{const c=t[e];v(c),i=c.url,a="application/dash+xml",r=chrome.cast.media.StreamType.LIVE;break}case m.HLS_LIVE:case m.HLS_LIVE_CMAF:{const c=t[e];v(c),i=_e(c.url),a="application/x-mpegurl",r=chrome.cast.media.StreamType.LIVE;break}case m.DASH_LIVE:case m.WEB_RTC_LIVE:{const c="Unsupported format for Chromecast",u=new Error(c);throw this.params.output.error$.next({id:"ChromecastProvider.createMediaInfo()",category:P.VIDEO_PIPELINE,message:c,thrown:u}),u}case m.DASH_LIVE_WEBM:throw new Error("DASH_LIVE_WEBM is no longer supported");default:return V(e)}const n=new chrome.cast.media.MediaInfo(this.params.meta.videoId??i,a);n.contentUrl=i,n.streamType=r,n.metadata=new chrome.cast.media.GenericMediaMetadata;const{title:o,subtitle:d}=this.params.meta;return A(o)&&(n.metadata.title=o),A(d)&&(n.metadata.subtitle=d),n}createLoadRequest(e){const t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;const i=this.params.desiredState.seekState.getState();return i.state===G.Applying||i.state===G.Requested?t.currentTime=this.params.output.isLive$.getValue()?0:i.position/1e3:t.currentTime=0,t}loadMedia(e){const t=this.params.connection.session.loadMedia(e),i=new Promise((a,r)=>{this.loadMediaTimeoutSubscription.add(xs(_i).subscribe(()=>r(`timeout(${_i})`)))});Promise.race([t,i]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state===G.Applying&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},a=>{const r=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${a}`;this.log({message:r}),this.params.output.error$.next({id:"ChromecastProvider.loadMedia",category:P.VIDEO_PIPELINE,message:r,thrown:a})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}syncPlayback=()=>{const e=this.videoState.getState(),t=this.videoState.getTransition(),i=this.params.desiredState.playbackState.getState(),a=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.seekState.getState();if(this.log({message:`[syncPlayback] videoState: ${e}; videoTransition: ${JSON.stringify(t)}; desiredPlaybackState: ${i}; desiredPlaybackStateTransition: ${this.params.desiredState.playbackState.getTransition()}; seekState: ${JSON.stringify(r)};`}),i===l.STOPPED){e!==F.STOPPED&&(this.videoState.startTransitionTo(F.STOPPED),this.stop());return}if(!t){if(a?.to!==l.PAUSED&&r.state===G.Requested&&e!==F.STOPPED){this.seek(r.position/1e3);return}switch(i){case l.READY:{switch(e){case F.PLAYING:case F.PAUSED:case F.READY:break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}case l.PLAYING:{switch(e){case F.PLAYING:break;case F.PAUSED:this.videoState.startTransitionTo(F.PLAYING),this.params.connection.remotePlayerController.playOrPause();break;case F.READY:this.videoState.startTransitionTo(F.PLAYING),this.params.connection.remotePlayerController.playOrPause();break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}case l.PAUSED:{switch(e){case F.PLAYING:this.videoState.startTransitionTo(F.PAUSED),this.params.connection.remotePlayerController.playOrPause();break;case F.PAUSED:break;case F.READY:this.videoState.startTransitionTo(F.PAUSED),this.videoState.setState(F.PAUSED);break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}default:V(i)}}}}const Di=s=>{s.removeAttribute("src"),s.load()},Qs=s=>{try{s.pause(),s.playbackRate=0,Di(s),s.remove()}catch(e){console.error(e)}};class js{attribute="data-pool-reused";get(e){return e.hasAttribute(this.attribute)}set(e,t){e.toggleAttribute(this.attribute,t)}delete(e){e.removeAttribute(this.attribute)}}const Ti=window.WeakMap?new WeakMap:new js,lt=s=>{let e=s.querySelector("video");const t=!!e;return e?Di(e):(e=document.createElement("video"),s.appendChild(e)),Ti.set(e,t),e.setAttribute("crossorigin","anonymous"),e.setAttribute("playsinline","playsinline"),e.controls=!1,e.setAttribute("poster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="),e},ft=s=>{const e=Ti.get(s);Ti.delete(s),e?Di(s):Qs(s)},We=(s,e,t,{equal:i=(n,o)=>n===o,changed$:a,onError:r}={})=>{const n=s.getState(),o=e(),d=Q(a),c=new ee;return a&&c.add(a.subscribe(u=>{const h=s.getState();i(u,h)&&s.setState(u)},r)),i(o,n)||(t(n),d&&s.setState(n)),c.add(s.stateChangeStarted$.subscribe(u=>{t(u.to),d&&s.setState(u.to)},r)),c},Ut=(s,e,t)=>We(e,()=>s.loop,i=>{A(i)&&(s.loop=i)},{onError:t}),pt=(s,e,t,i)=>We(e,()=>({muted:s.muted,volume:s.volume}),a=>{A(a)&&(s.muted=a.muted,s.volume=a.volume)},{equal:(a,r)=>a===r||a?.muted===r?.muted&&a?.volume===r?.volume,changed$:t,onError:i}),Pt=(s,e,t,i)=>We(e,()=>s.playbackRate,a=>{A(a)&&(s.playbackRate=a)},{changed$:t,onError:i}),Js=s=>["__",s.language,s.label].join("|"),Xs=(s,e)=>{if(s.id===e)return!0;const[t,i,a]=e.split("|");return s.language===i&&s.label===a};class it{available$=new x;current$=new g(void 0);error$=new x;video;cueSettings;subscription=new ee;externalTracks=new Map;internalTracks=new Map;connect(e,t,i){this.video=e,this.cueSettings=t.textTrackCuesSettings,this.subscribe();const a=r=>{this.error$.next({id:"TextTracksManager",category:P.WTF,message:"Generic HtmlVideoTextTrackManager error",thrown:r})};this.subscription.add(this.available$.subscribe(i.availableTextTracks$)),this.subscription.add(this.current$.subscribe(i.currentTextTrack$)),this.subscription.add(this.error$.subscribe(i.error$)),this.subscription.add(We(t.internalTextTracks,()=>Object.values(this.internalTracks),r=>{A(r)&&this.setInternal(r)},{equal:(r,n)=>A(r)&&A(n)&&r.length===n.length&&r.every(({id:o},d)=>o===n[d].id),changed$:this.available$.pipe(T(r=>r.filter(({type:n})=>n==="internal"))),onError:a})),this.subscription.add(We(t.externalTextTracks,()=>Object.values(this.externalTracks),r=>{A(r)&&this.setExternal(r)},{equal:(r,n)=>A(r)&&A(n)&&r.length===n.length&&r.every(({id:o},d)=>o===n[d].id),changed$:this.available$.pipe(T(r=>r.filter(({type:n})=>n==="external"))),onError:a})),this.subscription.add(We(t.currentTextTrack,()=>{if(this.video)return;const r=this.htmlTextTracksAsArray().find(({mode:n})=>n==="showing");return r&&this.htmlTextTrackToITextTrack(r).id},r=>this.select(r),{changed$:this.current$,onError:a})),this.subscription.add(We(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(const r of this.htmlTextTracksAsArray())this.applyCueSettings(r.cues),this.applyCueSettings(r.activeCues)}))}subscribe(){v(this.video);const{textTracks:e}=this.video;this.subscription.add(C(e,"addtrack").subscribe(()=>{const i=this.current$.getValue();i&&this.select(i)})),this.subscription.add(O(C(e,"addtrack"),C(e,"removetrack"),xe(["init"])).pipe(T(()=>this.htmlTextTracksAsArray().map(i=>this.htmlTextTrackToITextTrack(i))),de((i,a)=>i.length===a.length&&i.every(({id:r},n)=>r===a[n].id))).subscribe(this.available$)),this.subscription.add(O(C(e,"change"),xe(["init"])).pipe(T(()=>this.htmlTextTracksAsArray().find(({mode:i})=>i==="showing")),T(i=>i&&this.htmlTextTrackToITextTrack(i).id),de()).subscribe(this.current$));const t=i=>this.applyCueSettings(i.target?.activeCues??null);this.subscription.add(C(e,"addtrack").subscribe(i=>{i.track?.addEventListener("cuechange",t);const a=r=>{const n=r.target?.cues??null;n&&n.length&&(this.applyCueSettings(r.target?.cues??null),r.target?.removeEventListener("cuechange",a))};i.track?.addEventListener("cuechange",a)})),this.subscription.add(C(e,"removetrack").subscribe(i=>{i.track?.removeEventListener("cuechange",t)}))}applyCueSettings(e){if(!e||!e.length)return;const t=this.cueSettings.getState();for(const i of Array.from(e)){const a=i;A(t.align)&&(a.align=t.align),A(t.position)&&(a.position=t.position),A(t.size)&&(a.size=t.size),A(t.line)&&(a.line=t.line)}}htmlTextTracksAsArray(e=!1){v(this.video);const t=[...this.video.textTracks];return e?t:t.filter(it.isHealthyTrack)}htmlTextTrackToITextTrack(e){const{language:t,label:i}=e,a=e.id?e.id:Js(e),r=this.externalTracks.has(a),n=a.includes("auto");return r?{id:a,type:"external",isAuto:n,language:t,label:i,url:this.externalTracks.get(a)?.url}:{id:a,type:"internal",isAuto:n,language:t,label:i,url:this.internalTracks.get(a)?.url}}static isHealthyTrack(e){return!(e.kind==="metadata"||e.groupId||e.id===""&&e.label===""&&e.language==="")}setExternal(e){this.internalTracks.size>0&&Array.from(this.internalTracks).forEach(([,t])=>this.detach(t)),e.filter(({id:t})=>!this.externalTracks.has(t)).forEach(t=>this.attach(t)),Array.from(this.externalTracks).filter(([t])=>!e.find(i=>i.id===t)).forEach(([,t])=>this.detach(t))}setInternal(e){const t=[...this.externalTracks];e.filter(({id:i,language:a,isAuto:r})=>!this.internalTracks.has(i)&&!t.some(([,n])=>n.language===a&&n.isAuto===r)).forEach(i=>this.attach(i)),Array.from(this.internalTracks).filter(([i])=>!e.find(a=>a.id===i)).forEach(([,i])=>this.detach(i))}select(e){v(this.video);for(const t of this.htmlTextTracksAsArray(!0))t.mode="showing";for(const t of this.htmlTextTracksAsArray(!0))(Q(e)||!Xs(t,e))&&(t.mode="disabled")}destroy(){if(this.subscription.unsubscribe(),this.video)for(const e of Array.from(this.video.getElementsByTagName("track"))){const t=e.getAttribute("id");t&&this.externalTracks.has(t)&&this.video.removeChild(e)}this.externalTracks.clear()}attach(e){v(this.video);const t=document.createElement("track");t.setAttribute("src",e.url),t.setAttribute("id",e.id),e.label&&t.setAttribute("label",e.label),e.language&&t.setAttribute("srclang",e.language),e.type==="external"?this.externalTracks.set(e.id,e):e.type==="internal"&&this.internalTracks.set(e.id,e),this.video.appendChild(t)}detach(e){v(this.video);const t=Array.prototype.find.call(this.video.getElementsByTagName("track"),i=>i.getAttribute("id")===e.id);t&&this.video.removeChild(t),e.type==="external"?this.externalTracks.delete(e.id):e.type==="internal"&&this.internalTracks.delete(e.id)}}class Li{pausedTime=0;streamOffset=0;pauseTimestamp=0;getTotalPausedTime(){return this.pausedTime+this.getCurrentPausedTime()}getCurrentPausedTime(){return this.pauseTimestamp>0?Date.now()-this.pauseTimestamp:0}getStreamOffset(){return this.streamOffset}getTotalOffset(){return this.getTotalPausedTime()+this.streamOffset}pause(){this.pauseTimestamp===0&&(this.pauseTimestamp=Date.now())}resume(){this.pauseTimestamp>0&&(this.pausedTime+=this.getCurrentPausedTime(),this.pauseTimestamp=0)}resetTo(e,t=!1){this.streamOffset=e,this.pauseTimestamp=0,this.pausedTime=0,t&&this.pause()}}const os=s=>{let e=s;for(;!(e instanceof Document)&&!(e instanceof ShadowRoot)&&e!==null;)e=e?.parentNode;return e??void 0},Oi=s=>{const e=os(s);return!!(e&&e.fullscreenElement&&e.fullscreenElement===s)},Ks=s=>{const e=os(s);return!!(e&&e.pictureInPictureElement&&e.pictureInPictureElement===s)},Zs=3;var ea=(s,e,t=Zs)=>{let i=0,a=0;for(let r=0;r<s.length;r++){const n=s.start(r),o=s.end(r);if(n<=e&&e<=o){if(i=n,a=o,!t)return{from:i,to:a};for(let d=r-1;d>=0;d--)s.end(d)+t>=i&&(i=s.start(d));for(let d=r+1;d<s.length;d++)s.start(d)-t<=a&&(a=s.end(d))}}return{from:i,to:a}};const mt=s=>{const e=M=>C(s,M).pipe(Kt(void 0)),i=O(...["waiting","pause","canplay","play","canplaythrough","playing","seeking","seeked","ended"].map(M=>C(s,M))).pipe(T(M=>M.type==="ended"?s.readyState<2:s.readyState<3),de()),a=O(C(s,"progress"),C(s,"timeupdate")).pipe(T(()=>ea(s.buffered,s.currentTime))),n=$i().browser===ns.Safari?De({play:e("play").pipe(ye()),playing:e("playing")}).pipe(Kt(void 0)):e("playing"),o=C(s,"volumechange").pipe(T(()=>({muted:s.muted,volume:s.volume}))),d=C(s,"ratechange").pipe(T(()=>s.playbackRate)),c=C(s,"error").pipe(oe(()=>!!(s.error||s.played.length)),T(()=>{const M=s.error;return{id:M?`MediaError#${M.code}`:"HtmlVideoError",category:P.VIDEO_PIPELINE,message:M?M.message:"Error event from HTML video element",thrown:s.error??void 0}})),u=C(s,"timeupdate").pipe(T(()=>s.currentTime)),h=new x,f=.3;let p;u.subscribe(M=>{s.loop&&A(p)&&A(M)&&p>=s.duration-f&&M<=f&&h.next(p),p=M});const S=C(s,"enterpictureinpicture"),$=C(s,"leavepictureinpicture"),y=new g(Ks(s));S.subscribe(()=>y.next(!0)),$.subscribe(()=>y.next(!1));const k=new g(Oi(s));return C(s,"fullscreenchange").pipe(T(()=>Oi(s))).subscribe(k),{playing$:n,pause$:e("pause").pipe(oe(()=>!s.error)),canplay$:e("canplay"),ended$:e("ended"),looped$:h,error$:c,seeked$:e("seeked"),seeking$:e("seeking"),progress$:e("progress"),loadStart$:e("loadstart"),loadedMetadata$:e("loadedmetadata"),loadedData$:e("loadeddata"),timeUpdate$:u,durationChange$:C(s,"durationchange").pipe(T(()=>s.duration)),isBuffering$:i,currentBuffer$:a,volumeState$:o,playbackRateState$:d,inPiP$:y,inFullscreen$:k}};var ri=s=>{switch(s){case"mobile":return we.Q_144P;case"lowest":return we.Q_240P;case"low":return we.Q_360P;case"sd":case"medium":return we.Q_480P;case"hd":case"high":return we.Q_720P;case"fullhd":case"full":return we.Q_1080P;case"quadhd":case"quad":return we.Q_1440P;case"ultrahd":case"ultra":return we.Q_2160P}};let xi=!1,Qe={};const ta=s=>{xi=s},ia=()=>{Qe={}},sa=s=>{s(Qe)},Wt=(s,e)=>{xi&&(Qe.meta=Qe.meta??{},Qe.meta[s]=e)};class Ue{name;constructor(e){this.name=e}next(e){if(!xi)return;Qe.series=Qe.series??{};const t=Qe.series[this.name]??[];t.push([Date.now(),e]),Qe.series[this.name]=t}}var ot;(function(s){s.FitsContainer="FitsContainer",s.FitsThroughput="FitsThroughput",s.Buffer="Buffer",s.DroppedFramesLimit="DroppedFramesLimit",s.FitsQualityLimits="FitsQualityLimits"})(ot||(ot={}));const aa=new Ue("best_bitrate"),ra=(s,e,t)=>(e-t)*Math.pow(2,-10*s)+t;class na{last;history={};recordSelection(e){this.history[e.id]=se()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}const oa='Assertion "ABR Tracks is empty array" failed',ni=(s,{container:e,throughput:t,tuning:i,limits:a,reserve:r=0,forwardBufferHealth:n,playbackRate:o,current:d,history:c,droppedVideoMaxQualityLimit:u,abrLogger:h})=>{Cs(s,oa);const f=i.usePixelRatio?window.devicePixelRatio??1:1,p=i.limitByContainer&&e&&e.width>0&&e.height>0&&{width:e.width*f*i.containerSizeFactor,height:e.height*f*i.containerSizeFactor},S=p&&dt(p),$=i.considerPlaybackRate&&A(o)?o:1,y=s.filter(L=>!ut(L.quality)).sort((L,I)=>At(L.quality,I.quality)?-1:1),k=y.at(-1)?.quality,_=y.at(0)?.quality,M=Q(a)||A(a.min)&&A(a.max)&&jt(a.max,a.min)||A(a.min)&&_&&At(a.min,_)||A(a.max)&&k&&jt(a.max,k),E=$*ra(n??.5,i.bitrateFactorAtEmptyBuffer,i.bitrateFactorAtFullBuffer),D={},q=y.filter(L=>(S?jt(L.quality,S):!0)?(A(t)&&isFinite(t)&&A(L.bitrate)?t-r>=L.bitrate*E:!0)?i.lazyQualitySwitch&&A(i.minBufferToSwitchUp)&&d&&!ut(d.quality)&&(n??0)<i.minBufferToSwitchUp&&At(L.quality,d.quality)?(D[L.quality]=ot.Buffer,!1):!!u&&bi(L.quality,u)?(D[L.quality]=ot.DroppedFramesLimit,!1):M||(Q(a.max)||Zt(L.quality,a.max))&&(Q(a.min)||bi(L.quality,a.min))?!0:(D[L.quality]=ot.FitsQualityLimits,!1):(D[L.quality]=ot.FitsThroughput,!1):(D[L.quality]=ot.FitsContainer,!1))[0];q&&q.bitrate&&aa.next(q.bitrate);const H=q??y[Math.ceil((y.length-1)/2)]??s[0];H.quality!==c?.last?.quality&&h({message:`
7
7
  [available tracks]
8
8
  ${s.map(L=>`{ id: ${L.id}, quality: ${L.quality}, bitrate: ${L.bitrate} }`).join(`
9
9
  `)}
package/evergreen.esm.js CHANGED
@@ -1,9 +1,9 @@
1
1
  /**
2
- * @vkontakte/videoplayer-core v2.0.102-beta.3
3
- * Tue, 21 May 2024 11:58:06 GMT
4
- * https://st.mycdn.me/static/vkontakte-videoplayer/2-0-102/doc/
2
+ * @vkontakte/videoplayer-core v2.0.103-dev.c555938f.0
3
+ * Tue, 28 May 2024 09:13:35 GMT
4
+ * https://st.mycdn.me/static/vkontakte-videoplayer/2-0-103/doc/
5
5
  */
6
- import{ValueSubject as g,Subject as L,Subscription as ee,isNonNullable as A,ErrorCategory as P,isNullable as Q,fromEvent as C,assertNever as V,merge as O,tap as Ot,map as T,observableFrom as Le,filterChanged as de,assertNonNullable as v,debounce as Ge,getHighestQuality as Ts,timeout as vs,getCurrentBrowser as Ai,CurrentClientBrowser as ts,combine as De,once as ye,mapTo as Jt,filter as oe,VideoQuality as $e,now as se,assertNotEmptyArray as Es,videoSizeToQuality as dt,isInvariantQuality as ut,isHigher as At,isLower as Wt,isHigherOrEqual as mi,isLowerOrEqual as Xt,interval as It,videoQualityToHeight as As,abortable as Te,getExponentialDelay as Qt,throttle as ks,Observable as ki,observeElementSize as $s,isIOS as ws,CurrentClientDevice as Ps,safeStorage as hi,fillWithDefault as Ds,Logger as xs}from"@vkontakte/videoplayer-shared/evergreen.esm.js";import{Observable as Kr,Subject as Zr,Subscription as en,ValueSubject as tn,VideoQuality as sn}from"@vkontakte/videoplayer-shared/evergreen.esm.js";const Ls="2.0.102-beta.3";var l;(function(s){s.STOPPED="stopped",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused"})(l||(l={}));var m;(function(s){s.MPEG="MPEG",s.DASH="DASH_SEP",s.DASH_SEP="DASH_SEP",s.DASH_SEP_VK="DASH_SEP",s.DASH_WEBM="DASH_WEBM",s.DASH_WEBM_AV1="DASH_WEBM_AV1",s.DASH_WEBM_VK="DASH_WEBM",s.DASH_ONDEMAND="DASH_ONDEMAND",s.DASH_ONDEMAND_VK="DASH_ONDEMAND",s.DASH_LIVE="DASH_LIVE",s.DASH_LIVE_CMAF="DASH_LIVE_CMAF",s.DASH_LIVE_WEBM="DASH_LIVE_WEBM",s.HLS="HLS",s.HLS_ONDEMAND="HLS_ONDEMAND",s.HLS_JS="HLS",s.HLS_LIVE="HLS_LIVE",s.HLS_LIVE_CMAF="HLS_LIVE_CMAF",s.WEB_RTC_LIVE="WEB_RTC_LIVE"})(m||(m={}));var ge;(function(s){s.SCREEN="SCREEN",s.CHROMECAST="CHROMECAST"})(ge||(ge={}));var pe;(function(s){s.NOT_AVAILABLE="NOT_AVAILABLE",s.AVAILABLE="AVAILABLE",s.CONNECTING="CONNECTING",s.CONNECTED="CONNECTED"})(pe||(pe={}));var gi;(function(s){s.HTTP1="http1",s.HTTP2="http2",s.QUIC="quic"})(gi||(gi={}));var G;(function(s){s.None="none",s.Requested="requested",s.Applying="applying"})(G||(G={}));var et;(function(s){s.NONE="none",s.INLINE="inline",s.FULLSCREEN="fullscreen",s.SECOND_SCREEN="second_screen",s.PIP="pip"})(et||(et={}));var Cs=s=>new Promise((e,t)=>{const i=document.createElement("script");i.setAttribute("src",s),i.onload=()=>e,i.onerror=()=>t,document.body.appendChild(i)});class Rs{connection$=new g(void 0);castState$=new g(pe.NOT_AVAILABLE);errorEvent$=new L;contentId;realCastState$=new g(pe.NOT_AVAILABLE);subscription=new ee;log;params;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastInitializer");const t="chrome"in window;if(this.log({message:`[constructor] receiverApplicationId: ${this.params.receiverApplicationId}, isDisabled: ${this.params.isDisabled}, isSupported: ${t}`}),e.isDisabled||!t)return;const i=A(window.chrome?.cast),a=!!window.__onGCastApiAvailable;i?this.initializeCastApi():(window.__onGCastApiAvailable=r=>{delete window.__onGCastApiAvailable,r&&this.initializeCastApi()},a||Cs("https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1").catch(()=>this.errorEvent$.next({id:"ChromecastLoading",category:P.NETWORK,message:"Script loading failed!"})))}connect(){cast.framework.CastContext.getInstance()?.requestSession()}disconnect(){cast.framework.CastContext.getInstance()?.getCurrentSession()?.endSession(!0)}stopMedia(){return new Promise((e,t)=>{cast.framework.CastContext.getInstance()?.getCurrentSession()?.getMediaSession()?.stop(new chrome.cast.media.StopRequest,e,t)})}toggleConnection(){A(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){const t=this.connection$.getValue();Q(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){const t=this.connection$.getValue();Q(t)||e!==t.remotePlayer.isMuted&&t.remotePlayerController.muteOrUnmute()}destroy(){this.subscription.unsubscribe()}initListeners(){const e=new cast.framework.RemotePlayer,t=new cast.framework.RemotePlayerController(e),i=cast.framework.CastContext.getInstance();this.subscription.add(C(i,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(a=>{switch(a.sessionState){case cast.framework.SessionState.SESSION_STARTED:case cast.framework.SessionState.SESSION_STARTING:case cast.framework.SessionState.SESSION_RESUMED:this.contentId=i.getCurrentSession()?.getMediaSession()?.media.contentId;break;case cast.framework.SessionState.NO_SESSION:case cast.framework.SessionState.SESSION_ENDING:case cast.framework.SessionState.SESSION_ENDED:case cast.framework.SessionState.SESSION_START_FAILED:this.contentId=void 0;break;default:return V(a.sessionState)}})).add(O(C(i,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(Ot(a=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(a)}`})}),T(a=>a.castState)),Le([i.getCastState()])).pipe(de(),T(Is),Ot(a=>{this.log({message:`realCastState$: ${a}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(a=>{const r=a===pe.CONNECTED,n=A(this.connection$.getValue());if(r&&!n){const o=i.getCurrentSession();v(o);const d=o.getCastDevice(),c=o.getMediaSession()?.media.contentId;(Q(c)||c===this.contentId)&&(this.log({message:"connection created"}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:o,castDevice:d}))}else!r&&n&&(this.log({message:"connection destroyed"}),this.connection$.next(void 0));this.castState$.next(a===pe.CONNECTED?A(this.connection$.getValue())?pe.CONNECTED:pe.AVAILABLE:a)}))}initializeCastApi(){let e,t,i;try{e=cast.framework.CastContext.getInstance(),t=chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,i=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED}catch{return}try{e.setOptions({receiverApplicationId:this.params.receiverApplicationId??t,autoJoinPolicy:i}),this.initListeners()}catch(a){this.errorEvent$.next({id:"ChromecastInitializer",category:P.EXTERNAL_API,message:"[initializeCastApi] failed",thrown:a})}}}const Is=s=>{switch(s){case cast.framework.CastState.NO_DEVICES_AVAILABLE:return pe.NOT_AVAILABLE;case cast.framework.CastState.NOT_CONNECTED:return pe.AVAILABLE;case cast.framework.CastState.CONNECTING:return pe.CONNECTING;case cast.framework.CastState.CONNECTED:return pe.CONNECTED;default:return V(s)}};var le;(function(s){s[s.OFFSET_P=0]="OFFSET_P",s[s.PLAYBACK_SHIFT=1]="PLAYBACK_SHIFT",s[s.DASH_CMAF_OFFSET_P=2]="DASH_CMAF_OFFSET_P"})(le||(le={}));var _e=(s,e=0,t=le.OFFSET_P)=>{switch(t){case le.OFFSET_P:return s.replace("_offset_p",e===0?"":"_"+e.toFixed(0));case le.PLAYBACK_SHIFT:{if(e===0)return s;const i=new URL(s);return i.searchParams.append("playback_shift",e.toFixed(0)),i.toString()}case le.DASH_CMAF_OFFSET_P:{const i=new URL(s);return!i.searchParams.get("offset_p")&&e===0?s:(i.searchParams.set("offset_p",e.toFixed(0)),i.toString())}default:V(t)}return s};const Ri=(s,e)=>{switch(e){case le.OFFSET_P:return NaN;case le.PLAYBACK_SHIFT:{const t=new URL(s);return Number(t.searchParams.get("playback_shift"))}case le.DASH_CMAF_OFFSET_P:{const t=new URL(s);return Number(t.searchParams.get("offset_p")??0)}default:V(e)}};var R=(s,e,t=!1)=>{const i=s.getTransition();(t||!i||i.to===e)&&s.setState(e)};class ne{state;prevState;transition;transitionStarted$=new L;transitionEnded$=new L;transitionUpdated$=new L;forceChanged$=new L;stateChangeStarted$=O(this.transitionStarted$,this.transitionUpdated$);stateChangeEnded$=O(this.transitionEnded$,this.forceChanged$);constructor(e){this.state=e,this.prevState=void 0}setState(e){const t=this.transition,i=this.state;this.transition=void 0,this.prevState=i,this.state=e,t?t.to===e?this.transitionEnded$.next(t):this.forceChanged$.next({from:t.from,to:e,canceledTransition:t}):this.forceChanged$.next({from:i,to:e,canceledTransition:t})}startTransitionTo(e){const t=this.transition,i=this.state;i===e||A(t)&&t.to===e||(this.prevState=i,this.state=e,t?(this.transition={from:t.from,to:e,canceledTransition:t},this.transitionUpdated$.next(this.transition)):(this.transition={from:i,to:e},this.transitionStarted$.next(this.transition)))}getTransition(){return this.transition}getState(){return this.state}getPrevState(){return this.prevState}}const Bs=s=>{switch(s){case m.MPEG:case m.DASH_SEP:case m.DASH_ONDEMAND:case m.DASH_WEBM:case m.DASH_WEBM_AV1:case m.HLS:case m.HLS_ONDEMAND:return!1;case m.DASH_LIVE:case m.DASH_LIVE_CMAF:case m.HLS_LIVE:case m.HLS_LIVE_CMAF:case m.DASH_LIVE_WEBM:case m.WEB_RTC_LIVE:return!0;default:return V(s)}};var F;(function(s){s.STOPPED="stopped",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused"})(F||(F={}));const Ms=5,_s=5,Os=500,Ii=7e3;class Ns{subscription=new ee;loadMediaTimeoutSubscription=new ee;videoState=new ne(F.STOPPED);params;log;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastProvider"),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(Bs(e.format)),this.params.output.isAudioAvailable$.next(!0),this.handleRemoteVolumeChange({volume:this.params.connection.remotePlayer.volumeLevel,muted:this.params.connection.remotePlayer.isMuted});const t=this.params.connection.session.getMediaSession();t&&this.restoreSession(t),this.subscribe()}destroy(){this.log({message:"[destroy]"}),this.subscription.unsubscribe()}subscribe(){this.subscription.add(this.loadMediaTimeoutSubscription);const e=new ee;this.subscription.add(e),this.subscription.add(O(this.videoState.stateChangeStarted$.pipe(T(a=>`stateChangeStarted$ ${JSON.stringify(a)}`)),this.videoState.stateChangeEnded$.pipe(T(a=>`stateChangeEnded$ ${JSON.stringify(a)}`))).subscribe(a=>this.log({message:`[videoState] ${a}`})));const t=(a,r)=>this.subscription.add(a.subscribe(r));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{const a=new L;e.add(a.pipe(Ge(Os)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let r=NaN;e.add(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(n=>{this.logRemoteEvent(n);const o=n.value;this.params.output.position$.next(o),(this.params.desiredState.seekState.getState().state===G.Applying||Math.abs(o-r)>Ms)&&a.next(o),r=o})),e.add(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(n=>{this.logRemoteEvent(n),this.params.output.duration$.next(n.value)}))}t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),a=>{this.logRemoteEvent(a),a.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),a=>{this.logRemoteEvent(a),a.value?this.handleRemotePause():this.handleRemotePlay()}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),a=>{this.logRemoteEvent(a);const{remotePlayer:r}=this.params.connection,n=a.value,o=this.params.output.isBuffering$.getValue(),d=n===chrome.cast.media.PlayerState.BUFFERING;switch(o!==d&&this.params.output.isBuffering$.next(d),n){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&r.duration-r.currentTime<_s&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),R(this.params.desiredState.playbackState,l.STOPPED);break;case chrome.cast.media.PlayerState.PAUSED:{this.handleRemotePause();break}case chrome.cast.media.PlayerState.PLAYING:this.handleRemotePlay();break;case chrome.cast.media.PlayerState.BUFFERING:break;default:V(n)}}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),a=>{this.logRemoteEvent(a),this.handleRemoteVolumeChange({volume:a.value})}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),a=>{this.logRemoteEvent(a),this.handleRemoteVolumeChange({muted:a.value})});const i=O(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,Le(["init"])).pipe(Ge(0));t(i,this.syncPlayback)}restoreSession(e){this.log({message:"restoreSession"});const{remotePlayer:t}=this.params.connection;if(e.playerState!==chrome.cast.media.PlayerState.IDLE){t.isPaused?(this.videoState.setState(F.PAUSED),R(this.params.desiredState.playbackState,l.PAUSED)):(this.videoState.setState(F.PLAYING),R(this.params.desiredState.playbackState,l.PLAYING));const i=this.params.output.isLive$.getValue();this.params.output.duration$.next(i?0:t.duration),this.params.output.position$.next(i?0:t.currentTime),this.params.desiredState.seekState.setState({state:G.None})}}prepare(){const e=this.params.format;this.log({message:`[prepare] format: ${e}`});const t=this.createMediaInfo(e),i=this.createLoadRequest(t);this.loadMedia(i)}handleRemotePause(){const e=this.videoState.getState();(this.videoState.getTransition()?.to===F.PAUSED||e===F.PLAYING)&&(this.videoState.setState(F.PAUSED),R(this.params.desiredState.playbackState,l.PAUSED))}handleRemotePlay(){const e=this.videoState.getState();(this.videoState.getTransition()?.to===F.PLAYING||e===F.PAUSED)&&(this.videoState.setState(F.PLAYING),R(this.params.desiredState.playbackState,l.PLAYING))}handleRemoteReady(){this.videoState.getTransition()?.to===F.READY&&this.videoState.setState(F.READY),this.params.desiredState.playbackState.getTransition()?.to===l.READY&&R(this.params.desiredState.playbackState,l.READY)}handleRemoteStop(){this.videoState.getState()!==F.STOPPED&&this.videoState.setState(F.STOPPED)}handleRemoteVolumeChange(e){const t=this.params.output.volume$.getValue(),i={volume:e.volume??t.volume,muted:e.muted??t.muted};(i.volume!==t.volume||i.muted!==i.muted)&&this.params.output.volume$.next(i)}seek(e){this.params.output.willSeekEvent$.next();const{remotePlayer:t,remotePlayerController:i}=this.params.connection;t.currentTime=e,i.seek()}stop(){const{remotePlayerController:e}=this.params.connection;e.stop()}createMediaInfo(e){const t=this.params.source;let i,a,r;switch(e){case m.MPEG:{const c=t[e];v(c);const u=Ts(Object.keys(c));v(u);const h=c[u];v(h),i=h,a="video/mp4",r=chrome.cast.media.StreamType.BUFFERED;break}case m.HLS:case m.HLS_ONDEMAND:{const c=t[e];v(c),i=c.url,a="application/x-mpegurl",r=chrome.cast.media.StreamType.BUFFERED;break}case m.DASH_SEP:case m.DASH_ONDEMAND:case m.DASH_WEBM:case m.DASH_WEBM_AV1:{const c=t[e];v(c),i=c.url,a="application/dash+xml",r=chrome.cast.media.StreamType.BUFFERED;break}case m.DASH_LIVE_CMAF:{const c=t[e];v(c),i=c.url,a="application/dash+xml",r=chrome.cast.media.StreamType.LIVE;break}case m.HLS_LIVE:case m.HLS_LIVE_CMAF:{const c=t[e];v(c),i=_e(c.url),a="application/x-mpegurl",r=chrome.cast.media.StreamType.LIVE;break}case m.DASH_LIVE:case m.WEB_RTC_LIVE:{const c="Unsupported format for Chromecast",u=new Error(c);throw this.params.output.error$.next({id:"ChromecastProvider.createMediaInfo()",category:P.VIDEO_PIPELINE,message:c,thrown:u}),u}case m.DASH_LIVE_WEBM:throw new Error("DASH_LIVE_WEBM is no longer supported");default:return V(e)}const n=new chrome.cast.media.MediaInfo(this.params.meta.videoId??i,a);n.contentUrl=i,n.streamType=r,n.metadata=new chrome.cast.media.GenericMediaMetadata;const{title:o,subtitle:d}=this.params.meta;return A(o)&&(n.metadata.title=o),A(d)&&(n.metadata.subtitle=d),n}createLoadRequest(e){const t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;const i=this.params.desiredState.seekState.getState();return i.state===G.Applying||i.state===G.Requested?t.currentTime=this.params.output.isLive$.getValue()?0:i.position/1e3:t.currentTime=0,t}loadMedia(e){const t=this.params.connection.session.loadMedia(e),i=new Promise((a,r)=>{this.loadMediaTimeoutSubscription.add(vs(Ii).subscribe(()=>r(`timeout(${Ii})`)))});Promise.race([t,i]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state===G.Applying&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},a=>{const r=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${a}`;this.log({message:r}),this.params.output.error$.next({id:"ChromecastProvider.loadMedia",category:P.VIDEO_PIPELINE,message:r,thrown:a})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}syncPlayback=()=>{const e=this.videoState.getState(),t=this.videoState.getTransition(),i=this.params.desiredState.playbackState.getState(),a=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.seekState.getState();if(this.log({message:`[syncPlayback] videoState: ${e}; videoTransition: ${JSON.stringify(t)}; desiredPlaybackState: ${i}; desiredPlaybackStateTransition: ${this.params.desiredState.playbackState.getTransition()}; seekState: ${JSON.stringify(r)};`}),i===l.STOPPED){e!==F.STOPPED&&(this.videoState.startTransitionTo(F.STOPPED),this.stop());return}if(!t){if(a?.to!==l.PAUSED&&r.state===G.Requested&&e!==F.STOPPED){this.seek(r.position/1e3);return}switch(i){case l.READY:{switch(e){case F.PLAYING:case F.PAUSED:case F.READY:break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}case l.PLAYING:{switch(e){case F.PLAYING:break;case F.PAUSED:this.videoState.startTransitionTo(F.PLAYING),this.params.connection.remotePlayerController.playOrPause();break;case F.READY:this.videoState.startTransitionTo(F.PLAYING),this.params.connection.remotePlayerController.playOrPause();break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}case l.PAUSED:{switch(e){case F.PLAYING:this.videoState.startTransitionTo(F.PAUSED),this.params.connection.remotePlayerController.playOrPause();break;case F.PAUSED:break;case F.READY:this.videoState.startTransitionTo(F.PAUSED),this.videoState.setState(F.PAUSED);break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}default:V(i)}}}}const $i=s=>{s.removeAttribute("src"),s.load()},Fs=s=>{try{s.pause(),s.playbackRate=0,$i(s),s.remove()}catch(e){console.error(e)}};class Vs{attribute="data-pool-reused";get(e){return e.hasAttribute(this.attribute)}set(e,t){e.toggleAttribute(this.attribute,t)}delete(e){e.removeAttribute(this.attribute)}}const Si=window.WeakMap?new WeakMap:new Vs,lt=s=>{let e=s.querySelector("video");const t=!!e;return e?$i(e):(e=document.createElement("video"),s.appendChild(e)),Si.set(e,t),e.setAttribute("crossorigin","anonymous"),e.setAttribute("playsinline","playsinline"),e.controls=!1,e.setAttribute("poster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="),e},ft=s=>{const e=Si.get(s);Si.delete(s),e?$i(s):Fs(s)},We=(s,e,t,{equal:i=(n,o)=>n===o,changed$:a,onError:r}={})=>{const n=s.getState(),o=e(),d=Q(a),c=new ee;return a&&c.add(a.subscribe(u=>{const h=s.getState();i(u,h)&&s.setState(u)},r)),i(o,n)||(t(n),d&&s.setState(n)),c.add(s.stateChangeStarted$.subscribe(u=>{t(u.to),d&&s.setState(u.to)},r)),c},Ft=(s,e,t)=>We(e,()=>s.loop,i=>{A(i)&&(s.loop=i)},{onError:t}),pt=(s,e,t,i)=>We(e,()=>({muted:s.muted,volume:s.volume}),a=>{A(a)&&(s.muted=a.muted,s.volume=a.volume)},{equal:(a,r)=>a===r||a?.muted===r?.muted&&a?.volume===r?.volume,changed$:t,onError:i}),wt=(s,e,t,i)=>We(e,()=>s.playbackRate,a=>{A(a)&&(s.playbackRate=a)},{changed$:t,onError:i}),Us=s=>["__",s.language,s.label].join("|"),Hs=(s,e)=>{if(s.id===e)return!0;const[t,i,a]=e.split("|");return s.language===i&&s.label===a};class it{available$=new L;current$=new g(void 0);error$=new L;video;cueSettings;subscription=new ee;externalTracks=new Map;internalTracks=new Map;connect(e,t,i){this.video=e,this.cueSettings=t.textTrackCuesSettings,this.subscribe();const a=r=>{this.error$.next({id:"TextTracksManager",category:P.WTF,message:"Generic HtmlVideoTextTrackManager error",thrown:r})};this.subscription.add(this.available$.subscribe(i.availableTextTracks$)),this.subscription.add(this.current$.subscribe(i.currentTextTrack$)),this.subscription.add(this.error$.subscribe(i.error$)),this.subscription.add(We(t.internalTextTracks,()=>Object.values(this.internalTracks),r=>{A(r)&&this.setInternal(r)},{equal:(r,n)=>A(r)&&A(n)&&r.length===n.length&&r.every(({id:o},d)=>o===n[d].id),changed$:this.available$.pipe(T(r=>r.filter(({type:n})=>n==="internal"))),onError:a})),this.subscription.add(We(t.externalTextTracks,()=>Object.values(this.externalTracks),r=>{A(r)&&this.setExternal(r)},{equal:(r,n)=>A(r)&&A(n)&&r.length===n.length&&r.every(({id:o},d)=>o===n[d].id),changed$:this.available$.pipe(T(r=>r.filter(({type:n})=>n==="external"))),onError:a})),this.subscription.add(We(t.currentTextTrack,()=>{if(this.video)return;const r=this.htmlTextTracksAsArray().find(({mode:n})=>n==="showing");return r&&this.htmlTextTrackToITextTrack(r).id},r=>this.select(r),{changed$:this.current$,onError:a})),this.subscription.add(We(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(const r of this.htmlTextTracksAsArray())this.applyCueSettings(r.cues),this.applyCueSettings(r.activeCues)}))}subscribe(){v(this.video);const{textTracks:e}=this.video;this.subscription.add(C(e,"addtrack").subscribe(()=>{const i=this.current$.getValue();i&&this.select(i)})),this.subscription.add(O(C(e,"addtrack"),C(e,"removetrack"),Le(["init"])).pipe(T(()=>this.htmlTextTracksAsArray().map(i=>this.htmlTextTrackToITextTrack(i))),de((i,a)=>i.length===a.length&&i.every(({id:r},n)=>r===a[n].id))).subscribe(this.available$)),this.subscription.add(O(C(e,"change"),Le(["init"])).pipe(T(()=>this.htmlTextTracksAsArray().find(({mode:i})=>i==="showing")),T(i=>i&&this.htmlTextTrackToITextTrack(i).id),de()).subscribe(this.current$));const t=i=>this.applyCueSettings(i.target?.activeCues??null);this.subscription.add(C(e,"addtrack").subscribe(i=>{i.track?.addEventListener("cuechange",t);const a=r=>{const n=r.target?.cues??null;n&&n.length&&(this.applyCueSettings(r.target?.cues??null),r.target?.removeEventListener("cuechange",a))};i.track?.addEventListener("cuechange",a)})),this.subscription.add(C(e,"removetrack").subscribe(i=>{i.track?.removeEventListener("cuechange",t)}))}applyCueSettings(e){if(!e||!e.length)return;const t=this.cueSettings.getState();for(const i of Array.from(e)){const a=i;A(t.align)&&(a.align=t.align),A(t.position)&&(a.position=t.position),A(t.size)&&(a.size=t.size),A(t.line)&&(a.line=t.line)}}htmlTextTracksAsArray(e=!1){v(this.video);const t=[...this.video.textTracks];return e?t:t.filter(it.isHealthyTrack)}htmlTextTrackToITextTrack(e){const{language:t,label:i}=e,a=e.id?e.id:Us(e),r=this.externalTracks.has(a),n=a.includes("auto");return r?{id:a,type:"external",isAuto:n,language:t,label:i,url:this.externalTracks.get(a)?.url}:{id:a,type:"internal",isAuto:n,language:t,label:i,url:this.internalTracks.get(a)?.url}}static isHealthyTrack(e){return!(e.kind==="metadata"||e.groupId||e.id===""&&e.label===""&&e.language==="")}setExternal(e){this.internalTracks.size>0&&Array.from(this.internalTracks).forEach(([,t])=>this.detach(t)),e.filter(({id:t})=>!this.externalTracks.has(t)).forEach(t=>this.attach(t)),Array.from(this.externalTracks).filter(([t])=>!e.find(i=>i.id===t)).forEach(([,t])=>this.detach(t))}setInternal(e){const t=[...this.externalTracks];e.filter(({id:i,language:a,isAuto:r})=>!this.internalTracks.has(i)&&!t.some(([,n])=>n.language===a&&n.isAuto===r)).forEach(i=>this.attach(i)),Array.from(this.internalTracks).filter(([i])=>!e.find(a=>a.id===i)).forEach(([,i])=>this.detach(i))}select(e){v(this.video);for(const t of this.htmlTextTracksAsArray(!0))t.mode="showing";for(const t of this.htmlTextTracksAsArray(!0))(Q(e)||!Hs(t,e))&&(t.mode="disabled")}destroy(){if(this.subscription.unsubscribe(),this.video)for(const e of Array.from(this.video.getElementsByTagName("track"))){const t=e.getAttribute("id");t&&this.externalTracks.has(t)&&this.video.removeChild(e)}this.externalTracks.clear()}attach(e){v(this.video);const t=document.createElement("track");t.setAttribute("src",e.url),t.setAttribute("id",e.id),e.label&&t.setAttribute("label",e.label),e.language&&t.setAttribute("srclang",e.language),e.type==="external"?this.externalTracks.set(e.id,e):e.type==="internal"&&this.internalTracks.set(e.id,e),this.video.appendChild(t)}detach(e){v(this.video);const t=Array.prototype.find.call(this.video.getElementsByTagName("track"),i=>i.getAttribute("id")===e.id);t&&this.video.removeChild(t),e.type==="external"?this.externalTracks.delete(e.id):e.type==="internal"&&this.internalTracks.delete(e.id)}}class wi{pausedTime=0;streamOffset=0;pauseTimestamp=0;getTotalPausedTime(){return this.pausedTime+this.getCurrentPausedTime()}getCurrentPausedTime(){return this.pauseTimestamp>0?Date.now()-this.pauseTimestamp:0}getStreamOffset(){return this.streamOffset}getTotalOffset(){return this.getTotalPausedTime()+this.streamOffset}pause(){this.pauseTimestamp===0&&(this.pauseTimestamp=Date.now())}resume(){this.pauseTimestamp>0&&(this.pausedTime+=this.getCurrentPausedTime(),this.pauseTimestamp=0)}resetTo(e,t=!1){this.streamOffset=e,this.pauseTimestamp=0,this.pausedTime=0,t&&this.pause()}}const is=s=>{let e=s;for(;!(e instanceof Document)&&!(e instanceof ShadowRoot)&&e!==null;)e=e?.parentNode;return e??void 0},Bi=s=>{const e=is(s);return!!(e&&e.fullscreenElement&&e.fullscreenElement===s)},Ys=s=>{const e=is(s);return!!(e&&e.pictureInPictureElement&&e.pictureInPictureElement===s)},Gs=3;var qs=(s,e,t=Gs)=>{let i=0,a=0;for(let r=0;r<s.length;r++){const n=s.start(r),o=s.end(r);if(n<=e&&e<=o){if(i=n,a=o,!t)return{from:i,to:a};for(let d=r-1;d>=0;d--)s.end(d)+t>=i&&(i=s.start(d));for(let d=r+1;d<s.length;d++)s.start(d)-t<=a&&(a=s.end(d))}}return{from:i,to:a}};const mt=s=>{const e=M=>C(s,M).pipe(Jt(void 0)),i=O(...["waiting","pause","canplay","play","canplaythrough","playing","seeking","seeked","ended"].map(M=>C(s,M))).pipe(T(M=>M.type==="ended"?s.readyState<2:s.readyState<3),de()),a=O(C(s,"progress"),C(s,"timeupdate")).pipe(T(()=>qs(s.buffered,s.currentTime))),n=Ai().browser===ts.Safari?De({play:e("play").pipe(ye()),playing:e("playing")}).pipe(Jt(void 0)):e("playing"),o=C(s,"volumechange").pipe(T(()=>({muted:s.muted,volume:s.volume}))),d=C(s,"ratechange").pipe(T(()=>s.playbackRate)),c=C(s,"error").pipe(oe(()=>!!(s.error||s.played.length)),T(()=>{const M=s.error;return{id:M?`MediaError#${M.code}`:"HtmlVideoError",category:P.VIDEO_PIPELINE,message:M?M.message:"Error event from HTML video element",thrown:s.error??void 0}})),u=C(s,"timeupdate").pipe(T(()=>s.currentTime)),h=new L,f=.3;let p;u.subscribe(M=>{s.loop&&A(p)&&A(M)&&p>=s.duration-f&&M<=f&&h.next(p),p=M});const S=C(s,"enterpictureinpicture"),w=C(s,"leavepictureinpicture"),y=new g(Ys(s));S.subscribe(()=>y.next(!0)),w.subscribe(()=>y.next(!1));const k=new g(Bi(s));return C(s,"fullscreenchange").pipe(T(()=>Bi(s))).subscribe(k),{playing$:n,pause$:e("pause").pipe(oe(()=>!s.error)),canplay$:e("canplay"),ended$:e("ended"),looped$:h,error$:c,seeked$:e("seeked"),seeking$:e("seeking"),progress$:e("progress"),loadStart$:e("loadstart"),loadedMetadata$:e("loadedmetadata"),loadedData$:e("loadeddata"),timeUpdate$:u,durationChange$:C(s,"durationchange").pipe(T(()=>s.duration)),isBuffering$:i,currentBuffer$:a,volumeState$:o,playbackRateState$:d,inPiP$:y,inFullscreen$:k}};var si=s=>{switch(s){case"mobile":return $e.Q_144P;case"lowest":return $e.Q_240P;case"low":return $e.Q_360P;case"sd":case"medium":return $e.Q_480P;case"hd":case"high":return $e.Q_720P;case"fullhd":case"full":return $e.Q_1080P;case"quadhd":case"quad":return $e.Q_1440P;case"ultrahd":case"ultra":return $e.Q_2160P}};let Pi=!1,Qe={};const zs=s=>{Pi=s},Ws=()=>{Qe={}},Qs=s=>{s(Qe)},qt=(s,e)=>{Pi&&(Qe.meta=Qe.meta??{},Qe.meta[s]=e)};class Ue{name;constructor(e){this.name=e}next(e){if(!Pi)return;Qe.series=Qe.series??{};const t=Qe.series[this.name]??[];t.push([Date.now(),e]),Qe.series[this.name]=t}}var ot;(function(s){s.FitsContainer="FitsContainer",s.FitsThroughput="FitsThroughput",s.Buffer="Buffer",s.DroppedFramesLimit="DroppedFramesLimit",s.FitsQualityLimits="FitsQualityLimits"})(ot||(ot={}));const js=new Ue("best_bitrate"),Js=(s,e,t)=>(e-t)*Math.pow(2,-10*s)+t;class Xs{last;history={};recordSelection(e){this.history[e.id]=se()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}const Ks='Assertion "ABR Tracks is empty array" failed',ai=(s,{container:e,throughput:t,tuning:i,limits:a,reserve:r=0,forwardBufferHealth:n,playbackRate:o,current:d,history:c,droppedVideoMaxQualityLimit:u,abrLogger:h})=>{Es(s,Ks);const f=i.usePixelRatio?window.devicePixelRatio??1:1,p=i.limitByContainer&&e&&e.width>0&&e.height>0&&{width:e.width*f*i.containerSizeFactor,height:e.height*f*i.containerSizeFactor},S=p&&dt(p),w=i.considerPlaybackRate&&A(o)?o:1,y=s.filter(x=>!ut(x.quality)).sort((x,I)=>At(x.quality,I.quality)?-1:1),k=y.at(-1)?.quality,_=y.at(0)?.quality,M=Q(a)||A(a.min)&&A(a.max)&&Wt(a.max,a.min)||A(a.min)&&_&&At(a.min,_)||A(a.max)&&k&&Wt(a.max,k),E=w*Js(n??.5,i.bitrateFactorAtEmptyBuffer,i.bitrateFactorAtFullBuffer),D={},q=y.filter(x=>(S?Wt(x.quality,S):!0)?(A(t)&&isFinite(t)&&A(x.bitrate)?t-r>=x.bitrate*E:!0)?i.lazyQualitySwitch&&A(i.minBufferToSwitchUp)&&d&&!ut(d.quality)&&(n??0)<i.minBufferToSwitchUp&&At(x.quality,d.quality)?(D[x.quality]=ot.Buffer,!1):!!u&&mi(x.quality,u)?(D[x.quality]=ot.DroppedFramesLimit,!1):M||(Q(a.max)||Xt(x.quality,a.max))&&(Q(a.min)||mi(x.quality,a.min))?!0:(D[x.quality]=ot.FitsQualityLimits,!1):(D[x.quality]=ot.FitsThroughput,!1):(D[x.quality]=ot.FitsContainer,!1))[0];q&&q.bitrate&&js.next(q.bitrate);const H=q??y[Math.ceil((y.length-1)/2)]??s[0];H.quality!==c?.last?.quality&&h({message:`
6
+ import{ValueSubject as g,Subject as L,Subscription as ee,isNonNullable as A,ErrorCategory as P,isNullable as Q,fromEvent as C,assertNever as V,merge as O,tap as Ot,map as T,observableFrom as Le,filterChanged as de,assertNonNullable as v,debounce as Ge,getHighestQuality as Ts,timeout as vs,getCurrentBrowser as Ai,CurrentClientBrowser as ts,combine as De,once as ye,mapTo as Jt,filter as oe,VideoQuality as $e,now as se,assertNotEmptyArray as Es,videoSizeToQuality as dt,isInvariantQuality as ut,isHigher as At,isLower as Wt,isHigherOrEqual as mi,isLowerOrEqual as Xt,interval as It,videoQualityToHeight as As,abortable as Te,getExponentialDelay as Qt,throttle as ks,Observable as ki,observeElementSize as $s,isIOS as ws,CurrentClientDevice as Ps,safeStorage as hi,fillWithDefault as Ds,Logger as xs}from"@vkontakte/videoplayer-shared/evergreen.esm.js";import{Observable as Kr,Subject as Zr,Subscription as en,ValueSubject as tn,VideoQuality as sn}from"@vkontakte/videoplayer-shared/evergreen.esm.js";const Ls="2.0.103-dev.c555938f.0";var l;(function(s){s.STOPPED="stopped",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused"})(l||(l={}));var m;(function(s){s.MPEG="MPEG",s.DASH="DASH_SEP",s.DASH_SEP="DASH_SEP",s.DASH_SEP_VK="DASH_SEP",s.DASH_WEBM="DASH_WEBM",s.DASH_WEBM_AV1="DASH_WEBM_AV1",s.DASH_WEBM_VK="DASH_WEBM",s.DASH_ONDEMAND="DASH_ONDEMAND",s.DASH_ONDEMAND_VK="DASH_ONDEMAND",s.DASH_LIVE="DASH_LIVE",s.DASH_LIVE_CMAF="DASH_LIVE_CMAF",s.DASH_LIVE_WEBM="DASH_LIVE_WEBM",s.HLS="HLS",s.HLS_ONDEMAND="HLS_ONDEMAND",s.HLS_JS="HLS",s.HLS_LIVE="HLS_LIVE",s.HLS_LIVE_CMAF="HLS_LIVE_CMAF",s.WEB_RTC_LIVE="WEB_RTC_LIVE"})(m||(m={}));var ge;(function(s){s.SCREEN="SCREEN",s.CHROMECAST="CHROMECAST"})(ge||(ge={}));var pe;(function(s){s.NOT_AVAILABLE="NOT_AVAILABLE",s.AVAILABLE="AVAILABLE",s.CONNECTING="CONNECTING",s.CONNECTED="CONNECTED"})(pe||(pe={}));var gi;(function(s){s.HTTP1="http1",s.HTTP2="http2",s.QUIC="quic"})(gi||(gi={}));var G;(function(s){s.None="none",s.Requested="requested",s.Applying="applying"})(G||(G={}));var et;(function(s){s.NONE="none",s.INLINE="inline",s.FULLSCREEN="fullscreen",s.SECOND_SCREEN="second_screen",s.PIP="pip"})(et||(et={}));var Cs=s=>new Promise((e,t)=>{const i=document.createElement("script");i.setAttribute("src",s),i.onload=()=>e,i.onerror=()=>t,document.body.appendChild(i)});class Rs{connection$=new g(void 0);castState$=new g(pe.NOT_AVAILABLE);errorEvent$=new L;contentId;realCastState$=new g(pe.NOT_AVAILABLE);subscription=new ee;log;params;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastInitializer");const t="chrome"in window;if(this.log({message:`[constructor] receiverApplicationId: ${this.params.receiverApplicationId}, isDisabled: ${this.params.isDisabled}, isSupported: ${t}`}),e.isDisabled||!t)return;const i=A(window.chrome?.cast),a=!!window.__onGCastApiAvailable;i?this.initializeCastApi():(window.__onGCastApiAvailable=r=>{delete window.__onGCastApiAvailable,r&&this.initializeCastApi()},a||Cs("https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1").catch(()=>this.errorEvent$.next({id:"ChromecastLoading",category:P.NETWORK,message:"Script loading failed!"})))}connect(){cast.framework.CastContext.getInstance()?.requestSession()}disconnect(){cast.framework.CastContext.getInstance()?.getCurrentSession()?.endSession(!0)}stopMedia(){return new Promise((e,t)=>{cast.framework.CastContext.getInstance()?.getCurrentSession()?.getMediaSession()?.stop(new chrome.cast.media.StopRequest,e,t)})}toggleConnection(){A(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){const t=this.connection$.getValue();Q(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){const t=this.connection$.getValue();Q(t)||e!==t.remotePlayer.isMuted&&t.remotePlayerController.muteOrUnmute()}destroy(){this.subscription.unsubscribe()}initListeners(){const e=new cast.framework.RemotePlayer,t=new cast.framework.RemotePlayerController(e),i=cast.framework.CastContext.getInstance();this.subscription.add(C(i,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(a=>{switch(a.sessionState){case cast.framework.SessionState.SESSION_STARTED:case cast.framework.SessionState.SESSION_STARTING:case cast.framework.SessionState.SESSION_RESUMED:this.contentId=i.getCurrentSession()?.getMediaSession()?.media.contentId;break;case cast.framework.SessionState.NO_SESSION:case cast.framework.SessionState.SESSION_ENDING:case cast.framework.SessionState.SESSION_ENDED:case cast.framework.SessionState.SESSION_START_FAILED:this.contentId=void 0;break;default:return V(a.sessionState)}})).add(O(C(i,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(Ot(a=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(a)}`})}),T(a=>a.castState)),Le([i.getCastState()])).pipe(de(),T(Is),Ot(a=>{this.log({message:`realCastState$: ${a}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(a=>{const r=a===pe.CONNECTED,n=A(this.connection$.getValue());if(r&&!n){const o=i.getCurrentSession();v(o);const d=o.getCastDevice(),c=o.getMediaSession()?.media.contentId;(Q(c)||c===this.contentId)&&(this.log({message:"connection created"}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:o,castDevice:d}))}else!r&&n&&(this.log({message:"connection destroyed"}),this.connection$.next(void 0));this.castState$.next(a===pe.CONNECTED?A(this.connection$.getValue())?pe.CONNECTED:pe.AVAILABLE:a)}))}initializeCastApi(){let e,t,i;try{e=cast.framework.CastContext.getInstance(),t=chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,i=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED}catch{return}try{e.setOptions({receiverApplicationId:this.params.receiverApplicationId??t,autoJoinPolicy:i}),this.initListeners()}catch(a){this.errorEvent$.next({id:"ChromecastInitializer",category:P.EXTERNAL_API,message:"[initializeCastApi] failed",thrown:a})}}}const Is=s=>{switch(s){case cast.framework.CastState.NO_DEVICES_AVAILABLE:return pe.NOT_AVAILABLE;case cast.framework.CastState.NOT_CONNECTED:return pe.AVAILABLE;case cast.framework.CastState.CONNECTING:return pe.CONNECTING;case cast.framework.CastState.CONNECTED:return pe.CONNECTED;default:return V(s)}};var le;(function(s){s[s.OFFSET_P=0]="OFFSET_P",s[s.PLAYBACK_SHIFT=1]="PLAYBACK_SHIFT",s[s.DASH_CMAF_OFFSET_P=2]="DASH_CMAF_OFFSET_P"})(le||(le={}));var _e=(s,e=0,t=le.OFFSET_P)=>{switch(t){case le.OFFSET_P:return s.replace("_offset_p",e===0?"":"_"+e.toFixed(0));case le.PLAYBACK_SHIFT:{if(e===0)return s;const i=new URL(s);return i.searchParams.append("playback_shift",e.toFixed(0)),i.toString()}case le.DASH_CMAF_OFFSET_P:{const i=new URL(s);return!i.searchParams.get("offset_p")&&e===0?s:(i.searchParams.set("offset_p",e.toFixed(0)),i.toString())}default:V(t)}return s};const Ri=(s,e)=>{switch(e){case le.OFFSET_P:return NaN;case le.PLAYBACK_SHIFT:{const t=new URL(s);return Number(t.searchParams.get("playback_shift"))}case le.DASH_CMAF_OFFSET_P:{const t=new URL(s);return Number(t.searchParams.get("offset_p")??0)}default:V(e)}};var R=(s,e,t=!1)=>{const i=s.getTransition();(t||!i||i.to===e)&&s.setState(e)};class ne{state;prevState;transition;transitionStarted$=new L;transitionEnded$=new L;transitionUpdated$=new L;forceChanged$=new L;stateChangeStarted$=O(this.transitionStarted$,this.transitionUpdated$);stateChangeEnded$=O(this.transitionEnded$,this.forceChanged$);constructor(e){this.state=e,this.prevState=void 0}setState(e){const t=this.transition,i=this.state;this.transition=void 0,this.prevState=i,this.state=e,t?t.to===e?this.transitionEnded$.next(t):this.forceChanged$.next({from:t.from,to:e,canceledTransition:t}):this.forceChanged$.next({from:i,to:e,canceledTransition:t})}startTransitionTo(e){const t=this.transition,i=this.state;i===e||A(t)&&t.to===e||(this.prevState=i,this.state=e,t?(this.transition={from:t.from,to:e,canceledTransition:t},this.transitionUpdated$.next(this.transition)):(this.transition={from:i,to:e},this.transitionStarted$.next(this.transition)))}getTransition(){return this.transition}getState(){return this.state}getPrevState(){return this.prevState}}const Bs=s=>{switch(s){case m.MPEG:case m.DASH_SEP:case m.DASH_ONDEMAND:case m.DASH_WEBM:case m.DASH_WEBM_AV1:case m.HLS:case m.HLS_ONDEMAND:return!1;case m.DASH_LIVE:case m.DASH_LIVE_CMAF:case m.HLS_LIVE:case m.HLS_LIVE_CMAF:case m.DASH_LIVE_WEBM:case m.WEB_RTC_LIVE:return!0;default:return V(s)}};var F;(function(s){s.STOPPED="stopped",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused"})(F||(F={}));const Ms=5,_s=5,Os=500,Ii=7e3;class Ns{subscription=new ee;loadMediaTimeoutSubscription=new ee;videoState=new ne(F.STOPPED);params;log;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastProvider"),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(Bs(e.format)),this.params.output.isAudioAvailable$.next(!0),this.handleRemoteVolumeChange({volume:this.params.connection.remotePlayer.volumeLevel,muted:this.params.connection.remotePlayer.isMuted});const t=this.params.connection.session.getMediaSession();t&&this.restoreSession(t),this.subscribe()}destroy(){this.log({message:"[destroy]"}),this.subscription.unsubscribe()}subscribe(){this.subscription.add(this.loadMediaTimeoutSubscription);const e=new ee;this.subscription.add(e),this.subscription.add(O(this.videoState.stateChangeStarted$.pipe(T(a=>`stateChangeStarted$ ${JSON.stringify(a)}`)),this.videoState.stateChangeEnded$.pipe(T(a=>`stateChangeEnded$ ${JSON.stringify(a)}`))).subscribe(a=>this.log({message:`[videoState] ${a}`})));const t=(a,r)=>this.subscription.add(a.subscribe(r));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{const a=new L;e.add(a.pipe(Ge(Os)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let r=NaN;e.add(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(n=>{this.logRemoteEvent(n);const o=n.value;this.params.output.position$.next(o),(this.params.desiredState.seekState.getState().state===G.Applying||Math.abs(o-r)>Ms)&&a.next(o),r=o})),e.add(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(n=>{this.logRemoteEvent(n),this.params.output.duration$.next(n.value)}))}t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),a=>{this.logRemoteEvent(a),a.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),a=>{this.logRemoteEvent(a),a.value?this.handleRemotePause():this.handleRemotePlay()}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),a=>{this.logRemoteEvent(a);const{remotePlayer:r}=this.params.connection,n=a.value,o=this.params.output.isBuffering$.getValue(),d=n===chrome.cast.media.PlayerState.BUFFERING;switch(o!==d&&this.params.output.isBuffering$.next(d),n){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&r.duration-r.currentTime<_s&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),R(this.params.desiredState.playbackState,l.STOPPED);break;case chrome.cast.media.PlayerState.PAUSED:{this.handleRemotePause();break}case chrome.cast.media.PlayerState.PLAYING:this.handleRemotePlay();break;case chrome.cast.media.PlayerState.BUFFERING:break;default:V(n)}}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),a=>{this.logRemoteEvent(a),this.handleRemoteVolumeChange({volume:a.value})}),t(C(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),a=>{this.logRemoteEvent(a),this.handleRemoteVolumeChange({muted:a.value})});const i=O(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,Le(["init"])).pipe(Ge(0));t(i,this.syncPlayback)}restoreSession(e){this.log({message:"restoreSession"});const{remotePlayer:t}=this.params.connection;if(e.playerState!==chrome.cast.media.PlayerState.IDLE){t.isPaused?(this.videoState.setState(F.PAUSED),R(this.params.desiredState.playbackState,l.PAUSED)):(this.videoState.setState(F.PLAYING),R(this.params.desiredState.playbackState,l.PLAYING));const i=this.params.output.isLive$.getValue();this.params.output.duration$.next(i?0:t.duration),this.params.output.position$.next(i?0:t.currentTime),this.params.desiredState.seekState.setState({state:G.None})}}prepare(){const e=this.params.format;this.log({message:`[prepare] format: ${e}`});const t=this.createMediaInfo(e),i=this.createLoadRequest(t);this.loadMedia(i)}handleRemotePause(){const e=this.videoState.getState();(this.videoState.getTransition()?.to===F.PAUSED||e===F.PLAYING)&&(this.videoState.setState(F.PAUSED),R(this.params.desiredState.playbackState,l.PAUSED))}handleRemotePlay(){const e=this.videoState.getState();(this.videoState.getTransition()?.to===F.PLAYING||e===F.PAUSED)&&(this.videoState.setState(F.PLAYING),R(this.params.desiredState.playbackState,l.PLAYING))}handleRemoteReady(){this.videoState.getTransition()?.to===F.READY&&this.videoState.setState(F.READY),this.params.desiredState.playbackState.getTransition()?.to===l.READY&&R(this.params.desiredState.playbackState,l.READY)}handleRemoteStop(){this.videoState.getState()!==F.STOPPED&&this.videoState.setState(F.STOPPED)}handleRemoteVolumeChange(e){const t=this.params.output.volume$.getValue(),i={volume:e.volume??t.volume,muted:e.muted??t.muted};(i.volume!==t.volume||i.muted!==i.muted)&&this.params.output.volume$.next(i)}seek(e){this.params.output.willSeekEvent$.next();const{remotePlayer:t,remotePlayerController:i}=this.params.connection;t.currentTime=e,i.seek()}stop(){const{remotePlayerController:e}=this.params.connection;e.stop()}createMediaInfo(e){const t=this.params.source;let i,a,r;switch(e){case m.MPEG:{const c=t[e];v(c);const u=Ts(Object.keys(c));v(u);const h=c[u];v(h),i=h,a="video/mp4",r=chrome.cast.media.StreamType.BUFFERED;break}case m.HLS:case m.HLS_ONDEMAND:{const c=t[e];v(c),i=c.url,a="application/x-mpegurl",r=chrome.cast.media.StreamType.BUFFERED;break}case m.DASH_SEP:case m.DASH_ONDEMAND:case m.DASH_WEBM:case m.DASH_WEBM_AV1:{const c=t[e];v(c),i=c.url,a="application/dash+xml",r=chrome.cast.media.StreamType.BUFFERED;break}case m.DASH_LIVE_CMAF:{const c=t[e];v(c),i=c.url,a="application/dash+xml",r=chrome.cast.media.StreamType.LIVE;break}case m.HLS_LIVE:case m.HLS_LIVE_CMAF:{const c=t[e];v(c),i=_e(c.url),a="application/x-mpegurl",r=chrome.cast.media.StreamType.LIVE;break}case m.DASH_LIVE:case m.WEB_RTC_LIVE:{const c="Unsupported format for Chromecast",u=new Error(c);throw this.params.output.error$.next({id:"ChromecastProvider.createMediaInfo()",category:P.VIDEO_PIPELINE,message:c,thrown:u}),u}case m.DASH_LIVE_WEBM:throw new Error("DASH_LIVE_WEBM is no longer supported");default:return V(e)}const n=new chrome.cast.media.MediaInfo(this.params.meta.videoId??i,a);n.contentUrl=i,n.streamType=r,n.metadata=new chrome.cast.media.GenericMediaMetadata;const{title:o,subtitle:d}=this.params.meta;return A(o)&&(n.metadata.title=o),A(d)&&(n.metadata.subtitle=d),n}createLoadRequest(e){const t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;const i=this.params.desiredState.seekState.getState();return i.state===G.Applying||i.state===G.Requested?t.currentTime=this.params.output.isLive$.getValue()?0:i.position/1e3:t.currentTime=0,t}loadMedia(e){const t=this.params.connection.session.loadMedia(e),i=new Promise((a,r)=>{this.loadMediaTimeoutSubscription.add(vs(Ii).subscribe(()=>r(`timeout(${Ii})`)))});Promise.race([t,i]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state===G.Applying&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},a=>{const r=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${a}`;this.log({message:r}),this.params.output.error$.next({id:"ChromecastProvider.loadMedia",category:P.VIDEO_PIPELINE,message:r,thrown:a})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}syncPlayback=()=>{const e=this.videoState.getState(),t=this.videoState.getTransition(),i=this.params.desiredState.playbackState.getState(),a=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.seekState.getState();if(this.log({message:`[syncPlayback] videoState: ${e}; videoTransition: ${JSON.stringify(t)}; desiredPlaybackState: ${i}; desiredPlaybackStateTransition: ${this.params.desiredState.playbackState.getTransition()}; seekState: ${JSON.stringify(r)};`}),i===l.STOPPED){e!==F.STOPPED&&(this.videoState.startTransitionTo(F.STOPPED),this.stop());return}if(!t){if(a?.to!==l.PAUSED&&r.state===G.Requested&&e!==F.STOPPED){this.seek(r.position/1e3);return}switch(i){case l.READY:{switch(e){case F.PLAYING:case F.PAUSED:case F.READY:break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}case l.PLAYING:{switch(e){case F.PLAYING:break;case F.PAUSED:this.videoState.startTransitionTo(F.PLAYING),this.params.connection.remotePlayerController.playOrPause();break;case F.READY:this.videoState.startTransitionTo(F.PLAYING),this.params.connection.remotePlayerController.playOrPause();break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}case l.PAUSED:{switch(e){case F.PLAYING:this.videoState.startTransitionTo(F.PAUSED),this.params.connection.remotePlayerController.playOrPause();break;case F.PAUSED:break;case F.READY:this.videoState.startTransitionTo(F.PAUSED),this.videoState.setState(F.PAUSED);break;case F.STOPPED:this.videoState.startTransitionTo(F.READY),this.prepare();break;default:V(e)}break}default:V(i)}}}}const $i=s=>{s.removeAttribute("src"),s.load()},Fs=s=>{try{s.pause(),s.playbackRate=0,$i(s),s.remove()}catch(e){console.error(e)}};class Vs{attribute="data-pool-reused";get(e){return e.hasAttribute(this.attribute)}set(e,t){e.toggleAttribute(this.attribute,t)}delete(e){e.removeAttribute(this.attribute)}}const Si=window.WeakMap?new WeakMap:new Vs,lt=s=>{let e=s.querySelector("video");const t=!!e;return e?$i(e):(e=document.createElement("video"),s.appendChild(e)),Si.set(e,t),e.setAttribute("crossorigin","anonymous"),e.setAttribute("playsinline","playsinline"),e.controls=!1,e.setAttribute("poster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="),e},ft=s=>{const e=Si.get(s);Si.delete(s),e?$i(s):Fs(s)},We=(s,e,t,{equal:i=(n,o)=>n===o,changed$:a,onError:r}={})=>{const n=s.getState(),o=e(),d=Q(a),c=new ee;return a&&c.add(a.subscribe(u=>{const h=s.getState();i(u,h)&&s.setState(u)},r)),i(o,n)||(t(n),d&&s.setState(n)),c.add(s.stateChangeStarted$.subscribe(u=>{t(u.to),d&&s.setState(u.to)},r)),c},Ft=(s,e,t)=>We(e,()=>s.loop,i=>{A(i)&&(s.loop=i)},{onError:t}),pt=(s,e,t,i)=>We(e,()=>({muted:s.muted,volume:s.volume}),a=>{A(a)&&(s.muted=a.muted,s.volume=a.volume)},{equal:(a,r)=>a===r||a?.muted===r?.muted&&a?.volume===r?.volume,changed$:t,onError:i}),wt=(s,e,t,i)=>We(e,()=>s.playbackRate,a=>{A(a)&&(s.playbackRate=a)},{changed$:t,onError:i}),Us=s=>["__",s.language,s.label].join("|"),Hs=(s,e)=>{if(s.id===e)return!0;const[t,i,a]=e.split("|");return s.language===i&&s.label===a};class it{available$=new L;current$=new g(void 0);error$=new L;video;cueSettings;subscription=new ee;externalTracks=new Map;internalTracks=new Map;connect(e,t,i){this.video=e,this.cueSettings=t.textTrackCuesSettings,this.subscribe();const a=r=>{this.error$.next({id:"TextTracksManager",category:P.WTF,message:"Generic HtmlVideoTextTrackManager error",thrown:r})};this.subscription.add(this.available$.subscribe(i.availableTextTracks$)),this.subscription.add(this.current$.subscribe(i.currentTextTrack$)),this.subscription.add(this.error$.subscribe(i.error$)),this.subscription.add(We(t.internalTextTracks,()=>Object.values(this.internalTracks),r=>{A(r)&&this.setInternal(r)},{equal:(r,n)=>A(r)&&A(n)&&r.length===n.length&&r.every(({id:o},d)=>o===n[d].id),changed$:this.available$.pipe(T(r=>r.filter(({type:n})=>n==="internal"))),onError:a})),this.subscription.add(We(t.externalTextTracks,()=>Object.values(this.externalTracks),r=>{A(r)&&this.setExternal(r)},{equal:(r,n)=>A(r)&&A(n)&&r.length===n.length&&r.every(({id:o},d)=>o===n[d].id),changed$:this.available$.pipe(T(r=>r.filter(({type:n})=>n==="external"))),onError:a})),this.subscription.add(We(t.currentTextTrack,()=>{if(this.video)return;const r=this.htmlTextTracksAsArray().find(({mode:n})=>n==="showing");return r&&this.htmlTextTrackToITextTrack(r).id},r=>this.select(r),{changed$:this.current$,onError:a})),this.subscription.add(We(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(const r of this.htmlTextTracksAsArray())this.applyCueSettings(r.cues),this.applyCueSettings(r.activeCues)}))}subscribe(){v(this.video);const{textTracks:e}=this.video;this.subscription.add(C(e,"addtrack").subscribe(()=>{const i=this.current$.getValue();i&&this.select(i)})),this.subscription.add(O(C(e,"addtrack"),C(e,"removetrack"),Le(["init"])).pipe(T(()=>this.htmlTextTracksAsArray().map(i=>this.htmlTextTrackToITextTrack(i))),de((i,a)=>i.length===a.length&&i.every(({id:r},n)=>r===a[n].id))).subscribe(this.available$)),this.subscription.add(O(C(e,"change"),Le(["init"])).pipe(T(()=>this.htmlTextTracksAsArray().find(({mode:i})=>i==="showing")),T(i=>i&&this.htmlTextTrackToITextTrack(i).id),de()).subscribe(this.current$));const t=i=>this.applyCueSettings(i.target?.activeCues??null);this.subscription.add(C(e,"addtrack").subscribe(i=>{i.track?.addEventListener("cuechange",t);const a=r=>{const n=r.target?.cues??null;n&&n.length&&(this.applyCueSettings(r.target?.cues??null),r.target?.removeEventListener("cuechange",a))};i.track?.addEventListener("cuechange",a)})),this.subscription.add(C(e,"removetrack").subscribe(i=>{i.track?.removeEventListener("cuechange",t)}))}applyCueSettings(e){if(!e||!e.length)return;const t=this.cueSettings.getState();for(const i of Array.from(e)){const a=i;A(t.align)&&(a.align=t.align),A(t.position)&&(a.position=t.position),A(t.size)&&(a.size=t.size),A(t.line)&&(a.line=t.line)}}htmlTextTracksAsArray(e=!1){v(this.video);const t=[...this.video.textTracks];return e?t:t.filter(it.isHealthyTrack)}htmlTextTrackToITextTrack(e){const{language:t,label:i}=e,a=e.id?e.id:Us(e),r=this.externalTracks.has(a),n=a.includes("auto");return r?{id:a,type:"external",isAuto:n,language:t,label:i,url:this.externalTracks.get(a)?.url}:{id:a,type:"internal",isAuto:n,language:t,label:i,url:this.internalTracks.get(a)?.url}}static isHealthyTrack(e){return!(e.kind==="metadata"||e.groupId||e.id===""&&e.label===""&&e.language==="")}setExternal(e){this.internalTracks.size>0&&Array.from(this.internalTracks).forEach(([,t])=>this.detach(t)),e.filter(({id:t})=>!this.externalTracks.has(t)).forEach(t=>this.attach(t)),Array.from(this.externalTracks).filter(([t])=>!e.find(i=>i.id===t)).forEach(([,t])=>this.detach(t))}setInternal(e){const t=[...this.externalTracks];e.filter(({id:i,language:a,isAuto:r})=>!this.internalTracks.has(i)&&!t.some(([,n])=>n.language===a&&n.isAuto===r)).forEach(i=>this.attach(i)),Array.from(this.internalTracks).filter(([i])=>!e.find(a=>a.id===i)).forEach(([,i])=>this.detach(i))}select(e){v(this.video);for(const t of this.htmlTextTracksAsArray(!0))t.mode="showing";for(const t of this.htmlTextTracksAsArray(!0))(Q(e)||!Hs(t,e))&&(t.mode="disabled")}destroy(){if(this.subscription.unsubscribe(),this.video)for(const e of Array.from(this.video.getElementsByTagName("track"))){const t=e.getAttribute("id");t&&this.externalTracks.has(t)&&this.video.removeChild(e)}this.externalTracks.clear()}attach(e){v(this.video);const t=document.createElement("track");t.setAttribute("src",e.url),t.setAttribute("id",e.id),e.label&&t.setAttribute("label",e.label),e.language&&t.setAttribute("srclang",e.language),e.type==="external"?this.externalTracks.set(e.id,e):e.type==="internal"&&this.internalTracks.set(e.id,e),this.video.appendChild(t)}detach(e){v(this.video);const t=Array.prototype.find.call(this.video.getElementsByTagName("track"),i=>i.getAttribute("id")===e.id);t&&this.video.removeChild(t),e.type==="external"?this.externalTracks.delete(e.id):e.type==="internal"&&this.internalTracks.delete(e.id)}}class wi{pausedTime=0;streamOffset=0;pauseTimestamp=0;getTotalPausedTime(){return this.pausedTime+this.getCurrentPausedTime()}getCurrentPausedTime(){return this.pauseTimestamp>0?Date.now()-this.pauseTimestamp:0}getStreamOffset(){return this.streamOffset}getTotalOffset(){return this.getTotalPausedTime()+this.streamOffset}pause(){this.pauseTimestamp===0&&(this.pauseTimestamp=Date.now())}resume(){this.pauseTimestamp>0&&(this.pausedTime+=this.getCurrentPausedTime(),this.pauseTimestamp=0)}resetTo(e,t=!1){this.streamOffset=e,this.pauseTimestamp=0,this.pausedTime=0,t&&this.pause()}}const is=s=>{let e=s;for(;!(e instanceof Document)&&!(e instanceof ShadowRoot)&&e!==null;)e=e?.parentNode;return e??void 0},Bi=s=>{const e=is(s);return!!(e&&e.fullscreenElement&&e.fullscreenElement===s)},Ys=s=>{const e=is(s);return!!(e&&e.pictureInPictureElement&&e.pictureInPictureElement===s)},Gs=3;var qs=(s,e,t=Gs)=>{let i=0,a=0;for(let r=0;r<s.length;r++){const n=s.start(r),o=s.end(r);if(n<=e&&e<=o){if(i=n,a=o,!t)return{from:i,to:a};for(let d=r-1;d>=0;d--)s.end(d)+t>=i&&(i=s.start(d));for(let d=r+1;d<s.length;d++)s.start(d)-t<=a&&(a=s.end(d))}}return{from:i,to:a}};const mt=s=>{const e=M=>C(s,M).pipe(Jt(void 0)),i=O(...["waiting","pause","canplay","play","canplaythrough","playing","seeking","seeked","ended"].map(M=>C(s,M))).pipe(T(M=>M.type==="ended"?s.readyState<2:s.readyState<3),de()),a=O(C(s,"progress"),C(s,"timeupdate")).pipe(T(()=>qs(s.buffered,s.currentTime))),n=Ai().browser===ts.Safari?De({play:e("play").pipe(ye()),playing:e("playing")}).pipe(Jt(void 0)):e("playing"),o=C(s,"volumechange").pipe(T(()=>({muted:s.muted,volume:s.volume}))),d=C(s,"ratechange").pipe(T(()=>s.playbackRate)),c=C(s,"error").pipe(oe(()=>!!(s.error||s.played.length)),T(()=>{const M=s.error;return{id:M?`MediaError#${M.code}`:"HtmlVideoError",category:P.VIDEO_PIPELINE,message:M?M.message:"Error event from HTML video element",thrown:s.error??void 0}})),u=C(s,"timeupdate").pipe(T(()=>s.currentTime)),h=new L,f=.3;let p;u.subscribe(M=>{s.loop&&A(p)&&A(M)&&p>=s.duration-f&&M<=f&&h.next(p),p=M});const S=C(s,"enterpictureinpicture"),w=C(s,"leavepictureinpicture"),y=new g(Ys(s));S.subscribe(()=>y.next(!0)),w.subscribe(()=>y.next(!1));const k=new g(Bi(s));return C(s,"fullscreenchange").pipe(T(()=>Bi(s))).subscribe(k),{playing$:n,pause$:e("pause").pipe(oe(()=>!s.error)),canplay$:e("canplay"),ended$:e("ended"),looped$:h,error$:c,seeked$:e("seeked"),seeking$:e("seeking"),progress$:e("progress"),loadStart$:e("loadstart"),loadedMetadata$:e("loadedmetadata"),loadedData$:e("loadeddata"),timeUpdate$:u,durationChange$:C(s,"durationchange").pipe(T(()=>s.duration)),isBuffering$:i,currentBuffer$:a,volumeState$:o,playbackRateState$:d,inPiP$:y,inFullscreen$:k}};var si=s=>{switch(s){case"mobile":return $e.Q_144P;case"lowest":return $e.Q_240P;case"low":return $e.Q_360P;case"sd":case"medium":return $e.Q_480P;case"hd":case"high":return $e.Q_720P;case"fullhd":case"full":return $e.Q_1080P;case"quadhd":case"quad":return $e.Q_1440P;case"ultrahd":case"ultra":return $e.Q_2160P}};let Pi=!1,Qe={};const zs=s=>{Pi=s},Ws=()=>{Qe={}},Qs=s=>{s(Qe)},qt=(s,e)=>{Pi&&(Qe.meta=Qe.meta??{},Qe.meta[s]=e)};class Ue{name;constructor(e){this.name=e}next(e){if(!Pi)return;Qe.series=Qe.series??{};const t=Qe.series[this.name]??[];t.push([Date.now(),e]),Qe.series[this.name]=t}}var ot;(function(s){s.FitsContainer="FitsContainer",s.FitsThroughput="FitsThroughput",s.Buffer="Buffer",s.DroppedFramesLimit="DroppedFramesLimit",s.FitsQualityLimits="FitsQualityLimits"})(ot||(ot={}));const js=new Ue("best_bitrate"),Js=(s,e,t)=>(e-t)*Math.pow(2,-10*s)+t;class Xs{last;history={};recordSelection(e){this.history[e.id]=se()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}const Ks='Assertion "ABR Tracks is empty array" failed',ai=(s,{container:e,throughput:t,tuning:i,limits:a,reserve:r=0,forwardBufferHealth:n,playbackRate:o,current:d,history:c,droppedVideoMaxQualityLimit:u,abrLogger:h})=>{Es(s,Ks);const f=i.usePixelRatio?window.devicePixelRatio??1:1,p=i.limitByContainer&&e&&e.width>0&&e.height>0&&{width:e.width*f*i.containerSizeFactor,height:e.height*f*i.containerSizeFactor},S=p&&dt(p),w=i.considerPlaybackRate&&A(o)?o:1,y=s.filter(x=>!ut(x.quality)).sort((x,I)=>At(x.quality,I.quality)?-1:1),k=y.at(-1)?.quality,_=y.at(0)?.quality,M=Q(a)||A(a.min)&&A(a.max)&&Wt(a.max,a.min)||A(a.min)&&_&&At(a.min,_)||A(a.max)&&k&&Wt(a.max,k),E=w*Js(n??.5,i.bitrateFactorAtEmptyBuffer,i.bitrateFactorAtFullBuffer),D={},q=y.filter(x=>(S?Wt(x.quality,S):!0)?(A(t)&&isFinite(t)&&A(x.bitrate)?t-r>=x.bitrate*E:!0)?i.lazyQualitySwitch&&A(i.minBufferToSwitchUp)&&d&&!ut(d.quality)&&(n??0)<i.minBufferToSwitchUp&&At(x.quality,d.quality)?(D[x.quality]=ot.Buffer,!1):!!u&&mi(x.quality,u)?(D[x.quality]=ot.DroppedFramesLimit,!1):M||(Q(a.max)||Xt(x.quality,a.max))&&(Q(a.min)||mi(x.quality,a.min))?!0:(D[x.quality]=ot.FitsQualityLimits,!1):(D[x.quality]=ot.FitsThroughput,!1):(D[x.quality]=ot.FitsContainer,!1))[0];q&&q.bitrate&&js.next(q.bitrate);const H=q??y[Math.ceil((y.length-1)/2)]??s[0];H.quality!==c?.last?.quality&&h({message:`
7
7
  [available tracks]
8
8
  ${s.map(x=>`{ id: ${x.id}, quality: ${x.quality}, bitrate: ${x.bitrate} }`).join(`
9
9
  `)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/videoplayer-core",
3
- "version": "2.0.102-beta.3",
3
+ "version": "2.0.103-dev.c555938f.0",
4
4
  "author": "vk.com",
5
5
  "description": "Videoplayer core library based on the vk.com platform",
6
6
  "homepage": "https://vk.com",
@@ -49,7 +49,7 @@
49
49
  "**/*.d.ts"
50
50
  ],
51
51
  "dependencies": {
52
- "@vkontakte/videoplayer-shared": "1.0.35-beta.3",
52
+ "@vkontakte/videoplayer-shared": "^1.0.35",
53
53
  "hls.js": "~1.4.7"
54
54
  }
55
55
  }